@autorest/python 6.41.4 → 6.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
+ import shutil
6
7
  from collections.abc import ItemsView, KeysView, MutableMapping, ValuesView
7
8
  import logging
8
9
  from pathlib import Path
@@ -248,9 +249,23 @@ class ReaderAndWriter:
248
249
  except FileNotFoundError:
249
250
  pass
250
251
 
252
+ def remove_folder(self, foldername: Union[str, Path]) -> None:
253
+ try:
254
+ folder_path = self.output_folder / Path(foldername)
255
+ if folder_path.exists() and folder_path.is_dir():
256
+ shutil.rmtree(folder_path)
257
+ except FileNotFoundError:
258
+ pass
259
+
251
260
  def list_file(self) -> list[str]:
252
261
  return [str(f.relative_to(self.output_folder)) for f in self.output_folder.glob("**/*") if f.is_file()]
253
262
 
263
+ def list_file_of_folder(self, foldername: Union[str, Path]) -> list[str]:
264
+ folder_path = self.output_folder / Path(foldername)
265
+ if folder_path.exists() and folder_path.is_dir():
266
+ return [str(f.relative_to(self.output_folder)) for f in folder_path.glob("**/*") if f.is_file()]
267
+ return []
268
+
254
269
 
255
270
  class Plugin(ReaderAndWriter, ABC):
256
271
  """A base class for autorest plugin.
@@ -122,7 +122,21 @@ class JinjaSerializer(ReaderAndWriter):
122
122
  # If parsing the version fails, we assume the version file is not valid and overwrite.
123
123
  return False
124
124
 
125
+ # pylint: disable=too-many-branches
125
126
  def serialize(self) -> None:
127
+ # remove existing folders when generate from tsp
128
+ if self.code_model.is_tsp and self.code_model.is_azure_flavor:
129
+ # remove generated_samples and generated_tests folder
130
+ self.remove_folder(self._generated_tests_samples_folder("generated_samples"))
131
+ self.remove_folder(self._generated_tests_samples_folder("generated_tests"))
132
+
133
+ # remove generated sdk files
134
+ generation_path = self.code_model.get_generation_dir(self.code_model.namespace)
135
+ for file in self.list_file_of_folder(generation_path):
136
+ if file.endswith(".py") and "_patch.py" not in file:
137
+ self.remove_file(file)
138
+
139
+ # serialize logic
126
140
  env = Environment(
127
141
  loader=PackageLoader("pygen.codegen", "templates"),
128
142
  keep_trailing_newline=True,
@@ -519,8 +533,11 @@ class JinjaSerializer(ReaderAndWriter):
519
533
  return Path("/".join(namespace_config.split(".")[num_of_package_namespace:]))
520
534
  return Path("")
521
535
 
536
+ def _generated_tests_samples_folder(self, folder_name: str) -> Path:
537
+ return self._root_of_sdk / folder_name
538
+
522
539
  def _serialize_and_write_sample(self, env: Environment):
523
- out_path = self._root_of_sdk / "generated_samples"
540
+ out_path = self._generated_tests_samples_folder("generated_samples")
524
541
  for client in self.code_model.clients:
525
542
  for op_group in client.operation_groups:
526
543
  for operation in op_group.operations:
@@ -549,7 +566,7 @@ class JinjaSerializer(ReaderAndWriter):
549
566
 
550
567
  def _serialize_and_write_test(self, env: Environment):
551
568
  self.code_model.for_test = True
552
- out_path = self._root_of_sdk / "generated_tests"
569
+ out_path = self._generated_tests_samples_folder("generated_tests")
553
570
  general_serializer = TestGeneralSerializer(code_model=self.code_model, env=env)
554
571
  self.write_file(out_path / "conftest.py", general_serializer.serialize_conftest())
555
572
  if not self.code_model.options["azure-arm"]:
@@ -2,7 +2,7 @@
2
2
  {# Check if this is a sphinx documentation line that should not have extra prefix spacing #}
3
3
  {%- set is_sphinx_doc = doc_string.strip().startswith(':ivar') or doc_string.strip().startswith(':vartype') or doc_string.strip().startswith(':param') or doc_string.strip().startswith(':type') -%}
4
4
  {# Custom handling for bullet points - normalization is now done in preprocessing #}
5
- {% set enable_custom_handling = "* " in doc_string %}
5
+ {% set enable_custom_handling = "\n* " in doc_string or doc_string.startswith("* ") %}
6
6
  {%- if enable_custom_handling -%}
7
7
  {%- set lines = doc_string.split('\n') -%}
8
8
  {%- set result_lines = [] -%}
@@ -78,7 +78,7 @@
78
78
  if key in self.__flattened_items:
79
79
  if self.{{ flattened_property_attr }} is None:
80
80
  self.{{ flattened_property_attr }} = self._attr_to_rest_field["{{ flattened_property_attr }}"]._class_type()
81
- setattr(self.properties, key, value)
81
+ setattr(self.{{ flattened_property_attr }}, key, value)
82
82
  else:
83
83
  super().__setattr__(key, value)
84
84
  {% endif %}
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
+ import shutil
6
7
  from collections.abc import ItemsView, KeysView, MutableMapping, ValuesView
7
8
  import logging
8
9
  from pathlib import Path
@@ -248,9 +249,23 @@ class ReaderAndWriter:
248
249
  except FileNotFoundError:
249
250
  pass
250
251
 
252
+ def remove_folder(self, foldername: Union[str, Path]) -> None:
253
+ try:
254
+ folder_path = self.output_folder / Path(foldername)
255
+ if folder_path.exists() and folder_path.is_dir():
256
+ shutil.rmtree(folder_path)
257
+ except FileNotFoundError:
258
+ pass
259
+
251
260
  def list_file(self) -> list[str]:
252
261
  return [str(f.relative_to(self.output_folder)) for f in self.output_folder.glob("**/*") if f.is_file()]
253
262
 
263
+ def list_file_of_folder(self, foldername: Union[str, Path]) -> list[str]:
264
+ folder_path = self.output_folder / Path(foldername)
265
+ if folder_path.exists() and folder_path.is_dir():
266
+ return [str(f.relative_to(self.output_folder)) for f in folder_path.glob("**/*") if f.is_file()]
267
+ return []
268
+
254
269
 
255
270
  class Plugin(ReaderAndWriter, ABC):
256
271
  """A base class for autorest plugin.
