Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Release History

### 2022-xx-xx - 6.0.0

| Library | Min Version |
| ----------------------------------------------------------------------- | ----------- |
| `@autorest/core` | `3.8.1` |
| `@autorest/modelerfour` | `4.23.5` |
| `azure-core` dep of generated code | `1.24.0` |
| `azure-mgmt-core` dep of generated code (If generating mgmt plane code) | `1.3.0` |

**Breaking Changes**

- Only generate Python3 SDKs #1297
- Don't reformat initial query parameters into the next link #1297

### 2022-07-13 - 5.19.0

| Library | Min Version |
Expand All @@ -11,6 +25,7 @@
| `azure-mgmt-core` dep of generated code (If generating mgmt plane code) | `1.3.0` |

**New Features**

- Add _serialization.py for `--client-side-validation=false` generation, and migrate serilization from msrest to _serialization.py #1236

### 2022-07-13 - 5.18.0
Expand Down
43 changes: 16 additions & 27 deletions autorest/codegen/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,6 @@ def _validate_code_model_options(options: Dict[str, Any]) -> None:
"to 'public' or 'hidden'."
)

if not options["show_operations"] and options["add_python3_operation_files"]:
raise ValueError(
"Can not add typed sync operation files if you are not showing operations. "
"If you want typed synced operation files, you have to add flag "
"--show-operations"
)

if options["basic_setup_py"] and not options["package_version"]:
raise ValueError("--basic-setup-py must be used with --package-version")

Expand All @@ -85,12 +78,6 @@ def _validate_code_model_options(options: Dict[str, Any]) -> None:
"--package-mode can only be 'mgmtplane' or 'dataplane' or directory which contains template files"
)

if options["reformat_next_link"] and options["version_tolerant"]:
raise ValueError(
"--reformat-next-link can not be true for version tolerant generations. "
"Please remove --reformat-next-link from your call for version tolerant generations."
)

if options["multiapi"] and options["version_tolerant"]:
raise ValueError(
"Can not currently generate version tolerant multiapi SDKs. "
Expand Down Expand Up @@ -197,12 +184,22 @@ def _build_code_model_options(self) -> Dict[str, Any]:
models_mode_default = (
"none" if low_level_client or version_tolerant else "msrest"
)
python3_only = cast(
bool,
self._autorestapi.get_boolean_value(
"python3-only", low_level_client or version_tolerant
),
)
if self._autorestapi.get_boolean_value("python3-only") is False:
_LOGGER.warning(
"You have passed in --python3-only=False. We have force overriden "
"this to True."
)
if self._autorestapi.get_boolean_value("add-python3-operation-files"):
_LOGGER.warning(
"You have passed in --add-python3-operation-files. "
"This flag no longer has an effect bc all SDKs are now Python3 only."
)
if self._autorestapi.get_boolean_value("reformat-next-link"):
_LOGGER.warning(
"You have passed in --reformat-next-link. We have force overriden "
"this to False because we no longer reformat initial query parameters into next "
"calls unless explicitly defined in the service definition."
)

options: Dict[str, Any] = {
"azure_arm": azure_arm,
Expand Down Expand Up @@ -241,16 +238,11 @@ def _build_code_model_options(self) -> Dict[str, Any]:
"only-path-and-body-params-positional",
low_level_client or version_tolerant,
),
"add_python3_operation_files": self._autorestapi.get_boolean_value(
"add-python3-operation-files",
python3_only and not (low_level_client or version_tolerant),
),
"version_tolerant": version_tolerant,
"low_level_client": low_level_client,
"combine_operation_files": self._autorestapi.get_boolean_value(
"combine-operation-files", version_tolerant
),
"python3_only": python3_only,
"package_mode": self._autorestapi.get_value("package-mode"),
"package_pprint_name": self._autorestapi.get_value("package-pprint-name"),
"package_configuration": self._autorestapi.get_value(
Expand All @@ -260,9 +252,6 @@ def _build_code_model_options(self) -> Dict[str, Any]:
"default-optional-constants-to-none",
low_level_client or version_tolerant,
),
"reformat_next_link": self._autorestapi.get_boolean_value(
"reformat-next-link", not version_tolerant
),
}

if options["builders_visibility"] is None:
Expand Down
4 changes: 2 additions & 2 deletions autorest/codegen/models/base_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def description(self) -> str:
)
return self._description or self.name

