From 262414ebe6b29c08019b3dbdf55c3c31596f07ec Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 18 Mar 2025 15:12:18 -0400 Subject: [PATCH 01/23] switch to vendor folder --- .../pygen/codegen/models/code_model.py | 6 +++-- .../pygen/codegen/models/operation.py | 2 +- .../pygen/codegen/models/operation_group.py | 4 ++-- .../pygen/codegen/models/parameter.py | 2 +- .../pygen/codegen/models/primitive_types.py | 4 ++-- .../pygen/codegen/serializers/__init__.py | 22 +++++++++++-------- .../codegen/serializers/general_serializer.py | 6 ++--- ...endor.py.jinja2 => vendor_utils.py.jinja2} | 0 packages/http-client-python/package-lock.json | 4 ++-- 9 files changed, 28 insertions(+), 22 deletions(-) rename packages/http-client-python/generator/pygen/codegen/templates/{vendor.py.jinja2 => vendor_utils.py.jinja2} (100%) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index 4d0f1da89b1..0c5eb0ab20e 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -245,8 +245,10 @@ def is_top_namespace(self, client_namespace: str) -> bool: """ return client_namespace == self.namespace - def need_vendored_code(self, async_mode: bool, client_namespace: str) -> bool: - """Whether we need to vendor code in the _vendor.py in specific namespace""" + def need_vendor_folder(self, async_mode: bool, client_namespace: str) -> bool: + return self.need_vendor_utils(async_mode, client_namespace) + + def need_vendor_utils(self, async_mode: bool, client_namespace: str) -> bool: return ( self.need_vendored_form_data(async_mode, client_namespace) or self.need_vendored_etag(client_namespace) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 1f156009854..6c0eee95619 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -391,7 +391,7 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements ImportType.SDKCORE, ) if not async_mode: - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor") + relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils") file_import.add_submodule_import( relative_path, "prep_if_match", diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index 09eabbc9903..339a0fe41f7 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -147,7 +147,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: self.code_model.get_relative_import_path( serialize_namespace, self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), - module_name="_vendor", + module_name="_vendor.utils", ), f"{self.client.name}MixinABC", ImportType.LOCAL, @@ -183,7 +183,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: self.code_model.get_relative_import_path( serialize_namespace, self.code_model.get_imported_namespace_for_client(self.code_model.namespace, async_mode), - module_name="_vendor", + module_name="_vendor.utils", ), "raise_if_not_implemented", ImportType.LOCAL, diff --git a/packages/http-client-python/generator/pygen/codegen/models/parameter.py b/packages/http-client-python/generator/pygen/codegen/models/parameter.py index 1805e9d2fb3..bb6061abcbd 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/parameter.py +++ b/packages/http-client-python/generator/pygen/codegen/models/parameter.py @@ -275,7 +275,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: if self.is_form_data: serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils"), "prepare_multipart_form_data", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py b/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py index 08eb8de03df..94093366686 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py +++ b/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py @@ -618,13 +618,13 @@ def type_annotation(self, **kwargs: Any) -> str: return self.name def docstring_type(self, **kwargs: Any) -> str: - return f"~{self.code_model.namespace}._vendor.{self.name}" + return f"~{self.code_model.namespace}._vendor.utils.{self.name}" def imports(self, **kwargs: Any) -> FileImport: file_import = super().imports(**kwargs) serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils"), self.name, ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 25531abe3cf..e798d4db013 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -153,7 +153,7 @@ def serialize(self) -> None: general_serializer.serialize_pkgutil_init_file(), ) - # _model_base.py/_serialization.py/_vendor.py/py.typed/_types.py/_validation.py + # _model_base.py/_serialization.py/_vendor/py.typed/_types.py/_validation.py # is always put in top level namespace if self.code_model.is_top_namespace(client_namespace): self._serialize_and_write_top_level_folder(env=env, namespace=client_namespace) @@ -401,24 +401,28 @@ def _serialize_client_and_config_files( ) # sometimes we need define additional Mixin class for client in _vendor.py - self._serialize_and_write_vendor_file(env, namespace) + self._serialize_and_write_vendor_folder(env, namespace) - def _serialize_and_write_vendor_file(self, env: Environment, namespace: str) -> None: + def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) - # write _vendor.py for async_mode, async_path in self.serialize_loop: - if self.code_model.need_vendored_code(async_mode=async_mode, client_namespace=namespace): + if self.code_model.need_vendor_folder(async_mode=async_mode, client_namespace=namespace): self.write_file( - exec_path / Path(f"{async_path}_vendor.py"), + exec_path / Path(f"{async_path}_vendor") / Path("__init__.py"), + self.code_model.options["license_header"], + ) + if self.code_model.need_vendor_utils(async_mode=async_mode, client_namespace=namespace): + self.write_file( + exec_path / Path(f"{async_path}_vendor") / Path("utils.py"), GeneralSerializer( code_model=self.code_model, env=env, async_mode=async_mode, client_namespace=namespace - ).serialize_vendor_file(), + ).need_vendor_utils_file(), ) def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) - # write _vendor.py - self._serialize_and_write_vendor_file(env, namespace) + # write _vendor folder + self._serialize_and_write_vendor_folder(env, namespace) general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 57e774d99b0..bce38f47f47 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -85,8 +85,8 @@ def serialize_service_client_file(self, clients: List[Client]) -> str: serialize_namespace=self.serialize_namespace, ) - def serialize_vendor_file(self) -> str: - template = self.env.get_template("vendor.py.jinja2") + def need_vendor_utils_file(self) -> str: + template = self.env.get_template("vendor_utils.py.jinja2") clients = self.code_model.get_clients(self.client_namespace) # configure imports @@ -111,7 +111,7 @@ def serialize_vendor_file(self) -> str: for client in clients: if client.has_mixin: file_import.add_submodule_import( - "._configuration", + ".._configuration", f"{client.name}Configuration", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/templates/vendor.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 similarity index 100% rename from packages/http-client-python/generator/pygen/codegen/templates/vendor.py.jinja2 rename to packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index 740621513f8..089b11a05d0 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -1,12 +1,12 @@ { "name": "@typespec/http-client-python", - "version": "0.7.1", + "version": "0.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@typespec/http-client-python", - "version": "0.7.1", + "version": "0.8.0", "hasInstallScript": true, "license": "MIT", "dependencies": { From 26dcd606ec3da4185c8ae543fb64f21921e96139 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 24 Mar 2025 14:49:06 -0400 Subject: [PATCH 02/23] fix serialization import --- .../generator/pygen/codegen/serializers/general_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index c3e27186dfe..94069eb20c6 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -107,7 +107,7 @@ def need_vendor_utils_file(self) -> str: TypingSection.TYPING, ) file_import.add_msrest_import( - serialize_namespace=self.serialize_namespace, + serialize_namespace=f"{self.serialize_namespace}._vendor", msrest_import_type=MsrestImportType.SerializerDeserializer, typing_section=TypingSection.TYPING, ) From 833162b4c1bad177501a45843cad28b968132ee7 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 24 Mar 2025 15:20:31 -0400 Subject: [PATCH 03/23] passing with serialization folder --- .../generator/pygen/codegen/serializers/general_serializer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 94069eb20c6..609d6851d73 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -135,12 +135,12 @@ def need_vendor_utils_file(self) -> str: file_import.add_submodule_import("typing", "Any", ImportType.STDLIB) file_import.add_submodule_import("typing", "List", ImportType.STDLIB) file_import.add_submodule_import( - "._model_base", + ".._model_base", "SdkJSONEncoder", ImportType.LOCAL, ) file_import.add_submodule_import( - "._model_base", + ".._model_base", "Model", ImportType.LOCAL, ) From cb6394a4efeb7800d3c983f59cc57a03bea11c15 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 25 Mar 2025 13:49:26 -0400 Subject: [PATCH 04/23] move vendor folder to single folder at root of namespaces --- .../pygen/codegen/models/code_model.py | 7 ++-- .../generator/pygen/codegen/models/imports.py | 2 +- .../pygen/codegen/models/operation_group.py | 35 ++++++++--------- .../pygen/codegen/serializers/__init__.py | 38 +++++++++---------- .../codegen/serializers/general_serializer.py | 15 +------- .../codegen/templates/vendor_utils.py.jinja2 | 17 ++++----- 6 files changed, 50 insertions(+), 64 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index 229451d662d..57fa75f5010 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -249,7 +249,7 @@ def need_vendor_utils(self, async_mode: bool, client_namespace: str) -> bool: self.need_vendored_form_data(async_mode, client_namespace) or self.need_vendored_etag(client_namespace) or self.need_vendored_abstract(client_namespace) - or self.need_vendored_mixin(client_namespace) + or self.need_vendored_mixin ) def need_vendored_form_data(self, async_mode: bool, client_namespace: str) -> bool: @@ -266,8 +266,9 @@ def need_vendored_etag(self, client_namespace: str) -> bool: def need_vendored_abstract(self, client_namespace: str) -> bool: return self.is_top_namespace(client_namespace) and self.has_abstract_operations - def need_vendored_mixin(self, client_namespace: str) -> bool: - return self.has_mixin(client_namespace) + @property + def need_vendored_mixin(self) -> bool: + return any(c_n for c_n in self.client_namespace_types.keys() if self.has_mixin(c_n)) def has_mixin(self, client_namespace: str) -> bool: return any(c for c in self.get_clients(client_namespace) if c.has_mixin) diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index ed98052a7bb..2152ea19c54 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -273,7 +273,7 @@ def add_msrest_import( self.add_submodule_import("msrest", "Deserializer", ImportType.THIRDPARTY, typing_section) else: # _serialization.py is always in root namespace - imported_namespace = self.code_model.namespace + imported_namespace = f"{self.code_model.namespace}._vendor" if self.code_model.options["multiapi"]: # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX while _serialization.py is in azure.mgmt.xxx imported_namespace = get_parent_namespace(imported_namespace) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index 339a0fe41f7..35c902d1a72 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -67,7 +67,7 @@ def has_non_abstract_operations(self) -> bool: def base_class(self) -> str: base_classes: List[str] = [] if self.is_mixin: - base_classes.append(f"{self.client.name}MixinABC") + base_classes.append("ClientMixinABC") return ", ".join(base_classes) def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: @@ -141,32 +141,33 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ImportType.LOCAL, alias="_models", ) + file_import.add_submodule_import( + self.code_model.get_relative_import_path( + serialize_namespace, + self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), + module_name="_configuration", + ), + f"{self.client.name}Configuration", + ImportType.LOCAL, + ) + pipeline_client = f"{'Async' if async_mode else ''}PipelineClient" + file_import.add_submodule_import( + "" if self.code_model.is_azure_flavor else "runtime", + pipeline_client, + ImportType.SDKCORE, + ) if self.is_mixin: file_import.add_submodule_import( # XxxMixinABC is always defined in _vendor of client namespace self.code_model.get_relative_import_path( - serialize_namespace, + f"{self.code_model.namespace}._vendor.utils", self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), module_name="_vendor.utils", ), - f"{self.client.name}MixinABC", + f"ClientMixinABC[{pipeline_client}, {self.client.name}Configuration]", ImportType.LOCAL, ) else: - file_import.add_submodule_import( - "" if self.code_model.is_azure_flavor else "runtime", - f"{'Async' if async_mode else ''}PipelineClient", - ImportType.SDKCORE, - ) - file_import.add_submodule_import( - self.code_model.get_relative_import_path( - serialize_namespace, - self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), - module_name="_configuration", - ), - f"{self.client.name}Configuration", - ImportType.LOCAL, - ) file_import.add_msrest_import( serialize_namespace=kwargs.get("serialize_namespace", self.code_model.namespace), msrest_import_type=MsrestImportType.Serializer, diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 00622608b72..8778df2b46d 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -407,19 +407,24 @@ def _serialize_client_and_config_files( def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) - for async_mode, async_path in self.serialize_loop: - if self.code_model.need_vendor_folder(async_mode=async_mode, client_namespace=namespace): - self.write_file( - exec_path / Path(f"{async_path}_vendor") / Path("__init__.py"), - self.code_model.options["license_header"], - ) - if self.code_model.need_vendor_utils(async_mode=async_mode, client_namespace=namespace): - self.write_file( - exec_path / Path(f"{async_path}_vendor") / Path("utils.py"), - GeneralSerializer( - code_model=self.code_model, env=env, async_mode=async_mode, client_namespace=namespace - ).need_vendor_utils_file(), - ) + general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False) + vendor_folder_path = exec_path / Path(f"_vendor") + if self.code_model.need_vendor_folder(async_mode=False, client_namespace=namespace): + self.write_file( + vendor_folder_path / Path("__init__.py"), + self.code_model.options["license_header"], + ) + if self.code_model.need_vendor_utils(async_mode=False, client_namespace=namespace): + self.write_file( + vendor_folder_path / Path("utils.py"), + general_serializer.need_vendor_utils_file(), + ) + # write _serialization.py + if not (self.code_model.options["client_side_validation"] or self.code_model.options["multiapi"]): + self.write_file( + vendor_folder_path / Path("_serialization.py"), + general_serializer.serialize_serialization_file(), + ) def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) @@ -434,13 +439,6 @@ def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str # write the empty py.typed file self.write_file(exec_path / Path("py.typed"), "# Marker file for PEP 561.") - # write _serialization.py - if not self.code_model.options["client_side_validation"] and not self.code_model.options["multiapi"]: - self.write_file( - exec_path / Path("_serialization.py"), - general_serializer.serialize_serialization_file(), - ) - # write _model_base.py if self.code_model.options["models_mode"] == "dpg": self.write_file( diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 609d6851d73..344aa4cc4cf 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -94,30 +94,17 @@ def need_vendor_utils_file(self) -> str: # configure imports file_import = FileImport(self.code_model) - if self.code_model.need_vendored_mixin(self.client_namespace): + if self.code_model.need_vendored_mixin: file_import.add_submodule_import( "abc", "ABC", ImportType.STDLIB, ) - file_import.add_submodule_import( - "" if self.code_model.is_azure_flavor else "runtime", - f"{'Async' if self.async_mode else ''}PipelineClient", - ImportType.SDKCORE, - TypingSection.TYPING, - ) file_import.add_msrest_import( serialize_namespace=f"{self.serialize_namespace}._vendor", msrest_import_type=MsrestImportType.SerializerDeserializer, typing_section=TypingSection.TYPING, ) - for client in clients: - if client.has_mixin: - file_import.add_submodule_import( - ".._configuration", - f"{client.name}Configuration", - ImportType.LOCAL, - ) if self.code_model.need_vendored_etag(self.client_namespace): file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB) file_import.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 index b92ef3b5a2f..04fc043736e 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 @@ -3,18 +3,17 @@ {{ imports }} -{% if code_model.need_vendored_mixin(client_namespace) %} - {% for client in clients | selectattr("has_mixin") %} -{% set pylint_disable = "# pylint: disable=name-too-long" if (client.name | length) + ("MixinABC" | length) > 40 else "" %} -class {{ client.name }}MixinABC( {{ pylint_disable }} - ABC -): +{% if code_model.need_vendored_mixin %} + +TClient = TypeVar("TClient") +TConfig = TypeVar("TConfig") + +class ClientMixinABC(ABC, Generic[TClient, TConfig]): """DO NOT use this class. It is for internal typing use only.""" - _client: "{{ keywords.async_class }}PipelineClient" - _config: {{ client.name }}Configuration + _client: TClient + _config: TConfig _serialize: "Serializer" _deserialize: "Deserializer" - {% endfor %} {% endif %} {% if code_model.need_vendored_abstract(client_namespace) %} From 2108e11c77f64298148257770eee9f8245393461 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 25 Mar 2025 16:44:24 -0400 Subject: [PATCH 05/23] trying to get vendor as a single folder at the root of the namespace to work --- .../pygen/codegen/models/operation_group.py | 14 +- .../codegen/serializers/general_serializer.py | 2 + .../templates/operation_group.py.jinja2 | 6 +- packages/http-client-python/package-lock.json | 982 +++++------------- 4 files changed, 268 insertions(+), 736 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index 35c902d1a72..58353f8c67a 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -63,11 +63,11 @@ def has_non_abstract_operations(self) -> bool: operation_group.has_non_abstract_operations for operation_group in self.operation_groups ) - @property - def base_class(self) -> str: + def base_class(self, async_mode: bool) -> str: + pipeline_client = f"{'Async' if async_mode else ''}PipelineClient" base_classes: List[str] = [] if self.is_mixin: - base_classes.append("ClientMixinABC") + base_classes.append(f"ClientMixinABC[{pipeline_client}, {self.client.name}Configuration]") return ", ".join(base_classes) def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: @@ -150,21 +150,19 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: f"{self.client.name}Configuration", ImportType.LOCAL, ) - pipeline_client = f"{'Async' if async_mode else ''}PipelineClient" file_import.add_submodule_import( "" if self.code_model.is_azure_flavor else "runtime", - pipeline_client, + f"{'Async' if async_mode else ''}PipelineClient", ImportType.SDKCORE, ) if self.is_mixin: file_import.add_submodule_import( # XxxMixinABC is always defined in _vendor of client namespace self.code_model.get_relative_import_path( - f"{self.code_model.namespace}._vendor.utils", self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), - module_name="_vendor.utils", + f"{self.code_model.namespace}._vendor.utils", ), - f"ClientMixinABC[{pipeline_client}, {self.client.name}Configuration]", + "ClientMixinABC", ImportType.LOCAL, ) else: diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 344aa4cc4cf..102aa00c282 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -105,6 +105,8 @@ def need_vendor_utils_file(self) -> str: msrest_import_type=MsrestImportType.SerializerDeserializer, typing_section=TypingSection.TYPING, ) + file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB) + file_import.add_submodule_import("typing", "Generic", ImportType.STDLIB) if self.code_model.need_vendored_etag(self.client_namespace): file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB) file_import.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/templates/operation_group.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/operation_group.py.jinja2 index bba82eaccbe..3cc8e586292 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/operation_group.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/operation_group.py.jinja2 @@ -1,4 +1,4 @@ -{% set base_class = ("(" + operation_group.base_class + ")") if operation_group.base_class else "" %} +{% set base_class = ("(" + operation_group.base_class(async_mode) + ")") if operation_group.base_class(async_mode) else "" %} {% macro check_abstract_methods() %} {% if operation_group.has_abstract_operations %} raise_if_not_implemented(self.__class__, [ @@ -8,9 +8,9 @@ ]) {% endif %} {% endmacro %} -{% if operation_group.base_class %} +{% if operation_group.base_class(async_mode) %} class {{ operation_group.class_name }}( {{ operation_group.pylint_disable() }} - {{ operation_group.base_class }} + {{ operation_group.base_class(async_mode) }} ): {% else %} class {{ operation_group.class_name }}: {{ operation_group.pylint_disable() }} diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index df2ad7f107b..cc8a84fa0d7 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -320,9 +320,9 @@ } }, "node_modules/@azure/identity": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.7.0.tgz", - "integrity": "sha512-6z/S2KorkbKaZ0DgZFVRdu7RCuATmMSTjKpuhj7YpjxkJ0vnJ7kTM3cpNgzFgk9OPYfZ31wrBEtC/iwAS4jQDA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.8.0.tgz", + "integrity": "sha512-l9ALUGHtFB/JfsqmA+9iYAp2a+cCwdNO/cyIr2y7nJLJsz1aae6qVP8XxT7Kbudg0IQRSIMXj0+iivFdbD1xPA==", "dev": true, "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -333,7 +333,7 @@ "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.2.1", + "@azure/msal-node": "^3.2.3", "events": "^3.0.0", "jws": "^4.0.0", "open": "^10.1.0", @@ -357,33 +357,33 @@ } }, "node_modules/@azure/msal-browser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.7.0.tgz", - "integrity": "sha512-H4AIPhIQVe1qW4+BJaitqod6UGQiXE3juj7q2ZBsOPjuZicQaqcbnBp2gCroF/icS0+TJ9rGuyCBJbjlAqVOGA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.8.0.tgz", + "integrity": "sha512-z7kJlMW3IAETyq82LDKJqr++IeOvU728q9lkuTFjEIPUWxnB1OlmuPCF32fYurxOnOnJeFEZxjbEzq8xyP0aag==", "dev": true, "dependencies": { - "@azure/msal-common": "15.2.1" + "@azure/msal-common": "15.3.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.2.1.tgz", - "integrity": "sha512-eZHtYE5OHDN0o2NahCENkczQ6ffGc0MoUSAI3hpwGpZBHJXaEQMMZPWtIx86da2L9w7uT+Tr/xgJbGwIkvTZTQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.3.0.tgz", + "integrity": "sha512-lh+eZfibGwtQxFnx+mj6cYWn0pwA8tDnn8CBs9P21nC7Uw5YWRwfXaXdVQSMENZ5ojRqR+NzRaucEo4qUvs3pA==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.3.0.tgz", - "integrity": "sha512-ulsT3EHF1RQ29X55cxBLgKsIKWni9JdbUqG7sipGVP4uhWcBpmm/vhKOMH340+27Acm9+kHGnN/5XmQ5LrIDgA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.4.0.tgz", + "integrity": "sha512-b4wBaPV68i+g61wFOfl5zh1lQ9UylgCQpI2638pJHV0SINneO78hOFdnX8WCoGw5OOc4Eewth9pYOg7gaiyUYw==", "dev": true, "dependencies": { - "@azure/msal-common": "15.2.1", + "@azure/msal-common": "15.3.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -447,26 +447,6 @@ "node": ">=18" } }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dev": true, - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", @@ -922,9 +902,9 @@ "peer": true }, "node_modules/@eslint/config-helpers": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", - "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", "dev": true, "peer": true, "engines": { @@ -945,9 +925,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", - "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "peer": true, "dependencies": { @@ -1018,9 +998,9 @@ "peer": true }, "node_modules/@eslint/js": { - "version": "9.22.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", - "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "dev": true, "peer": true, "engines": { @@ -1559,9 +1539,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", - "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", + "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", "cpu": [ "arm" ], @@ -1572,9 +1552,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", - "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", + "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", "cpu": [ "arm64" ], @@ -1585,9 +1565,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", - "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", + "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", "cpu": [ "arm64" ], @@ -1598,9 +1578,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", - "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", + "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", "cpu": [ "x64" ], @@ -1611,9 +1591,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", - "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", + "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", "cpu": [ "arm64" ], @@ -1624,9 +1604,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", - "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", + "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", "cpu": [ "x64" ], @@ -1637,9 +1617,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", - "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", + "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", "cpu": [ "arm" ], @@ -1650,9 +1630,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", - "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", + "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", "cpu": [ "arm" ], @@ -1663,9 +1643,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", - "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", + "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", "cpu": [ "arm64" ], @@ -1676,9 +1656,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", - "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", + "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", "cpu": [ "arm64" ], @@ -1689,9 +1669,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", - "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", + "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", "cpu": [ "loong64" ], @@ -1702,9 +1682,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", - "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", + "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", "cpu": [ "ppc64" ], @@ -1715,9 +1695,22 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", - "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", + "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", + "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", "cpu": [ "riscv64" ], @@ -1728,9 +1721,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", - "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", + "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", "cpu": [ "s390x" ], @@ -1741,9 +1734,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", - "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", + "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", "cpu": [ "x64" ], @@ -1754,9 +1747,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", - "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", + "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", "cpu": [ "x64" ], @@ -1767,9 +1760,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", - "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", + "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", "cpu": [ "arm64" ], @@ -1780,9 +1773,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", - "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", + "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", "cpu": [ "ia32" ], @@ -1793,9 +1786,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", - "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", + "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", "cpu": [ "x64" ], @@ -1818,9 +1811,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { @@ -1857,23 +1850,17 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", - "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz", + "integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/type-utils": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/type-utils": "8.28.0", + "@typescript-eslint/utils": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1893,15 +1880,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", - "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz", + "integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4" }, "engines": { @@ -1940,13 +1927,13 @@ "dev": true }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz", + "integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1957,13 +1944,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", - "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz", + "integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/utils": "8.26.1", + "@typescript-eslint/typescript-estree": "8.28.0", + "@typescript-eslint/utils": "8.28.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -2003,9 +1990,9 @@ "dev": true }, "node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz", + "integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2016,13 +2003,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz", + "integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/visitor-keys": "8.28.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2089,15 +2076,15 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz", + "integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@typescript-eslint/scope-manager": "8.28.0", + "@typescript-eslint/types": "8.28.0", + "@typescript-eslint/typescript-estree": "8.28.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2112,12 +2099,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz", + "integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/types": "8.28.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2129,11 +2116,10 @@ } }, "node_modules/@typespec/compiler": { - "version": "0.67.1", - "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.67.1.tgz", - "integrity": "sha512-inaJUlbwvFBNiT8ViXZ4O2m0ECiLPkkp0Ek1wNquxpWNHxgvfFDH/JTv5SXXwL5FXY+uym9hNcyjmHQB7RJExw==", + "version": "0.67.2", + "resolved": "https://registry.npmjs.org/@typespec/compiler/-/compiler-0.67.2.tgz", + "integrity": "sha512-6c47359nR6IjI4fYq+0hi1mm9GMdHQ/LdqPa/roKg1wQaBohUMBJXW7duMDcz2BTorYjoEBYalz9olMG4oqZDA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "~7.26.2", "@inquirer/prompts": "^7.3.1", @@ -2166,7 +2152,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2179,7 +2164,6 @@ "resolved": "https://registry.npmjs.org/@typespec/events/-/events-0.67.1.tgz", "integrity": "sha512-4pd/FEd+y72h2eUOlwGavK+nv3SDp7ZUJkGTcARyjLH5aSIAOl4uYW+WzQjGJylu/9t+xmoHy47siOvYBxONkQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.0.0" }, @@ -2210,7 +2194,6 @@ "resolved": "https://registry.npmjs.org/@typespec/http-specs/-/http-specs-0.1.0-alpha.15-dev.3.tgz", "integrity": "sha512-pWrtceHjixwFv6SX1nkSu5WG7odm83FqnKLVzmO5Y29MD4DCgu1AhqtDM7UJ1GZgfHPbZS0zh9gj/01vxEhkdQ==", "dev": true, - "license": "MIT", "dependencies": { "@typespec/spec-api": "^0.1.0-alpha.2 || >=0.1.0-alpha.3-dev <0.1.0-alpha.3", "@typespec/spector": "^0.1.0-alpha.9 || >=0.1.0-alpha.10-dev <0.1.0-alpha.10" @@ -2253,31 +2236,23 @@ } }, "node_modules/@typespec/spec-api": { - "version": "0.1.0-alpha.3-dev.0", - "resolved": "https://registry.npmjs.org/@typespec/spec-api/-/spec-api-0.1.0-alpha.3-dev.0.tgz", - "integrity": "sha512-zMozvoCEDERYvGMgT2EvuNyIcaFvf3pUXWhc7jyhJK2zI0z2ELnT4gUEynJ3ugI/ICaWtxHrGkwueaf508a5gQ==", + "version": "0.1.0-alpha.3", + "resolved": "https://registry.npmjs.org/@typespec/spec-api/-/spec-api-0.1.0-alpha.3.tgz", + "integrity": "sha512-PQ46kam0YO2khZyWLduvJrKEKTKCOXNSas1aESSxz1wx/wfPZFHmYZsNAtINUTQfoKYwuxSTY5ey2NHQdJA6WQ==", "dev": true, "dependencies": { - "body-parser": "^1.20.3", "deep-equal": "^2.2.0", "express": "^4.21.2", - "express-promise-router": "^4.1.1", - "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", - "picocolors": "~1.1.1", - "prettier": "~3.5.3", - "winston": "^3.17.0", - "xml2js": "^0.6.2", - "yargs": "~17.7.2" + "xml2js": "^0.6.2" }, "engines": { "node": ">=20.0.0" } }, "node_modules/@typespec/spec-coverage-sdk": { - "version": "0.1.0-alpha.5-dev.0", - "resolved": "https://registry.npmjs.org/@typespec/spec-coverage-sdk/-/spec-coverage-sdk-0.1.0-alpha.5-dev.0.tgz", - "integrity": "sha512-I0p1ogrB3hW16K9IJyxFUz6AvuQ8NDsiLrav5ujGGJbW3gXdp+N6MzxXp5NNs4jfHoryX4kkA7xlTiPqKz3Pcw==", + "version": "0.1.0-alpha.5", + "resolved": "https://registry.npmjs.org/@typespec/spec-coverage-sdk/-/spec-coverage-sdk-0.1.0-alpha.5.tgz", + "integrity": "sha512-YXwE2Yzxt4Sq30G6Rt1PhHmhXxJQ72sgRUpkjQw47py+OXbm22TMgrakZsEQTf2Q2Yvovh2mLaqUFxJoG7lJbw==", "dev": true, "dependencies": { "@azure/identity": "~4.7.0", @@ -2288,10 +2263,35 @@ "node": ">=16.0.0" } }, + "node_modules/@typespec/spec-coverage-sdk/node_modules/@azure/identity": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.7.0.tgz", + "integrity": "sha512-6z/S2KorkbKaZ0DgZFVRdu7RCuATmMSTjKpuhj7YpjxkJ0vnJ7kTM3cpNgzFgk9OPYfZ31wrBEtC/iwAS4jQDA==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.2.1", + "events": "^3.0.0", + "jws": "^4.0.0", + "open": "^10.1.0", + "stoppable": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@typespec/spec-coverage-sdk/node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "22.13.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", + "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==", "dev": true, "dependencies": { "undici-types": "~6.20.0" @@ -2304,35 +2304,30 @@ "dev": true }, "node_modules/@typespec/spector": { - "version": "0.1.0-alpha.9", - "resolved": "https://registry.npmjs.org/@typespec/spector/-/spector-0.1.0-alpha.9.tgz", - "integrity": "sha512-plD3bZGqk1v2+pJoZl/TNxWlkS7mMzPNPtd+HkKbjmFxQfFUQGPvmkRq4YGijj9gjqcwYXrzQ10L8/emv9ZnoQ==", + "version": "0.1.0-alpha.10", + "resolved": "https://registry.npmjs.org/@typespec/spector/-/spector-0.1.0-alpha.10.tgz", + "integrity": "sha512-2M/LwXh+YKf0lT9tLV5a9OSI99g8X8ZeyHIUUenddE99gFqi41ql92k1LW/CT1jz4/pmoXMnWx3L+U439EXcHg==", "dev": true, "dependencies": { - "@azure/identity": "~4.7.0", + "@azure/identity": "~4.8.0", "@types/js-yaml": "^4.0.5", - "@typespec/compiler": "^0.67.0", - "@typespec/http": "^0.67.0", - "@typespec/rest": "^0.67.0", - "@typespec/spec-api": "^0.1.0-alpha.2", - "@typespec/spec-coverage-sdk": "^0.1.0-alpha.4", - "@typespec/versioning": "^0.67.0", + "@typespec/compiler": "^0.67.2", + "@typespec/http": "^0.67.1", + "@typespec/rest": "^0.67.1", + "@typespec/spec-api": "^0.1.0-alpha.3", + "@typespec/spec-coverage-sdk": "^0.1.0-alpha.5", + "@typespec/versioning": "^0.67.1", "ajv": "~8.17.1", - "axios": "^1.8.1", "body-parser": "^1.20.3", "deep-equal": "^2.2.0", "express": "^4.21.2", - "express-promise-router": "^4.1.1", - "form-data": "^4.0.2", "globby": "~14.1.0", - "jackspeak": "4.1.0", "js-yaml": "^4.1.0", + "micromatch": "^4.0.8", "morgan": "^1.10.0", - "multer": "^1.4.5-lts.1", - "node-fetch": "^3.3.1", + "multer": "1.4.5-lts.2", "picocolors": "~1.1.1", "source-map-support": "~0.5.21", - "winston": "^3.17.0", "xml2js": "^0.6.2", "yargs": "~17.7.2" }, @@ -2363,7 +2358,6 @@ "resolved": "https://registry.npmjs.org/@typespec/streams/-/streams-0.67.1.tgz", "integrity": "sha512-it+WNzurrk+TEzLvqlbCreyATmSR/g61/YX/k1D+B/QThPv8bh2S1sQqKtUMeThCu4/MHhZL9xTtdxWcLww+lg==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.0.0" }, @@ -2376,7 +2370,6 @@ "resolved": "https://registry.npmjs.org/@typespec/versioning/-/versioning-0.67.1.tgz", "integrity": "sha512-i1eZT8JlCthkRHJS3NH/nZTHUD7gJozP6pVy8wyHBx6TbnDOTfQ1P5YVlL2pF4ZdeRbGFhOKiUF/usEIOrkaVw==", "dev": true, - "license": "MIT", "engines": { "node": ">=20.0.0" }, @@ -2389,7 +2382,6 @@ "resolved": "https://registry.npmjs.org/@typespec/xml/-/xml-0.67.1.tgz", "integrity": "sha512-WDCxdtvlcUvD4AunpSje22Hb0BZzpluHATkx07/ru6HhdJsiwrc//IgGbV5eah9M6gK76sGXLicBLAFlxDfvDw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=20.0.0" @@ -2607,24 +2599,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansi-styles/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -2667,18 +2641,6 @@ "node": ">=12" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2694,17 +2656,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2727,8 +2678,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/body-parser": { "version": "1.20.3", @@ -2794,7 +2744,6 @@ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, - "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -3064,62 +3013,23 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorspace": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", @@ -3205,15 +3115,6 @@ "node": ">= 8" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3276,7 +3177,6 @@ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, - "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -3293,7 +3193,6 @@ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -3347,15 +3246,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3416,12 +3306,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -3499,21 +3383,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -3582,19 +3451,19 @@ } }, "node_modules/eslint": { - "version": "9.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", - "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.2", - "@eslint/config-helpers": "^0.1.0", + "@eslint/config-helpers": "^0.2.0", "@eslint/core": "^0.12.0", - "@eslint/eslintrc": "^3.3.0", - "@eslint/js": "9.22.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3883,29 +3752,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express-promise-router": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/express-promise-router/-/express-promise-router-4.1.1.tgz", - "integrity": "sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA==", - "dev": true, - "dependencies": { - "is-promise": "^4.0.0", - "lodash.flattendeep": "^4.0.0", - "methods": "^1.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/express": "^4.0.0", - "express": "^4.0.0" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3931,7 +3777,6 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4012,35 +3857,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "dev": true - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4121,32 +3937,6 @@ "dev": true, "peer": true }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -4178,33 +3968,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4389,7 +4152,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, - "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", @@ -4410,7 +4172,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -4642,7 +4403,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.8.19" @@ -4652,8 +4412,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/internal-slot": { "version": "1.1.0", @@ -4711,12 +4470,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, "node_modules/is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", @@ -4826,7 +4579,6 @@ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -4877,12 +4629,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4928,18 +4674,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -5081,7 +4815,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", "dev": true, - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -5176,8 +4909,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jwa": { "version": "2.0.0", @@ -5210,12 +4942,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5245,12 +4971,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -5300,29 +5020,6 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "dev": true }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "dev": true, - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/logform/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/loupe": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", @@ -5330,9 +5027,9 @@ "dev": true }, "node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "dev": true, "engines": { "node": "20 || >=22" @@ -5651,9 +5348,9 @@ "dev": true }, "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "version": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", "dev": true, "dependencies": { "append-field": "^1.0.0", @@ -5719,43 +5416,6 @@ "node": ">= 0.6" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5843,15 +5503,6 @@ "node": ">= 0.8" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "dependencies": { - "fn.name": "1.x.x" - } - }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", @@ -6000,7 +5651,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6116,8 +5766,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -6132,12 +5781,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6331,9 +5974,9 @@ } }, "node_modules/rollup": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", - "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", + "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", "dev": true, "dependencies": { "@types/estree": "1.0.6" @@ -6346,34 +5989,40 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.36.0", - "@rollup/rollup-android-arm64": "4.36.0", - "@rollup/rollup-darwin-arm64": "4.36.0", - "@rollup/rollup-darwin-x64": "4.36.0", - "@rollup/rollup-freebsd-arm64": "4.36.0", - "@rollup/rollup-freebsd-x64": "4.36.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", - "@rollup/rollup-linux-arm-musleabihf": "4.36.0", - "@rollup/rollup-linux-arm64-gnu": "4.36.0", - "@rollup/rollup-linux-arm64-musl": "4.36.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", - "@rollup/rollup-linux-riscv64-gnu": "4.36.0", - "@rollup/rollup-linux-s390x-gnu": "4.36.0", - "@rollup/rollup-linux-x64-gnu": "4.36.0", - "@rollup/rollup-linux-x64-musl": "4.36.0", - "@rollup/rollup-win32-arm64-msvc": "4.36.0", - "@rollup/rollup-win32-ia32-msvc": "4.36.0", - "@rollup/rollup-win32-x64-msvc": "4.36.0", + "@rollup/rollup-android-arm-eabi": "4.37.0", + "@rollup/rollup-android-arm64": "4.37.0", + "@rollup/rollup-darwin-arm64": "4.37.0", + "@rollup/rollup-darwin-x64": "4.37.0", + "@rollup/rollup-freebsd-arm64": "4.37.0", + "@rollup/rollup-freebsd-x64": "4.37.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", + "@rollup/rollup-linux-arm-musleabihf": "4.37.0", + "@rollup/rollup-linux-arm64-gnu": "4.37.0", + "@rollup/rollup-linux-arm64-musl": "4.37.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-gnu": "4.37.0", + "@rollup/rollup-linux-riscv64-musl": "4.37.0", + "@rollup/rollup-linux-s390x-gnu": "4.37.0", + "@rollup/rollup-linux-x64-gnu": "4.37.0", + "@rollup/rollup-linux-x64-musl": "4.37.0", + "@rollup/rollup-win32-arm64-msvc": "4.37.0", + "@rollup/rollup-win32-ia32-msvc": "4.37.0", + "@rollup/rollup-win32-x64-msvc": "4.37.0", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -6441,15 +6090,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6676,15 +6316,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -6725,15 +6356,6 @@ "source-map": "^0.6.0" } }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -7077,12 +6699,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -7155,19 +6771,10 @@ "node": ">=0.6" } }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/ts-api-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", - "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "engines": { "node": ">=18.12" @@ -7258,14 +6865,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz", - "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.28.0.tgz", + "integrity": "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.26.1", - "@typescript-eslint/parser": "8.26.1", - "@typescript-eslint/utils": "8.26.1" + "@typescript-eslint/eslint-plugin": "8.28.0", + "@typescript-eslint/parser": "8.28.0", + "@typescript-eslint/utils": "8.28.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7290,7 +6897,6 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -7365,9 +6971,9 @@ } }, "node_modules/vite": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", - "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", "dev": true, "dependencies": { "esbuild": "^0.25.0", @@ -7478,8 +7084,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/vitest": { "version": "3.0.9", @@ -7616,15 +7221,6 @@ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7714,70 +7310,6 @@ "node": ">=8" } }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", - "dev": true, - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "dev": true, - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", From 6a88e2ca412d3f3ef279ad561aa10acfd6c78ecf Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 13:21:39 -0400 Subject: [PATCH 06/23] authenticaiton-apikey passing --- .../generator/pygen/codegen/models/operation_group.py | 2 +- .../generator/pygen/codegen/serializers/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index 58353f8c67a..e4520b12676 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -159,7 +159,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: file_import.add_submodule_import( # XxxMixinABC is always defined in _vendor of client namespace self.code_model.get_relative_import_path( - self.code_model.get_imported_namespace_for_client(self.client.client_namespace, async_mode), + serialize_namespace, f"{self.code_model.namespace}._vendor.utils", ), "ClientMixinABC", diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index f1cb4c772aa..709a6bad531 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -414,7 +414,7 @@ def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) - if self.code_model.need_vendor_folder(async_mode=False, client_namespace=namespace): self.write_file( vendor_folder_path / Path("__init__.py"), - self.code_model.options["license_header"], + self.code_model.license_header, ) if self.code_model.need_vendor_utils(async_mode=False, client_namespace=namespace): self.write_file( From e2c9f99befede3d746e4c772b4b896aaa579e607 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 13:34:19 -0400 Subject: [PATCH 07/23] fix lint --- .../generator/pygen/codegen/models/code_model.py | 2 +- .../generator/pygen/codegen/models/operation.py | 4 +++- .../generator/pygen/codegen/serializers/__init__.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index f6873e8cfd3..99db1607031 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -269,7 +269,7 @@ def need_vendored_abstract(self, client_namespace: str) -> bool: @property def need_vendored_mixin(self) -> bool: - return any(c_n for c_n in self.client_namespace_types.keys() if self.has_mixin(c_n)) + return any(c_n for c_n in self.client_namespace_types if self.has_mixin(c_n)) def has_mixin(self, client_namespace: str) -> bool: return any(c for c in self.get_clients(client_namespace) if c.has_mixin) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 6c0eee95619..3cf869a9657 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -391,7 +391,9 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements ImportType.SDKCORE, ) if not async_mode: - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils") + relative_path = self.code_model.get_relative_import_path( + serialize_namespace, module_name="_vendor.utils" + ) file_import.add_submodule_import( relative_path, "prep_if_match", diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 709a6bad531..946a4913aff 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -410,7 +410,7 @@ def _serialize_client_and_config_files( def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False) - vendor_folder_path = exec_path / Path(f"_vendor") + vendor_folder_path = exec_path / Path("_vendor") if self.code_model.need_vendor_folder(async_mode=False, client_namespace=namespace): self.write_file( vendor_folder_path / Path("__init__.py"), From 1c1850da6c0302f461def9d422a2d19041165f7d Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 13:43:22 -0400 Subject: [PATCH 08/23] add changeset --- .../python-moveToVendorFolder-2025-3-17-13-43-15.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md diff --git a/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md b/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md new file mode 100644 index 00000000000..a6cc5befe75 --- /dev/null +++ b/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/http-client-python" +--- + +Reorder generated `_vendor` file into a `_vendor` folder \ No newline at end of file From 8769d8db0f228d45558fe959ee8acb0e533ed4c6 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 13:58:38 -0400 Subject: [PATCH 09/23] revert package lock change --- packages/http-client-python/package-lock.json | 594 ++++++++++++++++++ 1 file changed, 594 insertions(+) diff --git a/packages/http-client-python/package-lock.json b/packages/http-client-python/package-lock.json index 8bfd1a96d86..96c0842c944 100644 --- a/packages/http-client-python/package-lock.json +++ b/packages/http-client-python/package-lock.json @@ -455,6 +455,66 @@ "node": ">=18" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", @@ -470,6 +530,306 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", @@ -1186,6 +1546,32 @@ "node": ">=14" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.36.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", @@ -1199,6 +1585,214 @@ "darwin" ] }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", From 64d9442d701c85424dd88c7b32e39c444f34b239 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 14:49:13 -0400 Subject: [PATCH 10/23] move model_base into vendor folder --- .../generator/pygen/codegen/models/code_model.py | 6 +++++- .../pygen/codegen/models/lro_operation.py | 2 +- .../generator/pygen/codegen/models/model_type.py | 9 +++++---- .../generator/pygen/codegen/models/operation.py | 4 ++-- .../pygen/codegen/models/paging_operation.py | 2 +- .../generator/pygen/codegen/models/property.py | 2 +- .../pygen/codegen/serializers/__init__.py | 16 ++++++++-------- .../codegen/serializers/general_serializer.py | 4 ++-- .../codegen/serializers/model_serializer.py | 7 ++++--- .../test_typetest_property_nullable_async.py | 2 +- .../test_typetest_property_nullable.py | 2 +- .../unittests/test_model_base_serialization.py | 2 +- .../test_model_base_xml_serialization.py | 2 +- 13 files changed, 33 insertions(+), 27 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index 99db1607031..f5d2888912e 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -243,7 +243,11 @@ def is_top_namespace(self, client_namespace: str) -> bool: return client_namespace == self.namespace def need_vendor_folder(self, async_mode: bool, client_namespace: str) -> bool: - return self.need_vendor_utils(async_mode, client_namespace) + return self.need_vendor_utils(async_mode, client_namespace) or self.need_vendored_serialization or self.options["models_mode"] == "dpg" + + @property + def need_vendored_serialization(self) -> bool: + return not (self.options["client_side_validation"] or self.options["multiapi"]) def need_vendor_utils(self, async_mode: bool, client_namespace: str) -> bool: return ( diff --git a/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py b/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py index 8717954aa5c..075b7528fcd 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py @@ -134,7 +134,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: # but final call returns a model serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), "_deserialize", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/models/model_type.py b/packages/http-client-python/generator/pygen/codegen/models/model_type.py index 3b0952c61a9..f36e50bfe2c 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/model_type.py +++ b/packages/http-client-python/generator/pygen/codegen/models/model_type.py @@ -318,10 +318,11 @@ def imports(self, **kwargs: Any) -> FileImport: ) if self.is_form_data: file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace), - "_model_base", - ImportType.LOCAL, - ) + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), + "Model", + ImportType.LOCAL, + alias="_Model", + ) elif serialize_namespace_type == NamespaceType.TYPES_FILE or ( serialize_namespace_type == NamespaceType.MODEL and called_by_property ): diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 3cf869a9657..a5031a124a1 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -438,12 +438,12 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements if self.overloads: file_import.add_submodule_import("typing", "overload", ImportType.STDLIB) if self.code_model.options["models_mode"] == "dpg": - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base") + relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base") body_param = self.parameters.body_parameter if self.parameters.has_body else None if body_param and not isinstance(body_param.type, BinaryType): if self.has_form_data_body: file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace), "_model_base", ImportType.LOCAL + self.code_model.get_relative_import_path(serialize_namespace), "_vendor.model_base", ImportType.LOCAL ) elif xml_serializable(self.parameters.body_parameter.default_content_type): file_import.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py index f376191dc22..03846a87aad 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py @@ -157,7 +157,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ImportType.SDKCORE, ) if self.code_model.options["models_mode"] == "dpg": - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base") + relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base") file_import.merge(self.item_type.imports(**kwargs)) if self.default_error_deserialization or self.need_deserialize: file_import.add_submodule_import(relative_path, "_deserialize", ImportType.LOCAL) diff --git a/packages/http-client-python/generator/pygen/codegen/models/property.py b/packages/http-client-python/generator/pygen/codegen/models/property.py index 27d4ce8e723..c61e9fe7bef 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/property.py +++ b/packages/http-client-python/generator/pygen/codegen/models/property.py @@ -149,7 +149,7 @@ def imports(self, **kwargs) -> FileImport: if self.code_model.options["models_mode"] == "dpg": serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_model_base"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), "rest_discriminator" if self.is_discriminator else "rest_field", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 946a4913aff..5dca202cdc9 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -153,7 +153,7 @@ def serialize(self) -> None: general_serializer.serialize_pkgutil_init_file(), ) - # _model_base.py/_serialization.py/_vendor/py.typed/_types.py/_validation.py + # _vendor/py.typed/_types.py/_validation.py # is always put in top level namespace if self.code_model.is_top_namespace(client_namespace): self._serialize_and_write_top_level_folder(env=env, namespace=client_namespace) @@ -428,6 +428,13 @@ def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) - general_serializer.serialize_serialization_file(), ) + # write _model_base.py + if self.code_model.options["models_mode"] == "dpg": + self.write_file( + vendor_folder_path / Path("model_base.py"), + general_serializer.serialize_model_base_file(), + ) + def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) # write _vendor folder @@ -441,13 +448,6 @@ def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str # write the empty py.typed file self.write_file(exec_path / Path("py.typed"), "# Marker file for PEP 561.") - # write _model_base.py - if self.code_model.options["models_mode"] == "dpg": - self.write_file( - exec_path / Path("_model_base.py"), - general_serializer.serialize_model_base_file(), - ) - # write _validation.py if any(og for client in self.code_model.clients for og in client.operation_groups if og.need_validation): self.write_file( diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 4581ee17d66..bae5933517d 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -143,12 +143,12 @@ def need_vendor_utils_file(self) -> str: file_import.add_submodule_import("typing", "Any", ImportType.STDLIB) file_import.add_submodule_import("typing", "List", ImportType.STDLIB) file_import.add_submodule_import( - ".._model_base", + ".._vendor.model_base", "SdkJSONEncoder", ImportType.LOCAL, ) file_import.add_submodule_import( - ".._model_base", + ".._vendor.model_base", "Model", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py index a552129642d..599b224cf2e 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py @@ -230,10 +230,11 @@ def imports(self) -> FileImport: file_import = FileImport(self.code_model) if any(not m.parents for m in self.models): file_import.add_submodule_import( - self.code_model.get_relative_import_path(self.serialize_namespace), - "_model_base", + self.code_model.get_relative_import_path(self.serialize_namespace, module_name="_vendor.model_base"), + "Model", ImportType.LOCAL, TypingSection.REGULAR, + alias="_Model", ) for model in self.models: if model.base == "json": @@ -272,7 +273,7 @@ def imports(self) -> FileImport: return file_import def declare_model(self, model: ModelType) -> str: - basename = "_model_base.Model" + basename = "_Model" if model.parents: basename = ", ".join([m.name for m in model.parents]) if model.discriminator_value: diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py index 77c6aed8b4a..ef51a30509f 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py @@ -8,7 +8,7 @@ import pytest from typetest.property.nullable import models from typetest.property.nullable.aio import NullableClient -from typetest.property.nullable._model_base import ( # pylint: disable=protected-access +from typetest.property.nullable._vendor.model_base import ( # pylint: disable=protected-access SdkJSONEncoder, ) diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py b/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py index c69f89d4883..679e94c1a2b 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py @@ -7,7 +7,7 @@ import json import pytest from typetest.property.nullable import NullableClient, models -from typetest.property.nullable._model_base import ( # pylint: disable=protected-access +from typetest.property.nullable._vendor.model_base import ( # pylint: disable=protected-access SdkJSONEncoder, ) diff --git a/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py b/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py index b13e0b52dd2..29ed65db348 100644 --- a/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py +++ b/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py @@ -26,7 +26,7 @@ import sys from enum import Enum -from specialwords._model_base import ( +from specialwords._vendor.model_base import ( SdkJSONEncoder, Model, rest_field, diff --git a/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py b/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py index 2337da9d89a..0389e72dafa 100644 --- a/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py +++ b/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py @@ -10,7 +10,7 @@ Dict, ) -from specialwords._model_base import ( +from specialwords._vendor.model_base import ( _get_element, Model, rest_field, From 85c4508f57532deb38746bccccd0cab831dfd658 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 14:52:19 -0400 Subject: [PATCH 11/23] give serialization file name --- .../generator/pygen/codegen/models/imports.py | 15 ++++++++------- .../pygen/codegen/serializers/__init__.py | 4 ++-- .../pygen/codegen/serializers/model_serializer.py | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index d6a1a79e495..3427c42a782 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -30,9 +30,9 @@ class TypingSection(str, Enum): class MsrestImportType(Enum): - Module = auto() # import _serialization.py or msrest.serialization as Module - Serializer = auto() # from _serialization.py or msrest.serialization import Serializer - SerializerDeserializer = auto() # from _serialization.py or msrest.serialization import Serializer and Deserializer + Module = auto() # import _vendor/serialization.py or msrest.serialization as Module + Serializer = auto() # from _vendor/serialization.py or msrest.serialization import Serializer + SerializerDeserializer = auto() # from _vendor/serialization.py or msrest.serialization import Serializer and Deserializer class ImportModel: @@ -261,21 +261,22 @@ def add_msrest_import( if msrest_import_type == MsrestImportType.SerializerDeserializer: self.add_submodule_import("msrest", "Deserializer", ImportType.THIRDPARTY, typing_section) else: - # _serialization.py is always in root namespace + # _vendor/serialization.py is always in root namespace imported_namespace = f"{self.code_model.namespace}._vendor" if self.code_model.options["multiapi"]: - # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX while _serialization.py is in azure.mgmt.xxx + # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX while _vendor/serialization.py is in azure.mgmt.xxx imported_namespace = get_parent_namespace(imported_namespace) if msrest_import_type == MsrestImportType.Module: self.add_submodule_import( self.code_model.get_relative_import_path(serialize_namespace, imported_namespace), - "_serialization", + "serialization", ImportType.LOCAL, typing_section, + alias="_serialization", ) else: relative_path = self.code_model.get_relative_import_path( - serialize_namespace, imported_namespace, module_name="_serialization" + serialize_namespace, imported_namespace, module_name="serialization" ) self.add_submodule_import(relative_path, "Serializer", ImportType.LOCAL, typing_section) if msrest_import_type == MsrestImportType.SerializerDeserializer: diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 5dca202cdc9..55cc4695337 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -421,10 +421,10 @@ def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) - vendor_folder_path / Path("utils.py"), general_serializer.need_vendor_utils_file(), ) - # write _serialization.py + # write _vendor/serialization.py if not (self.code_model.options["client_side_validation"] or self.code_model.options["multiapi"]): self.write_file( - vendor_folder_path / Path("_serialization.py"), + vendor_folder_path / Path("serialization.py"), general_serializer.serialize_serialization_file(), ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py index 599b224cf2e..fb0424bb255 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py @@ -165,7 +165,7 @@ def declare_model(self, model: ModelType) -> str: basename = ( "msrest.serialization.Model" if self.code_model.options["client_side_validation"] - else "_serialization.Model" + else "serialization.Model" ) if model.parents: basename = ", ".join([m.name for m in model.parents]) From 92de95a1467f0776cbb36297333f16ea0df6e21e Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 15:03:41 -0400 Subject: [PATCH 12/23] format and lint --- .../generator/pygen/codegen/models/code_model.py | 10 +++++++--- .../generator/pygen/codegen/models/imports.py | 7 +++++-- .../generator/pygen/codegen/models/model_type.py | 10 +++++----- .../generator/pygen/codegen/models/operation.py | 8 ++++++-- .../generator/pygen/codegen/models/paging_operation.py | 4 +++- .../pygen/codegen/serializers/model_serializer.py | 4 +--- .../asynctests/test_encode_bytes_async.py | 1 + .../test/generic_mock_api_tests/test_encode_bytes.py | 1 + .../generator/test/unittests/conftest.py | 1 + 9 files changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index f5d2888912e..742f5426e87 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -243,11 +243,15 @@ def is_top_namespace(self, client_namespace: str) -> bool: return client_namespace == self.namespace def need_vendor_folder(self, async_mode: bool, client_namespace: str) -> bool: - return self.need_vendor_utils(async_mode, client_namespace) or self.need_vendored_serialization or self.options["models_mode"] == "dpg" - + return ( + self.need_vendor_utils(async_mode, client_namespace) + or self.need_vendored_serialization + or self.options["models_mode"] == "dpg" + ) + @property def need_vendored_serialization(self) -> bool: - return not (self.options["client_side_validation"] or self.options["multiapi"]) + return not (self.options["client_side_validation"] or self.options["multiapi"]) def need_vendor_utils(self, async_mode: bool, client_namespace: str) -> bool: return ( diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index 3427c42a782..1074531bbfc 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -32,7 +32,9 @@ class TypingSection(str, Enum): class MsrestImportType(Enum): Module = auto() # import _vendor/serialization.py or msrest.serialization as Module Serializer = auto() # from _vendor/serialization.py or msrest.serialization import Serializer - SerializerDeserializer = auto() # from _vendor/serialization.py or msrest.serialization import Serializer and Deserializer + SerializerDeserializer = ( + auto() + ) # from _vendor/serialization.py or msrest.serialization import Serializer and Deserializer class ImportModel: @@ -264,7 +266,8 @@ def add_msrest_import( # _vendor/serialization.py is always in root namespace imported_namespace = f"{self.code_model.namespace}._vendor" if self.code_model.options["multiapi"]: - # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX while _vendor/serialization.py is in azure.mgmt.xxx + # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX + # while _vendor/serialization.py is in azure.mgmt.xxx imported_namespace = get_parent_namespace(imported_namespace) if msrest_import_type == MsrestImportType.Module: self.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/models/model_type.py b/packages/http-client-python/generator/pygen/codegen/models/model_type.py index f36e50bfe2c..2f5c38af8e4 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/model_type.py +++ b/packages/http-client-python/generator/pygen/codegen/models/model_type.py @@ -318,11 +318,11 @@ def imports(self, **kwargs: Any) -> FileImport: ) if self.is_form_data: file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), - "Model", - ImportType.LOCAL, - alias="_Model", - ) + self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), + "Model", + ImportType.LOCAL, + alias="_Model", + ) elif serialize_namespace_type == NamespaceType.TYPES_FILE or ( serialize_namespace_type == NamespaceType.MODEL and called_by_property ): diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index a5031a124a1..2f230612914 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -438,12 +438,16 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements if self.overloads: file_import.add_submodule_import("typing", "overload", ImportType.STDLIB) if self.code_model.options["models_mode"] == "dpg": - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base") + relative_path = self.code_model.get_relative_import_path( + serialize_namespace, module_name="_vendor.model_base" + ) body_param = self.parameters.body_parameter if self.parameters.has_body else None if body_param and not isinstance(body_param.type, BinaryType): if self.has_form_data_body: file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace), "_vendor.model_base", ImportType.LOCAL + self.code_model.get_relative_import_path(serialize_namespace), + "_vendor.model_base", + ImportType.LOCAL, ) elif xml_serializable(self.parameters.body_parameter.default_content_type): file_import.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py index 03846a87aad..a486c4bf775 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py @@ -157,7 +157,9 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ImportType.SDKCORE, ) if self.code_model.options["models_mode"] == "dpg": - relative_path = self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base") + relative_path = self.code_model.get_relative_import_path( + serialize_namespace, module_name="_vendor.model_base" + ) file_import.merge(self.item_type.imports(**kwargs)) if self.default_error_deserialization or self.need_deserialize: file_import.add_submodule_import(relative_path, "_deserialize", ImportType.LOCAL) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py index fb0424bb255..5f0c4423789 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py @@ -163,9 +163,7 @@ def imports(self) -> FileImport: def declare_model(self, model: ModelType) -> str: basename = ( - "msrest.serialization.Model" - if self.code_model.options["client_side_validation"] - else "serialization.Model" + "msrest.serialization.Model" if self.code_model.options["client_side_validation"] else "serialization.Model" ) if model.parents: basename = ", ".join([m.name for m in model.parents]) diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py index f40eebf58ae..52612763836 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py @@ -97,6 +97,7 @@ async def test_header(client: BytesClient): ], ) + @pytest.mark.asyncio async def test_request_body(client: BytesClient, png_data: bytes): await client.request_body.default( diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/test_encode_bytes.py b/packages/http-client-python/generator/test/generic_mock_api_tests/test_encode_bytes.py index 0b48756ab17..666f6d14fba 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/test_encode_bytes.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/test_encode_bytes.py @@ -94,6 +94,7 @@ def test_header(client: BytesClient): ], ) + def test_request_body(client: BytesClient, png_data: bytes): client.request_body.default( value=png_data, diff --git a/packages/http-client-python/generator/test/unittests/conftest.py b/packages/http-client-python/generator/test/unittests/conftest.py index f85aad8ea70..9cabb68857c 100644 --- a/packages/http-client-python/generator/test/unittests/conftest.py +++ b/packages/http-client-python/generator/test/unittests/conftest.py @@ -6,6 +6,7 @@ import importlib import pytest + @pytest.fixture def core_library(): try: From 7c002350f91900d1f85c574715fdaa1b9934f67d Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 15:25:35 -0400 Subject: [PATCH 13/23] update model base --- .../generator/pygen/codegen/serializers/builder_serializer.py | 2 +- .../generator/pygen/codegen/templates/model_dpg.py.jinja2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py index 07ba2cc581d..e8b882be267 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py @@ -672,7 +672,7 @@ def _serialize_body_parameter(self, builder: OperationType) -> List[str]: [ "_body = (", f" {body_param.client_name}.as_dict()", - f" if isinstance({body_param.client_name}, _model_base.Model) else", + f" if isinstance({body_param.client_name}, _Model) else", f" {body_param.client_name}", ")", f"_file_fields: List[str] = {file_fields}", diff --git a/packages/http-client-python/generator/pygen/codegen/templates/model_dpg.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/model_dpg.py.jinja2 index c7a874872bb..4b18df84909 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/model_dpg.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/model_dpg.py.jinja2 @@ -19,7 +19,7 @@ """ {% if model.is_polymorphic %} - __mapping__: Dict[str, _model_base.Model] = {} + __mapping__: Dict[str, _Model] = {} {% endif %} {% for p in serializer.get_properties_to_declare(model)%} {{ serializer.declare_property(p) }} From d03d9da04c34200c3a03948f6f50e21f72d9f063 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 15:35:18 -0400 Subject: [PATCH 14/23] rename to utils folder --- ...n-moveToVendorFolder-2025-3-17-13-43-15.md | 2 +- .../pygen/codegen/models/code_model.py | 26 ++++++++-------- .../generator/pygen/codegen/models/imports.py | 12 ++++---- .../pygen/codegen/models/lro_operation.py | 2 +- .../pygen/codegen/models/model_type.py | 2 +- .../pygen/codegen/models/operation.py | 6 ++-- .../pygen/codegen/models/operation_group.py | 8 ++--- .../pygen/codegen/models/paging_operation.py | 2 +- .../pygen/codegen/models/parameter.py | 2 +- .../pygen/codegen/models/primitive_types.py | 4 +-- .../pygen/codegen/models/property.py | 2 +- .../pygen/codegen/serializers/__init__.py | 30 +++++++++---------- .../codegen/serializers/general_serializer.py | 16 +++++----- .../codegen/serializers/model_serializer.py | 2 +- ...vendor_utils.py.jinja2 => utils.py.jinja2} | 8 ++--- .../test_typetest_property_nullable_async.py | 2 +- .../test_typetest_property_nullable.py | 2 +- .../test_model_base_serialization.py | 2 +- .../test_model_base_xml_serialization.py | 2 +- 19 files changed, 66 insertions(+), 66 deletions(-) rename packages/http-client-python/generator/pygen/codegen/templates/{vendor_utils.py.jinja2 => utils.py.jinja2} (93%) diff --git a/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md b/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md index a6cc5befe75..7edd29c8815 100644 --- a/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md +++ b/.chronus/changes/python-moveToVendorFolder-2025-3-17-13-43-15.md @@ -4,4 +4,4 @@ packages: - "@typespec/http-client-python" --- -Reorder generated `_vendor` file into a `_vendor` folder \ No newline at end of file +Reorder generated `_vendor` file into a `_utils_` folder diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index 742f5426e87..14664b972a9 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -242,26 +242,26 @@ def is_top_namespace(self, client_namespace: str) -> bool: """ return client_namespace == self.namespace - def need_vendor_folder(self, async_mode: bool, client_namespace: str) -> bool: + def need_utils_folder(self, async_mode: bool, client_namespace: str) -> bool: return ( - self.need_vendor_utils(async_mode, client_namespace) - or self.need_vendored_serialization + self.need_utils_utils(async_mode, client_namespace) + or self.need_utils_serialization or self.options["models_mode"] == "dpg" ) @property - def need_vendored_serialization(self) -> bool: + def need_utils_serialization(self) -> bool: return not (self.options["client_side_validation"] or self.options["multiapi"]) - def need_vendor_utils(self, async_mode: bool, client_namespace: str) -> bool: + def need_utils_utils(self, async_mode: bool, client_namespace: str) -> bool: return ( - self.need_vendored_form_data(async_mode, client_namespace) - or self.need_vendored_etag(client_namespace) - or self.need_vendored_abstract(client_namespace) - or self.need_vendored_mixin + self.need_utils_form_data(async_mode, client_namespace) + or self.need_utils_etag(client_namespace) + or self.need_utils_abstract(client_namespace) + or self.need_utils_mixin ) - def need_vendored_form_data(self, async_mode: bool, client_namespace: str) -> bool: + def need_utils_form_data(self, async_mode: bool, client_namespace: str) -> bool: return ( (not async_mode) and self.is_top_namespace(client_namespace) @@ -269,14 +269,14 @@ def need_vendored_form_data(self, async_mode: bool, client_namespace: str) -> bo and self.options["models_mode"] == "dpg" ) - def need_vendored_etag(self, client_namespace: str) -> bool: + def need_utils_etag(self, client_namespace: str) -> bool: return self.is_top_namespace(client_namespace) and self.has_etag - def need_vendored_abstract(self, client_namespace: str) -> bool: + def need_utils_abstract(self, client_namespace: str) -> bool: return self.is_top_namespace(client_namespace) and self.has_abstract_operations @property - def need_vendored_mixin(self) -> bool: + def need_utils_mixin(self) -> bool: return any(c_n for c_n in self.client_namespace_types if self.has_mixin(c_n)) def has_mixin(self, client_namespace: str) -> bool: diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index 1074531bbfc..b27e3299ba0 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -30,11 +30,11 @@ class TypingSection(str, Enum): class MsrestImportType(Enum): - Module = auto() # import _vendor/serialization.py or msrest.serialization as Module - Serializer = auto() # from _vendor/serialization.py or msrest.serialization import Serializer + Module = auto() # import _utils/serialization.py or msrest.serialization as Module + Serializer = auto() # from _utils/serialization.py or msrest.serialization import Serializer SerializerDeserializer = ( auto() - ) # from _vendor/serialization.py or msrest.serialization import Serializer and Deserializer + ) # from _utils/serialization.py or msrest.serialization import Serializer and Deserializer class ImportModel: @@ -263,11 +263,11 @@ def add_msrest_import( if msrest_import_type == MsrestImportType.SerializerDeserializer: self.add_submodule_import("msrest", "Deserializer", ImportType.THIRDPARTY, typing_section) else: - # _vendor/serialization.py is always in root namespace - imported_namespace = f"{self.code_model.namespace}._vendor" + # _utils/serialization.py is always in root namespace + imported_namespace = f"{self.code_model.namespace}._utils" if self.code_model.options["multiapi"]: # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX - # while _vendor/serialization.py is in azure.mgmt.xxx + # while _utils/serialization.py is in azure.mgmt.xxx imported_namespace = get_parent_namespace(imported_namespace) if msrest_import_type == MsrestImportType.Module: self.add_submodule_import( diff --git a/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py b/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py index 075b7528fcd..9ae3fcbf3a9 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/lro_operation.py @@ -134,7 +134,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: # but final call returns a model serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_utils.model_base"), "_deserialize", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/models/model_type.py b/packages/http-client-python/generator/pygen/codegen/models/model_type.py index 2f5c38af8e4..98b1881c5b4 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/model_type.py +++ b/packages/http-client-python/generator/pygen/codegen/models/model_type.py @@ -318,7 +318,7 @@ def imports(self, **kwargs: Any) -> FileImport: ) if self.is_form_data: file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_utils.model_base"), "Model", ImportType.LOCAL, alias="_Model", diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 2f230612914..197cf5d8356 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -392,7 +392,7 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements ) if not async_mode: relative_path = self.code_model.get_relative_import_path( - serialize_namespace, module_name="_vendor.utils" + serialize_namespace, module_name="_utils.utils" ) file_import.add_submodule_import( relative_path, @@ -439,14 +439,14 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements file_import.add_submodule_import("typing", "overload", ImportType.STDLIB) if self.code_model.options["models_mode"] == "dpg": relative_path = self.code_model.get_relative_import_path( - serialize_namespace, module_name="_vendor.model_base" + serialize_namespace, module_name="_utils.model_base" ) body_param = self.parameters.body_parameter if self.parameters.has_body else None if body_param and not isinstance(body_param.type, BinaryType): if self.has_form_data_body: file_import.add_submodule_import( self.code_model.get_relative_import_path(serialize_namespace), - "_vendor.model_base", + "_utils.model_base", ImportType.LOCAL, ) elif xml_serializable(self.parameters.body_parameter.default_content_type): diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index e4520b12676..ffd73b38567 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -157,10 +157,10 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ) if self.is_mixin: file_import.add_submodule_import( - # XxxMixinABC is always defined in _vendor of client namespace + # XxxMixinABC is always defined in _utils of client namespace self.code_model.get_relative_import_path( serialize_namespace, - f"{self.code_model.namespace}._vendor.utils", + f"{self.code_model.namespace}._utils.utils", ), "ClientMixinABC", ImportType.LOCAL, @@ -178,11 +178,11 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ) if self.has_abstract_operations: file_import.add_submodule_import( - # raise_if_not_implemented is always defined in _vendor of top namespace + # raise_if_not_implemented is always defined in _utils of top namespace self.code_model.get_relative_import_path( serialize_namespace, self.code_model.get_imported_namespace_for_client(self.code_model.namespace, async_mode), - module_name="_vendor.utils", + module_name="_utils.utils", ), "raise_if_not_implemented", ImportType.LOCAL, diff --git a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py index a486c4bf775..cb2fb11eceb 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/paging_operation.py @@ -158,7 +158,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: ) if self.code_model.options["models_mode"] == "dpg": relative_path = self.code_model.get_relative_import_path( - serialize_namespace, module_name="_vendor.model_base" + serialize_namespace, module_name="_utils.model_base" ) file_import.merge(self.item_type.imports(**kwargs)) if self.default_error_deserialization or self.need_deserialize: diff --git a/packages/http-client-python/generator/pygen/codegen/models/parameter.py b/packages/http-client-python/generator/pygen/codegen/models/parameter.py index bb6061abcbd..e840775cb6a 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/parameter.py +++ b/packages/http-client-python/generator/pygen/codegen/models/parameter.py @@ -275,7 +275,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: if self.is_form_data: serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_utils.utils"), "prepare_multipart_form_data", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py b/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py index 94093366686..ec4cf03dd2c 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py +++ b/packages/http-client-python/generator/pygen/codegen/models/primitive_types.py @@ -618,13 +618,13 @@ def type_annotation(self, **kwargs: Any) -> str: return self.name def docstring_type(self, **kwargs: Any) -> str: - return f"~{self.code_model.namespace}._vendor.utils.{self.name}" + return f"~{self.code_model.namespace}._utils.utils.{self.name}" def imports(self, **kwargs: Any) -> FileImport: file_import = super().imports(**kwargs) serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.utils"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_utils.utils"), self.name, ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/models/property.py b/packages/http-client-python/generator/pygen/codegen/models/property.py index c61e9fe7bef..45381d1cff9 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/property.py +++ b/packages/http-client-python/generator/pygen/codegen/models/property.py @@ -149,7 +149,7 @@ def imports(self, **kwargs) -> FileImport: if self.code_model.options["models_mode"] == "dpg": serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace, module_name="_vendor.model_base"), + self.code_model.get_relative_import_path(serialize_namespace, module_name="_utils.model_base"), "rest_discriminator" if self.is_discriminator else "rest_field", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 55cc4695337..14a275f0c9f 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -153,7 +153,7 @@ def serialize(self) -> None: general_serializer.serialize_pkgutil_init_file(), ) - # _vendor/py.typed/_types.py/_validation.py + # _utils/py.typed/_types.py/_validation.py # is always put in top level namespace if self.code_model.is_top_namespace(client_namespace): self._serialize_and_write_top_level_folder(env=env, namespace=client_namespace) @@ -404,41 +404,41 @@ def _serialize_client_and_config_files( general_serializer.serialize_config_file(clients), ) - # sometimes we need define additional Mixin class for client in _vendor.py - self._serialize_and_write_vendor_folder(env, namespace) + # sometimes we need define additional Mixin class for client in _utils.py + self._serialize_and_write_utils_folder(env, namespace) - def _serialize_and_write_vendor_folder(self, env: Environment, namespace: str) -> None: + def _serialize_and_write_utils_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False) - vendor_folder_path = exec_path / Path("_vendor") - if self.code_model.need_vendor_folder(async_mode=False, client_namespace=namespace): + utils_folder_path = exec_path / Path("_utils") + if self.code_model.need_utils_folder(async_mode=False, client_namespace=namespace): self.write_file( - vendor_folder_path / Path("__init__.py"), + utils_folder_path / Path("__init__.py"), self.code_model.license_header, ) - if self.code_model.need_vendor_utils(async_mode=False, client_namespace=namespace): + if self.code_model.need_utils_utils(async_mode=False, client_namespace=namespace): self.write_file( - vendor_folder_path / Path("utils.py"), - general_serializer.need_vendor_utils_file(), + utils_folder_path / Path("utils.py"), + general_serializer.need_utils_utils_file(), ) - # write _vendor/serialization.py + # write _utils/serialization.py if not (self.code_model.options["client_side_validation"] or self.code_model.options["multiapi"]): self.write_file( - vendor_folder_path / Path("serialization.py"), + utils_folder_path / Path("serialization.py"), general_serializer.serialize_serialization_file(), ) # write _model_base.py if self.code_model.options["models_mode"] == "dpg": self.write_file( - vendor_folder_path / Path("model_base.py"), + utils_folder_path / Path("model_base.py"), general_serializer.serialize_model_base_file(), ) def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None: exec_path = self.exec_path(namespace) - # write _vendor folder - self._serialize_and_write_vendor_folder(env, namespace) + # write _utils folder + self._serialize_and_write_utils_folder(env, namespace) general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index bae5933517d..bb5428017b5 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -107,33 +107,33 @@ def serialize_service_client_file(self, clients: List[Client]) -> str: serialize_namespace=self.serialize_namespace, ) - def need_vendor_utils_file(self) -> str: - template = self.env.get_template("vendor_utils.py.jinja2") + def need_utils_utils_file(self) -> str: + template = self.env.get_template("utils.py.jinja2") clients = self.code_model.get_clients(self.client_namespace) # configure imports file_import = FileImport(self.code_model) - if self.code_model.need_vendored_mixin: + if self.code_model.need_utils_mixin: file_import.add_submodule_import( "abc", "ABC", ImportType.STDLIB, ) file_import.add_msrest_import( - serialize_namespace=f"{self.serialize_namespace}._vendor", + serialize_namespace=f"{self.serialize_namespace}._utils", msrest_import_type=MsrestImportType.SerializerDeserializer, typing_section=TypingSection.TYPING, ) file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB) file_import.add_submodule_import("typing", "Generic", ImportType.STDLIB) - if self.code_model.need_vendored_etag(self.client_namespace): + if self.code_model.need_utils_etag(self.client_namespace): file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB) file_import.add_submodule_import( "", "MatchConditions", ImportType.SDKCORE, ) - if self.code_model.need_vendored_form_data(self.async_mode, self.client_namespace): + if self.code_model.need_utils_form_data(self.async_mode, self.client_namespace): file_import.add_submodule_import("typing", "IO", ImportType.STDLIB) file_import.add_submodule_import("typing", "Tuple", ImportType.STDLIB) file_import.add_submodule_import("typing", "Union", ImportType.STDLIB) @@ -143,12 +143,12 @@ def need_vendor_utils_file(self) -> str: file_import.add_submodule_import("typing", "Any", ImportType.STDLIB) file_import.add_submodule_import("typing", "List", ImportType.STDLIB) file_import.add_submodule_import( - ".._vendor.model_base", + ".._utils.model_base", "SdkJSONEncoder", ImportType.LOCAL, ) file_import.add_submodule_import( - ".._vendor.model_base", + ".._utils.model_base", "Model", ImportType.LOCAL, ) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py index 5f0c4423789..891c9db4b64 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py @@ -228,7 +228,7 @@ def imports(self) -> FileImport: file_import = FileImport(self.code_model) if any(not m.parents for m in self.models): file_import.add_submodule_import( - self.code_model.get_relative_import_path(self.serialize_namespace, module_name="_vendor.model_base"), + self.code_model.get_relative_import_path(self.serialize_namespace, module_name="_utils.model_base"), "Model", ImportType.LOCAL, TypingSection.REGULAR, diff --git a/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/utils.py.jinja2 similarity index 93% rename from packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 rename to packages/http-client-python/generator/pygen/codegen/templates/utils.py.jinja2 index cc4293ec5b9..93c8da4f1de 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/vendor_utils.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/utils.py.jinja2 @@ -5,7 +5,7 @@ {{ imports }} -{% if code_model.need_vendored_mixin %} +{% if code_model.need_utils_mixin %} TClient = TypeVar("TClient") TConfig = TypeVar("TConfig") @@ -17,7 +17,7 @@ class ClientMixinABC(ABC, Generic[TClient, TConfig]): _serialize: "Serializer" _deserialize: "Deserializer" {% endif %} -{% if code_model.need_vendored_abstract(client_namespace) %} +{% if code_model.need_utils_abstract(client_namespace) %} def raise_if_not_implemented(cls, abstract_methods): not_implemented = [f for f in abstract_methods if not callable(getattr(cls, f, None))] @@ -28,7 +28,7 @@ def raise_if_not_implemented(cls, abstract_methods): ) {% endif %} -{% if code_model.need_vendored_etag(client_namespace) %} +{% if code_model.need_utils_etag(client_namespace) %} def quote_etag(etag: Optional[str]) -> Optional[str]: if not etag or etag == "*": return etag @@ -58,7 +58,7 @@ def prep_if_none_match(etag: Optional[str], match_condition: Optional[MatchCondi return "*" return None {% endif %} -{% if code_model.need_vendored_form_data(async_mode, client_namespace) %} +{% if code_model.need_utils_form_data(async_mode, client_namespace) %} # file-like tuple could be `(filename, IO (or bytes))` or `(filename, IO (or bytes), content_type)` FileContent = Union[str, bytes, IO[str], IO[bytes]] diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py index ef51a30509f..a5dc1322110 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py @@ -8,7 +8,7 @@ import pytest from typetest.property.nullable import models from typetest.property.nullable.aio import NullableClient -from typetest.property.nullable._vendor.model_base import ( # pylint: disable=protected-access +from typetest.property.nullable._utils.model_base import ( # pylint: disable=protected-access SdkJSONEncoder, ) diff --git a/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py b/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py index 679e94c1a2b..dcf3a44954a 100644 --- a/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +++ b/packages/http-client-python/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py @@ -7,7 +7,7 @@ import json import pytest from typetest.property.nullable import NullableClient, models -from typetest.property.nullable._vendor.model_base import ( # pylint: disable=protected-access +from typetest.property.nullable._utils.model_base import ( # pylint: disable=protected-access SdkJSONEncoder, ) diff --git a/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py b/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py index 29ed65db348..0900f9103d4 100644 --- a/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py +++ b/packages/http-client-python/generator/test/unittests/test_model_base_serialization.py @@ -26,7 +26,7 @@ import sys from enum import Enum -from specialwords._vendor.model_base import ( +from specialwords._utils.model_base import ( SdkJSONEncoder, Model, rest_field, diff --git a/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py b/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py index 0389e72dafa..78912e305b1 100644 --- a/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py +++ b/packages/http-client-python/generator/test/unittests/test_model_base_xml_serialization.py @@ -10,7 +10,7 @@ Dict, ) -from specialwords._vendor.model_base import ( +from specialwords._utils.model_base import ( _get_element, Model, rest_field, From 5d9ebc662b1de024742bb21f20a6aa501da4ab1a Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 16:14:56 -0400 Subject: [PATCH 15/23] remove import for formdata --- .../generator/pygen/codegen/models/operation.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 197cf5d8356..827b5f05f81 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -443,13 +443,7 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements ) body_param = self.parameters.body_parameter if self.parameters.has_body else None if body_param and not isinstance(body_param.type, BinaryType): - if self.has_form_data_body: - file_import.add_submodule_import( - self.code_model.get_relative_import_path(serialize_namespace), - "_utils.model_base", - ImportType.LOCAL, - ) - elif xml_serializable(self.parameters.body_parameter.default_content_type): + if xml_serializable(self.parameters.body_parameter.default_content_type): file_import.add_submodule_import( relative_path, "_get_element", From 787b9fecdd7805c72616f8fcc8ba4c575441455c Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 17 Apr 2025 16:53:22 -0400 Subject: [PATCH 16/23] fix formdata generation --- .../generator/pygen/codegen/models/operation.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 827b5f05f81..474c0168e57 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -443,7 +443,14 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements ) body_param = self.parameters.body_parameter if self.parameters.has_body else None if body_param and not isinstance(body_param.type, BinaryType): - if xml_serializable(self.parameters.body_parameter.default_content_type): + if self.has_form_data_body: + file_import.add_submodule_import( + relative_path, + "Model", + ImportType.LOCAL, + "_Model", + ) + elif xml_serializable(self.parameters.body_parameter.default_content_type): file_import.add_submodule_import( relative_path, "_get_element", From 874ce16bf67b7f9080246661935e57a099687d0b Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 18 Apr 2025 14:54:07 -0400 Subject: [PATCH 17/23] add alias to formdata import --- .../generator/pygen/codegen/models/operation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation.py b/packages/http-client-python/generator/pygen/codegen/models/operation.py index 474c0168e57..f3a00264291 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation.py @@ -448,7 +448,7 @@ def imports( # pylint: disable=too-many-branches, disable=too-many-statements relative_path, "Model", ImportType.LOCAL, - "_Model", + alias="_Model", ) elif xml_serializable(self.parameters.body_parameter.default_content_type): file_import.add_submodule_import( From 7dc50db96d61c67353848ab7a9c09defad9634ae Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 18 Apr 2025 16:25:52 -0400 Subject: [PATCH 18/23] update serialization in base model --- .../generator/pygen/codegen/serializers/model_serializer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py index 891c9db4b64..ff04aa63754 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/model_serializer.py @@ -163,7 +163,9 @@ def imports(self) -> FileImport: def declare_model(self, model: ModelType) -> str: basename = ( - "msrest.serialization.Model" if self.code_model.options["client_side_validation"] else "serialization.Model" + "msrest.serialization.Model" + if self.code_model.options["client_side_validation"] + else "_serialization.Model" ) if model.parents: basename = ", ".join([m.name for m in model.parents]) From 941e21c60441b522a4f16b703b18fe13521164ea Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 18 Apr 2025 17:10:42 -0400 Subject: [PATCH 19/23] fix serialization import --- .../generator/pygen/codegen/models/imports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index b27e3299ba0..c1b0d84f9ca 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -279,7 +279,7 @@ def add_msrest_import( ) else: relative_path = self.code_model.get_relative_import_path( - serialize_namespace, imported_namespace, module_name="serialization" + serialize_namespace, f"{self.code_model.namespace}._utils.serialization" ) self.add_submodule_import(relative_path, "Serializer", ImportType.LOCAL, typing_section) if msrest_import_type == MsrestImportType.SerializerDeserializer: From 2b85df56fbf86da315a3504ac97049341900e3f0 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 18 Apr 2025 17:25:03 -0400 Subject: [PATCH 20/23] update import namespace for multiapi --- .../generator/pygen/codegen/models/imports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/imports.py b/packages/http-client-python/generator/pygen/codegen/models/imports.py index c1b0d84f9ca..59d99ca8638 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/imports.py +++ b/packages/http-client-python/generator/pygen/codegen/models/imports.py @@ -268,7 +268,7 @@ def add_msrest_import( if self.code_model.options["multiapi"]: # for multiapi, the namespace is azure.mgmt.xxx.v20XX_XX_XX # while _utils/serialization.py is in azure.mgmt.xxx - imported_namespace = get_parent_namespace(imported_namespace) + imported_namespace = f"{get_parent_namespace(imported_namespace)}._utils" if msrest_import_type == MsrestImportType.Module: self.add_submodule_import( self.code_model.get_relative_import_path(serialize_namespace, imported_namespace), From dd4afff9fb6644b5f708895bc0a9d0a7752a9592 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 18 Apr 2025 17:47:59 -0400 Subject: [PATCH 21/23] fix imports for multiapi --- .../generator/pygen/codegen/serializers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 14a275f0c9f..152c70e5ad3 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -422,7 +422,7 @@ def _serialize_and_write_utils_folder(self, env: Environment, namespace: str) -> general_serializer.need_utils_utils_file(), ) # write _utils/serialization.py - if not (self.code_model.options["client_side_validation"] or self.code_model.options["multiapi"]): + if not self.code_model.options["client_side_validation"]: self.write_file( utils_folder_path / Path("serialization.py"), general_serializer.serialize_serialization_file(), From 88795ae211774f7ce00d68621e8aa686f0d8c4b7 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 21 Apr 2025 10:57:15 -0400 Subject: [PATCH 22/23] fix raise_if_not_implemented import --- .../pygen/codegen/models/operation_group.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py index ffd73b38567..0be9f5bf3d1 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/operation_group.py +++ b/packages/http-client-python/generator/pygen/codegen/models/operation_group.py @@ -100,8 +100,12 @@ def need_validation(self) -> bool: def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: file_import = FileImport(self.code_model) - serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace) + utils_path = self.code_model.get_relative_import_path( + serialize_namespace, + f"{self.code_model.namespace}._utils.utils", + ) + for operation in self.operations: file_import.merge(operation.imports(async_mode, **kwargs)) if not self.code_model.options["combine_operation_files"]: @@ -158,10 +162,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: if self.is_mixin: file_import.add_submodule_import( # XxxMixinABC is always defined in _utils of client namespace - self.code_model.get_relative_import_path( - serialize_namespace, - f"{self.code_model.namespace}._utils.utils", - ), + utils_path, "ClientMixinABC", ImportType.LOCAL, ) @@ -179,11 +180,7 @@ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport: if self.has_abstract_operations: file_import.add_submodule_import( # raise_if_not_implemented is always defined in _utils of top namespace - self.code_model.get_relative_import_path( - serialize_namespace, - self.code_model.get_imported_namespace_for_client(self.code_model.namespace, async_mode), - module_name="_utils.utils", - ), + utils_path, "raise_if_not_implemented", ImportType.LOCAL, ) From d3d98f519e39b6de5727bd4a982cb67f45118595 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 21 Apr 2025 14:25:06 -0400 Subject: [PATCH 23/23] generate init file for multiapi utils folders --- .../generator/pygen/codegen/models/code_model.py | 2 +- .../generator/pygen/codegen/serializers/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/code_model.py b/packages/http-client-python/generator/pygen/codegen/models/code_model.py index 14664b972a9..84426d282d5 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/code_model.py +++ b/packages/http-client-python/generator/pygen/codegen/models/code_model.py @@ -251,7 +251,7 @@ def need_utils_folder(self, async_mode: bool, client_namespace: str) -> bool: @property def need_utils_serialization(self) -> bool: - return not (self.options["client_side_validation"] or self.options["multiapi"]) + return not self.options["client_side_validation"] def need_utils_utils(self, async_mode: bool, client_namespace: str) -> bool: return ( diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py index 152c70e5ad3..62089274a77 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/__init__.py @@ -422,7 +422,7 @@ def _serialize_and_write_utils_folder(self, env: Environment, namespace: str) -> general_serializer.need_utils_utils_file(), ) # write _utils/serialization.py - if not self.code_model.options["client_side_validation"]: + if self.code_model.need_utils_serialization: self.write_file( utils_folder_path / Path("serialization.py"), general_serializer.serialize_serialization_file(),