@autorest/python 6.32.2 → 6.33.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.
Files changed (52) hide show
  1. package/autorest/m2r.py +1 -2
  2. package/autorest/m4reformatter/__init__.py +1 -2
  3. package/autorest/multiapi/models/imports.py +7 -2
  4. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +13 -2
  5. package/autorest/preprocess.py +1 -2
  6. package/generator/build/lib/pygen/codegen/__init__.py +0 -1
  7. package/generator/build/lib/pygen/codegen/_utils.py +1 -1
  8. package/generator/build/lib/pygen/codegen/models/client.py +39 -2
  9. package/generator/build/lib/pygen/codegen/models/enum_type.py +2 -2
  10. package/generator/build/lib/pygen/codegen/models/imports.py +2 -13
  11. package/generator/build/lib/pygen/codegen/models/model_type.py +1 -1
  12. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1 -3
  13. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +32 -6
  14. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +20 -1
  15. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +2 -2
  16. package/generator/build/lib/pygen/codegen/templates/client.py.jinja2 +1 -1
  17. package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +2 -8
  18. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +9 -13
  19. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +2 -2
  20. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +12 -12
  21. package/generator/component-detection-pip-report.json +70 -71
  22. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  23. package/generator/pygen/codegen/__init__.py +0 -1
  24. package/generator/pygen/codegen/_utils.py +1 -1
  25. package/generator/pygen/codegen/models/client.py +39 -2
  26. package/generator/pygen/codegen/models/enum_type.py +2 -2
  27. package/generator/pygen/codegen/models/imports.py +2 -13
  28. package/generator/pygen/codegen/models/model_type.py +1 -1
  29. package/generator/pygen/codegen/serializers/builder_serializer.py +1 -3
  30. package/generator/pygen/codegen/serializers/client_serializer.py +32 -6
  31. package/generator/pygen/codegen/serializers/general_serializer.py +20 -1
  32. package/generator/pygen/codegen/serializers/sample_serializer.py +2 -2
  33. package/generator/pygen/codegen/templates/client.py.jinja2 +1 -1
  34. package/generator/pygen/codegen/templates/config.py.jinja2 +2 -8
  35. package/generator/pygen/codegen/templates/model_base.py.jinja2 +9 -13
  36. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +2 -2
  37. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +12 -12
  38. package/generator/pygen.egg-info/PKG-INFO +0 -1
  39. package/generator/setup.py +0 -1
  40. package/package.json +2 -2
  41. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  42. package/scripts/eng/mypy.ini +1 -1
  43. package/scripts/eng/pylintrc +1 -1
  44. package/scripts/eng/pyrightconfig.json +1 -1
  45. package/scripts/install.py +3 -3
  46. package/scripts/mypy.ini +1 -1
  47. package/scripts/prepare.py +2 -2
  48. package/scripts/run-python3.js +1 -1
  49. package/scripts/run-python3.ts +1 -1
  50. package/scripts/start.py +2 -2
  51. package/scripts/venvtools.py +0 -3
  52. package/setup.py +0 -1
