@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.
- package/dist/emitter/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +8 -1
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +5 -4
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/http.d.ts +5 -0
- package/dist/emitter/http.d.ts.map +1 -1
- package/dist/emitter/http.js +20 -1
- package/dist/emitter/http.js.map +1 -1
- package/emitter/src/code-model.ts +12 -0
- package/emitter/src/emitter.ts +5 -4
- package/emitter/src/http.ts +23 -1
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +5 -6
- package/eng/scripts/ci/util.py +1 -1
- package/eng/scripts/setup/__pycache__/package_manager.cpython-39.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-39.pyc +0 -0
- package/eng/scripts/setup/install.py +21 -11
- package/eng/scripts/setup/install.ts +29 -4
- package/eng/scripts/setup/run-python3.ts +1 -1
- package/eng/scripts/setup/system-requirements.ts +13 -5
- package/generator/build/lib/pygen/__init__.py +7 -21
- package/generator/build/lib/pygen/black.py +2 -2
- package/generator/build/lib/pygen/codegen/__init__.py +4 -4
- package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
- package/generator/build/lib/pygen/codegen/models/base.py +9 -12
- package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
- package/generator/build/lib/pygen/codegen/models/client.py +61 -102
- package/generator/build/lib/pygen/codegen/models/code_model.py +33 -29
- package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
- package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
- package/generator/build/lib/pygen/codegen/models/list_type.py +11 -14
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
- package/generator/build/lib/pygen/codegen/models/operation.py +22 -56
- package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/build/lib/pygen/codegen/models/property.py +10 -10
- package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
- package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/build/lib/pygen/codegen/models/response.py +15 -40
- package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +15 -40
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +101 -94
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +46 -60
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +36 -29
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +8 -3
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +8 -1
- package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
- package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
- package/generator/build/lib/pygen/utils.py +6 -6
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +7 -21
- package/generator/pygen/black.py +2 -2
- package/generator/pygen/codegen/__init__.py +4 -4
- package/generator/pygen/codegen/models/__init__.py +2 -2
- package/generator/pygen/codegen/models/base.py +9 -12
- package/generator/pygen/codegen/models/base_builder.py +4 -6
- package/generator/pygen/codegen/models/client.py +61 -102
- package/generator/pygen/codegen/models/code_model.py +33 -29
- package/generator/pygen/codegen/models/combined_type.py +7 -7
- package/generator/pygen/codegen/models/constant_type.py +4 -11
- package/generator/pygen/codegen/models/credential_types.py +9 -11
- package/generator/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/pygen/codegen/models/enum_type.py +7 -7
- package/generator/pygen/codegen/models/imports.py +24 -29
- package/generator/pygen/codegen/models/list_type.py +11 -14
- package/generator/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/pygen/codegen/models/model_type.py +11 -11
- package/generator/pygen/codegen/models/operation.py +22 -56
- package/generator/pygen/codegen/models/operation_group.py +11 -22
- package/generator/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/pygen/codegen/models/parameter.py +12 -21
- package/generator/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/pygen/codegen/models/property.py +10 -10
- package/generator/pygen/codegen/models/request_builder.py +7 -8
- package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/pygen/codegen/models/response.py +15 -40
- package/generator/pygen/codegen/models/utils.py +2 -2
- package/generator/pygen/codegen/serializers/__init__.py +15 -40
- package/generator/pygen/codegen/serializers/builder_serializer.py +101 -94
- package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/pygen/codegen/serializers/general_serializer.py +46 -60
- package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/model_serializer.py +36 -29
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +8 -3
- package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/pygen/codegen/serializers/utils.py +2 -2
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +8 -1
- package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/pygen/preprocess/__init__.py +47 -30
- package/generator/pygen/preprocess/helpers.py +2 -2
- package/generator/pygen/utils.py +6 -6
- package/generator/pygen.egg-info/SOURCES.txt +0 -2
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +79 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +53 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +4 -4
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +37 -0
- package/generator/test/azure/mock_api_tests/conftest.py +2 -2
- package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +72 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +45 -0
- package/generator/test/azure/mock_api_tests/test_client_naming.py +3 -3
- package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +35 -0
- package/generator/test/azure/requirements.txt +2 -0
- package/generator/test/unbranded/mock_api_tests/conftest.py +1 -2
- package/generator/test/unittests/test_model_base_serialization.py +135 -92
- package/generator/test/unittests/test_model_base_xml_serialization.py +19 -23
- package/package.json +8 -8
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
- package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
- package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
- 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",
|
package/eng/scripts/ci/util.py
CHANGED
|
@@ -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'
|
|
28
|
+
help="The test folder we're in. Can be 'azure' or 'vanilla'",
|
|
29
29
|
required=True,
|
|
30
30
|
)
|
|
31
31
|
parser.add_argument(
|
|
Binary file
|
|
Binary file
|
|
@@ -8,28 +8,33 @@
|
|
|
8
8
|
import sys
|
|
9
9
|
|
|
10
10
|
if not sys.version_info >= (3, 9, 0):
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
50
|
+
try:
|
|
51
|
+
venv_context = create_venv_with_package_manager(venv_path)
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
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
|
-
|
|
6
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
51
|
-
if (
|
|
52
|
-
|
|
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
|
-
|
|
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,
|
|
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[
|
|
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
|
|
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:
|
|
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) ->
|
|
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) ->
|
|
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:
|
|
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
|
-
|
|
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)}
|
|
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
|
|
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:
|
|
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:
|
|
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) ->
|
|
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,
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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) ->
|
|
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[
|
|
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:
|
|
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) ->
|
|
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:
|
|
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:
|
|
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[
|
|
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) ->
|
|
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)
|