From a2b6c8afb4cbffdcfdeb2933a8defd5e636a70a5 Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 14:02:22 +0400 Subject: [PATCH 1/7] Add ES|QL API --- docs/sphinx/api.rst | 7 ++ .../_async/client/__init__.py | 2 + .../_async/client/esql.py | 100 ++++++++++++++++++ .../_sync/client/__init__.py | 2 + elasticsearch_serverless/_sync/client/esql.py | 100 ++++++++++++++++++ elasticsearch_serverless/client.py | 1 + 6 files changed, 212 insertions(+) create mode 100644 elasticsearch_serverless/_async/client/esql.py create mode 100644 elasticsearch_serverless/_sync/client/esql.py diff --git a/docs/sphinx/api.rst b/docs/sphinx/api.rst index 56c5bc6..52cab2c 100644 --- a/docs/sphinx/api.rst +++ b/docs/sphinx/api.rst @@ -51,6 +51,13 @@ Enrich Policies Event Query Language (EQL) -------------------------- +.. autoclass:: EqlClient + :members: + + +ES|QL +----- + .. autoclass:: EqlClient :members: diff --git a/elasticsearch_serverless/_async/client/__init__.py b/elasticsearch_serverless/_async/client/__init__.py index 0dff9a6..7272ed4 100644 --- a/elasticsearch_serverless/_async/client/__init__.py +++ b/elasticsearch_serverless/_async/client/__init__.py @@ -39,6 +39,7 @@ from .cluster import ClusterClient from .enrich import EnrichClient from .eql import EqlClient +from .esql import EsqlClient from .graph import GraphClient from .indices import IndicesClient from .inference import InferenceClient @@ -286,6 +287,7 @@ def __init__( self.enrich = EnrichClient(self) self.eql = EqlClient(self) + self.esql = EsqlClient(self) self.graph = GraphClient(self) self.license = LicenseClient(self) self.logstash = LogstashClient(self) diff --git a/elasticsearch_serverless/_async/client/esql.py b/elasticsearch_serverless/_async/client/esql.py new file mode 100644 index 0000000..db6056c --- /dev/null +++ b/elasticsearch_serverless/_async/client/esql.py @@ -0,0 +1,100 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import typing as t + +from elastic_transport import ObjectApiResponse + +from ._base import NamespacedClient +from .utils import _rewrite_parameters + + +class EsqlClient(NamespacedClient): + + @_rewrite_parameters( + body_fields=("query", "columnar", "filter", "locale", "params"), + ignore_deprecated_options={"params"}, + ) + async def query( + self, + *, + query: t.Optional[str] = None, + columnar: t.Optional[bool] = None, + delimiter: t.Optional[str] = None, + error_trace: t.Optional[bool] = None, + filter: t.Optional[t.Mapping[str, t.Any]] = None, + filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None, + format: t.Optional[str] = None, + human: t.Optional[bool] = None, + locale: t.Optional[str] = None, + params: t.Optional[t.Sequence[t.Union[None, bool, float, int, str]]] = None, + pretty: t.Optional[bool] = None, + body: t.Optional[t.Dict[str, t.Any]] = None, + ) -> ObjectApiResponse[t.Any]: + """ + Executes an ES|QL request + + ``_ + + :param query: The ES|QL query API accepts an ES|QL query string in the query + parameter, runs it, and returns the results. + :param columnar: By default, ES|QL returns results as rows. For example, FROM + returns each individual document as one row. For the JSON, YAML, CBOR and + smile formats, ES|QL can return the results in a columnar fashion where one + row represents all the values of a certain column in the results. + :param delimiter: The character to use between values within a CSV row. Only + valid for the CSV format. + :param filter: Specify a Query DSL query in the filter parameter to filter the + set of documents that an ES|QL query runs on. + :param format: A short version of the Accept header, e.g. json, yaml. + :param locale: + :param params: To avoid any attempts of hacking or code injection, extract the + values in a separate list of parameters. Use question mark placeholders (?) + in the query string for each of the parameters. + """ + if query is None and body is None: + raise ValueError("Empty value passed for parameter 'query'") + __path = "/_query" + __query: t.Dict[str, t.Any] = {} + __body: t.Dict[str, t.Any] = body if body is not None else {} + if delimiter is not None: + __query["delimiter"] = delimiter + if error_trace is not None: + __query["error_trace"] = error_trace + if filter_path is not None: + __query["filter_path"] = filter_path + if format is not None: + __query["format"] = format + if human is not None: + __query["human"] = human + if pretty is not None: + __query["pretty"] = pretty + if not __body: + if query is not None: + __body["query"] = query + if columnar is not None: + __body["columnar"] = columnar + if filter is not None: + __body["filter"] = filter + if locale is not None: + __body["locale"] = locale + if params is not None: + __body["params"] = params + __headers = {"accept": "application/json", "content-type": "application/json"} + return await self.perform_request( # type: ignore[return-value] + "POST", __path, params=__query, headers=__headers, body=__body + ) diff --git a/elasticsearch_serverless/_sync/client/__init__.py b/elasticsearch_serverless/_sync/client/__init__.py index 7700fec..7cade1e 100644 --- a/elasticsearch_serverless/_sync/client/__init__.py +++ b/elasticsearch_serverless/_sync/client/__init__.py @@ -39,6 +39,7 @@ from .cluster import ClusterClient from .enrich import EnrichClient from .eql import EqlClient +from .esql import EsqlClient from .graph import GraphClient from .indices import IndicesClient from .inference import InferenceClient @@ -286,6 +287,7 @@ def __init__( self.enrich = EnrichClient(self) self.eql = EqlClient(self) + self.esql = EsqlClient(self) self.graph = GraphClient(self) self.license = LicenseClient(self) self.logstash = LogstashClient(self) diff --git a/elasticsearch_serverless/_sync/client/esql.py b/elasticsearch_serverless/_sync/client/esql.py new file mode 100644 index 0000000..7434338 --- /dev/null +++ b/elasticsearch_serverless/_sync/client/esql.py @@ -0,0 +1,100 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import typing as t + +from elastic_transport import ObjectApiResponse + +from ._base import NamespacedClient +from .utils import _rewrite_parameters + + +class EsqlClient(NamespacedClient): + + @_rewrite_parameters( + body_fields=("query", "columnar", "filter", "locale", "params"), + ignore_deprecated_options={"params"}, + ) + def query( + self, + *, + query: t.Optional[str] = None, + columnar: t.Optional[bool] = None, + delimiter: t.Optional[str] = None, + error_trace: t.Optional[bool] = None, + filter: t.Optional[t.Mapping[str, t.Any]] = None, + filter_path: t.Optional[t.Union[str, t.Sequence[str]]] = None, + format: t.Optional[str] = None, + human: t.Optional[bool] = None, + locale: t.Optional[str] = None, + params: t.Optional[t.Sequence[t.Union[None, bool, float, int, str]]] = None, + pretty: t.Optional[bool] = None, + body: t.Optional[t.Dict[str, t.Any]] = None, + ) -> ObjectApiResponse[t.Any]: + """ + Executes an ES|QL request + + ``_ + + :param query: The ES|QL query API accepts an ES|QL query string in the query + parameter, runs it, and returns the results. + :param columnar: By default, ES|QL returns results as rows. For example, FROM + returns each individual document as one row. For the JSON, YAML, CBOR and + smile formats, ES|QL can return the results in a columnar fashion where one + row represents all the values of a certain column in the results. + :param delimiter: The character to use between values within a CSV row. Only + valid for the CSV format. + :param filter: Specify a Query DSL query in the filter parameter to filter the + set of documents that an ES|QL query runs on. + :param format: A short version of the Accept header, e.g. json, yaml. + :param locale: + :param params: To avoid any attempts of hacking or code injection, extract the + values in a separate list of parameters. Use question mark placeholders (?) + in the query string for each of the parameters. + """ + if query is None and body is None: + raise ValueError("Empty value passed for parameter 'query'") + __path = "/_query" + __query: t.Dict[str, t.Any] = {} + __body: t.Dict[str, t.Any] = body if body is not None else {} + if delimiter is not None: + __query["delimiter"] = delimiter + if error_trace is not None: + __query["error_trace"] = error_trace + if filter_path is not None: + __query["filter_path"] = filter_path + if format is not None: + __query["format"] = format + if human is not None: + __query["human"] = human + if pretty is not None: + __query["pretty"] = pretty + if not __body: + if query is not None: + __body["query"] = query + if columnar is not None: + __body["columnar"] = columnar + if filter is not None: + __body["filter"] = filter + if locale is not None: + __body["locale"] = locale + if params is not None: + __body["params"] = params + __headers = {"accept": "application/json", "content-type": "application/json"} + return self.perform_request( # type: ignore[return-value] + "POST", __path, params=__query, headers=__headers, body=__body + ) diff --git a/elasticsearch_serverless/client.py b/elasticsearch_serverless/client.py index 80e1667..0fd72fa 100644 --- a/elasticsearch_serverless/client.py +++ b/elasticsearch_serverless/client.py @@ -25,6 +25,7 @@ from ._sync.client.cluster import ClusterClient as ClusterClient # noqa: F401 from ._sync.client.enrich import EnrichClient as EnrichClient # noqa: F401 from ._sync.client.eql import EqlClient as EqlClient # noqa: F401 +from ._sync.client.esql import EsqlClient as EsqlClient # noqa: F401 from ._sync.client.graph import GraphClient as GraphClient # noqa: F401 from ._sync.client.indices import IndicesClient as IndicesClient # noqa: F401 from ._sync.client.inference import InferenceClient as InferenceClient # noqa: F401 From 6a355787aae4e70fbde3c6a17dbe82016b76751e Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 13:51:43 +0400 Subject: [PATCH 2/7] Pass endpoint_id and path_parts to BaseClient --- elasticsearch_serverless/_async/client/_base.py | 12 +++++++++++- elasticsearch_serverless/_sync/client/_base.py | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/elasticsearch_serverless/_async/client/_base.py b/elasticsearch_serverless/_async/client/_base.py index 51f8513..9fd3f73 100644 --- a/elasticsearch_serverless/_async/client/_base.py +++ b/elasticsearch_serverless/_async/client/_base.py @@ -138,6 +138,8 @@ async def perform_request( params: Optional[Mapping[str, Any]] = None, headers: Optional[Mapping[str, str]] = None, body: Optional[Any] = None, + endpoint_id: Optional[str] = None, + path_parts: Optional[Mapping[str, Any]] = None, ) -> ApiResponse[Any]: if headers: request_headers = self._headers.copy() @@ -251,9 +253,17 @@ async def perform_request( params: Optional[Mapping[str, Any]] = None, headers: Optional[Mapping[str, str]] = None, body: Optional[Any] = None, + endpoint_id: Optional[str] = None, + path_parts: Optional[Mapping[str, Any]] = None, ) -> ApiResponse[Any]: # Use the internal clients .perform_request() implementation # so we take advantage of their transport options. return await self._client.perform_request( - method, path, params=params, headers=headers, body=body + method, + path, + params=params, + headers=headers, + body=body, + endpoint_id=endpoint_id, + path_parts=path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/_base.py b/elasticsearch_serverless/_sync/client/_base.py index 1f50ecb..d4bdea5 100644 --- a/elasticsearch_serverless/_sync/client/_base.py +++ b/elasticsearch_serverless/_sync/client/_base.py @@ -138,6 +138,8 @@ def perform_request( params: Optional[Mapping[str, Any]] = None, headers: Optional[Mapping[str, str]] = None, body: Optional[Any] = None, + endpoint_id: Optional[str] = None, + path_parts: Optional[Mapping[str, Any]] = None, ) -> ApiResponse[Any]: if headers: request_headers = self._headers.copy() @@ -251,9 +253,17 @@ def perform_request( params: Optional[Mapping[str, Any]] = None, headers: Optional[Mapping[str, str]] = None, body: Optional[Any] = None, + endpoint_id: Optional[str] = None, + path_parts: Optional[Mapping[str, Any]] = None, ) -> ApiResponse[Any]: # Use the internal clients .perform_request() implementation # so we take advantage of their transport options. return self._client.perform_request( - method, path, params=params, headers=headers, body=body + method, + path, + params=params, + headers=headers, + body=body, + endpoint_id=endpoint_id, + path_parts=path_parts, ) From f98a4d340251334112c36a87ae9dc97af784abb6 Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 14:14:33 +0400 Subject: [PATCH 3/7] Run code generation --- .../_async/client/__init__.py | 404 ++++++++++-- .../_async/client/async_search.py | 43 +- elasticsearch_serverless/_async/client/cat.py | 116 +++- .../_async/client/cluster.py | 53 +- .../_async/client/enrich.py | 51 +- elasticsearch_serverless/_async/client/eql.py | 41 +- .../_async/client/esql.py | 9 +- .../_async/client/graph.py | 11 +- .../_async/client/indices.py | 414 ++++++++++--- .../_async/client/inference.py | 71 ++- .../_async/client/ingest.py | 54 +- .../_async/client/license.py | 8 +- .../_async/client/logstash.py | 33 +- elasticsearch_serverless/_async/client/ml.py | 586 +++++++++++++++--- .../_async/client/query_ruleset.py | 39 +- .../_async/client/search_application.py | 82 ++- .../_async/client/security.py | 67 +- elasticsearch_serverless/_async/client/sql.py | 57 +- .../_async/client/synonyms.py | 79 ++- .../_async/client/tasks.py | 10 +- .../_async/client/transform.py | 107 +++- .../_sync/client/__init__.py | 404 ++++++++++-- .../_sync/client/async_search.py | 43 +- elasticsearch_serverless/_sync/client/cat.py | 116 +++- .../_sync/client/cluster.py | 53 +- .../_sync/client/enrich.py | 51 +- elasticsearch_serverless/_sync/client/eql.py | 41 +- elasticsearch_serverless/_sync/client/esql.py | 9 +- .../_sync/client/graph.py | 11 +- .../_sync/client/indices.py | 414 ++++++++++--- .../_sync/client/inference.py | 71 ++- .../_sync/client/ingest.py | 54 +- .../_sync/client/license.py | 8 +- .../_sync/client/logstash.py | 33 +- elasticsearch_serverless/_sync/client/ml.py | 586 +++++++++++++++--- .../_sync/client/query_ruleset.py | 39 +- .../_sync/client/search_application.py | 82 ++- .../_sync/client/security.py | 67 +- elasticsearch_serverless/_sync/client/sql.py | 57 +- .../_sync/client/synonyms.py | 79 ++- .../_sync/client/tasks.py | 10 +- .../_sync/client/transform.py | 107 +++- 42 files changed, 3860 insertions(+), 810 deletions(-) diff --git a/elasticsearch_serverless/_async/client/__init__.py b/elasticsearch_serverless/_async/client/__init__.py index 7272ed4..06d781e 100644 --- a/elasticsearch_serverless/_async/client/__init__.py +++ b/elasticsearch_serverless/_async/client/__init__.py @@ -505,9 +505,12 @@ async def bulk( ) elif operations is not None and body is not None: raise ValueError("Cannot set both 'operations' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_bulk" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_bulk' else: + __path_parts = {} __path = "/_bulk" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -542,7 +545,13 @@ async def bulk( "content-type": "application/x-ndjson", } return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="bulk", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -565,6 +574,7 @@ async def clear_scroll( :param scroll_id: Scroll IDs to clear. To clear all scroll IDs, use `_all`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_search/scroll" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -585,7 +595,13 @@ async def clear_scroll( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="clear_scroll", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -610,6 +626,7 @@ async def close_point_in_time( """ if id is None and body is None: raise ValueError("Empty value passed for parameter 'id'") + __path_parts: t.Dict[str, str] = {} __path = "/_pit" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -630,7 +647,13 @@ async def close_point_in_time( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="close_point_in_time", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -710,9 +733,12 @@ async def count( If a query reaches this limit, Elasticsearch terminates the query early. Elasticsearch collects documents before sorting. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_count" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_count' else: + __path_parts = {} __path = "/_count" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -761,7 +787,13 @@ async def count( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="count", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -836,7 +868,8 @@ async def create( ) elif document is not None and body is not None: raise ValueError("Cannot set both 'document' and 'body'") - __path = f"/{_quote(index)}/_create/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_create/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -863,7 +896,13 @@ async def create( __body = document if document is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="create", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -920,7 +959,8 @@ async def delete( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -948,7 +988,12 @@ async def delete( __query["wait_for_active_shards"] = wait_for_active_shards __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="delete", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1079,7 +1124,8 @@ async def delete_by_query( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_delete_by_query" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_delete_by_query' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -1166,7 +1212,13 @@ async def delete_by_query( __body["slice"] = slice __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="delete_by_query", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1197,7 +1249,8 @@ async def delete_script( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_scripts/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1213,7 +1266,12 @@ async def delete_script( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="delete_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1277,7 +1335,8 @@ async def exists( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1309,7 +1368,12 @@ async def exists( __query["version_type"] = version_type __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="exists", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1369,7 +1433,8 @@ async def exists_source( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_source/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_source/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1399,7 +1464,12 @@ async def exists_source( __query["version_type"] = version_type __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="exists_source", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1470,7 +1540,8 @@ async def explain( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_explain/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_explain/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if analyze_wildcard is not None: @@ -1514,7 +1585,13 @@ async def explain( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="explain", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1583,9 +1660,12 @@ async def field_caps( :param types: Only return results for fields that have one of the types in the list """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_field_caps" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_field_caps' else: + __path_parts = {} __path = "/_field_caps" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1624,7 +1704,13 @@ async def field_caps( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="field_caps", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1692,7 +1778,8 @@ async def get( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1726,7 +1813,12 @@ async def get( __query["version_type"] = version_type __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1752,7 +1844,8 @@ async def get_script( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_scripts/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1766,7 +1859,12 @@ async def get_script( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1827,7 +1925,8 @@ async def get_source( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_source/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_source/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1859,7 +1958,12 @@ async def get_source( __query["version_type"] = version_type __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get_source", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1942,11 +2046,14 @@ async def index( ) elif document is not None and body is not None: raise ValueError("Cannot set both 'document' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and id not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __method = "PUT" elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_doc" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_doc' __method = "POST" else: raise ValueError("Couldn't find a path for the given parameters") @@ -1984,7 +2091,13 @@ async def index( __body = document if document is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - __method, __path, params=__query, headers=__headers, body=__body + __method, + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="index", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2001,6 +2114,7 @@ async def info( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -2013,7 +2127,12 @@ async def info( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="info", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2079,9 +2198,12 @@ async def mget( :param stored_fields: If `true`, retrieves the document fields stored in the index rather than the document `_source`. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mget" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mget' else: + __path_parts = {} __path = "/_mget" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2118,7 +2240,13 @@ async def mget( __body["ids"] = ids __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="mget", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2203,9 +2331,12 @@ async def msearch( ) elif searches is not None and body is not None: raise ValueError("Cannot set both 'searches' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_msearch" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_msearch' else: + __path_parts = {} __path = "/_msearch" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2246,7 +2377,13 @@ async def msearch( "content-type": "application/x-ndjson", } return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="msearch", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2296,9 +2433,12 @@ async def msearch_template( ) elif search_templates is not None and body is not None: raise ValueError("Cannot set both 'search_templates' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_msearch/template" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_msearch/template' else: + __path_parts = {} __path = "/_msearch/template" __query: t.Dict[str, t.Any] = {} if ccs_minimize_roundtrips is not None: @@ -2325,7 +2465,13 @@ async def msearch_template( "content-type": "application/x-ndjson", } return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="msearch_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2382,9 +2528,12 @@ async def mtermvectors( :param version: If `true`, returns the document version as part of a hit. :param version_type: Specific version type. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mtermvectors" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mtermvectors' else: + __path_parts = {} __path = "/_mtermvectors" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2429,7 +2578,13 @@ async def mtermvectors( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="mtermvectors", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2482,7 +2637,8 @@ async def open_point_in_time( raise ValueError("Empty value passed for parameter 'index'") if keep_alive is None: raise ValueError("Empty value passed for parameter 'keep_alive'") - __path = f"/{_quote(index)}/_pit" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_pit' __query: t.Dict[str, t.Any] = {} if keep_alive is not None: __query["keep_alive"] = keep_alive @@ -2504,7 +2660,12 @@ async def open_point_in_time( __query["routing"] = routing __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="open_point_in_time", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2548,10 +2709,13 @@ async def put_script( raise ValueError("Empty value passed for parameter 'id'") if script is None and body is None: raise ValueError("Empty value passed for parameter 'script'") + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH and context not in SKIP_IN_PATH: - __path = f"/_scripts/{_quote(id)}/{_quote(context)}" + __path_parts = {"id": _quote(id), "context": _quote(context)} + __path = f'/_scripts/{__path_parts["id"]}/{__path_parts["context"]}' elif id not in SKIP_IN_PATH: - __path = f"/_scripts/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -2573,7 +2737,13 @@ async def put_script( __body["script"] = script __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="put_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2628,9 +2798,12 @@ async def rank_eval( """ if requests is None and body is None: raise ValueError("Empty value passed for parameter 'requests'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_rank_eval" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_rank_eval' else: + __path_parts = {} __path = "/_rank_eval" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2657,7 +2830,13 @@ async def rank_eval( __body["metric"] = metric __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="rank_eval", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2723,6 +2902,7 @@ async def reindex( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") + __path_parts: t.Dict[str, str] = {} __path = "/_reindex" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2765,7 +2945,13 @@ async def reindex( __body["size"] = size __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="reindex", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2799,9 +2985,12 @@ async def render_search_template( search API's request body. These parameters also support Mustache variables. If no `id` or `` is specified, this parameter is required. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_render/template/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_render/template/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_render/template" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2826,7 +3015,13 @@ async def render_search_template( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="render_search_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2853,6 +3048,7 @@ async def scripts_painless_execute( :param context_setup: Additional parameters for the `context`. :param script: The Painless script to execute. """ + __path_parts: t.Dict[str, str] = {} __path = "/_scripts/painless/_execute" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2877,7 +3073,13 @@ async def scripts_painless_execute( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="scripts_painless_execute", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2908,6 +3110,7 @@ async def scroll( """ if scroll_id is None and body is None: raise ValueError("Empty value passed for parameter 'scroll_id'") + __path_parts: t.Dict[str, str] = {} __path = "/_search/scroll" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2932,7 +3135,13 @@ async def scroll( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="scroll", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3273,9 +3482,12 @@ async def search( by their respective types in the response. :param version: If true, returns document version as part of a hit. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_search" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_search' else: + __path_parts = {} __path = "/_search" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -3435,7 +3647,13 @@ async def search( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3550,7 +3768,14 @@ async def search_mvt( raise ValueError("Empty value passed for parameter 'x'") if y in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'y'") - __path = f"/{_quote(index)}/_mvt/{_quote(field)}/{_quote(zoom)}/{_quote(x)}/{_quote(y)}" + __path_parts: t.Dict[str, str] = { + "index": _quote(index), + "field": _quote(field), + "zoom": _quote(zoom), + "x": _quote(x), + "y": _quote(y), + } + __path = f'/{__path_parts["index"]}/_mvt/{__path_parts["field"]}/{__path_parts["zoom"]}/{__path_parts["x"]}/{__path_parts["y"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -3607,7 +3832,13 @@ async def search_mvt( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_mvt", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3692,9 +3923,12 @@ async def search_template( :param typed_keys: If `true`, the response prefixes aggregation and suggester names with their respective types. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_search/template" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_search/template' else: + __path_parts = {} __path = "/_search/template" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -3741,7 +3975,13 @@ async def search_template( __body["source"] = source __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3800,7 +4040,8 @@ async def terms_enum( raise ValueError("Empty value passed for parameter 'index'") if field is None and body is None: raise ValueError("Empty value passed for parameter 'field'") - __path = f"/{_quote(index)}/_terms_enum" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_terms_enum' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3832,7 +4073,13 @@ async def terms_enum( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="terms_enum", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3896,10 +4143,13 @@ async def termvectors( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and id not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_termvectors/{_quote(id)}" + __path_parts = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_termvectors/{__path_parts["id"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_termvectors" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_termvectors' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -3947,7 +4197,13 @@ async def termvectors( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="termvectors", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -4044,7 +4300,8 @@ async def update( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_update/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_update/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -4094,7 +4351,13 @@ async def update( __body["upsert"] = upsert __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="update", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -4236,7 +4499,8 @@ async def update_by_query( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_update_by_query" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_update_by_query' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -4331,5 +4595,11 @@ async def update_by_query( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="update_by_query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/async_search.py b/elasticsearch_serverless/_async/client/async_search.py index c2470c8..b576b39 100644 --- a/elasticsearch_serverless/_async/client/async_search.py +++ b/elasticsearch_serverless/_async/client/async_search.py @@ -48,7 +48,8 @@ async def delete( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -60,7 +61,12 @@ async def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -104,7 +110,8 @@ async def get( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -122,7 +129,12 @@ async def get( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -147,7 +159,8 @@ async def status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -159,7 +172,12 @@ async def status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -443,9 +461,12 @@ async def submit( up to a certain timeout. When the async search completes within the timeout, the response won’t include the ID as the results are not stored in the cluster. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_async_search" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_async_search' else: + __path_parts = {} __path = "/_async_search" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -605,5 +626,11 @@ async def submit( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="async_search.submit", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/cat.py b/elasticsearch_serverless/_async/client/cat.py index 7e5ed49..a789ca4 100644 --- a/elasticsearch_serverless/_async/client/cat.py +++ b/elasticsearch_serverless/_async/client/cat.py @@ -80,9 +80,12 @@ async def aliases( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_cat/aliases/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_cat/aliases/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_cat/aliases" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -111,7 +114,12 @@ async def aliases( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.aliases", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -159,9 +167,12 @@ async def component_templates( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_cat/component_templates/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_cat/component_templates/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_cat/component_templates" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -188,7 +199,12 @@ async def component_templates( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.component_templates", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -238,9 +254,12 @@ async def count( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/_cat/count/{_quote(index)}" + __path_parts = {"index": _quote(index)} + __path = f'/_cat/count/{__path_parts["index"]}' else: + __path_parts = {} __path = "/_cat/count" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -267,7 +286,12 @@ async def count( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.count", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -308,6 +332,7 @@ async def help( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] = {} __path = "/_cat" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -334,7 +359,12 @@ async def help( __query["v"] = v __headers = {"accept": "text/plain"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.help", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -413,9 +443,12 @@ async def indices( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/_cat/indices/{_quote(index)}" + __path_parts = {"index": _quote(index)} + __path = f'/_cat/indices/{__path_parts["index"]}' else: + __path_parts = {} __path = "/_cat/indices" __query: t.Dict[str, t.Any] = {} if bytes is not None: @@ -454,7 +487,12 @@ async def indices( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.indices", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -534,9 +572,12 @@ async def ml_data_frame_analytics( :param time: Unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_cat/ml/data_frame/analytics/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_cat/ml/data_frame/analytics/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_cat/ml/data_frame/analytics" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -569,7 +610,12 @@ async def ml_data_frame_analytics( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -655,9 +701,12 @@ async def ml_datafeeds( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/datafeeds/{_quote(datafeed_id)}" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_cat/ml/datafeeds/{__path_parts["datafeed_id"]}' else: + __path_parts = {} __path = "/_cat/ml/datafeeds" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -688,7 +737,12 @@ async def ml_datafeeds( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_datafeeds", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -778,9 +832,12 @@ async def ml_jobs( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/anomaly_detectors/{_quote(job_id)}" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_cat/ml/anomaly_detectors/{__path_parts["job_id"]}' else: + __path_parts = {} __path = "/_cat/ml/anomaly_detectors" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -813,7 +870,12 @@ async def ml_jobs( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_jobs", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -902,9 +964,12 @@ async def ml_trained_models( :param size: The maximum number of transforms to display. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/trained_models/{_quote(model_id)}" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_cat/ml/trained_models/{__path_parts["model_id"]}' else: + __path_parts = {} __path = "/_cat/ml/trained_models" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -939,7 +1004,12 @@ async def ml_trained_models( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_trained_models", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1030,9 +1100,12 @@ async def transforms( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_cat/transforms/{_quote(transform_id)}" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_cat/transforms/{__path_parts["transform_id"]}' else: + __path_parts = {} __path = "/_cat/transforms" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1067,5 +1140,10 @@ async def transforms( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.transforms", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/cluster.py b/elasticsearch_serverless/_async/client/cluster.py index 1a1d8ad..1b77504 100644 --- a/elasticsearch_serverless/_async/client/cluster.py +++ b/elasticsearch_serverless/_async/client/cluster.py @@ -55,7 +55,8 @@ async def delete_component_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -71,7 +72,12 @@ async def delete_component_template( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.delete_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -104,7 +110,8 @@ async def exists_component_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -120,7 +127,12 @@ async def exists_component_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.exists_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -155,9 +167,12 @@ async def get_component_template( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_component_template/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_component_template" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -178,7 +193,12 @@ async def get_component_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.get_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -210,7 +230,8 @@ async def info( """ if target in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'target'") - __path = f"/_info/{_quote(target)}" + __path_parts: t.Dict[str, str] = {"target": _quote(target)} + __path = f'/_info/{__path_parts["target"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -222,7 +243,12 @@ async def info( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.info", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -295,7 +321,8 @@ async def put_component_template( raise ValueError("Empty value passed for parameter 'name'") if template is None and body is None: raise ValueError("Empty value passed for parameter 'template'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if create is not None: @@ -321,5 +348,11 @@ async def put_component_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="cluster.put_component_template", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/enrich.py b/elasticsearch_serverless/_async/client/enrich.py index 3ddcfc1..63c7e8e 100644 --- a/elasticsearch_serverless/_async/client/enrich.py +++ b/elasticsearch_serverless/_async/client/enrich.py @@ -44,7 +44,8 @@ async def delete_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ async def delete_policy( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.delete_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -81,7 +87,8 @@ async def execute_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}/_execute" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}/_execute' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -95,7 +102,12 @@ async def execute_policy( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.execute_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -116,9 +128,12 @@ async def get_policy( :param name: Comma-separated list of enrich policy names used to limit the request. To return information for all enrich policies, omit this parameter. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_enrich/policy" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -131,7 +146,12 @@ async def get_policy( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.get_policy", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -164,7 +184,8 @@ async def put_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -184,7 +205,13 @@ async def put_policy( __body["range"] = range __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="enrich.put_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -202,6 +229,7 @@ async def stats( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_enrich/_stats" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -214,5 +242,10 @@ async def stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.stats", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/eql.py b/elasticsearch_serverless/_async/client/eql.py index 7b5885a..8e032a2 100644 --- a/elasticsearch_serverless/_async/client/eql.py +++ b/elasticsearch_serverless/_async/client/eql.py @@ -47,7 +47,8 @@ async def delete( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -59,7 +60,12 @@ async def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -92,7 +98,8 @@ async def get( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -108,7 +115,12 @@ async def get( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -131,7 +143,8 @@ async def get_status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -143,7 +156,12 @@ async def get_status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.get_status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -239,7 +257,8 @@ async def search( raise ValueError("Empty value passed for parameter 'index'") if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") - __path = f"/{_quote(index)}/_eql/search" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_eql/search' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -287,5 +306,11 @@ async def search( __body["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="eql.search", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/esql.py b/elasticsearch_serverless/_async/client/esql.py index db6056c..9973903 100644 --- a/elasticsearch_serverless/_async/client/esql.py +++ b/elasticsearch_serverless/_async/client/esql.py @@ -68,6 +68,7 @@ async def query( """ if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") + __path_parts: t.Dict[str, str] = {} __path = "/_query" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -96,5 +97,11 @@ async def query( __body["params"] = params __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="esql.query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/graph.py b/elasticsearch_serverless/_async/client/graph.py index b860ce8..998b990 100644 --- a/elasticsearch_serverless/_async/client/graph.py +++ b/elasticsearch_serverless/_async/client/graph.py @@ -65,7 +65,8 @@ async def explore( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_graph/explore" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_graph/explore' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -95,5 +96,11 @@ async def explore( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="graph.explore", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/indices.py b/elasticsearch_serverless/_async/client/indices.py index a66095b..dd13182 100644 --- a/elasticsearch_serverless/_async/client/indices.py +++ b/elasticsearch_serverless/_async/client/indices.py @@ -71,7 +71,11 @@ async def add_block( raise ValueError("Empty value passed for parameter 'index'") if block in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'block'") - __path = f"/{_quote(index)}/_block/{_quote(block)}" + __path_parts: t.Dict[str, str] = { + "index": _quote(index), + "block": _quote(block), + } + __path = f'/{__path_parts["index"]}/_block/{__path_parts["block"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -93,7 +97,12 @@ async def add_block( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.add_block", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -154,9 +163,12 @@ async def analyze( as a multi-value field. :param tokenizer: Tokenizer to use to convert text into tokens. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_analyze" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_analyze' else: + __path_parts = {} __path = "/_analyze" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -193,7 +205,13 @@ async def analyze( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.analyze", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -240,7 +258,8 @@ async def create( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -270,7 +289,13 @@ async def create( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.create", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -297,7 +322,8 @@ async def create_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -309,7 +335,12 @@ async def create_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.create_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -341,9 +372,12 @@ async def data_streams_stats( :param expand_wildcards: Type of data stream that wildcard patterns can match. Supports comma-separated values, such as `open,hidden`. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_data_stream/{_quote(name)}/_stats" + __path_parts = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_stats' else: + __path_parts = {} __path = "/_data_stream/_stats" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -358,7 +392,12 @@ async def data_streams_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.data_streams_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -411,7 +450,8 @@ async def delete( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -433,7 +473,12 @@ async def delete( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -470,7 +515,8 @@ async def delete_alias( raise ValueError("Empty value passed for parameter 'index'") if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -486,7 +532,12 @@ async def delete_alias( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -526,7 +577,8 @@ async def delete_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -544,7 +596,12 @@ async def delete_data_lifecycle( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -577,7 +634,8 @@ async def delete_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -591,7 +649,12 @@ async def delete_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -625,7 +688,8 @@ async def delete_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -641,7 +705,12 @@ async def delete_index_template( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -690,7 +759,8 @@ async def exists( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -714,7 +784,12 @@ async def exists( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -762,10 +837,13 @@ async def exists_alias( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' elif name not in SKIP_IN_PATH: - __path = f"/_alias/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_alias/{__path_parts["name"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -787,7 +865,12 @@ async def exists_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -816,7 +899,8 @@ async def exists_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -830,7 +914,12 @@ async def exists_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -860,7 +949,8 @@ async def explain_data_lifecycle( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_lifecycle/explain" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_lifecycle/explain' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -876,7 +966,12 @@ async def explain_data_lifecycle( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.explain_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -944,7 +1039,8 @@ async def get( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -972,7 +1068,12 @@ async def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1019,13 +1120,18 @@ async def get_alias( :param local: If `true`, the request retrieves information from the local node only. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_alias' elif name not in SKIP_IN_PATH: - __path = f"/_alias/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_alias/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_alias" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1046,7 +1152,12 @@ async def get_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1083,7 +1194,8 @@ async def get_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1099,7 +1211,12 @@ async def get_data_lifecycle( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1134,9 +1251,12 @@ async def get_data_stream( :param include_defaults: If true, returns all relevant default configurations for the index template. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_data_stream/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_data_stream" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1153,7 +1273,12 @@ async def get_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1189,9 +1314,12 @@ async def get_index_template( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_index_template/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_index_template" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1212,7 +1340,12 @@ async def get_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1263,9 +1396,12 @@ async def get_mapping( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mapping" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mapping' else: + __path_parts = {} __path = "/_mapping" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1288,7 +1424,12 @@ async def get_mapping( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_mapping", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1347,13 +1488,18 @@ async def get_settings( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_settings/{__path_parts["name"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_settings' elif name not in SKIP_IN_PATH: - __path = f"/_settings/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_settings/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_settings" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1380,7 +1526,12 @@ async def get_settings( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_settings", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1409,7 +1560,8 @@ async def migrate_to_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/_migrate/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/_migrate/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1421,7 +1573,12 @@ async def migrate_to_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.migrate_to_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1446,6 +1603,7 @@ async def modify_data_stream( """ if actions is None and body is None: raise ValueError("Empty value passed for parameter 'actions'") + __path_parts: t.Dict[str, str] = {} __path = "/_data_stream/_modify" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1462,7 +1620,13 @@ async def modify_data_stream( __body["actions"] = actions __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.modify_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1529,7 +1693,8 @@ async def put_alias( raise ValueError("Empty value passed for parameter 'index'") if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1561,7 +1726,13 @@ async def put_alias( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1618,7 +1789,8 @@ async def put_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1646,7 +1818,13 @@ async def put_data_lifecycle( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1735,7 +1913,8 @@ async def put_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if cause is not None: @@ -1777,7 +1956,13 @@ async def put_index_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_index_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1889,7 +2074,8 @@ async def put_mapping( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_mapping" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mapping' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -1937,7 +2123,13 @@ async def put_mapping( __body["_source"] = source __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_mapping", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2004,9 +2196,12 @@ async def put_settings( ) elif settings is not None and body is not None: raise ValueError("Cannot set both 'settings' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_settings' else: + __path_parts = {} __path = "/_settings" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2034,7 +2229,13 @@ async def put_settings( __body = settings if settings is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_settings", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2095,7 +2296,8 @@ async def put_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if cause is not None: @@ -2127,7 +2329,13 @@ async def put_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2170,9 +2378,12 @@ async def refresh( :param ignore_unavailable: If `false`, the request returns an error if it targets a missing or closed index. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_refresh" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_refresh' else: + __path_parts = {} __path = "/_refresh" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2191,7 +2402,12 @@ async def refresh( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.refresh", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2228,7 +2444,8 @@ async def resolve_index( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_resolve/index/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_resolve/index/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2242,7 +2459,12 @@ async def resolve_index( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.resolve_index", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2304,10 +2526,13 @@ async def rollover( """ if alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'alias'") + __path_parts: t.Dict[str, str] if alias not in SKIP_IN_PATH and new_index not in SKIP_IN_PATH: - __path = f"/{_quote(alias)}/_rollover/{_quote(new_index)}" + __path_parts = {"alias": _quote(alias), "new_index": _quote(new_index)} + __path = f'/{__path_parts["alias"]}/_rollover/{__path_parts["new_index"]}' elif alias not in SKIP_IN_PATH: - __path = f"/{_quote(alias)}/_rollover" + __path_parts = {"alias": _quote(alias)} + __path = f'/{__path_parts["alias"]}/_rollover' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -2343,7 +2568,13 @@ async def rollover( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.rollover", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2374,7 +2605,8 @@ async def simulate_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/_simulate_index/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/_simulate_index/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2390,7 +2622,12 @@ async def simulate_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.simulate_index_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2482,9 +2719,12 @@ async def simulate_template( :param version: Version number used to manage index templates externally. This number is not automatically generated by Elasticsearch. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_index_template/_simulate/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_index_template/_simulate/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_index_template/_simulate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2531,7 +2771,13 @@ async def simulate_template( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.simulate_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2563,6 +2809,7 @@ async def update_aliases( :param timeout: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] = {} __path = "/_aliases" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2583,7 +2830,13 @@ async def update_aliases( __body["actions"] = actions __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.update_aliases", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2655,9 +2908,12 @@ async def validate_query( :param rewrite: If `true`, returns a more detailed explanation showing the actual Lucene query that will be executed. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_validate/query" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_validate/query' else: + __path_parts = {} __path = "/_validate/query" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2702,5 +2958,11 @@ async def validate_query( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.validate_query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/inference.py b/elasticsearch_serverless/_async/client/inference.py index 7a2b77f..89df532 100644 --- a/elasticsearch_serverless/_async/client/inference.py +++ b/elasticsearch_serverless/_async/client/inference.py @@ -57,10 +57,16 @@ async def delete( """ if inference_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'inference_id'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -78,7 +84,12 @@ async def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="inference.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -105,11 +116,18 @@ async def get( :param task_type: The task type :param inference_id: The inference Id """ + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: + __path_parts = {} __path = "/_inference" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -122,7 +140,12 @@ async def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="inference.get", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -165,10 +188,16 @@ async def inference( raise ValueError("Empty value passed for parameter 'inference_id'") if input is None and body is None: raise ValueError("Empty value passed for parameter 'input'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -196,7 +225,13 @@ async def inference( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="inference.inference", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -236,10 +271,16 @@ async def put( ) elif inference_config is not None and body is not None: raise ValueError("Cannot set both 'inference_config' and 'body'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -254,5 +295,11 @@ async def put( __body = inference_config if inference_config is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="inference.put", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/ingest.py b/elasticsearch_serverless/_async/client/ingest.py index b11ed87..a795bf0 100644 --- a/elasticsearch_serverless/_async/client/ingest.py +++ b/elasticsearch_serverless/_async/client/ingest.py @@ -54,7 +54,8 @@ async def delete_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -70,7 +71,12 @@ async def delete_pipeline( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.delete_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -100,9 +106,12 @@ async def get_pipeline( returns an error. :param summary: Return pipelines without their definitions (default: false) """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_ingest/pipeline" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -119,7 +128,12 @@ async def get_pipeline( __query["summary"] = summary __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.get_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -139,6 +153,7 @@ async def processor_grok( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_ingest/processor/grok" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -151,7 +166,12 @@ async def processor_grok( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.processor_grok", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -209,7 +229,8 @@ async def put_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -239,7 +260,13 @@ async def put_pipeline( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ingest.put_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -272,9 +299,12 @@ async def simulate( :param verbose: If `true`, the response includes output data for each processor in the executed pipeline. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ingest/pipeline/{_quote(id)}/_simulate" + __path_parts = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}/_simulate' else: + __path_parts = {} __path = "/_ingest/pipeline/_simulate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -295,5 +325,11 @@ async def simulate( __body["pipeline"] = pipeline __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ingest.simulate", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/license.py b/elasticsearch_serverless/_async/client/license.py index 797a541..cadc727 100644 --- a/elasticsearch_serverless/_async/client/license.py +++ b/elasticsearch_serverless/_async/client/license.py @@ -50,6 +50,7 @@ async def get( :param local: Specifies whether to retrieve local information. The default value is `false`, which means the information is retrieved from the master node. """ + __path_parts: t.Dict[str, str] = {} __path = "/_license" __query: t.Dict[str, t.Any] = {} if accept_enterprise is not None: @@ -66,5 +67,10 @@ async def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="license.get", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/logstash.py b/elasticsearch_serverless/_async/client/logstash.py index d993581..882a1f6 100644 --- a/elasticsearch_serverless/_async/client/logstash.py +++ b/elasticsearch_serverless/_async/client/logstash.py @@ -44,7 +44,8 @@ async def delete_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ async def delete_pipeline( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="logstash.delete_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -76,9 +82,12 @@ async def get_pipeline( :param id: Comma-separated list of pipeline identifiers. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_logstash/pipeline" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -91,7 +100,12 @@ async def get_pipeline( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="logstash.get_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -124,7 +138,8 @@ async def put_pipeline( ) elif pipeline is not None and body is not None: raise ValueError("Cannot set both 'pipeline' and 'body'") - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -137,5 +152,11 @@ async def put_pipeline( __body = pipeline if pipeline is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="logstash.put_pipeline", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/ml.py b/elasticsearch_serverless/_async/client/ml.py index c823f5c..a2eb508 100644 --- a/elasticsearch_serverless/_async/client/ml.py +++ b/elasticsearch_serverless/_async/client/ml.py @@ -70,7 +70,8 @@ async def close_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_close" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_close' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -94,7 +95,13 @@ async def close_job( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.close_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -116,7 +123,8 @@ async def delete_calendar( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -128,7 +136,12 @@ async def delete_calendar( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -155,7 +168,11 @@ async def delete_calendar_event( raise ValueError("Empty value passed for parameter 'calendar_id'") if event_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'event_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events/{_quote(event_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "event_id": _quote(event_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events/{__path_parts["event_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -167,7 +184,12 @@ async def delete_calendar_event( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar_event", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -194,7 +216,11 @@ async def delete_calendar_job( raise ValueError("Empty value passed for parameter 'calendar_id'") if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/jobs/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "job_id": _quote(job_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/jobs/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -206,7 +232,12 @@ async def delete_calendar_job( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -233,7 +264,8 @@ async def delete_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -249,7 +281,12 @@ async def delete_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -277,7 +314,8 @@ async def delete_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -291,7 +329,12 @@ async def delete_datafeed( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -315,7 +358,8 @@ async def delete_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -327,7 +371,12 @@ async def delete_filter( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_filter", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -364,7 +413,8 @@ async def delete_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if delete_user_annotations is not None: __query["delete_user_annotations"] = delete_user_annotations @@ -382,7 +432,12 @@ async def delete_job( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -408,7 +463,8 @@ async def delete_trained_model( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -422,7 +478,12 @@ async def delete_trained_model( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -450,7 +511,11 @@ async def delete_trained_model_alias( raise ValueError("Empty value passed for parameter 'model_id'") if model_alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_alias'") - __path = f"/_ml/trained_models/{_quote(model_id)}/model_aliases/{_quote(model_alias)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "model_alias": _quote(model_alias), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/model_aliases/{__path_parts["model_alias"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -462,7 +527,12 @@ async def delete_trained_model_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_trained_model_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -506,6 +576,7 @@ async def estimate_model_memory( from the request if no detectors have a `by_field_name`, `over_field_name` or `partition_field_name`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_ml/anomaly_detectors/_estimate_model_memory" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -526,7 +597,13 @@ async def estimate_model_memory( __body["overall_cardinality"] = overall_cardinality __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.estimate_model_memory", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -561,6 +638,7 @@ async def evaluate_data_frame( raise ValueError("Empty value passed for parameter 'evaluation'") if index is None and body is None: raise ValueError("Empty value passed for parameter 'index'") + __path_parts: t.Dict[str, str] = {} __path = "/_ml/data_frame/_evaluate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -581,7 +659,13 @@ async def evaluate_data_frame( __body["query"] = query __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.evaluate_data_frame", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -623,7 +707,8 @@ async def flush_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_flush" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_flush' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -651,7 +736,13 @@ async def flush_job( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.flush_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -689,7 +780,8 @@ async def get_calendar_events( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events' __query: t.Dict[str, t.Any] = {} if end is not None: __query["end"] = end @@ -711,7 +803,12 @@ async def get_calendar_events( __query["start"] = start __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_calendar_events", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -746,9 +843,12 @@ async def get_calendars( :param size: Specifies the maximum number of calendars to obtain. This parameter is supported only when you omit the calendar identifier. """ + __path_parts: t.Dict[str, str] if calendar_id not in SKIP_IN_PATH: - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' else: + __path_parts = {} __path = "/_ml/calendars" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -773,7 +873,13 @@ async def get_calendars( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.get_calendars", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -816,9 +922,12 @@ async def get_data_frame_analytics( :param from_: Skips the specified number of data frame analytics jobs. :param size: Specifies the maximum number of data frame analytics jobs to obtain. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_ml/data_frame/analytics" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -839,7 +948,12 @@ async def get_data_frame_analytics( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -878,9 +992,12 @@ async def get_data_frame_analytics_stats( :param size: Specifies the maximum number of data frame analytics jobs to obtain. :param verbose: Defines whether the stats response should be verbose. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_stats" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_stats' else: + __path_parts = {} __path = "/_ml/data_frame/analytics/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -901,7 +1018,12 @@ async def get_data_frame_analytics_stats( __query["verbose"] = verbose __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_data_frame_analytics_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -936,9 +1058,12 @@ async def get_datafeed_stats( when there are partial matches. If this parameter is `false`, the request returns a `404` status code when there are no matches or only partial matches. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_stats" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/datafeeds/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -953,7 +1078,12 @@ async def get_datafeed_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_datafeed_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -991,9 +1121,12 @@ async def get_datafeeds( the configuration on retrieval. This allows the configuration to be in an acceptable format to be retrieved and then added to another cluster. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' else: + __path_parts = {} __path = "/_ml/datafeeds" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1010,7 +1143,12 @@ async def get_datafeeds( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_datafeeds", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1036,9 +1174,12 @@ async def get_filters( :param from_: Skips the specified number of filters. :param size: Specifies the maximum number of filters to obtain. """ + __path_parts: t.Dict[str, str] if filter_id not in SKIP_IN_PATH: - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' else: + __path_parts = {} __path = "/_ml/filters" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1055,7 +1196,12 @@ async def get_filters( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_filters", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1086,9 +1232,12 @@ async def get_job_stats( partial matches. If `false`, the API returns a `404` status code when there are no matches or only partial matches. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_stats" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/anomaly_detectors/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1103,7 +1252,12 @@ async def get_job_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_job_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1141,9 +1295,12 @@ async def get_jobs( the configuration on retrieval. This allows the configuration to be in an acceptable format to be retrieved and then added to another cluster. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' else: + __path_parts = {} __path = "/_ml/anomaly_detectors" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1160,7 +1317,12 @@ async def get_jobs( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_jobs", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1225,7 +1387,10 @@ async def get_overall_buckets( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/overall_buckets" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = ( + f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/results/overall_buckets' + ) __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1257,7 +1422,13 @@ async def get_overall_buckets( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.get_overall_buckets", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1311,9 +1482,12 @@ async def get_trained_models( tags, or none. When supplied, only trained models that contain all the supplied tags are returned. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' else: + __path_parts = {} __path = "/_ml/trained_models" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1340,7 +1514,12 @@ async def get_trained_models( __query["tags"] = tags __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_trained_models", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1375,9 +1554,12 @@ async def get_trained_models_stats( :param from_: Skips the specified number of models. :param size: Specifies the maximum number of models to obtain. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_ml/trained_models/{_quote(model_id)}/_stats" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/trained_models/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1396,7 +1578,12 @@ async def get_trained_models_stats( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_trained_models_stats", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1433,7 +1620,8 @@ async def infer_trained_model( raise ValueError("Empty value passed for parameter 'model_id'") if docs is None and body is None: raise ValueError("Empty value passed for parameter 'docs'") - __path = f"/_ml/trained_models/{_quote(model_id)}/_infer" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/_infer' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1453,7 +1641,13 @@ async def infer_trained_model( __body["inference_config"] = inference_config __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.infer_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1485,7 +1679,8 @@ async def open_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_open" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_open' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1505,7 +1700,13 @@ async def open_job( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.open_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1536,7 +1737,8 @@ async def post_calendar_events( raise ValueError("Empty value passed for parameter 'calendar_id'") if events is None and body is None: raise ValueError("Empty value passed for parameter 'events'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1552,7 +1754,13 @@ async def post_calendar_events( __body["events"] = events __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.post_calendar_events", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1579,9 +1787,12 @@ async def preview_data_frame_analytics( analytics jobs. Note that `id` and `dest` don’t need to be provided in the context of this API. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_preview" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_preview' else: + __path_parts = {} __path = "/_ml/data_frame/analytics/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1602,7 +1813,13 @@ async def preview_data_frame_analytics( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.preview_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1650,9 +1867,12 @@ async def preview_datafeed( object unless you also supply a `datafeed_config` object. :param start: The start time from where the datafeed preview should begin """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_preview" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_preview' else: + __path_parts = {} __path = "/_ml/datafeeds/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1679,7 +1899,13 @@ async def preview_datafeed( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.preview_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1708,7 +1934,8 @@ async def put_calendar( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1730,7 +1957,13 @@ async def put_calendar( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_calendar", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1757,7 +1990,11 @@ async def put_calendar_job( raise ValueError("Empty value passed for parameter 'calendar_id'") if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/jobs/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "job_id": _quote(job_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/jobs/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1769,7 +2006,12 @@ async def put_calendar_job( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.put_calendar_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1877,7 +2119,8 @@ async def put_data_frame_analytics( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1911,7 +2154,13 @@ async def put_data_frame_analytics( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2056,7 +2305,8 @@ async def put_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -2108,7 +2358,13 @@ async def put_datafeed( __body["scroll_size"] = scroll_size __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2140,7 +2396,8 @@ async def put_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2158,7 +2415,13 @@ async def put_filter( __body["items"] = items __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_filter", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2292,7 +2555,8 @@ async def put_job( raise ValueError("Empty value passed for parameter 'analysis_config'") if data_description is None and body is None: raise ValueError("Empty value passed for parameter 'data_description'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2338,7 +2602,13 @@ async def put_job( __body["results_retention_days"] = results_retention_days __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2421,7 +2691,8 @@ async def put_trained_model( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_definition_decompression is not None: @@ -2461,7 +2732,13 @@ async def put_trained_model( __body["tags"] = tags __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2503,7 +2780,11 @@ async def put_trained_model_alias( raise ValueError("Empty value passed for parameter 'model_id'") if model_alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_alias'") - __path = f"/_ml/trained_models/{_quote(model_id)}/model_aliases/{_quote(model_alias)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "model_alias": _quote(model_alias), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/model_aliases/{__path_parts["model_alias"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2517,7 +2798,12 @@ async def put_trained_model_alias( __query["reassign"] = reassign __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.put_trained_model_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2565,7 +2851,11 @@ async def put_trained_model_definition_part( ) if total_parts is None and body is None: raise ValueError("Empty value passed for parameter 'total_parts'") - __path = f"/_ml/trained_models/{_quote(model_id)}/definition/{_quote(part)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "part": _quote(part), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/definition/{__path_parts["part"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2585,7 +2875,13 @@ async def put_trained_model_definition_part( __body["total_parts"] = total_parts __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model_definition_part", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2620,7 +2916,8 @@ async def put_trained_model_vocabulary( raise ValueError("Empty value passed for parameter 'model_id'") if vocabulary is None and body is None: raise ValueError("Empty value passed for parameter 'vocabulary'") - __path = f"/_ml/trained_models/{_quote(model_id)}/vocabulary" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/vocabulary' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2640,7 +2937,13 @@ async def put_trained_model_vocabulary( __body["scores"] = scores __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model_vocabulary", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2671,7 +2974,8 @@ async def reset_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_reset" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_reset' __query: t.Dict[str, t.Any] = {} if delete_user_annotations is not None: __query["delete_user_annotations"] = delete_user_annotations @@ -2687,7 +2991,12 @@ async def reset_job( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.reset_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2723,7 +3032,8 @@ async def start_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_start" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_start' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2737,7 +3047,12 @@ async def start_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.start_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2781,7 +3096,8 @@ async def start_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_start" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_start' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2805,7 +3121,13 @@ async def start_datafeed( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.start_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2862,7 +3184,8 @@ async def start_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_start" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_start' __query: t.Dict[str, t.Any] = {} if cache_size is not None: __query["cache_size"] = cache_size @@ -2890,7 +3213,12 @@ async def start_trained_model_deployment( __query["wait_for"] = wait_for __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.start_trained_model_deployment", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2929,7 +3257,8 @@ async def stop_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_stop" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -2947,7 +3276,12 @@ async def stop_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.stop_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2984,7 +3318,8 @@ async def stop_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_stop" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_stop' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3008,7 +3343,13 @@ async def stop_datafeed( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.stop_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -3041,7 +3382,8 @@ async def stop_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_stop" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -3057,7 +3399,12 @@ async def stop_trained_model_deployment( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.stop_trained_model_deployment", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3105,7 +3452,8 @@ async def update_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_update" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3127,7 +3475,13 @@ async def update_data_frame_analytics( __body["model_memory_limit"] = model_memory_limit __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3274,7 +3628,8 @@ async def update_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_update" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -3324,7 +3679,13 @@ async def update_datafeed( __body["scroll_size"] = scroll_size __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3355,7 +3716,8 @@ async def update_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}/_update" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3375,7 +3737,13 @@ async def update_filter( __body["remove_items"] = remove_items __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_filter", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3482,7 +3850,8 @@ async def update_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_update" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3528,7 +3897,13 @@ async def update_job( __body["results_retention_days"] = results_retention_days __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3562,7 +3937,8 @@ async def update_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_update" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3582,5 +3958,11 @@ async def update_trained_model_deployment( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_trained_model_deployment", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/query_ruleset.py b/elasticsearch_serverless/_async/client/query_ruleset.py index a0fb113..685a4ff 100644 --- a/elasticsearch_serverless/_async/client/query_ruleset.py +++ b/elasticsearch_serverless/_async/client/query_ruleset.py @@ -44,7 +44,8 @@ async def delete( """ if ruleset_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'ruleset_id'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ async def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -78,7 +84,8 @@ async def get( """ if ruleset_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'ruleset_id'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -90,7 +97,12 @@ async def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.get", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -114,6 +126,7 @@ async def list( :param from_: Starting offset (default: 0) :param size: specifies a max number of results to get """ + __path_parts: t.Dict[str, str] = {} __path = "/_query_rules" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -130,7 +143,12 @@ async def list( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.list", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -160,7 +178,8 @@ async def put( raise ValueError("Empty value passed for parameter 'ruleset_id'") if rules is None and body is None: raise ValueError("Empty value passed for parameter 'rules'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -176,5 +195,11 @@ async def put( __body["rules"] = rules __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="query_ruleset.put", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/search_application.py b/elasticsearch_serverless/_async/client/search_application.py index 3892eb7..73fc368 100644 --- a/elasticsearch_serverless/_async/client/search_application.py +++ b/elasticsearch_serverless/_async/client/search_application.py @@ -44,7 +44,8 @@ async def delete( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ async def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -78,7 +84,8 @@ async def delete_behavioral_analytics( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/analytics/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -90,7 +97,12 @@ async def delete_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.delete_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -112,7 +124,8 @@ async def get( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -124,7 +137,12 @@ async def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -144,9 +162,12 @@ async def get_behavioral_analytics( :param name: A list of analytics collections to limit the returned information """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_application/analytics/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_application/analytics" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -159,7 +180,12 @@ async def get_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.get_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -185,6 +211,7 @@ async def list( :param q: Query in the Lucene query string syntax. :param size: Specifies a max number of results to get. """ + __path_parts: t.Dict[str, str] = {} __path = "/_application/search_application" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -203,7 +230,12 @@ async def list( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.list", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -239,7 +271,8 @@ async def put( ) elif search_application is not None and body is not None: raise ValueError("Cannot set both 'search_application' and 'body'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if create is not None: __query["create"] = create @@ -254,7 +287,13 @@ async def put( __body = search_application if search_application is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_application.put", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -276,7 +315,8 @@ async def put_behavioral_analytics( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/analytics/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -288,7 +328,12 @@ async def put_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.put_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -320,7 +365,8 @@ async def search( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}/_search" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}/_search' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -342,5 +388,11 @@ async def search( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_application.search", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/security.py b/elasticsearch_serverless/_async/client/security.py index 23e97e9..9291e6c 100644 --- a/elasticsearch_serverless/_async/client/security.py +++ b/elasticsearch_serverless/_async/client/security.py @@ -44,6 +44,7 @@ async def authenticate( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/_authenticate" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -56,7 +57,12 @@ async def authenticate( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="security.authenticate", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -105,6 +111,7 @@ async def create_api_key( is the same as the request for create role API. For more details, see create or update roles API. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -129,7 +136,13 @@ async def create_api_key( __body["role_descriptors"] = role_descriptors __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.create_api_key", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -180,6 +193,7 @@ async def get_api_key( :param with_profile_uid: Determines whether to also retrieve the profile uid, for the API key owner principal, if it exists. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} if active_only is not None: @@ -208,7 +222,12 @@ async def get_api_key( __query["with_profile_uid"] = with_profile_uid __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="security.get_api_key", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -244,9 +263,12 @@ async def has_privileges( :param cluster: A list of the cluster privileges that you want to check. :param index: """ + __path_parts: t.Dict[str, str] if user not in SKIP_IN_PATH: - __path = f"/_security/user/{_quote(user)}/_has_privileges" + __path_parts = {"user": _quote(user)} + __path = f'/_security/user/{__path_parts["user"]}/_has_privileges' else: + __path_parts = {} __path = "/_security/user/_has_privileges" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -267,7 +289,13 @@ async def has_privileges( __body["index"] = index __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.has_privileges", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -313,6 +341,7 @@ async def invalidate_api_key( :param username: The username of a user. This parameter cannot be used with either `ids` or `name`, or when `owner` flag is set to `true`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -339,7 +368,13 @@ async def invalidate_api_key( __body["username"] = username __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.invalidate_api_key", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -423,6 +458,7 @@ async def query_api_keys( :param with_profile_uid: Determines whether to also retrieve the profile uid, for the API key owner principal, if it exists. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/_query/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -472,7 +508,13 @@ async def query_api_keys( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.query_api_keys", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -527,7 +569,8 @@ async def update_api_key( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_security/api_key/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_security/api_key/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -551,5 +594,11 @@ async def update_api_key( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.update_api_key", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/sql.py b/elasticsearch_serverless/_async/client/sql.py index 5bc1448..9dc219c 100644 --- a/elasticsearch_serverless/_async/client/sql.py +++ b/elasticsearch_serverless/_async/client/sql.py @@ -47,6 +47,7 @@ async def clear_cursor( """ if cursor is None and body is None: raise ValueError("Empty value passed for parameter 'cursor'") + __path_parts: t.Dict[str, str] = {} __path = "/_sql/close" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -63,7 +64,13 @@ async def clear_cursor( __body["cursor"] = cursor __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.clear_cursor", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -86,7 +93,8 @@ async def delete_async( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/delete/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/delete/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -98,7 +106,12 @@ async def delete_async( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.delete_async", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -136,7 +149,8 @@ async def get_async( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if delimiter is not None: __query["delimiter"] = delimiter @@ -156,7 +170,12 @@ async def get_async( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.get_async", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -179,7 +198,8 @@ async def get_async_status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -191,7 +211,12 @@ async def get_async_status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.get_async_status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -281,6 +306,7 @@ async def query( to no timeout, meaning the request waits for complete search results. If the search doesn’t finish within this period, the search becomes async. """ + __path_parts: t.Dict[str, str] = {} __path = "/_sql" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -329,7 +355,13 @@ async def query( __body["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.query", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -360,6 +392,7 @@ async def translate( """ if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") + __path_parts: t.Dict[str, str] = {} __path = "/_sql/translate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -382,5 +415,11 @@ async def translate( __body["time_zone"] = time_zone __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.translate", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/synonyms.py b/elasticsearch_serverless/_async/client/synonyms.py index d446c84..0f6ec91 100644 --- a/elasticsearch_serverless/_async/client/synonyms.py +++ b/elasticsearch_serverless/_async/client/synonyms.py @@ -44,7 +44,8 @@ async def delete_synonym( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ async def delete_synonym( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.delete_synonym", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -82,7 +88,11 @@ async def delete_synonym_rule( raise ValueError("Empty value passed for parameter 'set_id'") if rule_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'rule_id'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -94,7 +104,12 @@ async def delete_synonym_rule( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.delete_synonym_rule", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -122,7 +137,8 @@ async def get_synonym( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -138,7 +154,12 @@ async def get_synonym( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonym", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -164,7 +185,11 @@ async def get_synonym_rule( raise ValueError("Empty value passed for parameter 'set_id'") if rule_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'rule_id'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -176,7 +201,12 @@ async def get_synonym_rule( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonym_rule", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -200,6 +230,7 @@ async def get_synonyms_sets( :param from_: Starting offset :param size: specifies a max number of results to get """ + __path_parts: t.Dict[str, str] = {} __path = "/_synonyms" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -216,7 +247,12 @@ async def get_synonyms_sets( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonyms_sets", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -245,7 +281,8 @@ async def put_synonym( raise ValueError("Empty value passed for parameter 'id'") if synonyms_set is None and body is None: raise ValueError("Empty value passed for parameter 'synonyms_set'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -261,7 +298,13 @@ async def put_synonym( __body["synonyms_set"] = synonyms_set __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="synonyms.put_synonym", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -294,7 +337,11 @@ async def put_synonym_rule( raise ValueError("Empty value passed for parameter 'rule_id'") if synonyms is None and body is None: raise ValueError("Empty value passed for parameter 'synonyms'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -310,5 +357,11 @@ async def put_synonym_rule( __body["synonyms"] = synonyms __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="synonyms.put_synonym_rule", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/tasks.py b/elasticsearch_serverless/_async/client/tasks.py index c7d9f99..9306a84 100644 --- a/elasticsearch_serverless/_async/client/tasks.py +++ b/elasticsearch_serverless/_async/client/tasks.py @@ -50,7 +50,8 @@ async def get( """ if task_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'task_id'") - __path = f"/_tasks/{_quote(task_id)}" + __path_parts: t.Dict[str, str] = {"task_id": _quote(task_id)} + __path = f'/_tasks/{__path_parts["task_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -66,5 +67,10 @@ async def get( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="tasks.get", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_async/client/transform.py b/elasticsearch_serverless/_async/client/transform.py index cab0492..faa6557 100644 --- a/elasticsearch_serverless/_async/client/transform.py +++ b/elasticsearch_serverless/_async/client/transform.py @@ -55,7 +55,8 @@ async def delete_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' __query: t.Dict[str, t.Any] = {} if delete_dest_index is not None: __query["delete_dest_index"] = delete_dest_index @@ -73,7 +74,12 @@ async def delete_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.delete_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -111,9 +117,12 @@ async def get_transform( :param from_: Skips the specified number of transforms. :param size: Specifies the maximum number of transforms to obtain. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_transform/{_quote(transform_id)}" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' else: + __path_parts = {} __path = "/_transform" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -134,7 +143,12 @@ async def get_transform( __query["size"] = size __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.get_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -172,7 +186,8 @@ async def get_transform_stats( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_stats" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_stats' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -192,7 +207,12 @@ async def get_transform_stats( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.get_transform_stats", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -258,9 +278,12 @@ async def preview_transform( :param timeout: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_transform/{_quote(transform_id)}/_preview" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_preview' else: + __path_parts = {} __path = "/_transform/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -299,7 +322,13 @@ async def preview_transform( if __body is not None: __headers["content-type"] = "application/json" return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.preview_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -399,7 +428,8 @@ async def put_transform( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") - __path = f"/_transform/{_quote(transform_id)}" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_validation is not None: @@ -437,7 +467,13 @@ async def put_transform( __body["sync"] = sync __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.put_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -467,7 +503,8 @@ async def reset_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_reset" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_reset' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -481,7 +518,12 @@ async def reset_transform( __query["pretty"] = pretty __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.reset_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -508,7 +550,8 @@ async def schedule_now_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_schedule_now" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_schedule_now' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -522,7 +565,12 @@ async def schedule_now_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.schedule_now_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -569,7 +617,8 @@ async def start_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_start" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_start' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -585,7 +634,12 @@ async def start_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.start_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -632,7 +686,8 @@ async def stop_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_stop" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -654,7 +709,12 @@ async def stop_transform( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.stop_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -722,7 +782,8 @@ async def update_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_update" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_validation is not None: @@ -756,5 +817,11 @@ async def update_transform( __body["sync"] = sync __headers = {"accept": "application/json", "content-type": "application/json"} return await self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.update_transform", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/__init__.py b/elasticsearch_serverless/_sync/client/__init__.py index 7cade1e..0453a8f 100644 --- a/elasticsearch_serverless/_sync/client/__init__.py +++ b/elasticsearch_serverless/_sync/client/__init__.py @@ -503,9 +503,12 @@ def bulk( ) elif operations is not None and body is not None: raise ValueError("Cannot set both 'operations' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_bulk" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_bulk' else: + __path_parts = {} __path = "/_bulk" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -540,7 +543,13 @@ def bulk( "content-type": "application/x-ndjson", } return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="bulk", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -563,6 +572,7 @@ def clear_scroll( :param scroll_id: Scroll IDs to clear. To clear all scroll IDs, use `_all`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_search/scroll" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -583,7 +593,13 @@ def clear_scroll( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="clear_scroll", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -608,6 +624,7 @@ def close_point_in_time( """ if id is None and body is None: raise ValueError("Empty value passed for parameter 'id'") + __path_parts: t.Dict[str, str] = {} __path = "/_pit" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -628,7 +645,13 @@ def close_point_in_time( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="close_point_in_time", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -708,9 +731,12 @@ def count( If a query reaches this limit, Elasticsearch terminates the query early. Elasticsearch collects documents before sorting. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_count" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_count' else: + __path_parts = {} __path = "/_count" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -759,7 +785,13 @@ def count( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="count", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -834,7 +866,8 @@ def create( ) elif document is not None and body is not None: raise ValueError("Cannot set both 'document' and 'body'") - __path = f"/{_quote(index)}/_create/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_create/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -861,7 +894,13 @@ def create( __body = document if document is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="create", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -918,7 +957,8 @@ def delete( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -946,7 +986,12 @@ def delete( __query["wait_for_active_shards"] = wait_for_active_shards __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="delete", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1077,7 +1122,8 @@ def delete_by_query( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_delete_by_query" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_delete_by_query' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -1164,7 +1210,13 @@ def delete_by_query( __body["slice"] = slice __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="delete_by_query", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1195,7 +1247,8 @@ def delete_script( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_scripts/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1211,7 +1264,12 @@ def delete_script( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="delete_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1275,7 +1333,8 @@ def exists( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1307,7 +1366,12 @@ def exists( __query["version_type"] = version_type __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="exists", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1367,7 +1431,8 @@ def exists_source( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_source/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_source/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1397,7 +1462,12 @@ def exists_source( __query["version_type"] = version_type __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="exists_source", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1468,7 +1538,8 @@ def explain( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_explain/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_explain/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if analyze_wildcard is not None: @@ -1512,7 +1583,13 @@ def explain( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="explain", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1581,9 +1658,12 @@ def field_caps( :param types: Only return results for fields that have one of the types in the list """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_field_caps" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_field_caps' else: + __path_parts = {} __path = "/_field_caps" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1622,7 +1702,13 @@ def field_caps( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="field_caps", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1690,7 +1776,8 @@ def get( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1724,7 +1811,12 @@ def get( __query["version_type"] = version_type __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1750,7 +1842,8 @@ def get_script( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_scripts/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1764,7 +1857,12 @@ def get_script( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1825,7 +1923,8 @@ def get_source( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_source/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_source/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1857,7 +1956,12 @@ def get_source( __query["version_type"] = version_type __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="get_source", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1940,11 +2044,14 @@ def index( ) elif document is not None and body is not None: raise ValueError("Cannot set both 'document' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and id not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_doc/{_quote(id)}" + __path_parts = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_doc/{__path_parts["id"]}' __method = "PUT" elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_doc" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_doc' __method = "POST" else: raise ValueError("Couldn't find a path for the given parameters") @@ -1982,7 +2089,13 @@ def index( __body = document if document is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - __method, __path, params=__query, headers=__headers, body=__body + __method, + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="index", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1999,6 +2112,7 @@ def info( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -2011,7 +2125,12 @@ def info( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="info", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2077,9 +2196,12 @@ def mget( :param stored_fields: If `true`, retrieves the document fields stored in the index rather than the document `_source`. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mget" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mget' else: + __path_parts = {} __path = "/_mget" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2116,7 +2238,13 @@ def mget( __body["ids"] = ids __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="mget", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2201,9 +2329,12 @@ def msearch( ) elif searches is not None and body is not None: raise ValueError("Cannot set both 'searches' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_msearch" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_msearch' else: + __path_parts = {} __path = "/_msearch" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2244,7 +2375,13 @@ def msearch( "content-type": "application/x-ndjson", } return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="msearch", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2294,9 +2431,12 @@ def msearch_template( ) elif search_templates is not None and body is not None: raise ValueError("Cannot set both 'search_templates' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_msearch/template" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_msearch/template' else: + __path_parts = {} __path = "/_msearch/template" __query: t.Dict[str, t.Any] = {} if ccs_minimize_roundtrips is not None: @@ -2323,7 +2463,13 @@ def msearch_template( "content-type": "application/x-ndjson", } return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="msearch_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2380,9 +2526,12 @@ def mtermvectors( :param version: If `true`, returns the document version as part of a hit. :param version_type: Specific version type. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mtermvectors" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mtermvectors' else: + __path_parts = {} __path = "/_mtermvectors" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2427,7 +2576,13 @@ def mtermvectors( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="mtermvectors", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2480,7 +2635,8 @@ def open_point_in_time( raise ValueError("Empty value passed for parameter 'index'") if keep_alive is None: raise ValueError("Empty value passed for parameter 'keep_alive'") - __path = f"/{_quote(index)}/_pit" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_pit' __query: t.Dict[str, t.Any] = {} if keep_alive is not None: __query["keep_alive"] = keep_alive @@ -2502,7 +2658,12 @@ def open_point_in_time( __query["routing"] = routing __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="open_point_in_time", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2546,10 +2707,13 @@ def put_script( raise ValueError("Empty value passed for parameter 'id'") if script is None and body is None: raise ValueError("Empty value passed for parameter 'script'") + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH and context not in SKIP_IN_PATH: - __path = f"/_scripts/{_quote(id)}/{_quote(context)}" + __path_parts = {"id": _quote(id), "context": _quote(context)} + __path = f'/_scripts/{__path_parts["id"]}/{__path_parts["context"]}' elif id not in SKIP_IN_PATH: - __path = f"/_scripts/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_scripts/{__path_parts["id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -2571,7 +2735,13 @@ def put_script( __body["script"] = script __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="put_script", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2626,9 +2796,12 @@ def rank_eval( """ if requests is None and body is None: raise ValueError("Empty value passed for parameter 'requests'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_rank_eval" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_rank_eval' else: + __path_parts = {} __path = "/_rank_eval" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2655,7 +2828,13 @@ def rank_eval( __body["metric"] = metric __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="rank_eval", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2721,6 +2900,7 @@ def reindex( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") + __path_parts: t.Dict[str, str] = {} __path = "/_reindex" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2763,7 +2943,13 @@ def reindex( __body["size"] = size __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="reindex", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2797,9 +2983,12 @@ def render_search_template( search API's request body. These parameters also support Mustache variables. If no `id` or `` is specified, this parameter is required. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_render/template/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_render/template/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_render/template" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2824,7 +3013,13 @@ def render_search_template( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="render_search_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2851,6 +3046,7 @@ def scripts_painless_execute( :param context_setup: Additional parameters for the `context`. :param script: The Painless script to execute. """ + __path_parts: t.Dict[str, str] = {} __path = "/_scripts/painless/_execute" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2875,7 +3071,13 @@ def scripts_painless_execute( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="scripts_painless_execute", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2906,6 +3108,7 @@ def scroll( """ if scroll_id is None and body is None: raise ValueError("Empty value passed for parameter 'scroll_id'") + __path_parts: t.Dict[str, str] = {} __path = "/_search/scroll" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2930,7 +3133,13 @@ def scroll( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="scroll", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3271,9 +3480,12 @@ def search( by their respective types in the response. :param version: If true, returns document version as part of a hit. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_search" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_search' else: + __path_parts = {} __path = "/_search" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -3433,7 +3645,13 @@ def search( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3548,7 +3766,14 @@ def search_mvt( raise ValueError("Empty value passed for parameter 'x'") if y in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'y'") - __path = f"/{_quote(index)}/_mvt/{_quote(field)}/{_quote(zoom)}/{_quote(x)}/{_quote(y)}" + __path_parts: t.Dict[str, str] = { + "index": _quote(index), + "field": _quote(field), + "zoom": _quote(zoom), + "x": _quote(x), + "y": _quote(y), + } + __path = f'/{__path_parts["index"]}/_mvt/{__path_parts["field"]}/{__path_parts["zoom"]}/{__path_parts["x"]}/{__path_parts["y"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -3605,7 +3830,13 @@ def search_mvt( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_mvt", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3690,9 +3921,12 @@ def search_template( :param typed_keys: If `true`, the response prefixes aggregation and suggester names with their respective types. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_search/template" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_search/template' else: + __path_parts = {} __path = "/_search/template" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -3739,7 +3973,13 @@ def search_template( __body["source"] = source __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3798,7 +4038,8 @@ def terms_enum( raise ValueError("Empty value passed for parameter 'index'") if field is None and body is None: raise ValueError("Empty value passed for parameter 'field'") - __path = f"/{_quote(index)}/_terms_enum" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_terms_enum' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3830,7 +4071,13 @@ def terms_enum( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="terms_enum", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3894,10 +4141,13 @@ def termvectors( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and id not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_termvectors/{_quote(id)}" + __path_parts = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_termvectors/{__path_parts["id"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_termvectors" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_termvectors' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -3945,7 +4195,13 @@ def termvectors( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="termvectors", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -4042,7 +4298,8 @@ def update( raise ValueError("Empty value passed for parameter 'index'") if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/{_quote(index)}/_update/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "id": _quote(id)} + __path = f'/{__path_parts["index"]}/_update/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -4092,7 +4349,13 @@ def update( __body["upsert"] = upsert __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="update", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -4234,7 +4497,8 @@ def update_by_query( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_update_by_query" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_update_by_query' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} # The 'sort' parameter with a colon can't be encoded to the body. @@ -4329,5 +4593,11 @@ def update_by_query( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="update_by_query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/async_search.py b/elasticsearch_serverless/_sync/client/async_search.py index 264ed1e..8f53c40 100644 --- a/elasticsearch_serverless/_sync/client/async_search.py +++ b/elasticsearch_serverless/_sync/client/async_search.py @@ -48,7 +48,8 @@ def delete( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -60,7 +61,12 @@ def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -104,7 +110,8 @@ def get( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -122,7 +129,12 @@ def get( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -147,7 +159,8 @@ def status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_async_search/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_async_search/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -159,7 +172,12 @@ def status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="async_search.status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -443,9 +461,12 @@ def submit( up to a certain timeout. When the async search completes within the timeout, the response won’t include the ID as the results are not stored in the cluster. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_async_search" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_async_search' else: + __path_parts = {} __path = "/_async_search" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -605,5 +626,11 @@ def submit( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="async_search.submit", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/cat.py b/elasticsearch_serverless/_sync/client/cat.py index addc866..5c55a17 100644 --- a/elasticsearch_serverless/_sync/client/cat.py +++ b/elasticsearch_serverless/_sync/client/cat.py @@ -80,9 +80,12 @@ def aliases( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_cat/aliases/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_cat/aliases/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_cat/aliases" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -111,7 +114,12 @@ def aliases( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.aliases", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -159,9 +167,12 @@ def component_templates( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_cat/component_templates/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_cat/component_templates/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_cat/component_templates" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -188,7 +199,12 @@ def component_templates( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.component_templates", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -238,9 +254,12 @@ def count( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/_cat/count/{_quote(index)}" + __path_parts = {"index": _quote(index)} + __path = f'/_cat/count/{__path_parts["index"]}' else: + __path_parts = {} __path = "/_cat/count" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -267,7 +286,12 @@ def count( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.count", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -308,6 +332,7 @@ def help( a suffix to the column name. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] = {} __path = "/_cat" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -334,7 +359,12 @@ def help( __query["v"] = v __headers = {"accept": "text/plain"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.help", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -413,9 +443,12 @@ def indices( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/_cat/indices/{_quote(index)}" + __path_parts = {"index": _quote(index)} + __path = f'/_cat/indices/{__path_parts["index"]}' else: + __path_parts = {} __path = "/_cat/indices" __query: t.Dict[str, t.Any] = {} if bytes is not None: @@ -454,7 +487,12 @@ def indices( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.indices", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -534,9 +572,12 @@ def ml_data_frame_analytics( :param time: Unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_cat/ml/data_frame/analytics/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_cat/ml/data_frame/analytics/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_cat/ml/data_frame/analytics" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -569,7 +610,12 @@ def ml_data_frame_analytics( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -655,9 +701,12 @@ def ml_datafeeds( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/datafeeds/{_quote(datafeed_id)}" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_cat/ml/datafeeds/{__path_parts["datafeed_id"]}' else: + __path_parts = {} __path = "/_cat/ml/datafeeds" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -688,7 +737,12 @@ def ml_datafeeds( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_datafeeds", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -778,9 +832,12 @@ def ml_jobs( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/anomaly_detectors/{_quote(job_id)}" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_cat/ml/anomaly_detectors/{__path_parts["job_id"]}' else: + __path_parts = {} __path = "/_cat/ml/anomaly_detectors" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -813,7 +870,12 @@ def ml_jobs( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_jobs", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -902,9 +964,12 @@ def ml_trained_models( :param size: The maximum number of transforms to display. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_cat/ml/trained_models/{_quote(model_id)}" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_cat/ml/trained_models/{__path_parts["model_id"]}' else: + __path_parts = {} __path = "/_cat/ml/trained_models" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -939,7 +1004,12 @@ def ml_trained_models( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.ml_trained_models", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1030,9 +1100,12 @@ def transforms( :param time: The unit used to display time values. :param v: When set to `true` will enable verbose output. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_cat/transforms/{_quote(transform_id)}" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_cat/transforms/{__path_parts["transform_id"]}' else: + __path_parts = {} __path = "/_cat/transforms" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1067,5 +1140,10 @@ def transforms( __query["v"] = v __headers = {"accept": "text/plain,application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cat.transforms", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/cluster.py b/elasticsearch_serverless/_sync/client/cluster.py index 0486421..b9ccbf3 100644 --- a/elasticsearch_serverless/_sync/client/cluster.py +++ b/elasticsearch_serverless/_sync/client/cluster.py @@ -55,7 +55,8 @@ def delete_component_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -71,7 +72,12 @@ def delete_component_template( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.delete_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -104,7 +110,8 @@ def exists_component_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -120,7 +127,12 @@ def exists_component_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.exists_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -155,9 +167,12 @@ def get_component_template( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_component_template/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_component_template" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -178,7 +193,12 @@ def get_component_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.get_component_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -210,7 +230,8 @@ def info( """ if target in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'target'") - __path = f"/_info/{_quote(target)}" + __path_parts: t.Dict[str, str] = {"target": _quote(target)} + __path = f'/_info/{__path_parts["target"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -222,7 +243,12 @@ def info( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="cluster.info", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -295,7 +321,8 @@ def put_component_template( raise ValueError("Empty value passed for parameter 'name'") if template is None and body is None: raise ValueError("Empty value passed for parameter 'template'") - __path = f"/_component_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_component_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if create is not None: @@ -321,5 +348,11 @@ def put_component_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="cluster.put_component_template", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/enrich.py b/elasticsearch_serverless/_sync/client/enrich.py index 43bda54..c6bf5f2 100644 --- a/elasticsearch_serverless/_sync/client/enrich.py +++ b/elasticsearch_serverless/_sync/client/enrich.py @@ -44,7 +44,8 @@ def delete_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ def delete_policy( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.delete_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -81,7 +87,8 @@ def execute_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}/_execute" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}/_execute' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -95,7 +102,12 @@ def execute_policy( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.execute_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -116,9 +128,12 @@ def get_policy( :param name: Comma-separated list of enrich policy names used to limit the request. To return information for all enrich policies, omit this parameter. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_enrich/policy" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -131,7 +146,12 @@ def get_policy( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.get_policy", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -164,7 +184,8 @@ def put_policy( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_enrich/policy/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_enrich/policy/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -184,7 +205,13 @@ def put_policy( __body["range"] = range __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="enrich.put_policy", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -202,6 +229,7 @@ def stats( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_enrich/_stats" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -214,5 +242,10 @@ def stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="enrich.stats", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/eql.py b/elasticsearch_serverless/_sync/client/eql.py index 92d594e..4c57f43 100644 --- a/elasticsearch_serverless/_sync/client/eql.py +++ b/elasticsearch_serverless/_sync/client/eql.py @@ -47,7 +47,8 @@ def delete( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -59,7 +60,12 @@ def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -92,7 +98,8 @@ def get( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -108,7 +115,12 @@ def get( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -131,7 +143,8 @@ def get_status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_eql/search/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_eql/search/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -143,7 +156,12 @@ def get_status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="eql.get_status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -239,7 +257,8 @@ def search( raise ValueError("Empty value passed for parameter 'index'") if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") - __path = f"/{_quote(index)}/_eql/search" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_eql/search' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -287,5 +306,11 @@ def search( __body["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="eql.search", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/esql.py b/elasticsearch_serverless/_sync/client/esql.py index 7434338..f3acd38 100644 --- a/elasticsearch_serverless/_sync/client/esql.py +++ b/elasticsearch_serverless/_sync/client/esql.py @@ -68,6 +68,7 @@ def query( """ if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") + __path_parts: t.Dict[str, str] = {} __path = "/_query" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -96,5 +97,11 @@ def query( __body["params"] = params __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="esql.query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/graph.py b/elasticsearch_serverless/_sync/client/graph.py index b76171f..45f4965 100644 --- a/elasticsearch_serverless/_sync/client/graph.py +++ b/elasticsearch_serverless/_sync/client/graph.py @@ -65,7 +65,8 @@ def explore( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_graph/explore" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_graph/explore' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -95,5 +96,11 @@ def explore( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="graph.explore", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/indices.py b/elasticsearch_serverless/_sync/client/indices.py index 988d44e..fba6bf6 100644 --- a/elasticsearch_serverless/_sync/client/indices.py +++ b/elasticsearch_serverless/_sync/client/indices.py @@ -71,7 +71,11 @@ def add_block( raise ValueError("Empty value passed for parameter 'index'") if block in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'block'") - __path = f"/{_quote(index)}/_block/{_quote(block)}" + __path_parts: t.Dict[str, str] = { + "index": _quote(index), + "block": _quote(block), + } + __path = f'/{__path_parts["index"]}/_block/{__path_parts["block"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -93,7 +97,12 @@ def add_block( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.add_block", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -154,9 +163,12 @@ def analyze( as a multi-value field. :param tokenizer: Tokenizer to use to convert text into tokens. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_analyze" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_analyze' else: + __path_parts = {} __path = "/_analyze" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -193,7 +205,13 @@ def analyze( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.analyze", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -240,7 +258,8 @@ def create( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -270,7 +289,13 @@ def create( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.create", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -297,7 +322,8 @@ def create_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -309,7 +335,12 @@ def create_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.create_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -341,9 +372,12 @@ def data_streams_stats( :param expand_wildcards: Type of data stream that wildcard patterns can match. Supports comma-separated values, such as `open,hidden`. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_data_stream/{_quote(name)}/_stats" + __path_parts = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_stats' else: + __path_parts = {} __path = "/_data_stream/_stats" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -358,7 +392,12 @@ def data_streams_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.data_streams_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -411,7 +450,8 @@ def delete( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -433,7 +473,12 @@ def delete( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -470,7 +515,8 @@ def delete_alias( raise ValueError("Empty value passed for parameter 'index'") if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -486,7 +532,12 @@ def delete_alias( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -526,7 +577,8 @@ def delete_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -544,7 +596,12 @@ def delete_data_lifecycle( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -577,7 +634,8 @@ def delete_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -591,7 +649,12 @@ def delete_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -625,7 +688,8 @@ def delete_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -641,7 +705,12 @@ def delete_index_template( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.delete_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -690,7 +759,8 @@ def exists( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -714,7 +784,12 @@ def exists( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -762,10 +837,13 @@ def exists_alias( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' elif name not in SKIP_IN_PATH: - __path = f"/_alias/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_alias/{__path_parts["name"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -787,7 +865,12 @@ def exists_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -816,7 +899,8 @@ def exists_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -830,7 +914,12 @@ def exists_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "HEAD", __path, params=__query, headers=__headers + "HEAD", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.exists_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -860,7 +949,8 @@ def explain_data_lifecycle( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_lifecycle/explain" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_lifecycle/explain' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -876,7 +966,12 @@ def explain_data_lifecycle( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.explain_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -944,7 +1039,8 @@ def get( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}' __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: __query["allow_no_indices"] = allow_no_indices @@ -972,7 +1068,12 @@ def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1019,13 +1120,18 @@ def get_alias( :param local: If `true`, the request retrieves information from the local node only. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_alias" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_alias' elif name not in SKIP_IN_PATH: - __path = f"/_alias/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_alias/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_alias" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1046,7 +1152,12 @@ def get_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_alias", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1083,7 +1194,8 @@ def get_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1099,7 +1211,12 @@ def get_data_lifecycle( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1134,9 +1251,12 @@ def get_data_stream( :param include_defaults: If true, returns all relevant default configurations for the index template. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_data_stream/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_data_stream" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1153,7 +1273,12 @@ def get_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1189,9 +1314,12 @@ def get_index_template( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_index_template/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_index_template" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1212,7 +1340,12 @@ def get_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_index_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1263,9 +1396,12 @@ def get_mapping( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_mapping" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mapping' else: + __path_parts = {} __path = "/_mapping" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1288,7 +1424,12 @@ def get_mapping( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_mapping", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1347,13 +1488,18 @@ def get_settings( no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH and name not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings/{_quote(name)}" + __path_parts = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_settings/{__path_parts["name"]}' elif index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_settings' elif name not in SKIP_IN_PATH: - __path = f"/_settings/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_settings/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_settings" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -1380,7 +1526,12 @@ def get_settings( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.get_settings", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1409,7 +1560,8 @@ def migrate_to_data_stream( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/_migrate/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/_migrate/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1421,7 +1573,12 @@ def migrate_to_data_stream( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.migrate_to_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1446,6 +1603,7 @@ def modify_data_stream( """ if actions is None and body is None: raise ValueError("Empty value passed for parameter 'actions'") + __path_parts: t.Dict[str, str] = {} __path = "/_data_stream/_modify" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1462,7 +1620,13 @@ def modify_data_stream( __body["actions"] = actions __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.modify_data_stream", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1529,7 +1693,8 @@ def put_alias( raise ValueError("Empty value passed for parameter 'index'") if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/{_quote(index)}/_alias/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"index": _quote(index), "name": _quote(name)} + __path = f'/{__path_parts["index"]}/_alias/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1561,7 +1726,13 @@ def put_alias( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1618,7 +1789,8 @@ def put_data_lifecycle( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_data_stream/{_quote(name)}/_lifecycle" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_data_stream/{__path_parts["name"]}/_lifecycle' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1646,7 +1818,13 @@ def put_data_lifecycle( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_data_lifecycle", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1735,7 +1913,8 @@ def put_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if cause is not None: @@ -1777,7 +1956,13 @@ def put_index_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_index_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1889,7 +2074,8 @@ def put_mapping( """ if index in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'index'") - __path = f"/{_quote(index)}/_mapping" + __path_parts: t.Dict[str, str] = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_mapping' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -1937,7 +2123,13 @@ def put_mapping( __body["_source"] = source __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_mapping", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2004,9 +2196,12 @@ def put_settings( ) elif settings is not None and body is not None: raise ValueError("Cannot set both 'settings' and 'body'") + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_settings" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_settings' else: + __path_parts = {} __path = "/_settings" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2034,7 +2229,13 @@ def put_settings( __body = settings if settings is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_settings", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2095,7 +2296,8 @@ def put_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_template/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_template/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if cause is not None: @@ -2127,7 +2329,13 @@ def put_template( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.put_template", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2170,9 +2378,12 @@ def refresh( :param ignore_unavailable: If `false`, the request returns an error if it targets a missing or closed index. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_refresh" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_refresh' else: + __path_parts = {} __path = "/_refresh" __query: t.Dict[str, t.Any] = {} if allow_no_indices is not None: @@ -2191,7 +2402,12 @@ def refresh( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.refresh", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2228,7 +2444,8 @@ def resolve_index( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_resolve/index/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_resolve/index/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2242,7 +2459,12 @@ def resolve_index( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.resolve_index", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2304,10 +2526,13 @@ def rollover( """ if alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'alias'") + __path_parts: t.Dict[str, str] if alias not in SKIP_IN_PATH and new_index not in SKIP_IN_PATH: - __path = f"/{_quote(alias)}/_rollover/{_quote(new_index)}" + __path_parts = {"alias": _quote(alias), "new_index": _quote(new_index)} + __path = f'/{__path_parts["alias"]}/_rollover/{__path_parts["new_index"]}' elif alias not in SKIP_IN_PATH: - __path = f"/{_quote(alias)}/_rollover" + __path_parts = {"alias": _quote(alias)} + __path = f'/{__path_parts["alias"]}/_rollover' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -2343,7 +2568,13 @@ def rollover( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.rollover", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2374,7 +2605,8 @@ def simulate_index_template( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_index_template/_simulate_index/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_index_template/_simulate_index/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2390,7 +2622,12 @@ def simulate_index_template( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="indices.simulate_index_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2482,9 +2719,12 @@ def simulate_template( :param version: Version number used to manage index templates externally. This number is not automatically generated by Elasticsearch. """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_index_template/_simulate/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_index_template/_simulate/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_index_template/_simulate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2531,7 +2771,13 @@ def simulate_template( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.simulate_template", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2563,6 +2809,7 @@ def update_aliases( :param timeout: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] = {} __path = "/_aliases" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2583,7 +2830,13 @@ def update_aliases( __body["actions"] = actions __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.update_aliases", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2655,9 +2908,12 @@ def validate_query( :param rewrite: If `true`, returns a more detailed explanation showing the actual Lucene query that will be executed. """ + __path_parts: t.Dict[str, str] if index not in SKIP_IN_PATH: - __path = f"/{_quote(index)}/_validate/query" + __path_parts = {"index": _quote(index)} + __path = f'/{__path_parts["index"]}/_validate/query' else: + __path_parts = {} __path = "/_validate/query" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -2702,5 +2958,11 @@ def validate_query( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="indices.validate_query", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/inference.py b/elasticsearch_serverless/_sync/client/inference.py index 029a8d9..be4a9cf 100644 --- a/elasticsearch_serverless/_sync/client/inference.py +++ b/elasticsearch_serverless/_sync/client/inference.py @@ -57,10 +57,16 @@ def delete( """ if inference_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'inference_id'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -78,7 +84,12 @@ def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="inference.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -105,11 +116,18 @@ def get( :param task_type: The task type :param inference_id: The inference Id """ + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: + __path_parts = {} __path = "/_inference" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -122,7 +140,12 @@ def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="inference.get", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -165,10 +188,16 @@ def inference( raise ValueError("Empty value passed for parameter 'inference_id'") if input is None and body is None: raise ValueError("Empty value passed for parameter 'input'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -196,7 +225,13 @@ def inference( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="inference.inference", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -236,10 +271,16 @@ def put( ) elif inference_config is not None and body is not None: raise ValueError("Cannot set both 'inference_config' and 'body'") + __path_parts: t.Dict[str, str] if task_type not in SKIP_IN_PATH and inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(task_type)}/{_quote(inference_id)}" + __path_parts = { + "task_type": _quote(task_type), + "inference_id": _quote(inference_id), + } + __path = f'/_inference/{__path_parts["task_type"]}/{__path_parts["inference_id"]}' elif inference_id not in SKIP_IN_PATH: - __path = f"/_inference/{_quote(inference_id)}" + __path_parts = {"inference_id": _quote(inference_id)} + __path = f'/_inference/{__path_parts["inference_id"]}' else: raise ValueError("Couldn't find a path for the given parameters") __query: t.Dict[str, t.Any] = {} @@ -254,5 +295,11 @@ def put( __body = inference_config if inference_config is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="inference.put", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/ingest.py b/elasticsearch_serverless/_sync/client/ingest.py index 1f7995c..e0becc3 100644 --- a/elasticsearch_serverless/_sync/client/ingest.py +++ b/elasticsearch_serverless/_sync/client/ingest.py @@ -54,7 +54,8 @@ def delete_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -70,7 +71,12 @@ def delete_pipeline( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.delete_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -100,9 +106,12 @@ def get_pipeline( returns an error. :param summary: Return pipelines without their definitions (default: false) """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_ingest/pipeline" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -119,7 +128,12 @@ def get_pipeline( __query["summary"] = summary __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.get_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -139,6 +153,7 @@ def processor_grok( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_ingest/processor/grok" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -151,7 +166,12 @@ def processor_grok( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ingest.processor_grok", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -209,7 +229,8 @@ def put_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ingest/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -239,7 +260,13 @@ def put_pipeline( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ingest.put_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -272,9 +299,12 @@ def simulate( :param verbose: If `true`, the response includes output data for each processor in the executed pipeline. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ingest/pipeline/{_quote(id)}/_simulate" + __path_parts = {"id": _quote(id)} + __path = f'/_ingest/pipeline/{__path_parts["id"]}/_simulate' else: + __path_parts = {} __path = "/_ingest/pipeline/_simulate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -295,5 +325,11 @@ def simulate( __body["pipeline"] = pipeline __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ingest.simulate", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/license.py b/elasticsearch_serverless/_sync/client/license.py index a61983b..4658bf3 100644 --- a/elasticsearch_serverless/_sync/client/license.py +++ b/elasticsearch_serverless/_sync/client/license.py @@ -50,6 +50,7 @@ def get( :param local: Specifies whether to retrieve local information. The default value is `false`, which means the information is retrieved from the master node. """ + __path_parts: t.Dict[str, str] = {} __path = "/_license" __query: t.Dict[str, t.Any] = {} if accept_enterprise is not None: @@ -66,5 +67,10 @@ def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="license.get", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/logstash.py b/elasticsearch_serverless/_sync/client/logstash.py index 673785e..040d5e0 100644 --- a/elasticsearch_serverless/_sync/client/logstash.py +++ b/elasticsearch_serverless/_sync/client/logstash.py @@ -44,7 +44,8 @@ def delete_pipeline( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ def delete_pipeline( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="logstash.delete_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -76,9 +82,12 @@ def get_pipeline( :param id: Comma-separated list of pipeline identifiers. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_logstash/pipeline" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -91,7 +100,12 @@ def get_pipeline( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="logstash.get_pipeline", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -124,7 +138,8 @@ def put_pipeline( ) elif pipeline is not None and body is not None: raise ValueError("Cannot set both 'pipeline' and 'body'") - __path = f"/_logstash/pipeline/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_logstash/pipeline/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -137,5 +152,11 @@ def put_pipeline( __body = pipeline if pipeline is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="logstash.put_pipeline", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/ml.py b/elasticsearch_serverless/_sync/client/ml.py index a09ee18..76c89ed 100644 --- a/elasticsearch_serverless/_sync/client/ml.py +++ b/elasticsearch_serverless/_sync/client/ml.py @@ -70,7 +70,8 @@ def close_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_close" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_close' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -94,7 +95,13 @@ def close_job( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.close_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -116,7 +123,8 @@ def delete_calendar( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -128,7 +136,12 @@ def delete_calendar( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -155,7 +168,11 @@ def delete_calendar_event( raise ValueError("Empty value passed for parameter 'calendar_id'") if event_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'event_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events/{_quote(event_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "event_id": _quote(event_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events/{__path_parts["event_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -167,7 +184,12 @@ def delete_calendar_event( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar_event", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -194,7 +216,11 @@ def delete_calendar_job( raise ValueError("Empty value passed for parameter 'calendar_id'") if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/jobs/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "job_id": _quote(job_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/jobs/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -206,7 +232,12 @@ def delete_calendar_job( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_calendar_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -233,7 +264,8 @@ def delete_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -249,7 +281,12 @@ def delete_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -277,7 +314,8 @@ def delete_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -291,7 +329,12 @@ def delete_datafeed( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -315,7 +358,8 @@ def delete_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -327,7 +371,12 @@ def delete_filter( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_filter", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -364,7 +413,8 @@ def delete_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if delete_user_annotations is not None: __query["delete_user_annotations"] = delete_user_annotations @@ -382,7 +432,12 @@ def delete_job( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -408,7 +463,8 @@ def delete_trained_model( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -422,7 +478,12 @@ def delete_trained_model( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -450,7 +511,11 @@ def delete_trained_model_alias( raise ValueError("Empty value passed for parameter 'model_id'") if model_alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_alias'") - __path = f"/_ml/trained_models/{_quote(model_id)}/model_aliases/{_quote(model_alias)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "model_alias": _quote(model_alias), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/model_aliases/{__path_parts["model_alias"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -462,7 +527,12 @@ def delete_trained_model_alias( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.delete_trained_model_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -506,6 +576,7 @@ def estimate_model_memory( from the request if no detectors have a `by_field_name`, `over_field_name` or `partition_field_name`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_ml/anomaly_detectors/_estimate_model_memory" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -526,7 +597,13 @@ def estimate_model_memory( __body["overall_cardinality"] = overall_cardinality __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.estimate_model_memory", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -561,6 +638,7 @@ def evaluate_data_frame( raise ValueError("Empty value passed for parameter 'evaluation'") if index is None and body is None: raise ValueError("Empty value passed for parameter 'index'") + __path_parts: t.Dict[str, str] = {} __path = "/_ml/data_frame/_evaluate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -581,7 +659,13 @@ def evaluate_data_frame( __body["query"] = query __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.evaluate_data_frame", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -623,7 +707,8 @@ def flush_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_flush" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_flush' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -651,7 +736,13 @@ def flush_job( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.flush_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -689,7 +780,8 @@ def get_calendar_events( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events' __query: t.Dict[str, t.Any] = {} if end is not None: __query["end"] = end @@ -711,7 +803,12 @@ def get_calendar_events( __query["start"] = start __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_calendar_events", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -746,9 +843,12 @@ def get_calendars( :param size: Specifies the maximum number of calendars to obtain. This parameter is supported only when you omit the calendar identifier. """ + __path_parts: t.Dict[str, str] if calendar_id not in SKIP_IN_PATH: - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' else: + __path_parts = {} __path = "/_ml/calendars" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -773,7 +873,13 @@ def get_calendars( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.get_calendars", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -816,9 +922,12 @@ def get_data_frame_analytics( :param from_: Skips the specified number of data frame analytics jobs. :param size: Specifies the maximum number of data frame analytics jobs to obtain. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' else: + __path_parts = {} __path = "/_ml/data_frame/analytics" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -839,7 +948,12 @@ def get_data_frame_analytics( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -878,9 +992,12 @@ def get_data_frame_analytics_stats( :param size: Specifies the maximum number of data frame analytics jobs to obtain. :param verbose: Defines whether the stats response should be verbose. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_stats" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_stats' else: + __path_parts = {} __path = "/_ml/data_frame/analytics/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -901,7 +1018,12 @@ def get_data_frame_analytics_stats( __query["verbose"] = verbose __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_data_frame_analytics_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -936,9 +1058,12 @@ def get_datafeed_stats( when there are partial matches. If this parameter is `false`, the request returns a `404` status code when there are no matches or only partial matches. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_stats" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/datafeeds/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -953,7 +1078,12 @@ def get_datafeed_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_datafeed_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -991,9 +1121,12 @@ def get_datafeeds( the configuration on retrieval. This allows the configuration to be in an acceptable format to be retrieved and then added to another cluster. """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' else: + __path_parts = {} __path = "/_ml/datafeeds" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1010,7 +1143,12 @@ def get_datafeeds( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_datafeeds", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1036,9 +1174,12 @@ def get_filters( :param from_: Skips the specified number of filters. :param size: Specifies the maximum number of filters to obtain. """ + __path_parts: t.Dict[str, str] if filter_id not in SKIP_IN_PATH: - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' else: + __path_parts = {} __path = "/_ml/filters" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -1055,7 +1196,12 @@ def get_filters( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_filters", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1086,9 +1232,12 @@ def get_job_stats( partial matches. If `false`, the API returns a `404` status code when there are no matches or only partial matches. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_stats" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/anomaly_detectors/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1103,7 +1252,12 @@ def get_job_stats( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_job_stats", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1141,9 +1295,12 @@ def get_jobs( the configuration on retrieval. This allows the configuration to be in an acceptable format to be retrieved and then added to another cluster. """ + __path_parts: t.Dict[str, str] if job_id not in SKIP_IN_PATH: - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' else: + __path_parts = {} __path = "/_ml/anomaly_detectors" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1160,7 +1317,12 @@ def get_jobs( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_jobs", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1225,7 +1387,10 @@ def get_overall_buckets( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/results/overall_buckets" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = ( + f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/results/overall_buckets' + ) __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1257,7 +1422,13 @@ def get_overall_buckets( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.get_overall_buckets", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1311,9 +1482,12 @@ def get_trained_models( tags, or none. When supplied, only trained models that contain all the supplied tags are returned. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' else: + __path_parts = {} __path = "/_ml/trained_models" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1340,7 +1514,12 @@ def get_trained_models( __query["tags"] = tags __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_trained_models", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1375,9 +1554,12 @@ def get_trained_models_stats( :param from_: Skips the specified number of models. :param size: Specifies the maximum number of models to obtain. """ + __path_parts: t.Dict[str, str] if model_id not in SKIP_IN_PATH: - __path = f"/_ml/trained_models/{_quote(model_id)}/_stats" + __path_parts = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/_stats' else: + __path_parts = {} __path = "/_ml/trained_models/_stats" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -1396,7 +1578,12 @@ def get_trained_models_stats( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.get_trained_models_stats", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1433,7 +1620,8 @@ def infer_trained_model( raise ValueError("Empty value passed for parameter 'model_id'") if docs is None and body is None: raise ValueError("Empty value passed for parameter 'docs'") - __path = f"/_ml/trained_models/{_quote(model_id)}/_infer" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/_infer' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1453,7 +1641,13 @@ def infer_trained_model( __body["inference_config"] = inference_config __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.infer_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1485,7 +1679,8 @@ def open_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_open" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_open' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1505,7 +1700,13 @@ def open_job( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.open_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1536,7 +1737,8 @@ def post_calendar_events( raise ValueError("Empty value passed for parameter 'calendar_id'") if events is None and body is None: raise ValueError("Empty value passed for parameter 'events'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/events" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/events' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1552,7 +1754,13 @@ def post_calendar_events( __body["events"] = events __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.post_calendar_events", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1579,9 +1787,12 @@ def preview_data_frame_analytics( analytics jobs. Note that `id` and `dest` don’t need to be provided in the context of this API. """ + __path_parts: t.Dict[str, str] if id not in SKIP_IN_PATH: - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_preview" + __path_parts = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_preview' else: + __path_parts = {} __path = "/_ml/data_frame/analytics/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1602,7 +1813,13 @@ def preview_data_frame_analytics( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.preview_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1650,9 +1867,12 @@ def preview_datafeed( object unless you also supply a `datafeed_config` object. :param start: The start time from where the datafeed preview should begin """ + __path_parts: t.Dict[str, str] if datafeed_id not in SKIP_IN_PATH: - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_preview" + __path_parts = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_preview' else: + __path_parts = {} __path = "/_ml/datafeeds/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -1679,7 +1899,13 @@ def preview_datafeed( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.preview_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1708,7 +1934,8 @@ def put_calendar( """ if calendar_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'calendar_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}" + __path_parts: t.Dict[str, str] = {"calendar_id": _quote(calendar_id)} + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1730,7 +1957,13 @@ def put_calendar( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_calendar", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -1757,7 +1990,11 @@ def put_calendar_job( raise ValueError("Empty value passed for parameter 'calendar_id'") if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/calendars/{_quote(calendar_id)}/jobs/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = { + "calendar_id": _quote(calendar_id), + "job_id": _quote(job_id), + } + __path = f'/_ml/calendars/{__path_parts["calendar_id"]}/jobs/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -1769,7 +2006,12 @@ def put_calendar_job( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.put_calendar_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -1877,7 +2119,8 @@ def put_data_frame_analytics( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -1911,7 +2154,13 @@ def put_data_frame_analytics( __body["version"] = version __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2056,7 +2305,8 @@ def put_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -2108,7 +2358,13 @@ def put_datafeed( __body["scroll_size"] = scroll_size __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2140,7 +2396,8 @@ def put_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2158,7 +2415,13 @@ def put_filter( __body["items"] = items __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_filter", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2292,7 +2555,8 @@ def put_job( raise ValueError("Empty value passed for parameter 'analysis_config'") if data_description is None and body is None: raise ValueError("Empty value passed for parameter 'data_description'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2338,7 +2602,13 @@ def put_job( __body["results_retention_days"] = results_retention_days __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2421,7 +2691,8 @@ def put_trained_model( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_definition_decompression is not None: @@ -2461,7 +2732,13 @@ def put_trained_model( __body["tags"] = tags __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2503,7 +2780,11 @@ def put_trained_model_alias( raise ValueError("Empty value passed for parameter 'model_id'") if model_alias in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_alias'") - __path = f"/_ml/trained_models/{_quote(model_id)}/model_aliases/{_quote(model_alias)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "model_alias": _quote(model_alias), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/model_aliases/{__path_parts["model_alias"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2517,7 +2798,12 @@ def put_trained_model_alias( __query["reassign"] = reassign __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.put_trained_model_alias", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2565,7 +2851,11 @@ def put_trained_model_definition_part( ) if total_parts is None and body is None: raise ValueError("Empty value passed for parameter 'total_parts'") - __path = f"/_ml/trained_models/{_quote(model_id)}/definition/{_quote(part)}" + __path_parts: t.Dict[str, str] = { + "model_id": _quote(model_id), + "part": _quote(part), + } + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/definition/{__path_parts["part"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2585,7 +2875,13 @@ def put_trained_model_definition_part( __body["total_parts"] = total_parts __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model_definition_part", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2620,7 +2916,8 @@ def put_trained_model_vocabulary( raise ValueError("Empty value passed for parameter 'model_id'") if vocabulary is None and body is None: raise ValueError("Empty value passed for parameter 'vocabulary'") - __path = f"/_ml/trained_models/{_quote(model_id)}/vocabulary" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/vocabulary' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2640,7 +2937,13 @@ def put_trained_model_vocabulary( __body["scores"] = scores __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.put_trained_model_vocabulary", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2671,7 +2974,8 @@ def reset_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_reset" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_reset' __query: t.Dict[str, t.Any] = {} if delete_user_annotations is not None: __query["delete_user_annotations"] = delete_user_annotations @@ -2687,7 +2991,12 @@ def reset_job( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.reset_job", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2723,7 +3032,8 @@ def start_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_start" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_start' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -2737,7 +3047,12 @@ def start_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.start_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2781,7 +3096,8 @@ def start_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_start" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_start' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -2805,7 +3121,13 @@ def start_datafeed( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.start_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2862,7 +3184,8 @@ def start_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_start" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_start' __query: t.Dict[str, t.Any] = {} if cache_size is not None: __query["cache_size"] = cache_size @@ -2890,7 +3213,12 @@ def start_trained_model_deployment( __query["wait_for"] = wait_for __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.start_trained_model_deployment", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -2929,7 +3257,8 @@ def stop_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_stop" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -2947,7 +3276,12 @@ def stop_data_frame_analytics( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.stop_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -2984,7 +3318,8 @@ def stop_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_stop" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_stop' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3008,7 +3343,13 @@ def stop_datafeed( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.stop_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -3041,7 +3382,8 @@ def stop_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_stop" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -3057,7 +3399,12 @@ def stop_trained_model_deployment( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="ml.stop_trained_model_deployment", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3105,7 +3452,8 @@ def update_data_frame_analytics( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_ml/data_frame/analytics/{_quote(id)}/_update" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_ml/data_frame/analytics/{__path_parts["id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3127,7 +3475,13 @@ def update_data_frame_analytics( __body["model_memory_limit"] = model_memory_limit __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_data_frame_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3274,7 +3628,8 @@ def update_datafeed( """ if datafeed_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'datafeed_id'") - __path = f"/_ml/datafeeds/{_quote(datafeed_id)}/_update" + __path_parts: t.Dict[str, str] = {"datafeed_id": _quote(datafeed_id)} + __path = f'/_ml/datafeeds/{__path_parts["datafeed_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if allow_no_indices is not None: @@ -3324,7 +3679,13 @@ def update_datafeed( __body["scroll_size"] = scroll_size __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_datafeed", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3355,7 +3716,8 @@ def update_filter( """ if filter_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'filter_id'") - __path = f"/_ml/filters/{_quote(filter_id)}/_update" + __path_parts: t.Dict[str, str] = {"filter_id": _quote(filter_id)} + __path = f'/_ml/filters/{__path_parts["filter_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3375,7 +3737,13 @@ def update_filter( __body["remove_items"] = remove_items __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_filter", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3482,7 +3850,8 @@ def update_job( """ if job_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'job_id'") - __path = f"/_ml/anomaly_detectors/{_quote(job_id)}/_update" + __path_parts: t.Dict[str, str] = {"job_id": _quote(job_id)} + __path = f'/_ml/anomaly_detectors/{__path_parts["job_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3528,7 +3897,13 @@ def update_job( __body["results_retention_days"] = results_retention_days __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_job", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -3562,7 +3937,8 @@ def update_trained_model_deployment( """ if model_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'model_id'") - __path = f"/_ml/trained_models/{_quote(model_id)}/deployment/_update" + __path_parts: t.Dict[str, str] = {"model_id": _quote(model_id)} + __path = f'/_ml/trained_models/{__path_parts["model_id"]}/deployment/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -3582,5 +3958,11 @@ def update_trained_model_deployment( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="ml.update_trained_model_deployment", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/query_ruleset.py b/elasticsearch_serverless/_sync/client/query_ruleset.py index 688c1c1..f4f7b59 100644 --- a/elasticsearch_serverless/_sync/client/query_ruleset.py +++ b/elasticsearch_serverless/_sync/client/query_ruleset.py @@ -44,7 +44,8 @@ def delete( """ if ruleset_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'ruleset_id'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -78,7 +84,8 @@ def get( """ if ruleset_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'ruleset_id'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -90,7 +97,12 @@ def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.get", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -114,6 +126,7 @@ def list( :param from_: Starting offset (default: 0) :param size: specifies a max number of results to get """ + __path_parts: t.Dict[str, str] = {} __path = "/_query_rules" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -130,7 +143,12 @@ def list( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="query_ruleset.list", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -160,7 +178,8 @@ def put( raise ValueError("Empty value passed for parameter 'ruleset_id'") if rules is None and body is None: raise ValueError("Empty value passed for parameter 'rules'") - __path = f"/_query_rules/{_quote(ruleset_id)}" + __path_parts: t.Dict[str, str] = {"ruleset_id": _quote(ruleset_id)} + __path = f'/_query_rules/{__path_parts["ruleset_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -176,5 +195,11 @@ def put( __body["rules"] = rules __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="query_ruleset.put", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/search_application.py b/elasticsearch_serverless/_sync/client/search_application.py index 1ad2d98..e6483fe 100644 --- a/elasticsearch_serverless/_sync/client/search_application.py +++ b/elasticsearch_serverless/_sync/client/search_application.py @@ -44,7 +44,8 @@ def delete( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ def delete( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.delete", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -78,7 +84,8 @@ def delete_behavioral_analytics( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/analytics/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -90,7 +97,12 @@ def delete_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.delete_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -112,7 +124,8 @@ def get( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -124,7 +137,12 @@ def get( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.get", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -144,9 +162,12 @@ def get_behavioral_analytics( :param name: A list of analytics collections to limit the returned information """ + __path_parts: t.Dict[str, str] if name not in SKIP_IN_PATH: - __path = f"/_application/analytics/{_quote(name)}" + __path_parts = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' else: + __path_parts = {} __path = "/_application/analytics" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -159,7 +180,12 @@ def get_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.get_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -185,6 +211,7 @@ def list( :param q: Query in the Lucene query string syntax. :param size: Specifies a max number of results to get. """ + __path_parts: t.Dict[str, str] = {} __path = "/_application/search_application" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -203,7 +230,12 @@ def list( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.list", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -239,7 +271,8 @@ def put( ) elif search_application is not None and body is not None: raise ValueError("Cannot set both 'search_application' and 'body'") - __path = f"/_application/search_application/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if create is not None: __query["create"] = create @@ -254,7 +287,13 @@ def put( __body = search_application if search_application is not None else body __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_application.put", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -276,7 +315,8 @@ def put_behavioral_analytics( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/analytics/{_quote(name)}" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/analytics/{__path_parts["name"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -288,7 +328,12 @@ def put_behavioral_analytics( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers + "PUT", + __path, + params=__query, + headers=__headers, + endpoint_id="search_application.put_behavioral_analytics", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -320,7 +365,8 @@ def search( """ if name in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'name'") - __path = f"/_application/search_application/{_quote(name)}/_search" + __path_parts: t.Dict[str, str] = {"name": _quote(name)} + __path = f'/_application/search_application/{__path_parts["name"]}/_search' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -342,5 +388,11 @@ def search( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="search_application.search", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/security.py b/elasticsearch_serverless/_sync/client/security.py index e76c0b9..c71c4c6 100644 --- a/elasticsearch_serverless/_sync/client/security.py +++ b/elasticsearch_serverless/_sync/client/security.py @@ -44,6 +44,7 @@ def authenticate( ``_ """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/_authenticate" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -56,7 +57,12 @@ def authenticate( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="security.authenticate", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -105,6 +111,7 @@ def create_api_key( is the same as the request for create role API. For more details, see create or update roles API. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -129,7 +136,13 @@ def create_api_key( __body["role_descriptors"] = role_descriptors __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.create_api_key", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -180,6 +193,7 @@ def get_api_key( :param with_profile_uid: Determines whether to also retrieve the profile uid, for the API key owner principal, if it exists. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} if active_only is not None: @@ -208,7 +222,12 @@ def get_api_key( __query["with_profile_uid"] = with_profile_uid __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="security.get_api_key", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -244,9 +263,12 @@ def has_privileges( :param cluster: A list of the cluster privileges that you want to check. :param index: """ + __path_parts: t.Dict[str, str] if user not in SKIP_IN_PATH: - __path = f"/_security/user/{_quote(user)}/_has_privileges" + __path_parts = {"user": _quote(user)} + __path = f'/_security/user/{__path_parts["user"]}/_has_privileges' else: + __path_parts = {} __path = "/_security/user/_has_privileges" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -267,7 +289,13 @@ def has_privileges( __body["index"] = index __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.has_privileges", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -313,6 +341,7 @@ def invalidate_api_key( :param username: The username of a user. This parameter cannot be used with either `ids` or `name`, or when `owner` flag is set to `true`. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -339,7 +368,13 @@ def invalidate_api_key( __body["username"] = username __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers, body=__body + "DELETE", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.invalidate_api_key", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -423,6 +458,7 @@ def query_api_keys( :param with_profile_uid: Determines whether to also retrieve the profile uid, for the API key owner principal, if it exists. """ + __path_parts: t.Dict[str, str] = {} __path = "/_security/_query/api_key" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -472,7 +508,13 @@ def query_api_keys( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.query_api_keys", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -527,7 +569,8 @@ def update_api_key( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_security/api_key/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_security/api_key/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -551,5 +594,11 @@ def update_api_key( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="security.update_api_key", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/sql.py b/elasticsearch_serverless/_sync/client/sql.py index 2da06f1..ea25c4c 100644 --- a/elasticsearch_serverless/_sync/client/sql.py +++ b/elasticsearch_serverless/_sync/client/sql.py @@ -47,6 +47,7 @@ def clear_cursor( """ if cursor is None and body is None: raise ValueError("Empty value passed for parameter 'cursor'") + __path_parts: t.Dict[str, str] = {} __path = "/_sql/close" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -63,7 +64,13 @@ def clear_cursor( __body["cursor"] = cursor __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.clear_cursor", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -86,7 +93,8 @@ def delete_async( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/delete/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/delete/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -98,7 +106,12 @@ def delete_async( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.delete_async", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -136,7 +149,8 @@ def get_async( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if delimiter is not None: __query["delimiter"] = delimiter @@ -156,7 +170,12 @@ def get_async( __query["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.get_async", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -179,7 +198,8 @@ def get_async_status( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_sql/async/status/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_sql/async/status/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -191,7 +211,12 @@ def get_async_status( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="sql.get_async_status", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -281,6 +306,7 @@ def query( to no timeout, meaning the request waits for complete search results. If the search doesn’t finish within this period, the search becomes async. """ + __path_parts: t.Dict[str, str] = {} __path = "/_sql" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -329,7 +355,13 @@ def query( __body["wait_for_completion_timeout"] = wait_for_completion_timeout __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.query", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -360,6 +392,7 @@ def translate( """ if query is None and body is None: raise ValueError("Empty value passed for parameter 'query'") + __path_parts: t.Dict[str, str] = {} __path = "/_sql/translate" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -382,5 +415,11 @@ def translate( __body["time_zone"] = time_zone __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="sql.translate", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/synonyms.py b/elasticsearch_serverless/_sync/client/synonyms.py index a978210..2455c3f 100644 --- a/elasticsearch_serverless/_sync/client/synonyms.py +++ b/elasticsearch_serverless/_sync/client/synonyms.py @@ -44,7 +44,8 @@ def delete_synonym( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -56,7 +57,12 @@ def delete_synonym( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.delete_synonym", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -82,7 +88,11 @@ def delete_synonym_rule( raise ValueError("Empty value passed for parameter 'set_id'") if rule_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'rule_id'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -94,7 +104,12 @@ def delete_synonym_rule( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.delete_synonym_rule", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -122,7 +137,8 @@ def get_synonym( """ if id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'id'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -138,7 +154,12 @@ def get_synonym( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonym", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -164,7 +185,11 @@ def get_synonym_rule( raise ValueError("Empty value passed for parameter 'set_id'") if rule_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'rule_id'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -176,7 +201,12 @@ def get_synonym_rule( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonym_rule", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -200,6 +230,7 @@ def get_synonyms_sets( :param from_: Starting offset :param size: specifies a max number of results to get """ + __path_parts: t.Dict[str, str] = {} __path = "/_synonyms" __query: t.Dict[str, t.Any] = {} if error_trace is not None: @@ -216,7 +247,12 @@ def get_synonyms_sets( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="synonyms.get_synonyms_sets", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -245,7 +281,8 @@ def put_synonym( raise ValueError("Empty value passed for parameter 'id'") if synonyms_set is None and body is None: raise ValueError("Empty value passed for parameter 'synonyms_set'") - __path = f"/_synonyms/{_quote(id)}" + __path_parts: t.Dict[str, str] = {"id": _quote(id)} + __path = f'/_synonyms/{__path_parts["id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -261,7 +298,13 @@ def put_synonym( __body["synonyms_set"] = synonyms_set __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="synonyms.put_synonym", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -294,7 +337,11 @@ def put_synonym_rule( raise ValueError("Empty value passed for parameter 'rule_id'") if synonyms is None and body is None: raise ValueError("Empty value passed for parameter 'synonyms'") - __path = f"/_synonyms/{_quote(set_id)}/{_quote(rule_id)}" + __path_parts: t.Dict[str, str] = { + "set_id": _quote(set_id), + "rule_id": _quote(rule_id), + } + __path = f'/_synonyms/{__path_parts["set_id"]}/{__path_parts["rule_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if error_trace is not None: @@ -310,5 +357,11 @@ def put_synonym_rule( __body["synonyms"] = synonyms __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="synonyms.put_synonym_rule", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/tasks.py b/elasticsearch_serverless/_sync/client/tasks.py index 078e850..6ab0f12 100644 --- a/elasticsearch_serverless/_sync/client/tasks.py +++ b/elasticsearch_serverless/_sync/client/tasks.py @@ -50,7 +50,8 @@ def get( """ if task_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'task_id'") - __path = f"/_tasks/{_quote(task_id)}" + __path_parts: t.Dict[str, str] = {"task_id": _quote(task_id)} + __path = f'/_tasks/{__path_parts["task_id"]}' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -66,5 +67,10 @@ def get( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="tasks.get", + path_parts=__path_parts, ) diff --git a/elasticsearch_serverless/_sync/client/transform.py b/elasticsearch_serverless/_sync/client/transform.py index 3979e66..3f3de36 100644 --- a/elasticsearch_serverless/_sync/client/transform.py +++ b/elasticsearch_serverless/_sync/client/transform.py @@ -55,7 +55,8 @@ def delete_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' __query: t.Dict[str, t.Any] = {} if delete_dest_index is not None: __query["delete_dest_index"] = delete_dest_index @@ -73,7 +74,12 @@ def delete_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "DELETE", __path, params=__query, headers=__headers + "DELETE", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.delete_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -111,9 +117,12 @@ def get_transform( :param from_: Skips the specified number of transforms. :param size: Specifies the maximum number of transforms to obtain. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_transform/{_quote(transform_id)}" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' else: + __path_parts = {} __path = "/_transform" __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: @@ -134,7 +143,12 @@ def get_transform( __query["size"] = size __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.get_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -172,7 +186,8 @@ def get_transform_stats( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_stats" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_stats' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -192,7 +207,12 @@ def get_transform_stats( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "GET", __path, params=__query, headers=__headers + "GET", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.get_transform_stats", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -258,9 +278,12 @@ def preview_transform( :param timeout: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. """ + __path_parts: t.Dict[str, str] if transform_id not in SKIP_IN_PATH: - __path = f"/_transform/{_quote(transform_id)}/_preview" + __path_parts = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_preview' else: + __path_parts = {} __path = "/_transform/_preview" __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} @@ -299,7 +322,13 @@ def preview_transform( if __body is not None: __headers["content-type"] = "application/json" return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.preview_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -399,7 +428,8 @@ def put_transform( raise ValueError("Empty value passed for parameter 'dest'") if source is None and body is None: raise ValueError("Empty value passed for parameter 'source'") - __path = f"/_transform/{_quote(transform_id)}" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_validation is not None: @@ -437,7 +467,13 @@ def put_transform( __body["sync"] = sync __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "PUT", __path, params=__query, headers=__headers, body=__body + "PUT", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.put_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -467,7 +503,8 @@ def reset_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_reset" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_reset' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -481,7 +518,12 @@ def reset_transform( __query["pretty"] = pretty __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.reset_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -508,7 +550,8 @@ def schedule_now_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_schedule_now" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_schedule_now' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -522,7 +565,12 @@ def schedule_now_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.schedule_now_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -569,7 +617,8 @@ def start_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_start" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_start' __query: t.Dict[str, t.Any] = {} if error_trace is not None: __query["error_trace"] = error_trace @@ -585,7 +634,12 @@ def start_transform( __query["timeout"] = timeout __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.start_transform", + path_parts=__path_parts, ) @_rewrite_parameters() @@ -632,7 +686,8 @@ def stop_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_stop" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_stop' __query: t.Dict[str, t.Any] = {} if allow_no_match is not None: __query["allow_no_match"] = allow_no_match @@ -654,7 +709,12 @@ def stop_transform( __query["wait_for_completion"] = wait_for_completion __headers = {"accept": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers + "POST", + __path, + params=__query, + headers=__headers, + endpoint_id="transform.stop_transform", + path_parts=__path_parts, ) @_rewrite_parameters( @@ -722,7 +782,8 @@ def update_transform( """ if transform_id in SKIP_IN_PATH: raise ValueError("Empty value passed for parameter 'transform_id'") - __path = f"/_transform/{_quote(transform_id)}/_update" + __path_parts: t.Dict[str, str] = {"transform_id": _quote(transform_id)} + __path = f'/_transform/{__path_parts["transform_id"]}/_update' __query: t.Dict[str, t.Any] = {} __body: t.Dict[str, t.Any] = body if body is not None else {} if defer_validation is not None: @@ -756,5 +817,11 @@ def update_transform( __body["sync"] = sync __headers = {"accept": "application/json", "content-type": "application/json"} return self.perform_request( # type: ignore[return-value] - "POST", __path, params=__query, headers=__headers, body=__body + "POST", + __path, + params=__query, + headers=__headers, + body=__body, + endpoint_id="transform.update_transform", + path_parts=__path_parts, ) From 878588909fffa2c70bd896a0b996936a6c803e83 Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 15:28:05 +0400 Subject: [PATCH 4/7] Add OpenTelemetry end-to-end test --- .buildkite/generatesteps.py | 7 ++- .buildkite/run-tests | 3 +- noxfile.py | 25 +++++--- pyproject.toml | 3 +- .../test_server/test_otel.py | 61 +++++++++++++++++++ 5 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 test_elasticsearch_serverless/test_server/test_otel.py diff --git a/.buildkite/generatesteps.py b/.buildkite/generatesteps.py index b054287..6967ad6 100644 --- a/.buildkite/generatesteps.py +++ b/.buildkite/generatesteps.py @@ -3,7 +3,7 @@ import yaml -def benchmark_to_steps(python, connection_class): +def benchmark_to_steps(python, connection_class, nox_session): return [ { "group": f":elasticsearch: :python: ES Serverless ({python}/{connection_class})", @@ -14,6 +14,7 @@ def benchmark_to_steps(python, connection_class): "env": { "PYTHON_VERSION": f"{python}", "PYTHON_CONNECTION_CLASS": f"{connection_class}", + "NOX_SESSION": f"{nox_session}", # For development versions # https://github.com/aio-libs/aiohttp/issues/6600 "AIOHTTP_NO_EXTENSIONS": 1, @@ -55,5 +56,7 @@ def benchmark_to_steps(python, connection_class): steps = [] for python in ["3.9", "3.10", "3.11", "3.12"]: for connection_class in ["urllib3", "requests"]: - steps.extend(benchmark_to_steps(python, connection_class)) + steps.extend(benchmark_to_steps(python, connection_class, "test")) + steps.extend(benchmark_to_steps("3.9", "urllib3", "test_otel")) + steps.extend(benchmark_to_steps("3.12", "urllib3", "test_otel")) print(yaml.dump({"steps": steps}, Dumper=yaml.Dumper, sort_keys=False)) diff --git a/.buildkite/run-tests b/.buildkite/run-tests index c2a7497..11913a7 100755 --- a/.buildkite/run-tests +++ b/.buildkite/run-tests @@ -51,6 +51,7 @@ echo -e "--- :computer: Environment variables" echo -e "ELASTICSEARCH_URL $ELASTICSEARCH_URL" echo -e "PYTHON_VERSION $PYTHON_VERSION" echo -e "PYTHON_CONNECTION_CLASS $PYTHON_CONNECTION_CLASS" +echo -e "NOX_SESSION $NOX_SESSION" echo -e "--- :docker: Build elasticsearch-serverless-python container" @@ -74,4 +75,4 @@ docker run \ --volume "$(pwd)/junit:/code/elasticsearch-serverless-python/junit" \ --rm \ elasticsearch-serverless-python \ - nox -s "test-$PYTHON_VERSION" + nox -s ${NOX_SESSION}-${PYTHON_VERSION} diff --git a/noxfile.py b/noxfile.py index 669db2f..9360f74 100644 --- a/noxfile.py +++ b/noxfile.py @@ -31,14 +31,11 @@ INSTALL_ENV = {"AIOHTTP_NO_EXTENSIONS": "1"} -@nox.session(python=["3.9", "3.10", "3.11", "3.12"]) -def test(session): - session.install(".[dev]", env=INSTALL_ENV) - +def pytest_argv(): junit_xml = os.path.join( SOURCE_DIR, "junit", "elasticsearch-serverless-python-junit.xml" ) - pytest_argv = [ + return [ "pytest", "--cov-report=term-missing", "--cov=elasticsearch_serverless", @@ -47,9 +44,23 @@ def test(session): "--log-level=debug", "-vv", "--cache-clear", - *(session.posargs), ] - session.run(*pytest_argv) + + +@nox.session(python=["3.9", "3.10", "3.11", "3.12"]) +def test(session): + session.install(".[dev]", env=INSTALL_ENV) + + session.run(*pytest_argv(), *(session.posargs)) + + +@nox.session(python=["3.9", "3.12"]) +def test_otel(session): + session.install(".[dev]", env=INSTALL_ENV) + session.install("opentelemetry-api", "opentelemetry-sdk") + + argv = pytest_argv() + ["-m", "otel"] + session.run(*argv, *(session.posargs), env={"TEST_WITH_OTEL": "1"}) @nox.session() diff --git a/pyproject.toml b/pyproject.toml index b6c9001..462bbd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -99,7 +99,8 @@ packages = ["elasticsearch_serverless"] [tool.pytest.ini_options] junit_family = "legacy" -xfail_strict=true +xfail_strict = true +markers = "otel" [tool.isort] profile = "black" diff --git a/test_elasticsearch_serverless/test_server/test_otel.py b/test_elasticsearch_serverless/test_server/test_otel.py new file mode 100644 index 0000000..e9ebcd1 --- /dev/null +++ b/test_elasticsearch_serverless/test_server/test_otel.py @@ -0,0 +1,61 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import os + +import pytest + +try: + from opentelemetry import trace + from opentelemetry.sdk.trace import TracerProvider, export + from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, + ) +except ModuleNotFoundError: + pass + +pytestmark = [ + pytest.mark.skipif( + "TEST_WITH_OTEL" not in os.environ, reason="TEST_WITH_OTEL is not set" + ), + pytest.mark.otel, +] + + +def test_otel_end_to_end(monkeypatch, sync_client): + # Sets the global default tracer provider + tracer_provider = TracerProvider() + memory_exporter = InMemorySpanExporter() + span_processor = export.SimpleSpanProcessor(memory_exporter) + tracer_provider.add_span_processor(span_processor) + trace.set_tracer_provider(tracer_provider) + + resp = sync_client.search(index="logs-*", query={"match_all": {}}) + assert resp.meta.status == 200 + + spans = memory_exporter.get_finished_spans() + assert len(spans) == 1 + assert spans[0].name == "search" + expected_attributes = { + "http.request.method": "POST", + "db.system": "elasticsearch", + "db.operation": "search", + "db.elasticsearch.path_parts.index": "logs-*", + } + # Assert expected atttributes are here, but allow other attributes too + # to make this test robust to elastic-transport changes + assert expected_attributes.items() <= spans[0].attributes.items() From c4dda0d6d7643c01abc4104f34b28446bb9cc72c Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 17:22:07 +0400 Subject: [PATCH 5/7] Record OpenTelemetry spans --- .../_async/client/_base.py | 30 ++++++ elasticsearch_serverless/_otel.py | 92 ++++++++++++++++++ .../_sync/client/_base.py | 30 ++++++ .../test_client/test_options.py | 11 +++ test_elasticsearch_serverless/test_otel.py | 97 +++++++++++++++++++ 5 files changed, 260 insertions(+) create mode 100644 elasticsearch_serverless/_otel.py create mode 100644 test_elasticsearch_serverless/test_otel.py diff --git a/elasticsearch_serverless/_async/client/_base.py b/elasticsearch_serverless/_async/client/_base.py index 9fd3f73..63cd0b2 100644 --- a/elasticsearch_serverless/_async/client/_base.py +++ b/elasticsearch_serverless/_async/client/_base.py @@ -27,10 +27,12 @@ HttpHeaders, ListApiResponse, ObjectApiResponse, + OpenTelemetrySpan, TextApiResponse, ) from elastic_transport.client_utils import DEFAULT, DefaultType +from ..._otel import OpenTelemetry from ...compat import warn_stacklevel from ...exceptions import ( HTTP_EXCEPTIONS, @@ -125,6 +127,7 @@ def __init__(self, _transport: AsyncTransport) -> None: self._retry_on_timeout: Union[DefaultType, bool] = DEFAULT self._retry_on_status: Union[DefaultType, Collection[int]] = DEFAULT self._verified_elasticsearch = False + self._otel = OpenTelemetry() @property def transport(self) -> AsyncTransport: @@ -140,6 +143,32 @@ async def perform_request( body: Optional[Any] = None, endpoint_id: Optional[str] = None, path_parts: Optional[Mapping[str, Any]] = None, + ) -> ApiResponse[Any]: + with self._otel.span( + method, + endpoint_id=endpoint_id, + path_parts=path_parts or {}, + ) as otel_span: + response = await self._perform_request( + method, + path, + params=params, + headers=headers, + body=body, + otel_span=otel_span, + ) + otel_span.set_elastic_cloud_metadata(response.meta.headers) + return response + + async def _perform_request( + self, + method: str, + path: str, + *, + params: Optional[Mapping[str, Any]] = None, + headers: Optional[Mapping[str, str]] = None, + body: Optional[Any] = None, + otel_span: OpenTelemetrySpan, ) -> ApiResponse[Any]: if headers: request_headers = self._headers.copy() @@ -162,6 +191,7 @@ async def perform_request( retry_on_status=self._retry_on_status, retry_on_timeout=self._retry_on_timeout, client_meta=self._client_meta, + otel_span=otel_span, ) # HEAD with a 404 is returned as a normal response diff --git a/elasticsearch_serverless/_otel.py b/elasticsearch_serverless/_otel.py new file mode 100644 index 0000000..1f052b6 --- /dev/null +++ b/elasticsearch_serverless/_otel.py @@ -0,0 +1,92 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from __future__ import annotations + +import contextlib +import os +from typing import TYPE_CHECKING, Generator, Mapping + +if TYPE_CHECKING: + from typing import Literal + +try: + from opentelemetry import trace + + _tracer: trace.Tracer | None = trace.get_tracer("elasticsearch-api") +except ModuleNotFoundError: + _tracer = None + +from elastic_transport import OpenTelemetrySpan + +# Valid values for the enabled config are 'true' and 'false'. Default is 'true'. +ENABLED_ENV_VAR = "OTEL_PYTHON_INSTRUMENTATION_ELASTICSEARCH_ENABLED" +# Describes how to handle search queries in the request body when assigned to +# a span attribute. +# Valid values are 'omit' and 'raw'. +# Default is 'omit' as 'raw' has security implications. +BODY_STRATEGY_ENV_VAR = "OTEL_PYTHON_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY" +DEFAULT_BODY_STRATEGY = "omit" + + +class OpenTelemetry: + def __init__( + self, + enabled: bool | None = None, + tracer: trace.Tracer | None = None, + # TODO import Literal at the top-level when dropping Python 3.7 + body_strategy: 'Literal["omit", "raw"]' | None = None, + ): + if enabled is None: + enabled = os.environ.get(ENABLED_ENV_VAR, "false") != "false" + self.tracer = tracer or _tracer + self.enabled = enabled and self.tracer is not None + + if body_strategy is not None: + self.body_strategy = body_strategy + else: + self.body_strategy = os.environ.get( + BODY_STRATEGY_ENV_VAR, DEFAULT_BODY_STRATEGY + ) # type: ignore[assignment] + assert self.body_strategy in ("omit", "raw") + + @contextlib.contextmanager + def span( + self, + method: str, + *, + endpoint_id: str | None, + path_parts: Mapping[str, str], + ) -> Generator[OpenTelemetrySpan, None, None]: + if not self.enabled or self.tracer is None: + yield OpenTelemetrySpan(None) + return + + span_name = endpoint_id or method + with self.tracer.start_as_current_span(span_name) as otel_span: + otel_span.set_attribute("http.request.method", method) + otel_span.set_attribute("db.system", "elasticsearch") + if endpoint_id is not None: + otel_span.set_attribute("db.operation", endpoint_id) + for key, value in path_parts.items(): + otel_span.set_attribute(f"db.elasticsearch.path_parts.{key}", value) + + yield OpenTelemetrySpan( + otel_span, + endpoint_id=endpoint_id, + body_strategy=self.body_strategy, + ) diff --git a/elasticsearch_serverless/_sync/client/_base.py b/elasticsearch_serverless/_sync/client/_base.py index d4bdea5..468beb5 100644 --- a/elasticsearch_serverless/_sync/client/_base.py +++ b/elasticsearch_serverless/_sync/client/_base.py @@ -26,11 +26,13 @@ HttpHeaders, ListApiResponse, ObjectApiResponse, + OpenTelemetrySpan, TextApiResponse, Transport, ) from elastic_transport.client_utils import DEFAULT, DefaultType +from ..._otel import OpenTelemetry from ...compat import warn_stacklevel from ...exceptions import ( HTTP_EXCEPTIONS, @@ -125,6 +127,7 @@ def __init__(self, _transport: Transport) -> None: self._retry_on_timeout: Union[DefaultType, bool] = DEFAULT self._retry_on_status: Union[DefaultType, Collection[int]] = DEFAULT self._verified_elasticsearch = False + self._otel = OpenTelemetry() @property def transport(self) -> Transport: @@ -140,6 +143,32 @@ def perform_request( body: Optional[Any] = None, endpoint_id: Optional[str] = None, path_parts: Optional[Mapping[str, Any]] = None, + ) -> ApiResponse[Any]: + with self._otel.span( + method, + endpoint_id=endpoint_id, + path_parts=path_parts or {}, + ) as otel_span: + response = self._perform_request( + method, + path, + params=params, + headers=headers, + body=body, + otel_span=otel_span, + ) + otel_span.set_elastic_cloud_metadata(response.meta.headers) + return response + + def _perform_request( + self, + method: str, + path: str, + *, + params: Optional[Mapping[str, Any]] = None, + headers: Optional[Mapping[str, str]] = None, + body: Optional[Any] = None, + otel_span: OpenTelemetrySpan, ) -> ApiResponse[Any]: if headers: request_headers = self._headers.copy() @@ -162,6 +191,7 @@ def perform_request( retry_on_status=self._retry_on_status, retry_on_timeout=self._retry_on_timeout, client_meta=self._client_meta, + otel_span=otel_span, ) # HEAD with a 404 is returned as a normal response diff --git a/test_elasticsearch_serverless/test_client/test_options.py b/test_elasticsearch_serverless/test_client/test_options.py index 94a5051..2feaeee 100644 --- a/test_elasticsearch_serverless/test_client/test_options.py +++ b/test_elasticsearch_serverless/test_client/test_options.py @@ -17,6 +17,7 @@ # under the License. import pytest +from elastic_transport import OpenTelemetrySpan from elastic_transport.client_utils import DEFAULT from elasticsearch_serverless import AsyncElasticsearch, Elasticsearch @@ -137,6 +138,7 @@ def test_options_passed_to_perform_request(self): assert call.pop("retry_on_timeout") is DEFAULT assert call.pop("retry_on_status") is DEFAULT assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -155,6 +157,7 @@ def test_options_passed_to_perform_request(self): calls = client.transport.calls call = calls[("GET", "/test")][1] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -180,6 +183,7 @@ def test_options_passed_to_perform_request(self): calls = client.transport.calls call = calls[("GET", "/test")][0] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -207,6 +211,7 @@ async def test_options_passed_to_async_perform_request(self): assert call.pop("retry_on_timeout") is DEFAULT assert call.pop("retry_on_status") is DEFAULT assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -225,6 +230,7 @@ async def test_options_passed_to_async_perform_request(self): calls = client.transport.calls call = calls[("GET", "/test")][1] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -250,6 +256,7 @@ async def test_options_passed_to_async_perform_request(self): calls = client.transport.calls call = calls[("GET", "/test")][0] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -389,6 +396,7 @@ def test_options_timeout_parameters(self): calls = client.transport.calls call = calls[("GET", "/test")][0] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -418,6 +426,7 @@ def test_options_timeout_parameters(self): calls = client.transport.calls call = calls[("GET", "/test")][0] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -442,6 +451,7 @@ def test_options_timeout_parameters(self): assert call.pop("retry_on_timeout") is DEFAULT assert call.pop("retry_on_status") is DEFAULT assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", @@ -463,6 +473,7 @@ def test_options_timeout_parameters(self): calls = client.transport.calls call = calls[("GET", "/test")][0] assert call.pop("client_meta") is DEFAULT + assert isinstance(call.pop("otel_span"), OpenTelemetrySpan) assert call == { "headers": { "accept": "application/json", diff --git a/test_elasticsearch_serverless/test_otel.py b/test_elasticsearch_serverless/test_otel.py new file mode 100644 index 0000000..4f1abfb --- /dev/null +++ b/test_elasticsearch_serverless/test_otel.py @@ -0,0 +1,97 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import os + +import pytest + +try: + from opentelemetry.sdk.trace import TracerProvider, export + from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, + ) +except ModuleNotFoundError: + pass + + +from elasticsearch_serverless._otel import ENABLED_ENV_VAR, OpenTelemetry + +pytestmark = [ + pytest.mark.skipif( + "TEST_WITH_OTEL" not in os.environ, reason="TEST_WITH_OTEL is not set" + ), + pytest.mark.otel, +] + + +def setup_tracing(): + tracer_provider = TracerProvider() + memory_exporter = InMemorySpanExporter() + span_processor = export.SimpleSpanProcessor(memory_exporter) + tracer_provider.add_span_processor(span_processor) + tracer = tracer_provider.get_tracer(__name__) + + return tracer, memory_exporter + + +def test_enabled(): + otel = OpenTelemetry() + assert otel.enabled == (os.environ.get(ENABLED_ENV_VAR, "false") != "false") + + +def test_minimal_span(): + tracer, memory_exporter = setup_tracing() + + otel = OpenTelemetry(enabled=True, tracer=tracer) + with otel.span("GET", endpoint_id=None, path_parts={}): + pass + + spans = memory_exporter.get_finished_spans() + assert len(spans) == 1 + assert spans[0].name == "GET" + assert spans[0].attributes == { + "http.request.method": "GET", + "db.system": "elasticsearch", + } + + +def test_detailed_span(): + tracer, memory_exporter = setup_tracing() + otel = OpenTelemetry(enabled=True, tracer=tracer) + with otel.span( + "GET", + endpoint_id="ml.open_job", + path_parts={"job_id": "my-job"}, + ) as span: + span.set_elastic_cloud_metadata( + { + "X-Found-Handling-Cluster": "e9106fc68e3044f0b1475b04bf4ffd5f", + "X-Found-Handling-Instance": "instance-0000000001", + } + ) + + spans = memory_exporter.get_finished_spans() + assert len(spans) == 1 + assert spans[0].name == "ml.open_job" + assert spans[0].attributes == { + "http.request.method": "GET", + "db.system": "elasticsearch", + "db.operation": "ml.open_job", + "db.elasticsearch.path_parts.job_id": "my-job", + "db.elasticsearch.cluster.name": "e9106fc68e3044f0b1475b04bf4ffd5f", + "db.elasticsearch.node.name": "instance-0000000001", + } From 4adcf84f1a6229eb839ad6e803eb5ad76f5e1523 Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 17:22:50 +0400 Subject: [PATCH 6/7] Document and enable OpenTelemetry instrumentation --- docs/guide/images/otel-waterfall-retry.png | Bin 0 -> 50707 bytes .../guide/images/otel-waterfall-with-http.png | Bin 0 -> 44194 bytes .../images/otel-waterfall-without-http.png | Bin 0 -> 35709 bytes docs/guide/integrations.asciidoc | 10 +++ docs/guide/open-telemetry.asciidoc | 75 ++++++++++++++++++ elasticsearch_serverless/_otel.py | 2 +- test_elasticsearch_serverless/test_otel.py | 2 +- 7 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 docs/guide/images/otel-waterfall-retry.png create mode 100644 docs/guide/images/otel-waterfall-with-http.png create mode 100644 docs/guide/images/otel-waterfall-without-http.png create mode 100644 docs/guide/open-telemetry.asciidoc diff --git a/docs/guide/images/otel-waterfall-retry.png b/docs/guide/images/otel-waterfall-retry.png new file mode 100644 index 0000000000000000000000000000000000000000..c4eb79473e2acfe2a7210e5c22356c1b7f7ef4be GIT binary patch literal 50707 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

Iyd0u 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 HjD!CJ|3%M^ literal 0 HcmV?d00001 diff --git a/docs/guide/images/otel-waterfall-with-http.png b/docs/guide/images/otel-waterfall-with-http.png new file mode 100644 index 0000000000000000000000000000000000000000..2d11542a659b877962cde7b62488e9ef3697a6f2 GIT binary patch literal 44194 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 Y1#CGaW%<|$p{S&ACYHx5emZ;Q->{}h4FCWD literal 0 HcmV?d00001 diff --git a/docs/guide/images/otel-waterfall-without-http.png b/docs/guide/images/otel-waterfall-without-http.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3b8de5bb9f4096740d69b10b83bb72ec5c5f73 GIT binary patch literal 35709 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 BF9-kt literal 0 HcmV?d00001 diff --git a/docs/guide/integrations.asciidoc b/docs/guide/integrations.asciidoc index 966fb57..6e8f52d 100644 --- a/docs/guide/integrations.asciidoc +++ b/docs/guide/integrations.asciidoc @@ -4,6 +4,13 @@ You can find integration options and information on this page. +[discrete] +[[opentelemetry-intro]] +=== OpenTelemetry instrumentation + +The Python Elasticsearch client supports native OpenTelemetry instrumentation following the https://opentelemetry.io/docs/specs/semconv/database/elasticsearch/[OpenTelemetry Semantic Conventions for Elasticsearch]. +Refer to the <> page for details. + [discrete] [[transport]] === Transport @@ -53,3 +60,6 @@ es.options( ------------------------------------ Type hints also allow tools like your IDE to check types and provide better auto-complete functionality. + + +include::open-telemetry.asciidoc[] \ No newline at end of file diff --git a/docs/guide/open-telemetry.asciidoc b/docs/guide/open-telemetry.asciidoc new file mode 100644 index 0000000..9bbc1da --- /dev/null +++ b/docs/guide/open-telemetry.asciidoc @@ -0,0 +1,75 @@ +[[opentelemetry]] +=== Using OpenTelemetry + +You can use https://opentelemetry.io/[OpenTelemetry] to monitor the performance and behavior of your {es} requests through the Elasticsearch Python client. +The Python client comes with built-in OpenTelemetry instrumentation that emits https://www.elastic.co/guide/en/apm/guide/current/apm-distributed-tracing.html[distributed tracing spans] by default. +With that, applications using https://www.elastic.co/blog/manual-instrumentation-of-python-applications-opentelemetry[manual OpenTelemetry instrumentation] or https://www.elastic.co/blog/auto-instrumentation-of-python-applications-opentelemetry[automatic OpenTelemetry instrumentation] are enriched with additional spans that contain insightful information about the execution of the {es} requests. + +The native instrumentation in the Python client follows the https://opentelemetry.io/docs/specs/semconv/database/elasticsearch/[OpenTelemetry Semantic Conventions for {es}]. In particular, the instrumentation in the client covers the logical layer of {es} requests. A single span per request is created that is processed by the service through the Python client. The following image shows a trace that records the handling of two different {es} requests: an `info` request and a `search` request. + +[role="screenshot"] +image::images/otel-waterfall-without-http.png[alt="Distributed trace with Elasticsearch spans",align="center"] + +Usually, OpenTelemetry auto-instrumentation modules come with instrumentation support for HTTP-level communication. In this case, in addition to the logical {es} client requests, spans will be captured for the physical HTTP requests emitted by the client. The following image shows a trace with both, {es} spans (in blue) and the corresponding HTTP-level spans (in red) after having installed the ``opentelemetry-instrumentation-urllib3`` package: + +[role="screenshot"] +image::images/otel-waterfall-with-http.png[alt="Distributed trace with Elasticsearch spans",align="center"] + +Advanced Python client behavior such as nodes round-robin and request retries are revealed through the combination of logical {es} spans and the physical HTTP spans. The following example shows a `search` request in a scenario with two nodes: + +[role="screenshot"] +image::images/otel-waterfall-retry.png[alt="Distributed trace with Elasticsearch spans",align="center"] + +The first node is unavailable and results in an HTTP error, while the retry to the second node succeeds. Both HTTP requests are subsumed by the logical {es} request span (in blue). + +[discrete] +==== Setup the OpenTelemetry instrumentation + +When using the https://opentelemetry.io/docs/languages/python/instrumentation/[manual Python OpenTelemetry instrumentation] or the https://opentelemetry.io/docs/languages/python/automatic/[OpenTelemetry Python agent], the Python client's OpenTelemetry instrumentation is enabled by default and uses the global OpenTelemetry SDK with the global tracer provider. +If you're getting started with OpenTelemetry instrumentation, the following blog posts have step-by-step instructions to ingest and explore tracing data with the Elastic stack: + +* https://www.elastic.co/blog/manual-instrumentation-of-python-applications-opentelemetry[Manual instrumentation with OpenTelemetry for Python applications] +* https://www.elastic.co/blog/auto-instrumentation-of-python-applications-opentelemetry[Automatic instrumentation with OpenTelemetry for Python applications] + +[discrete] +=== Comparison with community instrumentation + +The https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/elasticsearch/elasticsearch.html[commmunity OpenTelemetry Elasticsearch instrumentation] also instruments the client and sends OpenTelemetry traces, but was developed before the OpenTelemetry Semantic Conventions for {es}, so the traces attributes are inconsistent with other OpenTelemetry Elasticsearch client instrumentations. To avoid tracing the same requests twice, make sure to use only one instrumentation, either by uninstalling the opentelemetry-instrumentation-elasticsearch Python package or by <>. + +[discrete] +==== Configuring the OpenTelemetry instrumentation + +You can configure this OpenTelemetry instrumentation through environment variables. +The following configuration options are available. + +[discrete] +[[opentelemetry-config-enable]] +===== Enable / Disable the OpenTelemetry instrumentation + +With this configuration option you can enable (default) or disable the built-in OpenTelemetry instrumentation. + +**Default:** `true` + +|============ +| Environment Variable | `OTEL_PYTHON_INSTRUMENTATION_ELASTICSEARCH_ENABLED` +|============ + +[discrete] +===== Capture search request bodies + +Per default, the built-in OpenTelemetry instrumentation does not capture request bodies due to data privacy considerations. You can use this option to enable capturing of search queries from the request bodies of {es} search requests in case you wish to gather this information regardless. The options are to capture the raw search query or not capture it at all. + +**Default:** `omit` + +**Valid Options:** `omit`, `raw` + +|============ +| Environment Variable | `OTEL_PYTHON_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY` +|============ + +[discrete] +==== Overhead + +The OpenTelemetry instrumentation (as any other monitoring approach) may come with a slight overhead on CPU, memory, and/or latency. The overhead may only occur when the instrumentation is enabled (default) and an OpenTelemetry SDK is active in the target application. When the instrumentation is disabled or no OpenTelemetry SDK is active within the target application, monitoring overhead is not expected when using the client. + +Even in cases where the instrumentation is enabled and is actively used (by an OpenTelemetry SDK), the overhead is minimal and negligible in the vast majority of cases. In edge cases where there is a noticeable overhead, the <> to eliminate any potential impact on performance. diff --git a/elasticsearch_serverless/_otel.py b/elasticsearch_serverless/_otel.py index 1f052b6..9264569 100644 --- a/elasticsearch_serverless/_otel.py +++ b/elasticsearch_serverless/_otel.py @@ -52,7 +52,7 @@ def __init__( body_strategy: 'Literal["omit", "raw"]' | None = None, ): if enabled is None: - enabled = os.environ.get(ENABLED_ENV_VAR, "false") != "false" + enabled = os.environ.get(ENABLED_ENV_VAR, "true") == "true" self.tracer = tracer or _tracer self.enabled = enabled and self.tracer is not None diff --git a/test_elasticsearch_serverless/test_otel.py b/test_elasticsearch_serverless/test_otel.py index 4f1abfb..1177f38 100644 --- a/test_elasticsearch_serverless/test_otel.py +++ b/test_elasticsearch_serverless/test_otel.py @@ -50,7 +50,7 @@ def setup_tracing(): def test_enabled(): otel = OpenTelemetry() - assert otel.enabled == (os.environ.get(ENABLED_ENV_VAR, "false") != "false") + assert otel.enabled == (os.environ.get(ENABLED_ENV_VAR, "true") == "true") def test_minimal_span(): From 1ccf81619ef90f189632a7911a4877bb9ad71335 Mon Sep 17 00:00:00 2001 From: Quentin Pradet Date: Mon, 24 Jun 2024 18:03:40 +0400 Subject: [PATCH 7/7] Fix Buildkite pipelines --- .buildkite/generatesteps.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.buildkite/generatesteps.py b/.buildkite/generatesteps.py index 6967ad6..98ace21 100644 --- a/.buildkite/generatesteps.py +++ b/.buildkite/generatesteps.py @@ -6,7 +6,7 @@ def benchmark_to_steps(python, connection_class, nox_session): return [ { - "group": f":elasticsearch: :python: ES Serverless ({python}/{connection_class})", + "group": f":elasticsearch: :python: {nox_session} {python} {connection_class}", "steps": [ { "label": "Run tests", @@ -25,12 +25,12 @@ def benchmark_to_steps(python, connection_class, nox_session): "EC_REGISTER_BACKEND": "appex-qa-team-cluster", "EC_ENV": "qa", "EC_REGION": "aws-eu-west-1", - "EC_PROJECT_PREFIX": f"esv-client-python-test-{python}-{connection_class}", + "EC_PROJECT_PREFIX": f"esv-client-python-{nox_session}-{python}-{connection_class}", }, "command": "./.buildkite/run-tests", "artifact_paths": "junit/*-junit.xml", "retry": {"manual": False}, - "key": f"run_{python.replace('.', '_')}_{connection_class}", + "key": f"run_{python.replace('.', '_')}_{connection_class}_{nox_session}", }, { "label": "Teardown", @@ -41,7 +41,7 @@ def benchmark_to_steps(python, connection_class, nox_session): "EC_REGISTER_BACKEND": "appex-qa-team-cluster", "EC_ENV": "qa", "EC_REGION": "aws-eu-west-1", - "EC_PROJECT_PREFIX": f"esv-client-python-test-{python}-{connection_class}", + "EC_PROJECT_PREFIX": f"esv-client-python-{nox_session}-{python}-{connection_class}", }, "command": ".buildkite/teardown-tests", "depends_on": f"run_{python.replace('.', '_')}_{connection_class}",