@@ -4,11 +4,11 @@
4
4
  "install": [
5
5
  {
6
6
  "download_info": {
7
- "url": "https://files.pythonhosted.org/packages/15/65/3f0dba35760d902849d39d38c0a72767794b1963227b69a587f8a336d08c/setuptools-75.3.2-py3-none-any.whl",
7
+ "url": "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl",
8
8
  "archive_info": {
9
- "hash": "sha256=90ab613b6583fc02d5369cbca13ea26ea0e182d1df2d943ee9cbe81d4c61add9",
9
+ "hash": "sha256=3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8",
10
10
  "hashes": {
11
- "sha256": "90ab613b6583fc02d5369cbca13ea26ea0e182d1df2d943ee9cbe81d4c61add9"
11
+ "sha256": "3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"
12
12
  }
13
13
  }
14
14
  },
@@ -16,9 +16,12 @@
16
16
  "is_yanked": false,
17
17
  "requested": true,
18
18
  "metadata": {
19
- "metadata_version": "2.1",
19
+ "metadata_version": "2.4",
20
20
  "name": "setuptools",
21
- "version": "75.3.2",
21
+ "version": "78.1.0",
22
+ "dynamic": [
23
+ "license-file"
24
+ ],
22
25
  "summary": "Easily download, build, install, upgrade, and uninstall Python packages",
23
26
  "description_content_type": "text/x-rst",
24
27
  "keywords": [
@@ -45,94 +48,90 @@
45
48
  "Topic :: Utilities"
46
49
  ],
47
50
  "requires_dist": [
48
- "pytest-checkdocs >=2.4 ; extra == 'check'",
49
- "pytest-ruff >=0.2.1 ; (sys_platform != \"cygwin\") and extra == 'check'",
50
- "ruff >=0.5.2 ; (sys_platform != \"cygwin\") and extra == 'check'",
51
- "packaging >=24 ; extra == 'core'",
52
- "more-itertools >=8.8 ; extra == 'core'",
53
- "jaraco.text >=3.7 ; extra == 'core'",
54
- "wheel >=0.43.0 ; extra == 'core'",
55
- "platformdirs >=4.2.2 ; extra == 'core'",
56
- "jaraco.collections ; extra == 'core'",
57
- "jaraco.functools ; extra == 'core'",
58
- "packaging ; extra == 'core'",
59
- "more-itertools ; extra == 'core'",
60
- "importlib-metadata >=6 ; (python_version < \"3.10\") and extra == 'core'",
61
- "tomli >=2.0.1 ; (python_version < \"3.11\") and extra == 'core'",
62
- "importlib-resources >=5.10.2 ; (python_version < \"3.9\") and extra == 'core'",
63
- "pytest-cov ; extra == 'cover'",
64
- "sphinx >=3.5 ; extra == 'doc'",
65
- "jaraco.packaging >=9.3 ; extra == 'doc'",
66
- "rst.linker >=1.9 ; extra == 'doc'",
67
- "furo ; extra == 'doc'",
68
- "sphinx-lint ; extra == 'doc'",
69
- "jaraco.tidelift >=1.4 ; extra == 'doc'",
70
- "pygments-github-lexers ==0.0.5 ; extra == 'doc'",
71
- "sphinx-favicon ; extra == 'doc'",
72
- "sphinx-inline-tabs ; extra == 'doc'",
73
- "sphinx-reredirects ; extra == 'doc'",
74
- "sphinxcontrib-towncrier ; extra == 'doc'",
75
- "sphinx-notfound-page <2,>=1 ; extra == 'doc'",
76
- "pyproject-hooks !=1.1 ; extra == 'doc'",
77
- "towncrier <24.7 ; extra == 'doc'",
78
- "pytest-enabler >=2.2 ; extra == 'enabler'",
79
- "pytest !=8.1.*,>=6 ; extra == 'test'",
80
- "virtualenv >=13.0.0 ; extra == 'test'",
81
- "wheel >=0.44.0 ; extra == 'test'",
82
- "pip >=19.1 ; extra == 'test'",
83
- "packaging >=23.2 ; extra == 'test'",
84
- "jaraco.envs >=2.2 ; extra == 'test'",
85
- "pytest-xdist >=3 ; extra == 'test'",
86
- "jaraco.path >=3.2.0 ; extra == 'test'",
87
- "build[virtualenv] >=1.0.3 ; extra == 'test'",
88
- "filelock >=3.4.0 ; extra == 'test'",
89
- "ini2toml[lite] >=0.14 ; extra == 'test'",
90
- "tomli-w >=1.0.0 ; extra == 'test'",
91
- "pytest-timeout ; extra == 'test'",
92
- "pytest-home >=0.5 ; extra == 'test'",
93
- "pytest-subprocess ; extra == 'test'",
94
- "pyproject-hooks !=1.1 ; extra == 'test'",
95
- "jaraco.test >=5.5 ; extra == 'test'",
96
- "ruff <=0.7.1 ; extra == 'test'",
97
- "jaraco.develop >=7.21 ; (python_version >= \"3.9\" and sys_platform != \"cygwin\") and extra == 'test'",
98
- "pytest-perf ; (sys_platform != \"cygwin\") and extra == 'test'",
99
- "pytest-mypy ; extra == 'type'",
100
- "mypy ==1.12.* ; extra == 'type'",
101
- "importlib-metadata >=7.0.2 ; (python_version < \"3.10\") and extra == 'type'",
102
- "jaraco.develop >=7.21 ; (sys_platform != \"cygwin\") and extra == 'type'"
51
+ "pytest!=8.1.*,>=6; extra == \"test\"",
52
+ "virtualenv>=13.0.0; extra == \"test\"",
53
+ "wheel>=0.44.0; extra == \"test\"",
54
+ "pip>=19.1; extra == \"test\"",
55
+ "packaging>=24.2; extra == \"test\"",
56
+ "jaraco.envs>=2.2; extra == \"test\"",
57
+ "pytest-xdist>=3; extra == \"test\"",
58
+ "jaraco.path>=3.7.2; extra == \"test\"",
59
+ "build[virtualenv]>=1.0.3; extra == \"test\"",
60
+ "filelock>=3.4.0; extra == \"test\"",
61
+ "ini2toml[lite]>=0.14; extra == \"test\"",
62
+ "tomli-w>=1.0.0; extra == \"test\"",
63
+ "pytest-timeout; extra == \"test\"",
64
+ "pytest-perf; sys_platform != \"cygwin\" and extra == \"test\"",
65
+ "jaraco.develop>=7.21; (python_version >= \"3.9\" and sys_platform != \"cygwin\") and extra == \"test\"",
66
+ "pytest-home>=0.5; extra == \"test\"",
67
+ "pytest-subprocess; extra == \"test\"",
68
+ "pyproject-hooks!=1.1; extra == \"test\"",
69
+ "jaraco.test>=5.5; extra == \"test\"",
70
+ "sphinx>=3.5; extra == \"doc\"",
71
+ "jaraco.packaging>=9.3; extra == \"doc\"",
72
+ "rst.linker>=1.9; extra == \"doc\"",
73
+ "furo; extra == \"doc\"",
74
+ "sphinx-lint; extra == \"doc\"",
75
+ "jaraco.tidelift>=1.4; extra == \"doc\"",
76
+ "pygments-github-lexers==0.0.5; extra == \"doc\"",
77
+ "sphinx-favicon; extra == \"doc\"",
78
+ "sphinx-inline-tabs; extra == \"doc\"",
79
+ "sphinx-reredirects; extra == \"doc\"",
80
+ "sphinxcontrib-towncrier; extra == \"doc\"",
81
+ "sphinx-notfound-page<2,>=1; extra == \"doc\"",
82
+ "pyproject-hooks!=1.1; extra == \"doc\"",
83
+ "towncrier<24.7; extra == \"doc\"",
84
+ "packaging>=24.2; extra == \"core\"",
85
+ "more_itertools>=8.8; extra == \"core\"",
86
+ "jaraco.text>=3.7; extra == \"core\"",
87
+ "importlib_metadata>=6; python_version < \"3.10\" and extra == \"core\"",
88
+ "tomli>=2.0.1; python_version < \"3.11\" and extra == \"core\"",
89
+ "wheel>=0.43.0; extra == \"core\"",
90
+ "platformdirs>=4.2.2; extra == \"core\"",
91
+ "jaraco.functools>=4; extra == \"core\"",
92
+ "more_itertools; extra == \"core\"",
93
+ "pytest-checkdocs>=2.4; extra == \"check\"",
94
+ "pytest-ruff>=0.2.1; sys_platform != \"cygwin\" and extra == \"check\"",
95
+ "ruff>=0.8.0; sys_platform != \"cygwin\" and extra == \"check\"",
96
+ "pytest-cov; extra == \"cover\"",
97
+ "pytest-enabler>=2.2; extra == \"enabler\"",
98
+ "pytest-mypy; extra == \"type\"",
99
+ "mypy==1.14.*; extra == \"type\"",
100
+ "importlib_metadata>=7.0.2; python_version < \"3.10\" and extra == \"type\"",
101
+ "jaraco.develop>=7.21; sys_platform != \"cygwin\" and extra == \"type\""
103
102
  ],
104
- "requires_python": ">=3.8",
103
+ "requires_python": ">=3.9",
105
104
  "project_url": [
106
105
  "Source, https://github.com/pypa/setuptools",
107
106
  "Documentation, https://setuptools.pypa.io/",
108
107
  "Changelog, https://setuptools.pypa.io/en/stable/history.html"
109
108
  ],
110
109
  "provides_extra": [
110
+ "test",
111
+ "doc",
112
+ "ssl",
111
113
  "certs",
112
- "check",
113
114
  "core",
115
+ "check",
114
116
  "cover",
115
- "doc",
116
117
  "enabler",
117
- "ssl",
118
- "test",
119
118
  "type"
120
119
  ],
121
- "description": ".. |pypi-version| image:: https://img.shields.io/pypi/v/setuptools.svg\n :target: https://pypi.org/project/setuptools\n\n.. |py-version| image:: https://img.shields.io/pypi/pyversions/setuptools.svg\n\n.. |test-badge| image:: https://github.com/pypa/setuptools/actions/workflows/main.yml/badge.svg\n :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. |ruff-badge| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg\n :target: https://setuptools.pypa.io\n\n.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2024-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white\n :target: https://codecov.io/gh/pypa/setuptools\n\n.. |tidelift-badge| image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme\n\n.. |discord-badge| image:: https://img.shields.io/discord/803025117553754132\n :target: https://discord.com/channels/803025117553754132/815945031150993468\n :alt: Discord\n\n|pypi-version| |py-version| |test-badge| |ruff-badge| |docs-badge| |skeleton-badge| |codecov-badge| |discord-badge|\n\nSee the `Quickstart <https://setuptools.pypa.io/en/latest/userguide/quickstart.html>`_\nand the `User's Guide <https://setuptools.pypa.io/en/latest/userguide/>`_ for\ninstructions on how to use Setuptools.\n\nQuestions and comments should be directed to `GitHub Discussions\n<https://github.com/pypa/setuptools/discussions>`_.\nBug reports and especially tested patches may be\nsubmitted directly to the `bug tracker\n<https://github.com/pypa/setuptools/issues>`_.\n\n\nCode of Conduct\n===============\n\nEveryone interacting in the setuptools project's codebases, issue trackers,\nchat rooms, and fora is expected to follow the\n`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.\n\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nSetuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.\n"
120
+ "description": ".. |pypi-version| image:: https://img.shields.io/pypi/v/setuptools.svg\n :target: https://pypi.org/project/setuptools\n\n.. |py-version| image:: https://img.shields.io/pypi/pyversions/setuptools.svg\n\n.. |test-badge| image:: https://github.com/pypa/setuptools/actions/workflows/main.yml/badge.svg\n :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. |ruff-badge| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg\n :target: https://setuptools.pypa.io\n\n.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2025-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white\n :target: https://codecov.io/gh/pypa/setuptools\n\n.. |tidelift-badge| image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme\n\n.. |discord-badge| image:: https://img.shields.io/discord/803025117553754132\n :target: https://discord.com/channels/803025117553754132/815945031150993468\n :alt: Discord\n\n|pypi-version| |py-version| |test-badge| |ruff-badge| |docs-badge| |skeleton-badge| |codecov-badge| |discord-badge|\n\nSee the `Quickstart <https://setuptools.pypa.io/en/latest/userguide/quickstart.html>`_\nand the `User's Guide <https://setuptools.pypa.io/en/latest/userguide/>`_ for\ninstructions on how to use Setuptools.\n\nQuestions and comments should be directed to `GitHub Discussions\n<https://github.com/pypa/setuptools/discussions>`_.\nBug reports and especially tested patches may be\nsubmitted directly to the `bug tracker\n<https://github.com/pypa/setuptools/issues>`_.\n\n\nCode of Conduct\n===============\n\nEveryone interacting in the setuptools project's codebases, issue trackers,\nchat rooms, and fora is expected to follow the\n`PSF Code of Conduct <https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md>`_.\n\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nSetuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more <https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=referral&utm_campaign=github>`_.\n"
122
121
  }
123
122
  }
124
123
  ],