def method_signature(self, is_python3_file: bool, async_mode: bool) -> List[str]:
def method_signature(self, async_mode: bool) -> List[str]:
if self.abstract:
return ["*args,", "**kwargs"]
return self.parameters.method_signature(is_python3_file, async_mode)
return self.parameters.method_signature(async_mode)
2 changes: 1 addition & 1 deletion autorest/codegen/models/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def imports(self, async_mode: bool) -> FileImport:
# Also in this case, we're in version tolerant, so python3 only is true
file_import.add_submodule_import(
f"{path_to_models}models",
f"{self.code_model.get_models_filename(is_python3_file=True)}",
self.code_model.models_filename,
ImportType.LOCAL,
alias="models",
)
Expand Down
19 changes: 7 additions & 12 deletions autorest/codegen/models/code_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,11 +235,7 @@ def need_format_url(self) -> bool:
@property
def need_mixin_abc(self) -> bool:
"""Do we want a mixin ABC class for typing purposes?"""
return any(
o
for o in self.operation_groups
if o.is_mixin and self.options["python3_only"]
)
return any(o for o in self.operation_groups if o.is_mixin)

@property
def has_lro_operations(self) -> bool:
Expand All @@ -252,20 +248,19 @@ def has_lro_operations(self) -> bool:
]
)

def get_models_filename(self, is_python3_file: bool) -> str:
@property
def models_filename(self) -> str:
"""Get the names of the model file(s)"""
if not self.is_legacy and self.options["python3_only"]:
return "_models"
if is_python3_file:
if self.is_legacy:
return "_models_py3"
return "_models"

@property
def enums_filename(self) -> str:
"""The name of the enums file"""
if not self.is_legacy:
return "_enums"
return f"_{self.module_name}_enums"
if self.is_legacy:
return f"_{self.module_name}_enums"
return "_enums"

@property
def is_legacy(self) -> bool:
Expand Down
6 changes: 2 additions & 4 deletions autorest/codegen/models/lro_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,8 @@ def get_base_polling_method_path(self, async_mode: bool) -> str:
def get_no_polling_method(self, async_mode: bool) -> str:
return self.responses[0].get_no_polling_method(async_mode)

def imports(
self, async_mode: bool, is_python3_file: bool, **kwargs: Any
) -> FileImport:
file_import = super().imports(async_mode, is_python3_file, **kwargs)
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
file_import = super().imports(async_mode, **kwargs)
if self.abstract:
return file_import
if async_mode:
Expand Down
12 changes: 3 additions & 9 deletions autorest/codegen/models/lro_paging_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,9 @@ def operation_type(self) -> str:
def cls_type_annotation(self, *, async_mode: bool) -> str:
return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]" # pylint: disable=no-member

def imports(
self, async_mode: bool, is_python3_file: bool, **kwargs: Any
) -> FileImport:
lro_imports = LROOperationBase.imports(
self, async_mode, is_python3_file, **kwargs
)
paging_imports = PagingOperationBase.imports(
self, async_mode, is_python3_file, **kwargs
)
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
lro_imports = LROOperationBase.imports(self, async_mode, **kwargs)
paging_imports = PagingOperationBase.imports(self, async_mode, **kwargs)

file_import = lro_imports
file_import.merge(paging_imports)
Expand Down
7 changes: 1 addition & 6 deletions autorest/codegen/models/model_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,13 +238,8 @@ def imports(self, **kwargs: Any) -> FileImport:
relative_path, "models", ImportType.LOCAL, alias="_models"
)
else:
# a little hacky, but we only do this for version tolerant
# models files, which are all python3 only
models_filename = self.code_model.get_models_filename(
is_python3_file=True
)
file_import.add_submodule_import(
f"{relative_path}models.{models_filename}",
f"{relative_path}models.{self.code_model.models_filename}",
self.name,
ImportType.LOCAL,
)
Expand Down
23 changes: 6 additions & 17 deletions autorest/codegen/models/operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,22 +274,14 @@ def get_request_builder_import(
alias="rest",
)
if self.code_model.options["builders_visibility"] == "embedded" and async_mode:
suffix = (
"_py3"
if self.code_model.options["add_python3_operation_files"]
and not self.code_model.options["python3_only"]
else ""
)
file_import.add_submodule_import(
f"...{self.code_model.operations_folder_name}.{self.filename}{suffix}",
f"...{self.code_model.operations_folder_name}.{self.filename}",
request_builder.name,
import_type=ImportType.LOCAL,
)
return file_import