@@ -122,7 +122,21 @@ class JinjaSerializer(ReaderAndWriter):
122
122
  # If parsing the version fails, we assume the version file is not valid and overwrite.
123
123
  return False
124
124
 
125
+ # pylint: disable=too-many-branches
125
126
  def serialize(self) -> None:
127
+ # remove existing folders when generate from tsp
128
+ if self.code_model.is_tsp and self.code_model.is_azure_flavor:
129
+ # remove generated_samples and generated_tests folder
130
+ self.remove_folder(self._generated_tests_samples_folder("generated_samples"))
131
+ self.remove_folder(self._generated_tests_samples_folder("generated_tests"))
132
+
133
+ # remove generated sdk files
134
+ generation_path = self.code_model.get_generation_dir(self.code_model.namespace)
135
+ for file in self.list_file_of_folder(generation_path):
136
+ if file.endswith(".py") and "_patch.py" not in file:
137
+ self.remove_file(file)
138
+
139
+ # serialize logic
126
140
  env = Environment(
127
141
  loader=PackageLoader("pygen.codegen", "templates"),
128
142
  keep_trailing_newline=True,
@@ -519,8 +533,11 @@ class JinjaSerializer(ReaderAndWriter):
519
533
  return Path("/".join(namespace_config.split(".")[num_of_package_namespace:]))
520
534
  return Path("")
521
535
 
536
+ def _generated_tests_samples_folder(self, folder_name: str) -> Path:
537
+ return self._root_of_sdk / folder_name
538
+
522
539
  def _serialize_and_write_sample(self, env: Environment):
523
- out_path = self._root_of_sdk / "generated_samples"
540
+ out_path = self._generated_tests_samples_folder("generated_samples")
524
541
  for client in self.code_model.clients:
525
542
  for op_group in client.operation_groups:
526
543
  for operation in op_group.operations:
@@ -549,7 +566,7 @@ class JinjaSerializer(ReaderAndWriter):
549
566
 
550
567
  def _serialize_and_write_test(self, env: Environment):
551
568
  self.code_model.for_test = True
552
- out_path = self._root_of_sdk / "generated_tests"
569
+ out_path = self._generated_tests_samples_folder("generated_tests")
553
570
  general_serializer = TestGeneralSerializer(code_model=self.code_model, env=env)
554
571
  self.write_file(out_path / "conftest.py", general_serializer.serialize_conftest())
555
572
  if not self.code_model.options["azure-arm"]:
@@ -2,7 +2,7 @@
2
2
  {# Check if this is a sphinx documentation line that should not have extra prefix spacing #}
3
3
  {%- set is_sphinx_doc = doc_string.strip().startswith(':ivar') or doc_string.strip().startswith(':vartype') or doc_string.strip().startswith(':param') or doc_string.strip().startswith(':type') -%}
4
4
  {# Custom handling for bullet points - normalization is now done in preprocessing #}
5
- {% set enable_custom_handling = "* " in doc_string %}
5
+ {% set enable_custom_handling = "\n* " in doc_string or doc_string.startswith("* ") %}
6
6
  {%- if enable_custom_handling -%}
7
7
  {%- set lines = doc_string.split('\n') -%}
8
8
  {%- set result_lines = [] -%}
@@ -78,7 +78,7 @@
78
78
  if key in self.__flattened_items:
79
79
  if self.{{ flattened_property_attr }} is None:
80
80
  self.{{ flattened_property_attr }} = self._attr_to_rest_field["{{ flattened_property_attr }}"]._class_type()
81
- setattr(self.properties, key, value)
81
+ setattr(self.{{ flattened_property_attr }}, key, value)
82
82
  else:
83
83
  super().__setattr__(key, value)
84
84
  {% endif %}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autorest/python",
3
- "version": "6.41.4",
3
+ "version": "6.42.0",
4
4
  "description": "The Python extension for generators in AutoRest.",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "homepage": "https://github.com/Azure/autorest.python/blob/main/README.md",
21
21
  "dependencies": {
22
- "@typespec/http-client-python": "~0.19.2",
22
+ "@typespec/http-client-python": "~0.20.0",
23
23
  "@autorest/system-requirements": "~1.0.2",
24
24
  "fs-extra": "~11.2.0",
25
25
  "tsx": "~4.19.1"