@typespec/http-client-python 0.12.3 → 0.12.5
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/types.d.ts.map +1 -1
- package/dist/emitter/types.js +12 -5
- package/dist/emitter/types.js.map +1 -1
- package/emitter/src/types.ts +14 -7
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +3 -0
- 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/build_pygen_wheel.py +9 -10
- package/eng/scripts/setup/install.py +13 -17
- package/eng/scripts/setup/package_manager.py +139 -0
- package/eng/scripts/setup/prepare.py +4 -12
- package/eng/scripts/setup/venvtools.py +1 -42
- package/generator/build/lib/pygen/codegen/models/property.py +6 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +31 -0
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/codegen/models/property.py +6 -0
- package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +31 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +31 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +30 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +36 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +9 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +20 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +7 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +19 -0
- package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +29 -0
- package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +27 -0
- package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +34 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +8 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +19 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +4 -0
- package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +18 -0
- package/generator/test/azure/requirements.txt +4 -0
- package/package.json +3 -3
|
@@ -11,28 +11,27 @@ if not sys.version_info >= (3, 9, 0):
|
|
|
11
11
|
raise Exception("Autorest for Python extension requires Python 3.9 at least")
|
|
12
12
|
|
|
13
13
|
try:
|
|
14
|
-
import
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
from package_manager import detect_package_manager, PackageManagerNotFoundError
|
|
15
|
+
detect_package_manager() # Just check if we have a package manager
|
|
16
|
+
except (ImportError, ModuleNotFoundError, PackageManagerNotFoundError):
|
|
17
|
+
raise Exception("Your Python installation doesn't have a suitable package manager (pip or uv) available")
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
# Now we have pip and Py >= 3.9, go to work
|
|
20
|
+
# Now we have a package manager (pip or uv) and Py >= 3.9, go to work
|
|
20
21
|
|
|
21
22
|
from pathlib import Path
|
|
22
23
|
|
|
23
|
-
from venvtools import
|
|
24
|
+
from venvtools import python_run
|
|
25
|
+
from package_manager import install_packages, create_venv_with_package_manager
|
|
24
26
|
|
|
25
27
|
_ROOT_DIR = Path(__file__).parent.parent.parent.parent
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
def main():
|
|
29
31
|
venv_path = _ROOT_DIR / "venv_build_wheel"
|
|
30
|
-
|
|
31
|
-
env_builder.create(venv_path)
|
|
32
|
-
venv_context = env_builder.context
|
|
32
|
+
venv_context = create_venv_with_package_manager(venv_path)
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
python_run(venv_context, "pip", ["install", "build"])
|
|
34
|
+
install_packages(["build"], venv_context)
|
|
36
35
|
python_run(venv_context, "build", ["--wheel"], additional_dir="generator")
|
|
37
36
|
|
|
38
37
|
|
|
@@ -13,10 +13,11 @@ if not sys.version_info >= (3, 9, 0):
|
|
|
13
13
|
)
|
|
14
14
|
|
|
15
15
|
try:
|
|
16
|
-
import
|
|
17
|
-
|
|
16
|
+
from package_manager import detect_package_manager, PackageManagerNotFoundError
|
|
17
|
+
detect_package_manager() # Just check if we have a package manager
|
|
18
|
+
except (ImportError, ModuleNotFoundError, PackageManagerNotFoundError):
|
|
18
19
|
raise Warning(
|
|
19
|
-
"Your Python installation doesn't have pip available. We will run your code with Pyodide since your Python
|
|
20
|
+
"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."
|
|
20
21
|
)
|
|
21
22
|
|
|
22
23
|
try:
|
|
@@ -27,28 +28,23 @@ except (ImportError, ModuleNotFoundError):
|
|
|
27
28
|
)
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
# Now we have pip and Py >= 3.8, go to work
|
|
31
|
+
# Now we have a package manager (uv or pip) and Py >= 3.8, go to work
|
|
31
32
|
|
|
32
33
|
from pathlib import Path
|
|
33
34
|
|
|
34
|
-
from venvtools import ExtendedEnvBuilder, python_run
|
|
35
|
-
|
|
36
35
|
_ROOT_DIR = Path(__file__).parent.parent.parent.parent
|
|
37
36
|
|
|
38
37
|
|
|
39
38
|
def main():
|
|
40
39
|
venv_path = _ROOT_DIR / "venv"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
python_run(venv_context, "pip", ["install", "-U", "pip"])
|
|
50
|
-
python_run(venv_context, "pip", ["install", "-U", "black"])
|
|
51
|
-
python_run(venv_context, "pip", ["install", "-e", f"{_ROOT_DIR}/generator"])
|
|
40
|
+
|
|
41
|
+
# Create virtual environment using package manager abstraction
|
|
42
|
+
from package_manager import create_venv_with_package_manager, install_packages
|
|
43
|
+
venv_context = create_venv_with_package_manager(venv_path)
|
|
44
|
+
|
|
45
|
+
# Install required packages - install_packages handles package manager logic
|
|
46
|
+
install_packages(["-U", "black"], venv_context)
|
|
47
|
+
install_packages(["-e", f"{_ROOT_DIR}/generator"], venv_context)
|
|
52
48
|
|
|
53
49
|
|
|
54
50
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
# -------------------------------------------------------------------------
|
|
4
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
5
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
6
|
+
# license information.
|
|
7
|
+
# --------------------------------------------------------------------------
|
|
8
|
+
"""Package manager utilities for detecting and using pip or uv."""
|
|
9
|
+
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
import venv
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from venvtools import ExtendedEnvBuilder
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PackageManagerNotFoundError(Exception):
|
|
18
|
+
"""Raised when no suitable package manager is found."""
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _check_command_available(command: str) -> bool:
|
|
23
|
+
"""Check if a command is available in the environment."""
|
|
24
|
+
try:
|
|
25
|
+
subprocess.run([command, "--version"], capture_output=True, check=True)
|
|
26
|
+
return True
|
|
27
|
+
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def detect_package_manager() -> str:
|
|
32
|
+
"""Detect the best available package manager.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
str: The package manager command ('uv' or 'pip')
|
|
36
|
+
|
|
37
|
+
Raises:
|
|
38
|
+
PackageManagerNotFoundError: If no suitable package manager is found
|
|
39
|
+
"""
|
|
40
|
+
# Check for uv first since it's more modern and faster
|
|
41
|
+
if _check_command_available("uv"):
|
|
42
|
+
return "uv"
|
|
43
|
+
|
|
44
|
+
# Fall back to pip
|
|
45
|
+
if _check_command_available("pip"):
|
|
46
|
+
return "pip"
|
|
47
|
+
|
|
48
|
+
# As a last resort, try using python -m pip
|
|
49
|
+
try:
|
|
50
|
+
subprocess.run([sys.executable, "-m", "pip", "--version"],
|
|
51
|
+
capture_output=True, check=True)
|
|
52
|
+
return "python -m pip"
|
|
53
|
+
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
raise PackageManagerNotFoundError(
|
|
57
|
+
"No suitable package manager found. Please install either uv or pip."
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def get_install_command(package_manager: str, venv_context=None) -> list:
|
|
62
|
+
"""Get the install command for the given package manager.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
package_manager: The package manager command ('uv', 'pip', or 'python -m pip')
|
|
66
|
+
venv_context: The virtual environment context (optional, used for pip)
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
list: The base install command as a list
|
|
70
|
+
"""
|
|
71
|
+
if package_manager == "uv":
|
|
72
|
+
cmd = ["uv", "pip", "install"]
|
|
73
|
+
if venv_context:
|
|
74
|
+
cmd.extend(["--python", venv_context.env_exe])
|
|
75
|
+
return cmd
|
|
76
|
+
elif package_manager == "pip":
|
|
77
|
+
if venv_context:
|
|
78
|
+
return [venv_context.env_exe, "-m", "pip", "install"]
|
|
79
|
+
else:
|
|
80
|
+
return ["pip", "install"]
|
|
81
|
+
elif package_manager == "python -m pip":
|
|
82
|
+
if venv_context:
|
|
83
|
+
return [venv_context.env_exe, "-m", "pip", "install"]
|
|
84
|
+
else:
|
|
85
|
+
return [sys.executable, "-m", "pip", "install"]
|
|
86
|
+
else:
|
|
87
|
+
raise ValueError(f"Unknown package manager: {package_manager}")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def install_packages(packages: list, venv_context=None, package_manager: str = None) -> None:
|
|
91
|
+
"""Install packages using the available package manager.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
packages: List of packages to install
|
|
95
|
+
venv_context: Virtual environment context (optional)
|
|
96
|
+
package_manager: Package manager to use (auto-detected if None)
|
|
97
|
+
"""
|
|
98
|
+
if package_manager is None:
|
|
99
|
+
package_manager = detect_package_manager()
|
|
100
|
+
|
|
101
|
+
install_cmd = get_install_command(package_manager, venv_context)
|
|
102
|
+
|
|
103
|
+
try:
|
|
104
|
+
subprocess.check_call(install_cmd + packages)
|
|
105
|
+
except subprocess.CalledProcessError as e:
|
|
106
|
+
raise RuntimeError(f"Failed to install packages with {package_manager}: {e}")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def create_venv_with_package_manager(venv_path):
|
|
110
|
+
"""Create virtual environment using the best available package manager.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
venv_path: Path where to create the virtual environment
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
venv_context: Virtual environment context object
|
|
117
|
+
"""
|
|
118
|
+
package_manager = detect_package_manager()
|
|
119
|
+
|
|
120
|
+
if package_manager == "uv":
|
|
121
|
+
# Use uv to create and manage the virtual environment
|
|
122
|
+
if not venv_path.exists():
|
|
123
|
+
subprocess.check_call(["uv", "venv", str(venv_path)])
|
|
124
|
+
|
|
125
|
+
# Create a mock venv_context for compatibility
|
|
126
|
+
class MockVenvContext:
|
|
127
|
+
def __init__(self, venv_path):
|
|
128
|
+
self.env_exe = str(venv_path / "bin" / "python") if sys.platform != "win32" else str(venv_path / "Scripts" / "python.exe")
|
|
129
|
+
|
|
130
|
+
return MockVenvContext(venv_path)
|
|
131
|
+
else:
|
|
132
|
+
# Use standard venv for pip
|
|
133
|
+
if venv_path.exists():
|
|
134
|
+
env_builder = venv.EnvBuilder(with_pip=True)
|
|
135
|
+
return env_builder.ensure_directories(venv_path)
|
|
136
|
+
else:
|
|
137
|
+
env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
|
|
138
|
+
env_builder.create(venv_path)
|
|
139
|
+
return env_builder.context
|
|
@@ -6,8 +6,6 @@
|
|
|
6
6
|
# license information.
|
|
7
7
|
# --------------------------------------------------------------------------
|
|
8
8
|
import sys
|
|
9
|
-
import os
|
|
10
|
-
import argparse
|
|
11
9
|
|
|
12
10
|
if not sys.version_info >= (3, 9, 0):
|
|
13
11
|
raise Warning(
|
|
@@ -15,9 +13,7 @@ if not sys.version_info >= (3, 9, 0):
|
|
|
15
13
|
)
|
|
16
14
|
|
|
17
15
|
from pathlib import Path
|
|
18
|
-
import
|
|
19
|
-
|
|
20
|
-
from venvtools import python_run
|
|
16
|
+
from package_manager import create_venv_with_package_manager, install_packages
|
|
21
17
|
|
|
22
18
|
_ROOT_DIR = Path(__file__).parent.parent.parent.parent
|
|
23
19
|
|
|
@@ -28,14 +24,10 @@ def main():
|
|
|
28
24
|
|
|
29
25
|
assert venv_preexists # Otherwise install was not done
|
|
30
26
|
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
venv_context = create_venv_with_package_manager(venv_path)
|
|
28
|
+
|
|
33
29
|
try:
|
|
34
|
-
|
|
35
|
-
venv_context,
|
|
36
|
-
"pip",
|
|
37
|
-
["install", "-r", f"{_ROOT_DIR}/generator/dev_requirements.txt"],
|
|
38
|
-
)
|
|
30
|
+
install_packages(["-r", f"{_ROOT_DIR}/generator/dev_requirements.txt"], venv_context)
|
|
39
31
|
except FileNotFoundError as e:
|
|
40
32
|
raise ValueError(e.filename)
|
|
41
33
|
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
|
-
from contextlib import contextmanager
|
|
7
|
-
import tempfile
|
|
8
6
|
import subprocess
|
|
9
7
|
import venv
|
|
10
8
|
import sys
|
|
@@ -31,51 +29,12 @@ class ExtendedEnvBuilder(venv.EnvBuilder):
|
|
|
31
29
|
return self.context
|
|
32
30
|
|
|
33
31
|
|
|
34
|
-
def create(
|
|
35
|
-
env_dir,
|
|
36
|
-
system_site_packages=False,
|
|
37
|
-
clear=False,
|
|
38
|
-
symlinks=False,
|
|
39
|
-
with_pip=False,
|
|
40
|
-
prompt=None,
|
|
41
|
-
upgrade_deps=False,
|
|
42
|
-
):
|
|
43
|
-
"""Create a virtual environment in a directory."""
|
|
44
|
-
builder = ExtendedEnvBuilder(
|
|
45
|
-
system_site_packages=system_site_packages,
|
|
46
|
-
clear=clear,
|
|
47
|
-
symlinks=symlinks,
|
|
48
|
-
with_pip=with_pip,
|
|
49
|
-
prompt=prompt,
|
|
50
|
-
upgrade_deps=upgrade_deps,
|
|
51
|
-
)
|
|
52
|
-
builder.create(env_dir)
|
|
53
|
-
return builder.context
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@contextmanager
|
|
57
|
-
def create_venv_with_package(packages):
|
|
58
|
-
"""Create a venv with these packages in a temp dir and yield the env.
|
|
59
|
-
|
|
60
|
-
packages should be an iterable of pip version instruction (e.g. package~=1.2.3)
|
|
61
|
-
"""
|
|
62
|
-
with tempfile.TemporaryDirectory() as tempdir:
|
|
63
|
-
my_env = create(tempdir, with_pip=True, upgrade_deps=True)
|
|
64
|
-
pip_call = [
|
|
65
|
-
my_env.env_exe,
|
|
66
|
-
"-m",
|
|
67
|
-
"pip",
|
|
68
|
-
"install",
|
|
69
|
-
]
|
|
70
|
-
subprocess.check_call(pip_call + ["-U", "pip"])
|
|
71
|
-
if packages:
|
|
72
|
-
subprocess.check_call(pip_call + packages)
|
|
73
|
-
yield my_env
|
|
74
32
|
|
|
75
33
|
|
|
76
34
|
def python_run(venv_context, module, command=None, *, additional_dir="."):
|
|
77
35
|
try:
|
|
78
36
|
cmd_line = [venv_context.env_exe, "-m", module] + (command if command else [])
|
|
37
|
+
|
|
79
38
|
print("Executing: {}".format(" ".join(cmd_line)))
|
|
80
39
|
subprocess.run(
|
|
81
40
|
cmd_line,
|
|
@@ -87,11 +87,17 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
87
87
|
def is_enum_discriminator(self) -> bool:
|
|
88
88
|
return self.is_discriminator and self.type.type == "enum"
|
|
89
89
|
|
|
90
|
+
@property
|
|
91
|
+
def is_combined_discriminator(self) -> bool:
|
|
92
|
+
return self.is_discriminator and self.type.type == "combined"
|
|
93
|
+
|
|
90
94
|
@property
|
|
91
95
|
def is_base_discriminator(self) -> bool:
|
|
92
96
|
"""If this discriminator is on the base model for polymorphic inheritance"""
|
|
93
97
|
if self.is_enum_discriminator:
|
|
94
98
|
return self.is_polymorphic and self.client_default_value is None
|
|
99
|
+
if self.is_combined_discriminator:
|
|
100
|
+
return True
|
|
95
101
|
return self.is_discriminator and self.is_polymorphic and cast(ConstantType, self.type).value is None
|
|
96
102
|
|
|
97
103
|
@property
|
|
@@ -104,4 +104,35 @@ additional questions or comments.
|
|
|
104
104
|
[pip]: https://pypi.org/project/pip/
|
|
105
105
|
[azure_sub]: https://azure.microsoft.com/free/
|
|
106
106
|
{% endif %}
|
|
107
|
+
{% else %}
|
|
108
|
+
# Overview
|
|
109
|
+
|
|
110
|
+
This package is generated by `@typespec/http-client-python` with Typespec.
|
|
111
|
+
|
|
112
|
+
## Getting started
|
|
113
|
+
|
|
114
|
+
### Prequisites
|
|
115
|
+
|
|
116
|
+
- Python 3.9 or later is required to use this package.
|
|
117
|
+
|
|
118
|
+
### Install the package
|
|
119
|
+
|
|
120
|
+
Step into folder where setup.py is then run:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pip install -e .
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Examples
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
>>> from {{ code_model.namespace }} import {{ client_name }}
|
|
130
|
+
>>> from {{ code_model.core_library }}.exceptions import HttpResponseError
|
|
131
|
+
|
|
132
|
+
>>> client = {{ client_name }}(endpoint='<endpoint>')
|
|
133
|
+
>>> try:
|
|
134
|
+
<!-- write code here -->
|
|
135
|
+
except HttpResponseError as e:
|
|
136
|
+
print('service responds error: {}'.format(e.response.json()))
|
|
137
|
+
```
|
|
107
138
|
{% endif %}
|
|
Binary file
|
|
@@ -87,11 +87,17 @@ class Property(BaseModel): # pylint: disable=too-many-instance-attributes
|
|
|
87
87
|
def is_enum_discriminator(self) -> bool:
|
|
88
88
|
return self.is_discriminator and self.type.type == "enum"
|
|
89
89
|
|
|
90
|
+
@property
|
|
91
|
+
def is_combined_discriminator(self) -> bool:
|
|
92
|
+
return self.is_discriminator and self.type.type == "combined"
|
|
93
|
+
|
|
90
94
|
@property
|
|
91
95
|
def is_base_discriminator(self) -> bool:
|
|
92
96
|
"""If this discriminator is on the base model for polymorphic inheritance"""
|
|
93
97
|
if self.is_enum_discriminator:
|
|
94
98
|
return self.is_polymorphic and self.client_default_value is None
|
|
99
|
+
if self.is_combined_discriminator:
|
|
100
|
+
return True
|
|
95
101
|
return self.is_discriminator and self.is_polymorphic and cast(ConstantType, self.type).value is None
|
|
96
102
|
|
|
97
103
|
@property
|
|
@@ -104,4 +104,35 @@ additional questions or comments.
|
|
|
104
104
|
[pip]: https://pypi.org/project/pip/
|
|
105
105
|
[azure_sub]: https://azure.microsoft.com/free/
|
|
106
106
|
{% endif %}
|
|
107
|
+
{% else %}
|
|
108
|
+
# Overview
|
|
109
|
+
|
|
110
|
+
This package is generated by `@typespec/http-client-python` with Typespec.
|
|
111
|
+
|
|
112
|
+
## Getting started
|
|
113
|
+
|
|
114
|
+
### Prequisites
|
|
115
|
+
|
|
116
|
+
- Python 3.9 or later is required to use this package.
|
|
117
|
+
|
|
118
|
+
### Install the package
|
|
119
|
+
|
|
120
|
+
Step into folder where setup.py is then run:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pip install -e .
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Examples
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
>>> from {{ code_model.namespace }} import {{ client_name }}
|
|
130
|
+
>>> from {{ code_model.core_library }}.exceptions import HttpResponseError
|
|
131
|
+
|
|
132
|
+
>>> client = {{ client_name }}(endpoint='<endpoint>')
|
|
133
|
+
>>> try:
|
|
134
|
+
<!-- write code here -->
|
|
135
|
+
except HttpResponseError as e:
|
|
136
|
+
print('service responds error: {}'.format(e.response.json()))
|
|
137
|
+
```
|
|
107
138
|
{% endif %}
|
package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import pytest
|
|
7
7
|
from azure.resourcemanager.commonproperties.aio import CommonPropertiesClient
|
|
8
8
|
from azure.resourcemanager.commonproperties import models
|
|
9
|
+
from azure.core import exceptions
|
|
9
10
|
|
|
10
11
|
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
11
12
|
RESOURCE_GROUP_NAME = "test-rg"
|
|
@@ -61,3 +62,33 @@ async def test_managed_identity_update_with_user_assigned_and_system_assigned(cl
|
|
|
61
62
|
assert result.location == "eastus"
|
|
62
63
|
assert result.identity.type == "SystemAssigned,UserAssigned"
|
|
63
64
|
assert result.properties.provisioning_state == "Succeeded"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@pytest.mark.asyncio
|
|
68
|
+
async def test_error_get_for_predefined_error(client):
|
|
69
|
+
try:
|
|
70
|
+
await client.error.get_for_predefined_error(
|
|
71
|
+
resource_group_name=RESOURCE_GROUP_NAME,
|
|
72
|
+
confidential_resource_name="confidential",
|
|
73
|
+
)
|
|
74
|
+
except exceptions.ResourceNotFoundError as e:
|
|
75
|
+
assert e.status_code == 404
|
|
76
|
+
assert (
|
|
77
|
+
e.error.message
|
|
78
|
+
== "The Resource 'Azure.ResourceManager.CommonProperties/confidentialResources/confidential' under resource group 'test-rg' was not found."
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@pytest.mark.asyncio
|
|
83
|
+
async def test_error_create_for_user_defined_error(client):
|
|
84
|
+
try:
|
|
85
|
+
await client.error.create_for_user_defined_error(
|
|
86
|
+
resource_group_name=RESOURCE_GROUP_NAME,
|
|
87
|
+
confidential_resource_name="confidential",
|
|
88
|
+
resource=models.ConfidentialResource(
|
|
89
|
+
location="eastus", properties=models.ConfidentialResourceProperties(username="00")
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
except exceptions.HttpResponseError as e:
|
|
93
|
+
assert e.status_code == 400
|
|
94
|
+
assert e.error.message == "Username should not contain only numbers."
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
import pytest
|
|
7
|
+
from azure.resourcemanager.largeheader.aio import LargeHeaderClient
|
|
8
|
+
from azure.resourcemanager.largeheader import models
|
|
9
|
+
|
|
10
|
+
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
11
|
+
RESOURCE_GROUP_NAME = "test-rg"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.fixture
|
|
15
|
+
async def client(credential, authentication_policy):
|
|
16
|
+
async with LargeHeaderClient(
|
|
17
|
+
credential, SUBSCRIPTION_ID, "http://localhost:3000", authentication_policy=authentication_policy
|
|
18
|
+
) as client:
|
|
19
|
+
yield client
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.mark.asyncio
|
|
23
|
+
async def test_large_headers_begin_two6_k(client: LargeHeaderClient):
|
|
24
|
+
result = await (
|
|
25
|
+
await client.large_headers.begin_two6_k(
|
|
26
|
+
resource_group_name=RESOURCE_GROUP_NAME,
|
|
27
|
+
large_header_name="header1",
|
|
28
|
+
)
|
|
29
|
+
).result()
|
|
30
|
+
assert result == models.CancelResult(succeeded=True)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
import pytest
|
|
7
|
+
from azure.resourcemanager.nonresource.aio import NonResourceClient
|
|
8
|
+
from azure.resourcemanager.nonresource import models
|
|
9
|
+
|
|
10
|
+
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
11
|
+
RESOURCE_GROUP_NAME = "test-rg"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.fixture
|
|
15
|
+
async def client(credential, authentication_policy):
|
|
16
|
+
async with NonResourceClient(
|
|
17
|
+
credential, SUBSCRIPTION_ID, "http://localhost:3000", authentication_policy=authentication_policy
|
|
18
|
+
) as client:
|
|
19
|
+
yield client
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.mark.asyncio
|
|
23
|
+
async def test_non_resource_create(client: NonResourceClient):
|
|
24
|
+
result = await client.non_resource_operations.create(
|
|
25
|
+
location="eastus", parameter="hello", body=models.NonResource(id="id", name="hello", type="nonResource")
|
|
26
|
+
)
|
|
27
|
+
assert result == models.NonResource(id="id", name="hello", type="nonResource")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.mark.asyncio
|
|
31
|
+
async def test_non_resource_get(client: NonResourceClient):
|
|
32
|
+
result = await client.non_resource_operations.get(
|
|
33
|
+
location="eastus",
|
|
34
|
+
parameter="hello",
|
|
35
|
+
)
|
|
36
|
+
assert result == models.NonResource(id="id", name="hello", type="nonResource")
|
|
@@ -10,6 +10,7 @@ from specs.azure.clientgenerator.core.clientinitialization.aio import (
|
|
|
10
10
|
MixedParamsClient,
|
|
11
11
|
PathParamClient,
|
|
12
12
|
ParamAliasClient,
|
|
13
|
+
ParentClient,
|
|
13
14
|
)
|
|
14
15
|
from specs.azure.clientgenerator.core.clientinitialization.models import Input
|
|
15
16
|
|
|
@@ -48,3 +49,11 @@ async def test_param_alias_client():
|
|
|
48
49
|
async with ParamAliasClient("sample-blob") as client:
|
|
49
50
|
await client.with_aliased_name()
|
|
50
51
|
await client.with_original_name()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# @pytest.mark.asyncio
|
|
55
|
+
# async def test_parent_child_client():
|
|
56
|
+
# async with ParentClient() as client:
|
|
57
|
+
# await client.child_client.with_query()
|
|
58
|
+
# await client.child_client.get_standalone()
|
|
59
|
+
# await client.child_client.delete_standalone()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
import pytest
|
|
7
|
+
from specs.azure.clientgenerator.core.emptystring.aio import DeserializeEmptyStringAsNullClient
|
|
8
|
+
from specs.azure.clientgenerator.core.emptystring import models
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture
|
|
12
|
+
async def client():
|
|
13
|
+
async with DeserializeEmptyStringAsNullClient() as client:
|
|
14
|
+
yield client
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.mark.asyncio
|
|
18
|
+
async def test_get(client: DeserializeEmptyStringAsNullClient):
|
|
19
|
+
result = await client.get()
|
|
20
|
+
assert result == models.ResponseModel(sample_url="")
|
|
@@ -29,3 +29,10 @@ async def test_model_usage(client: UsageClient):
|
|
|
29
29
|
assert models.RoundTripModel(
|
|
30
30
|
result=models.ResultModel(name="Madge")
|
|
31
31
|
) == await client.model_in_operation.model_in_read_only_property(body=models.RoundTripModel())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# @pytest.mark.asyncio
|
|
35
|
+
# async def test_orphan_model_serializable(client: UsageClient):
|
|
36
|
+
# await client.model_in_operation.orphan_model_serializable(
|
|
37
|
+
# body=models.OrphanModel(model_name="name", description="desc")
|
|
38
|
+
# )
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
import pytest
|
|
7
|
+
from specs.azure.encode.duration.aio import DurationClient
|
|
8
|
+
from specs.azure.encode.duration import models
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@pytest.fixture
|
|
12
|
+
async def client():
|
|
13
|
+
async with DurationClient() as client:
|
|
14
|
+
yield client
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.mark.asyncio
|
|
18
|
+
async def test_duration_constant(client: DurationClient):
|
|
19
|
+
await client.duration_constant(models.DurationModel(input="1.02:59:59.5000000"))
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import pytest
|
|
7
7
|
from azure.resourcemanager.commonproperties import CommonPropertiesClient
|
|
8
8
|
from azure.resourcemanager.commonproperties import models
|
|
9
|
+
from azure.core import exceptions
|
|
9
10
|
|
|
10
11
|
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
11
12
|
RESOURCE_GROUP_NAME = "test-rg"
|
|
@@ -58,3 +59,31 @@ def test_managed_identity_update_with_user_assigned_and_system_assigned(client):
|
|
|
58
59
|
assert result.location == "eastus"
|
|
59
60
|
assert result.identity.type == "SystemAssigned,UserAssigned"
|
|
60
61
|
assert result.properties.provisioning_state == "Succeeded"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_error_get_for_predefined_error(client):
|
|
65
|
+
try:
|
|
66
|
+
client.error.get_for_predefined_error(
|
|
67
|
+
resource_group_name=RESOURCE_GROUP_NAME,
|
|
68
|
+
confidential_resource_name="confidential",
|
|
69
|
+
)
|
|
70
|
+
except exceptions.ResourceNotFoundError as e:
|
|
71
|
+
assert e.status_code == 404
|
|
72
|
+
assert (
|
|
73
|
+
e.error.message
|
|
74
|
+
== "The Resource 'Azure.ResourceManager.CommonProperties/confidentialResources/confidential' under resource group 'test-rg' was not found."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def test_error_create_for_user_defined_error(client):
|
|
79
|
+
try:
|
|
80
|
+
client.error.create_for_user_defined_error(
|
|
81
|
+
resource_group_name=RESOURCE_GROUP_NAME,
|
|
82
|
+
confidential_resource_name="confidential",
|
|
83
|
+
resource=models.ConfidentialResource(
|
|
84
|
+
location="eastus", properties=models.ConfidentialResourceProperties(username="00")
|
|
85
|
+
),
|
|
86
|
+
)
|
|
87
|
+
except exceptions.HttpResponseError as e:
|
|
88
|
+
assert e.status_code == 400
|
|
89
|
+
assert e.error.message == "Username should not contain only numbers."
|