125
124
  "environment": {
126
125
  "implementation_name": "cpython",
127
- "implementation_version": "3.8.10",
126
+ "implementation_version": "3.9.21",
128
127
  "os_name": "posix",
129
128
  "platform_machine": "x86_64",
130
- "platform_release": "5.15.0-1082-azure",
129
+ "platform_release": "5.15.0-1086-azure",
131
130
  "platform_system": "Linux",
132
- "platform_version": "#91~20.04.1-Ubuntu SMP Tue Feb 25 03:23:03 UTC 2025",
133
- "python_full_version": "3.8.10",
131
+ "platform_version": "#95~20.04.1-Ubuntu SMP Thu Mar 27 18:45:17 UTC 2025",
132
+ "python_full_version": "3.9.21",
134
133
  "platform_python_implementation": "CPython",
135
- "python_version": "3.8",
134
+ "python_version": "3.9",
136
135
  "sys_platform": "linux"
137
136
  }
138
137
  }
@@ -150,7 +150,6 @@ class OptionsRetriever:
150
150
  def package_version(self) -> Optional[str]:
151
151
  return str(self.options.get("package-version", ""))
152
152
 
153
-
154
153
  @property
155
154
  def header_text(self) -> Optional[str]:
156
155
  return self.options.get("header-text")
