Skip to content

Commit 8df21a0

Browse files
lmazuelscbeddmccoyp
authored
Introduce a dummy azpysdk (#42637)
* Add option to run uv easily if wanted * fix dev_setup for the fact that azuresdk-tools isn't a setup.py package anymore * Update eng/tools/azure-sdk-tools/pyproject.toml Co-authored-by: McCoy Patiño <[email protected]> --------- Co-authored-by: Scott Beddall <[email protected]> Co-authored-by: Scott Beddall <[email protected]> Co-authored-by: McCoy Patiño <[email protected]>
1 parent d02db4d commit 8df21a0

File tree

8 files changed

+185
-73
lines changed

8 files changed

+185
-73
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,6 @@ component-detection-pip-report.json
172172
**/.pydevproject
173173
**/.settings
174174
.github/prompts/copilot-instructions.md
175+
176+
# No uv lock for now
177+
uv.lock

eng/tools/azure-sdk-tools/azpysdk/__init__.py

Whitespace-only changes.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
"""azpysdk CLI
2+
3+
A minimal command-line interface using argparse. This file provides a
4+
`main()` entrypoint so the package can be invoked as a module
5+
(e.g. `python -m azpysdk.main`) or installed as a console script.
6+
"""
7+
8+
from __future__ import annotations
9+
10+
import argparse
11+
import sys
12+
from typing import Sequence, Optional
13+
14+
__all__ = ["main", "build_parser"]
15+
__version__ = "0.0.0"
16+
17+
18+
def _cmd_greet(args: argparse.Namespace) -> int:
19+
"""Simple greet command: prints a greeting."""
20+
name = args.name or "world"
21+
print(f"Hello, {name}!")
22+
return 0
23+
24+
25+
def _cmd_echo(args: argparse.Namespace) -> int:
26+
"""Echo command: prints back the provided message."""
27+
print(args.message)
28+
return 0
29+
30+
31+
def _cmd_run(args: argparse.Namespace) -> int:
32+
"""Run command: placeholder for running a task or pipeline."""
33+
print(f"Running task: {args.task}")
34+
# TODO: implement real behaviour
35+
return 0
36+
37+
38+
def build_parser() -> argparse.ArgumentParser:
39+
"""Create and return the top-level ArgumentParser for the CLI."""
40+
parser = argparse.ArgumentParser(
41+
prog="azpysdk", description="Azure SDK Python tools (minimal CLI)"
42+
)
43+
parser.add_argument("-V", "--version", action="version", version=__version__)
44+
45+
subparsers = parser.add_subparsers(title="commands", dest="command")
46+
47+
# greet
48+
p = subparsers.add_parser("greet", help="Greet someone")
49+
p.add_argument("-n", "--name", help="Name to greet")
50+
p.set_defaults(func=_cmd_greet)
51+
52+
# echo
53+
p = subparsers.add_parser("echo", help="Echo a message")
54+
p.add_argument("message", help="Message to echo")
55+
p.set_defaults(func=_cmd_echo)
56+
57+
# run
58+
p = subparsers.add_parser("run", help="Run a placeholder task")
59+
p.add_argument("-t", "--task", default="default", help="Task name to run")
60+
p.set_defaults(func=_cmd_run)
61+
62+
return parser
63+
64+
65+
def main(argv: Optional[Sequence[str]] = None) -> int:
66+
"""CLI entrypoint.
67+
68+
Args:
69+
argv: Optional list of arguments to parse (defaults to sys.argv[1:]).
70+
71+
Returns:
72+
Exit code to return to the OS.
73+
"""
74+
parser = build_parser()
75+
args = parser.parse_args(argv)
76+
77+
if not hasattr(args, "func"):
78+
parser.print_help()
79+
return 1
80+
81+
try:
82+
result = args.func(args)
83+
return int(result or 0)
84+
except KeyboardInterrupt:
85+
print("Interrupted by user", file=sys.stderr)
86+
return 130
87+
except Exception as exc: # pragma: no cover - simple top-level error handling
88+
print(f"Error: {exc}", file=sys.stderr)
89+
return 2
90+
91+
92+
if __name__ == "__main__":
93+
raise SystemExit(main())
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,67 @@
1+
[build-system]
2+
requires = ["setuptools>=42", "wheel"]
3+
build-backend = "setuptools.build_meta"
4+
5+
[project]
6+
name = "azure-sdk-tools"
7+
version = "0.0.0"
8+
description = "Build and test tooling for the Azure SDK for Python"
9+
readme = "README.md"
10+
authors = [
11+
{ name = "Microsoft Corporation", email = "[email protected]" }
12+
]
13+
urls = { "Homepage" = "https://github.com/Azure/azure-sdk-for-python" }
14+
15+
dependencies = [
16+
"packaging",
17+
"wheel",
18+
"Jinja2",
19+
"json-delta>=2.0",
20+
"pytest-cov",
21+
"pytest>=3.5.1",
22+
"python-dotenv",
23+
"PyYAML",
24+
"urllib3",
25+
"tomli-w==1.0.0",
26+
"azure-core",
27+
"ConfigArgParse>=0.12.0",
28+
"pytest-asyncio>=0.9.0; python_version >= '3.5'",
29+
"tomli; python_version < '3.11'",
30+
]
31+
32+
[project.scripts]
33+
generate_package = "packaging_tools.generate_package:generate_main"
34+
generate_sdk = "packaging_tools.generate_sdk:generate_main"
35+
generate_client = "packaging_tools.generate_client:generate_main"
36+
multiapi_combiner = "packaging_tools.multiapi_combiner:combine"
37+
perfstress = "devtools_testutils.perfstress_tests:run_perfstress_cmd"
38+
perfstressdebug = "devtools_testutils.perfstress_tests:run_perfstress_debug_cmd"
39+
sdk_generator = "packaging_tools.sdk_generator:generate_main"
40+
sdk_build = "ci_tools.build:build"
41+
sdk_build_package = "ci_tools.build:build_package"
42+
sdk_build_conda = "ci_tools.conda:entrypoint"
43+
sdk_set_dev_version = "ci_tools.versioning.version_set_dev:version_set_dev_main"
44+
sdk_set_version = "ci_tools.versioning.version_set:version_set_main"
45+
sdk_increment_version = "ci_tools.versioning.version_increment:version_increment_main"
46+
sdk_analyze_deps = "ci_tools.dependency_analysis:analyze_dependencies"
47+
sdk_find_invalid_versions = "ci_tools.versioning.find_invalid_versions:find_invalid_versions_main"
48+
sdk_verify_keywords = "ci_tools.keywords_verify:entrypoint"
49+
systemperf = "devtools_testutils.perfstress_tests:run_system_perfstress_tests_cmd"
50+
azpysdk = "azpysdk.main:main"
51+
52+
[project.optional-dependencies]
53+
build = ["setuptools", "pyparsing", "certifi", "cibuildwheel", "pkginfo", "build"]
54+
conda = ["beautifulsoup4"]
55+
systemperf = ["aiohttp>=3.0", "requests>=2.0", "tornado==6.0.3", "httpx>=0.21", "azure-core"]
56+
ghtools = ["GitPython", "PyGithub>=1.59.0", "requests>=2.0"]
57+
58+
[tool.setuptools]
59+
include-package-data = true
60+
61+
[tool.setuptools.packages.find]
62+
where = ["."]
63+
exclude = ["tests*"]
64+
165
[tool.black]
266
line-length=120
367
exclude="packaging_tools/templates/setup.py"

eng/tools/azure-sdk-tools/setup.py

Lines changed: 0 additions & 64 deletions
This file was deleted.

eng/tools/azure-sdk-tools/tests/test_parse_functionality.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
)
1212
scenarios_folder = os.path.join(os.path.dirname(__file__), "integration", "scenarios")
1313
metapackage_scenario = os.path.join(scenarios_folder, "setup_py_metapackage")
14+
setup_project_scenario = os.path.join(scenarios_folder, "setup_py_project_def")
1415
pyproject_scenario = os.path.join(scenarios_folder, "pyproject_project_def")
1516
pyproject_extension_scenario = os.path.join(scenarios_folder, "pyproject_project_def_with_extension")
1617

