@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.
@@ -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 pip
15
- except (ImportError, ModuleNotFoundError):
16
- raise Exception("Your Python installation doesn't have pip available")
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 ExtendedEnvBuilder, python_run
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
- env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
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
- python_run(venv_context, "pip", ["install", "-U", "pip"])
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 pip
17
- except (ImportError, ModuleNotFoundError):
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 version isn't adequate."
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
- if venv_path.exists():
42
- env_builder = venv.EnvBuilder(with_pip=True)
43
- venv_context = env_builder.ensure_directories(venv_path)
44
- else:
45
- env_builder = ExtendedEnvBuilder(with_pip=True, upgrade_deps=True)
46
- env_builder.create(venv_path)
47
- venv_context = env_builder.context
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 venv
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
- env_builder = venv.EnvBuilder(with_pip=True)
32
- venv_context = env_builder.ensure_directories(venv_path)
27
+ venv_context = create_venv_with_package_manager(venv_path)
28
+
33
29
  try:
34
- python_run(
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 %}
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/http-client-python",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec emitter for Python SDKs",
6
6
  "homepage": "https://typespec.io",