@@ -17,7 +17,7 @@ DEFAULT_LICENSE_DESCRIPTION = (
17
17
  "MIT License\n"
18
18
  "\n"
19
19
  "Permission is hereby granted, free of charge, to any person obtaining a copy\n"
20
- "of this software and associated documentation files (the \"Software\"), to deal\n"
20
+ 'of this software and associated documentation files (the "Software"), to deal\n'
21
21
  "in the Software without restriction, including without limitation the rights\n"
22
22
  "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n"
23
23
  "copies of the Software, and to permit persons to whom the Software is\n"
@@ -15,7 +15,7 @@ from .request_builder import (
15
15
  OverloadedRequestBuilder,
16
16
  get_request_builder,
17
17
  )
18
- from .parameter import Parameter, ParameterMethodLocation
18
+ from .parameter import Parameter, ParameterMethodLocation, ParameterLocation
19
19
  from .lro_operation import LROOperation
20
20
  from .lro_paging_operation import LROPagingOperation
21
21
  from ...utils import extract_original_name, NAME_LENGTH_LIMIT
@@ -54,7 +54,7 @@ class _ClientConfigBase(Generic[ParameterListType], BaseModel):
54
54
  return self.yaml_data["name"]
55
55
 
56
56
 
57
- class Client(_ClientConfigBase[ClientGlobalParameterList]):
57
+ class Client(_ClientConfigBase[ClientGlobalParameterList]): # pylint: disable=too-many-public-methods
58
58
  """Model representing our service client"""
59
59
 
60
60
  def __init__(
@@ -79,6 +79,27 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
79
79
  self.request_id_header_name = self.yaml_data.get("requestIdHeaderName", None)
80
80
  self.has_etag: bool = yaml_data.get("hasEtag", False)
81
81
 
82
+ # update the host parameter value. In later logic, SDK will overwrite it
83
+ # with value from cloud_setting if users don't provide it.
84
+ if self.need_cloud_setting:
85
+ for p in self.parameters.parameters:
86
+ if p.location == ParameterLocation.ENDPOINT_PATH:
87
+ p.client_default_value = None
88
+ p.optional = True
89
+ break
90
+
91
+ @property
92
+ def need_cloud_setting(self) -> bool:
93
+ return bool(
94
+ self.code_model.options.get("azure_arm", False)
95
+ and self.credential_scopes is not None
96
+ and self.endpoint_parameter is not None
97
+ )
98
+
99
+ @property
100
+ def endpoint_parameter(self) -> Optional[Parameter]:
101
+ return next((p for p in self.parameters.parameters if p.location == ParameterLocation.ENDPOINT_PATH), None)
102
+
82
103
  def _build_request_builders(
83
104
  self,
84
105
  ) -> List[Union[RequestBuilder, OverloadedRequestBuilder]]:
@@ -233,6 +254,10 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
233
254
  "Self",
234
255
  ImportType.STDLIB,
235
256
  )
257
+ if self.need_cloud_setting:
258
+ file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
259
+ file_import.add_submodule_import("azure.core.settings", "settings", ImportType.SDKCORE)
260
+ file_import.add_submodule_import("azure.mgmt.core.tools", "get_arm_endpoints", ImportType.SDKCORE)
236
261
  return file_import
237
262
 
238
263
  @property
@@ -332,6 +357,18 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
332
357
  )