def imports(
self, async_mode: bool, is_python3_file: bool, **kwargs: Any
) -> FileImport:
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
if self.abstract:
return FileImport()
file_import = self._imports_shared(async_mode, **kwargs)
Expand Down Expand Up @@ -326,11 +318,10 @@ def imports(
"azure.core.exceptions", "ResourceExistsError", ImportType.AZURECORE
)

kwargs_to_pop = self.parameters.kwargs_to_pop(is_python3_file)
if self.has_kwargs_to_pop_with_default(
kwargs_to_pop, ParameterLocation.HEADER
self.parameters.kwargs_to_pop, ParameterLocation.HEADER
) or self.has_kwargs_to_pop_with_default(
kwargs_to_pop, ParameterLocation.QUERY
self.parameters.kwargs_to_pop, ParameterLocation.QUERY
):
file_import.add_submodule_import(
"azure.core.utils", "case_insensitive_dict", ImportType.AZURECORE
Expand Down Expand Up @@ -468,10 +459,8 @@ def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel"):


class Operation(OperationBase[Response]):
def imports(
self, async_mode: bool, is_python3_file: bool, **kwargs: Any
) -> FileImport:
file_import = super().imports(async_mode, is_python3_file, **kwargs)
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
file_import = super().imports(async_mode, **kwargs)
if self.abstract:
return file_import
if async_mode:
Expand Down
11 changes: 4 additions & 7 deletions autorest/codegen/models/operation_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,11 @@ def __init__(
def has_abstract_operations(self) -> bool:
return any(o for o in self.operations if o.abstract)

def base_class(self, async_mode: bool) -> str:
@property
def base_class(self) -> str:
base_classes: List[str] = []
if self.is_mixin and self.code_model.need_mixin_abc:
base_classes.append("MixinABC")
if not (async_mode or self.code_model.options["python3_only"]):
base_classes.append("object")
return ", ".join(base_classes)

def imports_for_multiapi(self, async_mode: bool) -> FileImport:
Expand All @@ -67,15 +66,13 @@ def mypy_ignore(self) -> str:
return " # type: ignore"
return ""

def imports(self, async_mode: bool, is_python3_file: bool) -> FileImport:
def imports(self, async_mode: bool) -> FileImport:
file_import = FileImport()

relative_path = "..." if async_mode else ".."
for operation in self.operations:
file_import.merge(
operation.imports(
async_mode, is_python3_file, relative_path=relative_path
)
operation.imports(async_mode, relative_path=relative_path)
)
# for multiapi
if not self.code_model.options["version_tolerant"]:
Expand Down
6 changes: 2 additions & 4 deletions autorest/codegen/models/paging_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,11 @@ def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
def has_optional_return_type(self) -> bool:
return False

def imports(
self, async_mode: bool, is_python3_file: bool, **kwargs: Any
) -> FileImport:
def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
if self.abstract:
return FileImport()
file_import = self._imports_shared(async_mode, **kwargs)
file_import.merge(super().imports(async_mode, is_python3_file, **kwargs))
file_import.merge(super().imports(async_mode, **kwargs))
if self.code_model.options["tracing"] and self.want_tracing:
file_import.add_submodule_import(
"azure.core.tracing.decorator",
Expand Down
10 changes: 3 additions & 7 deletions autorest/codegen/models/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,15 +179,11 @@ def docstring_type_keyword(self) -> str:
def in_method_signature(self) -> bool:
...

def method_signature(self, is_python3_file: bool, async_mode: bool) -> str:
def method_signature(self, async_mode: bool) -> str:
type_annot = self.type_annotation(async_mode=async_mode)
if is_python3_file:
if self.client_default_value is not None or self.optional:
return f"{self.client_name}: {type_annot} = {self.client_default_value_declaration},"
return f"{self.client_name}: {type_annot},"
if self.client_default_value is not None or self.optional:
return f"{self.client_name}={self.client_default_value_declaration}, # type: {type_annot}"
return f"{self.client_name}, # type: {type_annot}"
return f"{self.client_name}: {type_annot} = {self.client_default_value_declaration},"
return f"{self.client_name}: {type_annot},"


class _BodyParameterBase(_ParameterBase):
Expand Down
Loading