@typespec/http-client-python 0.12.4 → 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/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/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/templates/packaging_templates/README.md.jinja2 +31 -0
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -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,
|
|
@@ -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
|
|
@@ -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 %}
|