333
358
  return file_import
334
359
 
360
+ @property
361
+ def credential_scopes(self) -> Optional[List[str]]:
362
+ """Credential scopes for this client"""
363
+
364
+ if self.credential:
365
+ if hasattr(getattr(self.credential.type, "policy", None), "credential_scopes"):
366
+ return self.credential.type.policy.credential_scopes # type: ignore
367
+ for t in getattr(self.credential.type, "types", []):
368
+ if hasattr(getattr(t, "policy", None), "credential_scopes"):
369
+ return t.policy.credential_scopes
370
+ return None
371
+
335
372
  @classmethod
336
373
  def from_yaml(
337
374
  cls,
@@ -52,7 +52,7 @@ class EnumValue(BaseType):
52
52
  """The python type used for RST syntax input and type annotation."""
53
53
 
54
54
  type_annotation = self.value_type.type_annotation(**kwargs)
55
- enum_type_annotation = f"{self.code_model.namespace}.models.{self.name}"
55
+ enum_type_annotation = f"{self.enum_type.client_namespace}.models.{self.name}"
56
56
  return f"{type_annotation} or ~{enum_type_annotation}"
57
57
 
58
58
  def get_json_template_representation(
@@ -198,7 +198,7 @@ class EnumType(BaseType):
198
198
  """The python type used for RST syntax input and type annotation."""
199
199
  if self.code_model.options["models_mode"]:
200
200
  type_annotation = self.value_type.type_annotation(**kwargs)
201
- enum_type_annotation = f"{self.code_model.namespace}.models.{self.name}"
201
+ enum_type_annotation = f"{self.client_namespace}.models.{self.name}"
202
202
  return f"{type_annotation} or ~{enum_type_annotation}"
203
203
  return self.value_type.type_annotation(**kwargs)
204
204
 
@@ -168,23 +168,12 @@ class FileImport:
168
168
  self.type_definitions.update(file_import.type_definitions)
169
169
 
170
170
  def add_mutable_mapping_import(self) -> None:
171
- self.add_import("sys", ImportType.STDLIB)
172
- self.add_submodule_import(
173
- "typing",
174
- "MutableMapping",
175
- ImportType.BY_VERSION,
176
- TypingSection.REGULAR,
177
- None,
178
- (((3, 9), "collections.abc", None),),
179
- )
171
+ self.add_submodule_import("collections.abc", "MutableMapping", ImportType.STDLIB)
180
172
 
181
173
  def define_mutable_mapping_type(self) -> None:
182
174
  """Helper function for defining the mutable mapping type"""
183
175
  self.add_mutable_mapping_import()
184
- self.define_mypy_type(
185
- "JSON",
186
- "MutableMapping[str, Any] # pylint: disable=unsubscriptable-object",
187
- )
176
+ self.define_mypy_type("JSON", "MutableMapping[str, Any]")
188
177
  self.add_submodule_import("typing", "Any", ImportType.STDLIB)
189
178
 
190
179
  def to_dict(
@@ -292,7 +292,7 @@ class GeneratedModelType(ModelType):
292
292
 
293
293
  def docstring_type(self, **kwargs: Any) -> str:
294
294
  type_annotation = self.type_annotation(need_model_alias=False, skip_quote=True, **kwargs)
295
- return f"~{self.code_model.namespace}.models.{type_annotation}"
295
+ return f"~{self.client_namespace}.models.{type_annotation}"
296
296
 
297
297
  def docstring_text(self, **kwargs: Any) -> str:
298
298
  return self.name
@@ -1373,9 +1373,7 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1373
1373
  return retval
1374
1374
 
1375
1375
  def _get_next_callback(self, builder: PagingOperationType) -> List[str]:
1376
- retval = [
1377
- f"{'async ' if self.async_mode else ''}def get_next({builder.next_variable_name}=None):" # pylint: disable=line-too-long
1378
- ]
1376
+ retval = [f"{'async ' if self.async_mode else ''}def get_next({builder.next_variable_name}=None):"]
1379
1377
  retval.append(f" _request = prepare_request({builder.next_variable_name})")
1380
1378
  retval.append("")
1381
1379
  retval.extend([f" {l}" for l in self.make_pipeline_call(builder)])
@@ -3,10 +3,10 @@
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 List
6
+ from typing import List, cast
7
7
 
8
8
  from . import utils
9
- from ..models import Client, ParameterMethodLocation
9
+ from ..models import Client, ParameterMethodLocation, Parameter, ParameterLocation
10
10
  from .parameter_serializer import ParameterSerializer, PopKwargType
11
11
  from ...utils import build_policies
12
12
 
@@ -77,17 +77,40 @@ class ClientSerializer:
77
77
  retval.append('"""')
78
78
  return retval
79
79
 
80
- def initialize_config(self) -> str:
80
+ def initialize_config(self) -> List[str]:
81
+ retval = []
82
+ additional_signatures = []
83
+ if self.client.need_cloud_setting:
84
+ additional_signatures.append("credential_scopes=credential_scopes")
85
+ endpoint_parameter = cast(Parameter, self.client.endpoint_parameter)
86
+ retval.extend(
87
+ [
88
+ '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore',
89
+ "_endpoints = get_arm_endpoints(_cloud)",
90
+ f"if not {endpoint_parameter.client_name}:",
91
+ f' {endpoint_parameter.client_name} = _endpoints["resource_manager"]',
92
+ 'credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])',
93
+ ]
94
+ )
81
95
  config_name = f"{self.client.name}Configuration"
82
96
  config_call = ", ".join(
83
97
  [
84
- f"{p.client_name}={p.client_name}"
98
+ (
99
+ f"{p.client_name}="
100
+ + (
101
+ f"cast(str, {p.client_name})"
102
+ if self.client.need_cloud_setting and p.location == ParameterLocation.ENDPOINT_PATH
103
+ else p.client_name
104
+ )
105
+ )
85
106
  for p in self.client.config.parameters.method
86
107
  if p.method_location != ParameterMethodLocation.KWARG
87
108
  ]
109
+ + additional_signatures
88
110
  + ["**kwargs"]
89
111
  )
90
- return f"self._config = {config_name}({config_call})"
112
+ retval.append(f"self._config = {config_name}({config_call})")
113
+ return retval
91
114
 
92
115
  @property
93
116
  def host_variable_name(self) -> str:
@@ -104,8 +127,11 @@ class ClientSerializer:
104
127
  result = []
105
128
  pipeline_client_name = self.client.pipeline_class(async_mode)
106
129
  endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint"
130
+ host_variable_name = (
131
+ f"cast(str, {self.host_variable_name})" if self.client.need_cloud_setting else self.host_variable_name
132
+ )
107
133
  params = {
108
- endpoint_name: self.host_variable_name,
134
+ endpoint_name: host_variable_name,
109
135
  "policies": "_policies",
110
136
  }
111
137
  if not self.client.code_model.is_legacy and self.client.request_id_header_name:
@@ -16,13 +16,29 @@ from ..models.utils import NamespaceType
16
16
  from .client_serializer import ClientSerializer, ConfigSerializer
17
17
  from .base_serializer import BaseSerializer
18
18
 
19
+ VERSION_MAP = {
20
+ "msrest": "0.7.1",
21
+ "isodate": "0.6.1",
22
+ "azure-mgmt-core": "1.5.0",
23
+ "azure-core": "1.30.0",
24
+ "typing-extensions": "4.6.0",
25
+ "corehttp": "1.0.0b6",
26
+ }
27
+
28
+ MIN_PYTHON_VERSION = "3.9"
29
+ MAX_PYTHON_VERSION = "3.12"
30
+
19
31
 
20
32
  class GeneralSerializer(BaseSerializer):
21
33
  """General serializer for SDK root level files"""
22
34
 
23
35
  def serialize_setup_file(self) -> str:
24
36
  template = self.env.get_template("packaging_templates/setup.py.jinja2")
25
- params = {}
37
+ params = {
38
+ "VERSION_MAP": VERSION_MAP,
39
+ "MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
40
+ "MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
41
+ }
26
42
  params.update(self.code_model.options)
27
43
  return template.render(code_model=self.code_model, **params)
28
44
 
@@ -48,6 +64,9 @@ class GeneralSerializer(BaseSerializer):
48
64
  "pkgutil_names": [".".join(package_parts[: i + 1]) for i in range(len(package_parts))],
49
65
  "init_names": ["/".join(package_parts[: i + 1]) + "/__init__.py" for i in range(len(package_parts))],
50
66
  "client_name": self.code_model.clients[0].name,
67
+ "VERSION_MAP": VERSION_MAP,
68
+ "MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
69
+ "MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
51
70
  }
52
71
  params.update(self.code_model.options)
53
72
  params.update(kwargs)
@@ -62,7 +62,7 @@ class SampleSerializer(BaseSerializer):
62
62
  ImportType.SDKCORE,
63
63
  )
64
64
  for param in self.operation.parameters.positional + self.operation.parameters.keyword_only:
65
- if not param.client_default_value and not param.optional and param.wire_name in self.sample_params:
65
+ if param.client_default_value is None and not param.optional and param.wire_name in self.sample_params:
66
66
  imports.merge(param.type.imports_for_sample())
67
67
  return FileImportSerializer(imports, True)
68
68
 
@@ -80,7 +80,7 @@ class SampleSerializer(BaseSerializer):
80
80
  for p in (
81
81
  self.code_model.clients[0].parameters.positional + self.code_model.clients[0].parameters.keyword_only
82
82
  )
83
- if not (p.optional or p.client_default_value)
83
+ if not p.optional and p.client_default_value is None
84
84
  ]
