@typespec/http-client-python 0.15.2 → 0.16.1-dev.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.
Files changed (156) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +8 -1
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/emitter.d.ts.map +1 -1
  5. package/dist/emitter/emitter.js +5 -4
  6. package/dist/emitter/emitter.js.map +1 -1
  7. package/dist/emitter/http.d.ts +5 -0
  8. package/dist/emitter/http.d.ts.map +1 -1
  9. package/dist/emitter/http.js +20 -1
  10. package/dist/emitter/http.js.map +1 -1
  11. package/emitter/src/code-model.ts +12 -0
  12. package/emitter/src/emitter.ts +5 -4
  13. package/emitter/src/http.ts +23 -1
  14. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  15. package/eng/scripts/ci/regenerate.ts +5 -6
  16. package/eng/scripts/ci/util.py +1 -1
  17. package/eng/scripts/setup/__pycache__/package_manager.cpython-39.pyc +0 -0
  18. package/eng/scripts/setup/__pycache__/venvtools.cpython-39.pyc +0 -0
  19. package/eng/scripts/setup/install.py +21 -11
  20. package/eng/scripts/setup/install.ts +29 -4
  21. package/eng/scripts/setup/run-python3.ts +1 -1
  22. package/eng/scripts/setup/system-requirements.ts +13 -5
  23. package/generator/build/lib/pygen/__init__.py +7 -21
  24. package/generator/build/lib/pygen/black.py +2 -2
  25. package/generator/build/lib/pygen/codegen/__init__.py +4 -4
  26. package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
  27. package/generator/build/lib/pygen/codegen/models/base.py +9 -12
  28. package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
  29. package/generator/build/lib/pygen/codegen/models/client.py +61 -102
  30. package/generator/build/lib/pygen/codegen/models/code_model.py +33 -29
  31. package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
  32. package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
  33. package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
  34. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
  35. package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
  36. package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
  37. package/generator/build/lib/pygen/codegen/models/list_type.py +11 -14
  38. package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
  39. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  40. package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
  41. package/generator/build/lib/pygen/codegen/models/operation.py +22 -56
  42. package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
  43. package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
  44. package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
  45. package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
  46. package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
  47. package/generator/build/lib/pygen/codegen/models/property.py +10 -10
  48. package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
  49. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
  50. package/generator/build/lib/pygen/codegen/models/response.py +15 -40
  51. package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
  52. package/generator/build/lib/pygen/codegen/serializers/__init__.py +15 -40
  53. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +101 -94
  54. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
  55. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
  56. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +46 -60
  57. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
  58. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
  59. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +36 -29
  60. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +8 -3
  61. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  62. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
  63. package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
  64. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  65. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
  66. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
  67. package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
  68. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  69. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  70. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  71. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  72. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  73. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +8 -1
  74. package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
  75. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  76. package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
  77. package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
  78. package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
  79. package/generator/build/lib/pygen/utils.py +6 -6
  80. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  81. package/generator/pygen/__init__.py +7 -21
  82. package/generator/pygen/black.py +2 -2
  83. package/generator/pygen/codegen/__init__.py +4 -4
  84. package/generator/pygen/codegen/models/__init__.py +2 -2
  85. package/generator/pygen/codegen/models/base.py +9 -12
  86. package/generator/pygen/codegen/models/base_builder.py +4 -6
  87. package/generator/pygen/codegen/models/client.py +61 -102
  88. package/generator/pygen/codegen/models/code_model.py +33 -29
  89. package/generator/pygen/codegen/models/combined_type.py +7 -7
  90. package/generator/pygen/codegen/models/constant_type.py +4 -11
  91. package/generator/pygen/codegen/models/credential_types.py +9 -11
  92. package/generator/pygen/codegen/models/dictionary_type.py +7 -8
  93. package/generator/pygen/codegen/models/enum_type.py +7 -7
  94. package/generator/pygen/codegen/models/imports.py +24 -29
  95. package/generator/pygen/codegen/models/list_type.py +11 -14
  96. package/generator/pygen/codegen/models/lro_operation.py +6 -6
  97. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  98. package/generator/pygen/codegen/models/model_type.py +11 -11
  99. package/generator/pygen/codegen/models/operation.py +22 -56
  100. package/generator/pygen/codegen/models/operation_group.py +11 -22
  101. package/generator/pygen/codegen/models/paging_operation.py +15 -19
  102. package/generator/pygen/codegen/models/parameter.py +12 -21
  103. package/generator/pygen/codegen/models/parameter_list.py +37 -39
  104. package/generator/pygen/codegen/models/primitive_types.py +24 -18
  105. package/generator/pygen/codegen/models/property.py +10 -10
  106. package/generator/pygen/codegen/models/request_builder.py +7 -8
  107. package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
  108. package/generator/pygen/codegen/models/response.py +15 -40
  109. package/generator/pygen/codegen/models/utils.py +2 -2
  110. package/generator/pygen/codegen/serializers/__init__.py +15 -40
  111. package/generator/pygen/codegen/serializers/builder_serializer.py +101 -94
  112. package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
  113. package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
  114. package/generator/pygen/codegen/serializers/general_serializer.py +46 -60
  115. package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
  116. package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
  117. package/generator/pygen/codegen/serializers/model_serializer.py +36 -29
  118. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +8 -3
  119. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  120. package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
  121. package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
  122. package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  123. package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
  124. package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
  125. package/generator/pygen/codegen/serializers/utils.py +2 -2
  126. package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  127. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  128. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  129. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  130. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  131. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +8 -1
  132. package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
  133. package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  134. package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
  135. package/generator/pygen/preprocess/__init__.py +47 -30
  136. package/generator/pygen/preprocess/helpers.py +2 -2
  137. package/generator/pygen/utils.py +6 -6
  138. package/generator/pygen.egg-info/SOURCES.txt +0 -2
  139. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +79 -0
  140. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +53 -0
  141. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +4 -4
  142. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +37 -0
  143. package/generator/test/azure/mock_api_tests/conftest.py +2 -2
  144. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +72 -0
  145. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +45 -0
  146. package/generator/test/azure/mock_api_tests/test_client_naming.py +3 -3
  147. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +35 -0
  148. package/generator/test/azure/requirements.txt +2 -0
  149. package/generator/test/unbranded/mock_api_tests/conftest.py +1 -2
  150. package/generator/test/unittests/test_model_base_serialization.py +135 -92
  151. package/generator/test/unittests/test_model_base_xml_serialization.py +19 -23
  152. package/package.json +8 -8
  153. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
  154. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  155. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
  156. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