@@ -110,22 +111,21 @@ def test_sdk_sample_setup(test_patch):
110111
)
111112
"""
112113

113-
result = ParsedSetup.from_path(package_root)
114+
result = ParsedSetup.from_path(setup_project_scenario)
114115

115116
assert result.name == "azure-core"
116117
assert result.version == "1.21.0"
117118
assert result.python_requires == ">=3.7"
118119
assert result.requires == ["requests>=2.18.4", "six>=1.11.0", "typing-extensions>=4.0.1"]
119120
assert result.is_new_sdk == True
120-
assert result.setup_filename == os.path.join(package_root, "setup.py")
121+
assert result.setup_filename == os.path.join(setup_project_scenario, "setup.py")
121122
assert "pytyped" in result.package_data
122123
assert result.include_package_data == True
123-
assert result.folder == package_root
124+
assert result.folder == setup_project_scenario
124125
assert len(result.classifiers) > 0
125126
assert result.classifiers[0] == "Development Status :: 5 - Production/Stable"
126127
assert result.classifiers[5] == "Programming Language :: Python :: 3.8"
127128
assert result.keywords[0] == "azure sdk"
128-
assert result.is_metapackage == False
129129
assert len(result.keywords) == 2
130130

131131

@@ -191,24 +191,23 @@ def test_parse_recognizes_extensions(test_patch):
191191
)
192192
"""
193193