85
85
  client_params = {
86
86
  p.client_name: special_param.get(
@@ -9,7 +9,7 @@
9
9
  {% if client.has_parameterized_host %}
10
10
  {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}
11
11
  {% endif %}
12
- {{ serializer.initialize_config() }}
12
+ {{ op_tools.serialize(serializer.initialize_config()) | indent(8) }}
13
13
  {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }}
14
14
 
15
15
  {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }}
@@ -21,14 +21,8 @@ class {{ client.name }}Configuration: {{ client.config.pylint_disable() }}
21
21
  {% if serializer.set_constants() %}
22
22
  {{ op_tools.serialize(serializer.set_constants()) | indent(8) -}}
23
23
  {% endif %}
24
- {% if client.credential %}
25
- {% set cred_scopes = client.credential.type if client.credential.type.policy is defined and client.credential.type.policy.credential_scopes is defined %}
26
- {% if not cred_scopes %}
27
- {% set cred_scopes = client.credential.type.types | selectattr("policy.credential_scopes") | first if client.credential.type.types is defined %}
28
- {% endif %}
29
- {% if cred_scopes %}
30
- self.credential_scopes = kwargs.pop('credential_scopes', {{ cred_scopes.policy.credential_scopes }})
31
- {% endif %}
24
+ {% if client.credential_scopes is not none %}
25
+ self.credential_scopes = kwargs.pop('credential_scopes', {{ client.credential_scopes }})
32
26
  {% endif %}