@@ -22,11 +22,7 @@ const argv = parseArgs({
22
22
  });
23
23
 
24
24
  // Add this near the top with other constants
25
- const SKIP_SPECS = [
26
- "type/union/discriminated",
27
- "client-operation-group",
28
- "azure/client-generator-core/hierarchy-building",
29
- ];
25
+ const SKIP_SPECS = ["type/union/discriminated", "client-operation-group"];
30
26
 
31
27
  // Get the directory of the current file
32
28
  const PLUGIN_DIR = argv.values.pluginDir
@@ -68,6 +64,9 @@ const AZURE_EMITTER_OPTIONS: Record<string, Record<string, string> | Record<stri
68
64
  "azure/client-generator-core/override": {
69
65
  namespace: "specs.azure.clientgenerator.core.override",
70
66
  },
67
+ "azure/client-generator-core/hierarchy-building": {
68
+ namespace: "specs.azure.clientgenerator.core.hierarchybuilding",
69
+ },
71
70
  "azure/core/basic": {
72
71
  namespace: "specs.azure.core.basic",
73
72
  },
@@ -114,7 +113,7 @@ const AZURE_EMITTER_OPTIONS: Record<string, Record<string, string> | Record<stri
114
113
  namespace: "client.structure.twooperationgroup",
115
114
  },
116
115
  "client/naming": {
117
- namespace: "client.naming",
116
+ namespace: "client.naming.main",
118
117
  },
