@autorest/python 6.41.4 → 6.42.1
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.
- package/generator/build/lib/pygen/__init__.py +16 -0
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +19 -2
- package/generator/build/lib/pygen/codegen/templates/macros.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +16 -0
- package/generator/pygen/codegen/serializers/__init__.py +19 -2
- package/generator/pygen/codegen/templates/macros.jinja2 +1 -1
- package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/package.json +2 -2
- package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
|
@@ -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
|
|
@@ -39,6 +40,7 @@ class OptionsDict(MutableMapping):
|
|
|
39
40
|
"validate-versioning": True,
|
|
40
41
|
"version-tolerant": True,
|
|
41
42
|
"generation-subdir": None, # subdirectory to generate the code in
|
|
43
|
+
"clear-output-folder": False, # whether to clear the output folder before generating code
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
def __init__(self, options: Optional[dict[str, Any]] = None) -> None:
|
|
@@ -248,9 +250,23 @@ class ReaderAndWriter:
|
|
|
248
250
|
except FileNotFoundError:
|
|
249
251
|
pass
|
|
250
252
|
|
|
253
|
+
def remove_folder(self, foldername: Union[str, Path]) -> None:
|
|
254
|
+
try:
|
|
255
|
+
folder_path = self.output_folder / Path(foldername)
|
|
256
|
+
if folder_path.exists() and folder_path.is_dir():
|
|
257
|
+
shutil.rmtree(folder_path)
|
|
258
|
+
except FileNotFoundError:
|
|
259
|
+
pass
|
|
260
|
+
|
|
251
261
|
def list_file(self) -> list[str]:
|
|
252
262
|
return [str(f.relative_to(self.output_folder)) for f in self.output_folder.glob("**/*") if f.is_file()]
|
|
253
263
|
|
|
264
|
+
def list_file_of_folder(self, foldername: Union[str, Path]) -> list[str]:
|
|
265
|
+
folder_path = self.output_folder / Path(foldername)
|
|
266
|
+
if folder_path.exists() and folder_path.is_dir():
|
|
267
|
+
return [str(f.relative_to(self.output_folder)) for f in folder_path.glob("**/*") if f.is_file()]
|
|
268
|
+
return []
|
|
269
|
+
|
|
254
270
|
|
|
255
271
|
class Plugin(ReaderAndWriter, ABC):
|
|
256
272
|
"""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.options.get("clear-output-folder"):
|
|
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.
|
|
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.
|
|
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.
|
|
81
|
+
setattr(self.{{ flattened_property_attr }}, key, value)
|
|
82
82
|
else:
|
|
83
83
|
super().__setattr__(key, value)
|
|
84
84
|
{% endif %}
|
|
Binary file
|
|
@@ -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
|
|
@@ -39,6 +40,7 @@ class OptionsDict(MutableMapping):
|
|
|
39
40
|
"validate-versioning": True,
|
|
40
41
|
"version-tolerant": True,
|
|
41
42
|
"generation-subdir": None, # subdirectory to generate the code in
|
|
43
|
+
"clear-output-folder": False, # whether to clear the output folder before generating code
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
def __init__(self, options: Optional[dict[str, Any]] = None) -> None:
|
|
@@ -248,9 +250,23 @@ class ReaderAndWriter:
|
|
|
248
250
|
except FileNotFoundError:
|
|
249
251
|
pass
|
|
250
252
|
|
|
253
|
+
def remove_folder(self, foldername: Union[str, Path]) -> None:
|
|
254
|
+
try:
|
|
255
|
+
folder_path = self.output_folder / Path(foldername)
|
|
256
|
+
if folder_path.exists() and folder_path.is_dir():
|
|
257
|
+
shutil.rmtree(folder_path)
|
|
258
|
+
except FileNotFoundError:
|
|
259
|
+
pass
|
|
260
|
+
|
|
251
261
|
def list_file(self) -> list[str]:
|
|
252
262
|
return [str(f.relative_to(self.output_folder)) for f in self.output_folder.glob("**/*") if f.is_file()]
|
|
253
263
|
|
|
264
|
+
def list_file_of_folder(self, foldername: Union[str, Path]) -> list[str]:
|
|
265
|
+
folder_path = self.output_folder / Path(foldername)
|
|
266
|
+
if folder_path.exists() and folder_path.is_dir():
|
|
267
|
+
return [str(f.relative_to(self.output_folder)) for f in folder_path.glob("**/*") if f.is_file()]
|
|
268
|
+
return []
|
|
269
|
+
|
|
254
270
|
|
|
255
271
|
class Plugin(ReaderAndWriter, ABC):
|
|
256
272
|
"""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.options.get("clear-output-folder"):
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
3
|
+
"version": "6.42.1",
|
|
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.
|
|
22
|
+
"@typespec/http-client-python": "~0.20.2",
|
|
23
23
|
"@autorest/system-requirements": "~1.0.2",
|
|
24
24
|
"fs-extra": "~11.2.0",
|
|
25
25
|
"tsx": "~4.19.1"
|
|
Binary file
|