33
27
  kwargs.setdefault('sdk_moniker', '{{ client.config.sdk_moniker }}/{}'.format(VERSION))
34
28
  self.polling_interval = kwargs.get("polling_interval", 30)
@@ -18,6 +18,7 @@ import email.utils
18
18
  from datetime import datetime, date, time, timedelta, timezone
19
19
  from json import JSONEncoder
20
20
  import xml.etree.ElementTree as ET
21
+ from collections.abc import MutableMapping
21
22
  from typing_extensions import Self
22
23
  import isodate
23
24
  from {{ code_model.core_library }}.exceptions import DeserializationError
@@ -25,11 +26,6 @@ from {{ code_model.core_library }}{{ "" if code_model.is_azure_flavor else ".uti
25
26
  from {{ code_model.core_library }}.{{ "" if code_model.is_azure_flavor else "runtime." }}pipeline import PipelineResponse
26
27
  from {{ code_model.core_library }}.serialization import _Null
27
28
 
28
- if sys.version_info >= (3, 9):
29
- from collections.abc import MutableMapping
30
- else:
31
- from typing import MutableMapping
32
-
33
29
  _LOGGER = logging.getLogger(__name__)
34
30
 
35
31
  __all__ = ["SdkJSONEncoder", "Model", "rest_field", "rest_discriminator"]
@@ -344,7 +340,7 @@ def _get_model(module_name: str, model_name: str):
344
340
  _UNSET = object()
345
341
 
346
342
 
347
- class _MyMutableMapping(MutableMapping[str, typing.Any]): # pylint: disable=unsubscriptable-object
343
+ class _MyMutableMapping(MutableMapping[str, typing.Any]):
348
344
  def __init__(self, data: typing.Dict[str, typing.Any]) -> None:
349
345
  self._data = data
350
346
 
@@ -404,13 +400,13 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]): # pylint: disable=uns
404
400
  return default