119
118
  "client/overload": {
120
119
  namespace: "client.overload",
@@ -25,7 +25,7 @@ def run_check(name, call_back, log_info):
25
25
  "-t",
26
26
  "--test-folder",
27
27
  dest="test_folder",
28
- help="The test folder we're in. Can be 'azure', 'multiapi', or 'vanilla'",
28
+ help="The test folder we're in. Can be 'azure' or 'vanilla'",
29
29
  required=True,
30
30
  )
31
31
  parser.add_argument(
@@ -8,28 +8,33 @@
8
8
  import sys
9
9
 
10
10
  if not sys.version_info >= (3, 9, 0):
11
- raise Warning(
12
- "Autorest for Python extension requires Python 3.9 at least. We will run your code with Pyodide since your Python version isn't adequate."
11
+ print(
12
+ "Warning: Autorest for Python extension requires Python 3.9 at least. We will run your code with Pyodide since your Python version isn't adequate."
13
13
  )
14
+ sys.exit(2) # Exit code 2 for inadequate environment
14
15
 
15
16
  try:
16
17
  from package_manager import detect_package_manager, PackageManagerNotFoundError
17
18
 
18
19
  detect_package_manager() # Just check if we have a package manager
19
20
  except (ImportError, ModuleNotFoundError, PackageManagerNotFoundError):
20
- raise Warning(
21
- "Your Python installation doesn't have a suitable package manager (pip or uv) available. We will run your code with Pyodide since your Python environment isn't adequate."
21
+ print(
22
+ "Warning: Your Python installation doesn't have a suitable package manager (pip or uv) available. We will run your code with Pyodide since your Python environment isn't adequate."
22
23
  )
24
+ sys.exit(2) # Exit code 2 for inadequate environment
23
25
 
24
26
  try:
25
27
  import venv
26
28
  except (ImportError, ModuleNotFoundError):
27
- raise Warning(
28
- "Your Python installation doesn't have venv available. We will run your code with Pyodide since your Python version isn't adequate."
29
+ print(
30
+ "Warning: Your Python installation doesn't have venv available. We will run your code with Pyodide since your Python version isn't adequate."
29
31
  )
32
+ sys.exit(2) # Exit code 2 for inadequate environment
30
33
 
31
34
 
32
- # Now we have a package manager (uv or pip) and Py >= 3.8, go to work
35
+ # Now we have a package manager (uv or pip) and Py >= 3.9, go to work
36
+ # At this point, both Python and package manager are confirmed to be available
37
+ # Any failures from here should fail the npm install, not fallback to Pyodide
33
38
 
34
39
  from pathlib import Path
35
40
 
@@ -42,11 +47,16 @@ def main():
42
47
  # Create virtual environment using package manager abstraction
43
48
  from package_manager import create_venv_with_package_manager, install_packages
44
49
 
45
- venv_context = create_venv_with_package_manager(venv_path)
50
+ try:
51
+ venv_context = create_venv_with_package_manager(venv_path)
46
52
 
47
- # Install required packages - install_packages handles package manager logic
48
- install_packages(["-U", "black"], venv_context)
49
- install_packages(["-e", f"{_ROOT_DIR}/generator"], venv_context)
53
+ # Install required packages - install_packages handles package manager logic
54
+ install_packages(["-U", "black"], venv_context)
55
+ install_packages([f"{_ROOT_DIR}/generator"], venv_context)
56
+ except Exception as e:
57
+ # Since Python and package manager are available, any failure here should fail the npm install
58
+ print(f"Error: Installation failed despite Python and package manager being available: {e}")
59
+ sys.exit(1) # Exit code 1 for installation failure
50
60
 
51
61
 
52
62
  if __name__ == "__main__":
@@ -1,11 +1,36 @@
1
- import { runPython3 } from "./run-python3.js";
1
+ import cp from "child_process";
2
+ import { patchPythonPath } from "./system-requirements.js";
2
3
 
3
4
  async function main() {
5
+ let pythonCommand: string[];
6
+
4
7
  try {
5
- await runPython3("./eng/scripts/setup/install.py");
6
- console.log("Found Python on your local environment and created a venv with all requirements."); // eslint-disable-line no-console
8
+ // First try to resolve Python path
9
+ pythonCommand = await patchPythonPath(["python", "./eng/scripts/setup/install.py"], {
10
+ version: ">=3.9",
11
+ environmentVariable: "AUTOREST_PYTHON_EXE",
12
+ });
7
13
  } catch (error) {
8
- console.log("No Python found on your local environment. We will use Pyodide instead."); // eslint-disable-line no-console
14
+ console.log(`Ran into the following error when setting up your local environment: ${error}`); // eslint-disable-line no-console
15
+ return;
16
+ }
17
+
18
+ try {
19
+ // Python found, now try to run the installation script
20
+ cp.execSync(pythonCommand.join(" "), {
21
+ stdio: [0, 1, 2],
22
+ });
23
+ console.log("Found Python on your local environment and created a venv with all requirements."); // eslint-disable-line no-console
24
+ } catch (error: any) {
25
+ // Check the exit code to determine the type of error
26
+ if (error.status === 2) {
27
+ // Exit code 2: Python/pip not adequate - use Pyodide
28
+ console.log("No Python found on your local environment. We will use Pyodide instead."); // eslint-disable-line no-console
29
+ } else {
30
+ // Exit code 1 or other: Python and pip were found but installation failed - fail the npm install
31
+ console.error("Python and package manager found but installation failed."); // eslint-disable-line no-console
32
+ process.exit(1);
33
+ }
9
34
  }
10
35
  }
11
36
 
@@ -11,7 +11,7 @@ import { patchPythonPath } from "./system-requirements.js";
11
11
 
12
12
  export async function runPython3(...args: string[]) {
13
13
  const command = await patchPythonPath(["python", ...args], {
14
- version: ">=3.8",
14
+ version: ">=3.9",
15
15
  environmentVariable: "AUTOREST_PYTHON_EXE",
16
16
  });
17
17
  cp.execSync(command.join(" "), {
@@ -1,5 +1,4 @@
1
1
  import { ChildProcess, spawn, SpawnOptions } from "child_process";
2
- import { coerce, satisfies } from "semver";
3
2
 
4
3
  /*
5
4
  * Copied from @autorest/system-requirements
@@ -46,12 +45,21 @@ const execute = (
46
45
  });
47
46
  };
48
47
 
48
+ // Simple version comparison without semver dependency
49
49
  const versionIsSatisfied = (version: string, requirement: string): boolean => {
50
- const cleanedVersion = coerce(version);
51
- if (!cleanedVersion) {
52
- throw new Error(`Invalid version ${version}.`);
50
+ // For now, support only >= requirements since that's what we use
51
+ if (requirement.startsWith(">=")) {
52
+ const requiredVersion = requirement.substring(2);
53
+ return parseVersionNumber(version) >= parseVersionNumber(requiredVersion);
53
54
  }
54
- return satisfies(cleanedVersion, requirement, true);
55
+ // Fallback to true for other version requirements
56
+ return true;
57
+ };
58
+
59
+ const parseVersionNumber = (version: string): number => {
60
+ // Parse version like "3.9.0" to a comparable number
61
+ const parts = version.split(".").map((p) => parseInt(p.replace(/[^0-9]/g, ""), 10) || 0);
62
+ return parts[0] * 10000 + (parts[1] || 0) * 100 + (parts[2] || 0);
55
63
  };
56
64
 
57
65
  /**
@@ -8,7 +8,7 @@ import logging
8
8
  from pathlib import Path
9
9
  import json
10
10
  from abc import ABC, abstractmethod
11
- from typing import Any, Dict, Iterator, Optional, Union, List
11
+ from typing import Any, Iterator, Optional, Union
12
12
 
13
13
  import yaml
14
14
  from .utils import TYPESPEC_PACKAGE_MODE, VALID_PACKAGE_MODE
@@ -33,7 +33,6 @@ class OptionsDict(MutableMapping):
33
33
  "head-as-boolean": True,
34
34
  "keep-version-file": False,
35
35
  "low-level-client": False,
36
- "multiapi": False,
37
36
  "no-async": False,
38
37
  "no-namespace-folders": False,
39
38
  "polymorphic-examples": 5,
@@ -42,7 +41,7 @@ class OptionsDict(MutableMapping):
42
41
  "generation-subdir": None, # subdirectory to generate the code in
43
42
  }
44
43
 
45
- def __init__(self, options: Optional[Dict[str, Any]] = None) -> None:
44
+ def __init__(self, options: Optional[dict[str, Any]] = None) -> None:
46
45
  self._data = options.copy() if options else {}
47
46
  self._validate_combinations()
48
47
 
@@ -148,16 +147,6 @@ class OptionsDict(MutableMapping):
148
147
  "If you want operation files, pass in flag --show-operations"
149
148
  )
150
149
 
151
- if self.get("multiapi") and self.get("version-tolerant"):
152
- raise ValueError(
153
- "Can not currently generate version tolerant multiapi SDKs. "
154
- "We are working on creating a new multiapi SDK for version tolerant and it is not available yet."
155
- )
156
-
157
- # If multiapi, do not generate default pyproject.toml
158
- if self.get("multiapi"):
159
- self["keep-setup-py"] = True
160
-
161
150
  if self.get("client-side-validation") and self.get("version-tolerant"):
162
151
  raise ValueError("Can not generate version tolerant with --client-side-validation. ")
163
152
 
@@ -205,7 +194,7 @@ class OptionsDict(MutableMapping):
205
194
  for key in self.DEFAULTS:
206
195
  if key not in all_keys:
207
196
  all_keys.add(key)
208
- all_keys.update(self.DEFAULTS.keys())
197
+ all_keys |= self.DEFAULTS.keys()
209
198
  return KeysView({key: None for key in all_keys})
210
199
 
211
200
  def values(self) -> ValuesView[Any]:
@@ -218,7 +207,7 @@ class OptionsDict(MutableMapping):
218
207
  class ReaderAndWriter:
219
208
  def __init__(self, *, output_folder: Union[str, Path], **kwargs: Any) -> None:
220
209
  self.output_folder = Path(output_folder)
221
- self._list_file: List[str] = []
210
+ self._list_file: list[str] = []
222
211
  try:
223
212
  with open(
224
213
  Path(self.output_folder) / Path("..") / Path("python.json"),
@@ -234,9 +223,6 @@ class ReaderAndWriter:
234
223
  _LOGGER.warning("Loading python.json file. This behavior will be depreacted")
235
224
  self.options.update(python_json)
236
225
 
237
- def get_output_folder(self) -> Path:
238
- return self.output_folder
239
-
240
226
  def read_file(self, path: Union[str, Path]) -> str:
241
227
  """Directly reading from disk"""
242
228
  # make path relative to output folder
@@ -262,7 +248,7 @@ class ReaderAndWriter:
262
248
  except FileNotFoundError:
263
249
  pass
264
250
 
265
- def list_file(self) -> List[str]:
251
+ def list_file(self) -> list[str]:
266
252
  return [str(f.relative_to(self.output_folder)) for f in self.output_folder.glob("**/*") if f.is_file()]
267
253
 
268
254
 
@@ -286,7 +272,7 @@ class Plugin(ReaderAndWriter, ABC):
286
272
  class YamlUpdatePlugin(Plugin):
287
273
  """A plugin that update the YAML as input."""
288
274
 
289
- def get_yaml(self) -> Dict[str, Any]:
275
+ def get_yaml(self) -> dict[str, Any]:
290
276
  # tsp file doesn't have to be relative to output folder
291
277
  with open(self.options["tsp_file"], "r", encoding="utf-8-sig") as fd:
292
278
  return yaml.safe_load(fd.read())
@@ -307,7 +293,7 @@ class YamlUpdatePlugin(Plugin):
307
293
  return True
308
294
 
309
295
  @abstractmethod
310
- def update_yaml(self, yaml_data: Dict[str, Any]) -> None:
296
+ def update_yaml(self, yaml_data: dict[str, Any]) -> None:
311
297
  """The code-model-v4-no-tags yaml model tree.
312
298
 
313
299
  :rtype: updated yaml
@@ -69,9 +69,9 @@ class BlackScriptPlugin(Plugin):
69
69
  pylint_disables.append("too-many-lines")
70
70
  if pylint_disables:
71
71
  file_content = (
72
- "\n".join([lines[0] + ",".join([""] + pylint_disables)] + lines[1:])
72
+ os.linesep.join([lines[0] + ",".join([""] + pylint_disables)] + lines[1:])
73
73
  if "pylint: disable=" in lines[0]
74
- else f"# pylint: disable={','.join(pylint_disables)}\n" + file_content
74
+ else f"# pylint: disable={','.join(pylint_disables)}{os.linesep}" + file_content
75
75
  )
76
76
  self.write_file(file, file_content)
77
77
 
@@ -4,7 +4,7 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  import logging
7
- from typing import Dict, Any
7
+ from typing import Any
8
8
  import yaml
9
9
 
10
10
 
@@ -20,7 +20,7 @@ _LOGGER = logging.getLogger(__name__)
20
20
  class CodeGenerator(Plugin):
21
21
 
22
22
  @staticmethod
23
- def sort_exceptions(yaml_data: Dict[str, Any]) -> None:
23
+ def sort_exceptions(yaml_data: dict[str, Any]) -> None:
24
24
  for client in yaml_data["clients"]:
25
25
  for group in client.get("operationGroups", []):
26
26
  for operation in group.get("operations", []):
@@ -37,7 +37,7 @@ class CodeGenerator(Plugin):
37
37
  )
38
38
 
39
39
  @staticmethod
40
- def remove_cloud_errors(yaml_data: Dict[str, Any]) -> None:
40
+ def remove_cloud_errors(yaml_data: dict[str, Any]) -> None:
41
41
  for client in yaml_data["clients"]:
42
42
  for group in client.get("operationGroups", []):
43
43
  for operation in group.get("operations", []):
@@ -60,7 +60,7 @@ class CodeGenerator(Plugin):
60
60
  del yaml_data["schemas"]["objects"][i]
61
61
  break
62
62
 
63
- def get_yaml(self) -> Dict[str, Any]:
63
+ def get_yaml(self) -> dict[str, Any]:
64
64
  # tsp file doesn't have to be relative to output folder
65
65
  with open(self.options["tsp_file"], "r", encoding="utf-8-sig") as fd:
66
66
  return yaml.safe_load(fd.read())
@@ -4,7 +4,7 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  import logging
7
- from typing import Any, Dict, Union, Optional
7
+ from typing import Any, Union, Optional
8
8
  from .base import BaseModel
9
9
  from .base_builder import BaseBuilder, ParameterListType
10
10
  from .code_model import CodeModel
@@ -155,7 +155,7 @@ TYPE_TO_OBJECT = {
155
155
  _LOGGER = logging.getLogger(__name__)
156
156
 
157
157
 
158
- def build_type(yaml_data: Dict[str, Any], code_model: CodeModel) -> BaseType:
158
+ def build_type(yaml_data: dict[str, Any], code_model: CodeModel) -> BaseType:
159
159
  yaml_id = id(yaml_data)
160
160
  try:
161
161
  return code_model.lookup_type(yaml_id)
@@ -3,7 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
- from typing import Any, Dict, TYPE_CHECKING, List, Optional
6
+ from typing import Any, TYPE_CHECKING, Optional
7
7
  from abc import ABC, abstractmethod
8
8
  from .imports import FileImport
9
9
 
@@ -20,7 +20,7 @@ class BaseModel:
20
20
  :type yaml_data: dict[str, Any]
21
21
  """
22
22
 
23
- def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
23
+ def __init__(self, yaml_data: dict[str, Any], code_model: "CodeModel") -> None:
24
24
  self.yaml_data = yaml_data
25
25
  self.code_model = code_model
26
26
 
@@ -39,21 +39,18 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
39
39
  :type yaml_data: dict[str, Any]
40
40
  """
41
41
 
42
- def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
42
+ def __init__(self, yaml_data: dict[str, Any], code_model: "CodeModel") -> None:
43
43
  super().__init__(yaml_data, code_model)
44
44
  self.type = yaml_data["type"] # the type discriminator
45
- self.api_versions: List[str] = yaml_data.get("apiVersions", []) # api versions this type is in.
45
+ self.api_versions: list[str] = yaml_data.get("apiVersions", []) # api versions this type is in.
46
46
 
47
47
  @classmethod
48
- def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "BaseType":
48
+ def from_yaml(cls, yaml_data: dict[str, Any], code_model: "CodeModel") -> "BaseType":
49
49
  return cls(yaml_data=yaml_data, code_model=code_model)
50
50
 
51
51
  def imports(self, **kwargs) -> FileImport: # pylint: disable=unused-argument
52
52
  return FileImport(self.code_model)
53
53
 
54
- def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
55
- return self.imports(**kwargs)
56
-
57
54
  def imports_for_sample(self) -> FileImport:
58
55
  return FileImport(self.code_model)
59
56
 
@@ -62,7 +59,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
62
59
  return repr(value)
63
60
 
64
61
  @property
65
- def xml_metadata(self) -> Dict[str, Any]:
62
+ def xml_metadata(self) -> dict[str, Any]:
66
63
  """XML metadata for the type, if the type has it."""
67
64
  return self.yaml_data.get("xmlMetadata", {})
68
65
 
@@ -132,7 +129,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
132
129
  """
133
130
 
134
131
  @property
135
- def validation(self) -> Optional[Dict[str, Any]]:
132
+ def validation(self) -> Optional[dict[str, Any]]:
136
133
  """Whether there's any validation constraints on this type.
137
134
 
138
135
  Even though we generate validation maps if there are validation constraints,
@@ -162,7 +159,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
162
159
  """Template of what this schema would look like as JSON input"""
163
160
 
164
161
  def get_polymorphic_subtypes(
165
- self, polymorphic_subtypes: List["ModelType"] # pylint: disable=unused-argument
162
+ self, polymorphic_subtypes: list["ModelType"] # pylint: disable=unused-argument
166
163
  ) -> None:
167
164
  return None
168
165
 
@@ -172,7 +169,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
172
169
  """Template of what an instance check of a variable for this type would look like"""
173
170
 
174
171
  @property
175
- def serialization_constraints(self) -> List[str]:
172
+ def serialization_constraints(self) -> list[str]:
176
173
  """Whether there are any serialization constraints when serializing this type."""
177
174
  return []
178
175
 
@@ -5,8 +5,6 @@
5
5
  # --------------------------------------------------------------------------
6
6
  import logging
7
7
  from typing import (
8
- List,
9
- Dict,
10
8
  Any,
11
9
  Generic,
12
10
  TypeVar,
@@ -52,7 +50,7 @@ class BaseBuilder(
52
50
 
53
51
  def __init__(
54
52
  self,
55
- yaml_data: Dict[str, Any],
53
+ yaml_data: dict[str, Any],
56
54
  code_model: "CodeModel",
57
55
  client: "Client",
58
56
  name: str,
@@ -70,9 +68,9 @@ class BaseBuilder(
70
68
  self.want_tracing: bool = yaml_data.get("wantTracing", True)
71
69
  self.group_name: str = yaml_data["groupName"] # either operationGroup or client I am on
72
70
  self.is_overload: bool = yaml_data["isOverload"]
73
- self.api_versions: List[str] = yaml_data["apiVersions"]
71
+ self.api_versions: list[str] = yaml_data["apiVersions"]
74
72
  self.added_on: Optional[str] = yaml_data.get("addedOn")
75
- self.external_docs: Optional[Dict[str, Any]] = yaml_data.get("externalDocs")
73
+ self.external_docs: Optional[dict[str, Any]] = yaml_data.get("externalDocs")
76
74
  self.client_namespace: str = yaml_data.get("clientNamespace", code_model.namespace)
77
75
 
78
76
  if code_model.options["version-tolerant"] and yaml_data.get("abstract"):
@@ -114,7 +112,7 @@ class BaseBuilder(
114
112
  )
115
113
  return self._description or self.name
116
114
 
117
- def method_signature(self, async_mode: bool, **kwargs: Any) -> List[str]:
115
+ def method_signature(self, async_mode: bool, **kwargs: Any) -> list[str]:
118
116
  if self.abstract:
119
117
  return ["*args,", "**kwargs"]
120
118
  return self.parameters.method_signature(async_mode, **kwargs)