194-
result = ParsedSetup.from_path(package_root)
194+
result = ParsedSetup.from_path(setup_project_scenario)
195195

196196
assert result.name == "azure-storage-extensions"
197197
assert result.version == "1.21.0"
198198
assert result.python_requires == ">=3.7"
199199
assert result.requires == ["requests>=2.18.4", "six>=1.11.0", "typing-extensions>=4.0.1"]
200200
# todo resolve this conflict assert result.is_new_sdk == True
201-
assert result.setup_filename == os.path.join(package_root, "setup.py")
201+
assert result.setup_filename == os.path.join(setup_project_scenario, "setup.py")
202202
assert "pytyped" in result.package_data
203203
assert result.include_package_data == True
204-
assert result.folder == package_root
204+
assert result.folder == setup_project_scenario
205205
assert len(result.classifiers) > 0
206206
assert result.classifiers[0] == "Development Status :: 5 - Production/Stable"
207207
assert result.classifiers[5] == "Programming Language :: Python :: 3.8"
208208
assert result.ext_package == "azure.storage.extensions"
209209
assert result.ext_modules is not None
210210
assert result.is_pyproject == False
211-
assert result.is_metapackage == False
212211
assert len(result.ext_modules) == 1
213212
assert str(type(result.ext_modules[0])) == "<class 'setuptools.extension.Extension'>"
214213

scripts/dev_setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def select_install_type(pkg, run_develop, exceptions):
7575

7676
packages = {
7777
tuple(os.path.dirname(f).rsplit(os.sep, 1))
78-
for f in glob.glob(os.path.join(root_dir, "sdk/*/azure-*/setup.py")) + glob.glob(os.path.join(root_dir, "eng/tools/azure-*/setup.py"))
78+
for f in glob.glob(os.path.join(root_dir, "sdk/*/azure-*/setup.py")) + glob.glob(os.path.join(root_dir, "eng/tools/azure-sdk-tools/"))
7979
}
8080
# [(base_folder, package_name), ...] to {package_name: base_folder, ...}
8181
packages = {package_name: base_folder for (base_folder, package_name) in packages}

sdk/keyvault/azure-keyvault-keys/pyproject.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,20 @@ pytyped = ["py.typed"]
4646

4747
[tool.azure-sdk-build]
4848
pyright = false
49+
50+
[tool.uv.sources]
51+
azure-core = { path = "../../core/azure-core" }
52+
azure-keyvault-nspkg = { path = "../../nspkg/azure-keyvault-nspkg" }
53+
azure-sdk-tools = { path = "../../../eng/tools/azure-sdk-tools" }
54+
55+
[dependency-groups]
56+
dev = [
57+
"aiohttp>=3.0",
58+
"azure-core",
59+
"azure-identity>=1.24.0",
60+
"azure-keyvault-nspkg",
61+
"azure-mgmt-keyvault==10.1.0",
62+
"azure-sdk-tools",
63+
"parameterized>=0.7.3",
64+
"python-dateutil>=2.8.0",
65+
]

0 commit comments

Comments
 (0)