405
401
 
406
402
  @typing.overload
407
- def pop(self, key: str) -> typing.Any: ...
403
+ def pop(self, key: str) -> typing.Any: ... # pylint: disable=arguments-differ
408
404
 
409
405
  @typing.overload
410
- def pop(self, key: str, default: _T) -> _T: ...
406
+ def pop(self, key: str, default: _T) -> _T: ... # pylint: disable=signature-differs
411
407
 
412
408
  @typing.overload
413
- def pop(self, key: str, default: typing.Any) -> typing.Any: ...
409
+ def pop(self, key: str, default: typing.Any) -> typing.Any: ... # pylint: disable=signature-differs
414
410
 
415
411
  def pop(self, key: str, default: typing.Any = _UNSET) -> typing.Any:
416
412
  """
@@ -440,7 +436,7 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]): # pylint: disable=uns
440
436
  """
441
437
  self._data.clear()
442
438
 
443
- def update(self, *args: typing.Any, **kwargs: typing.Any) -> None:
439
+ def update(self, *args: typing.Any, **kwargs: typing.Any) -> None: # pylint: disable=arguments-differ
444
440
  """
445
441
  Updates D from mapping/iterable E and F.
446
442
  :param any args: Either a mapping object or an iterable of key-value pairs.
@@ -451,7 +447,7 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]): # pylint: disable=uns
451
447
  def setdefault(self, key: str, default: None = None) -> None: ...
452
448
 
453
449
  @typing.overload
454
- def setdefault(self, key: str, default: typing.Any) -> typing.Any: ...
450
+ def setdefault(self, key: str, default: typing.Any) -> typing.Any: ... # pylint: disable=signature-differs
455
451
 
456
452
  def setdefault(self, key: str, default: typing.Any = _UNSET) -> typing.Any:
457
453
  """
@@ -641,7 +637,7 @@ class Model(_MyMutableMapping):
641
637
  cls._attr_to_rest_field: typing.Dict[str, _RestField] = dict(attr_to_rest_field.items())
642
638
  cls._calculated.add(f"{cls.__module__}.{cls.__qualname__}")
643
639
 
644
- return super().__new__(cls) # pylint: disable=no-value-for-parameter
640
+ return super().__new__(cls)
645
641
 
646
642
  def __init_subclass__(cls, discriminator: typing.Optional[str] = None) -> None:
647
643
  for base in cls.__bases__:
@@ -677,7 +673,7 @@ class Model(_MyMutableMapping):
677
673
  discriminator_value = data.find(xml_name).text # pyright: ignore
678
674
  else:
679
675
  discriminator_value = data.get(discriminator._rest_name)
680
- mapped_cls = cls.__mapping__.get(discriminator_value, cls) # pyright: ignore
676
+ mapped_cls = cls.__mapping__.get(discriminator_value, cls) # pyright: ignore # pylint: disable=no-member
681
677
  return mapped_cls._deserialize(data, exist_discriminators)
682
678
 
683
679
  def as_dict(self, *, exclude_readonly: bool = False) -> typing.Dict[str, typing.Any]:
@@ -3,7 +3,7 @@
3
3
  # Microsoft Azure SDK for Python
4
4
 
5
5
  This is the Microsoft {{package_pprint_name}} Client Library.
6
- This package has been tested with Python 3.8+.
6
+ This package has been tested with Python 3.9+.
7
7
  For a more complete view of Azure libraries, see the [azure sdk python release](https://aka.ms/azsdk/python/all).
8
8
 
9
9
  # Usage
@@ -36,7 +36,7 @@ python -m pip install {{ package_name }}
36
36
 
37
37
  #### Prequisites
38
38
 
39
- - Python 3.8 or later is required to use this package.
39
+ - Python 3.9 or later is required to use this package.
40
40
  - You need an [Azure subscription][azure_sub] to use this package.
41
41
  - An existing {{ package_pprint_name }} instance.
42
42