@typespec/http-client-python 0.9.1 → 0.9.2

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 (59) hide show
  1. package/dist/emitter/emitter.d.ts.map +1 -1
  2. package/dist/emitter/emitter.js +1 -2
  3. package/dist/emitter/emitter.js.map +1 -1
  4. package/dist/emitter/run-python3.js +1 -1
  5. package/dist/emitter/utils.d.ts +0 -1
  6. package/dist/emitter/utils.d.ts.map +1 -1
  7. package/dist/emitter/utils.js +2 -6
  8. package/dist/emitter/utils.js.map +1 -1
  9. package/emitter/src/emitter.ts +1 -4
  10. package/emitter/src/run-python3.ts +1 -1
  11. package/emitter/src/utils.ts +2 -7
  12. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  13. package/eng/scripts/Build-Packages.ps1 +7 -5
  14. package/eng/scripts/ci/format.ts +1 -1
  15. package/eng/scripts/ci/mypy.ini +1 -1
  16. package/eng/scripts/ci/pylintrc +1 -1
  17. package/eng/scripts/ci/pyrightconfig.json +1 -1
  18. package/eng/scripts/ci/regenerate.ts +39 -3
  19. package/eng/scripts/ci/run-ci.ts +1 -0
  20. package/eng/scripts/ci/run_pylint.py +1 -1
  21. package/eng/scripts/ci/utils.ts +5 -3
  22. package/eng/scripts/setup/__pycache__/{venvtools.cpython-38.pyc → venvtools.cpython-39.pyc} +0 -0
  23. package/eng/scripts/setup/build_pygen_wheel.py +3 -3
  24. package/eng/scripts/setup/install.py +2 -2
  25. package/eng/scripts/setup/prepare.py +2 -2
  26. package/generator/build/lib/pygen/codegen/__init__.py +0 -1
  27. package/generator/build/lib/pygen/codegen/_utils.py +1 -1
  28. package/generator/build/lib/pygen/codegen/models/imports.py +2 -13
  29. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1 -3
  30. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +9 -13
  31. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +2 -2
  32. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +1 -2
  33. package/generator/component-detection-pip-report.json +70 -71
  34. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  35. package/generator/pygen/codegen/__init__.py +0 -1
  36. package/generator/pygen/codegen/_utils.py +1 -1
  37. package/generator/pygen/codegen/models/imports.py +2 -13
  38. package/generator/pygen/codegen/serializers/builder_serializer.py +1 -3
  39. package/generator/pygen/codegen/templates/model_base.py.jinja2 +9 -13
  40. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +2 -2
  41. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +1 -2
  42. package/generator/pygen.egg-info/PKG-INFO +11 -2
  43. package/generator/setup.py +0 -1
  44. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -7
  45. package/generator/test/generic_mock_api_tests/conftest.py +3 -3
  46. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -7
  47. package/generator/test/unittests/conftest.py +14 -0
  48. package/generator/test/unittests/requirements.txt +3 -0
  49. package/generator/test/unittests/test_enums.py +52 -0
  50. package/generator/test/unittests/test_name_converter.py +43 -0
  51. package/generator/test/unittests/test_optional_return_type.py +268 -0
  52. package/generator/test/unittests/test_parameter_ordering.py +104 -0
  53. package/generator/test/unittests/test_sort_schema.py +93 -0
  54. package/generator/test/unittests/tox.ini +5 -0
  55. package/package.json +1 -1
  56. /package/generator/test/{generic_mock_api_tests/data → data}/image.jpg +0 -0
  57. /package/generator/test/{generic_mock_api_tests/data → data}/image.png +0 -0
  58. /package/generator/test/{generic_mock_api_tests/unittests → unittests}/test_model_base_serialization.py +0 -0
  59. /package/generator/test/{generic_mock_api_tests/unittests → unittests}/test_model_base_xml_serialization.py +0 -0
@@ -1,6 +1,6 @@
1
1
  # global configurations
2
2
  [mypy]
3
- python_version = 3.8
3
+ python_version = 3.9
4
4
 
5
5
 
6
6
  # module level configurations
@@ -1,5 +1,5 @@
1
1
  [MASTER]
2
- py-version=3.8
2
+ py-version=3.9
3
3
  ignore-patterns=test_*,conftest,setup
4
4
  reports=no
5
5
 
@@ -2,5 +2,5 @@
2
2
  "reportUnnecessaryCast": "warning",
3
3
  "reportTypeCommentUsage": true,
4
4
  "reportMissingImports": false,
5
- "pythonVersion": "3.8"
5
+ "pythonVersion": "3.9"
6
6
  }
@@ -37,15 +37,51 @@ interface TspCommand {
37
37
  }
38
38
 
39
39
  const AZURE_EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, string>[]> = {
40
- "azure/example/basic": {
41
- namespace: "specs.azure.example.basic",
42
- },
43
40
  "azure/client-generator-core/access": {
44
41
  namespace: "specs.azure.clientgenerator.core.access",
45
42
  },
43
+ "azure/client-generator-core/api-version": {
44
+ namespace: "specs.azure.clientgenerator.core.apiversion",
45
+ },
46
+ "azure/client-generator-core/client-initialization": {
47
+ namespace: "specs.azure.clientgenerator.core.clientinitialization",
48
+ },
49
+ "azure/client-generator-core/flatten-property": {
50
+ namespace: "specs.azure.clientgenerator.core.flattenproperty",
51
+ },
46
52
  "azure/client-generator-core/usage": {
47
53
  namespace: "specs.azure.clientgenerator.core.usage",
48
54
  },
55
+ "azure/core/basic": {
56
+ namespace: "specs.azure.core.basic",
57
+ },
58
+ "azure/core/lro/rpc": {
59
+ namespace: "specs.azure.core.lro.rpc",
60
+ },
61
+ "azure/core/lro/standard": {
62
+ namespace: "specs.azure.core.lro.standard",
63
+ },
64
+ "azure/core/model": {
65
+ namespace: "specs.azure.core.model",
66
+ },
67
+ "azure/core/page": {
68
+ namespace: "specs.azure.core.page",
69
+ },
70
+ "azure/core/scalar": {
71
+ namespace: "specs.azure.core.scalar",
72
+ },
73
+ "azure/core/traits": {
74
+ namespace: "specs.azure.core.traits",
75
+ },
76
+ "azure/encode/duration": {
77
+ namespace: "specs.azure.encode.duration",
78
+ },
79
+ "azure/example/basic": {
80
+ namespace: "specs.azure.example.basic",
81
+ },
82
+ "azure/payload/pageable": {
83
+ namespace: "specs.azure.payload.pageable",
84
+ },
49
85
  "client/structure/default": {
50
86
  namespace: "client.structure.service",
51
87
  },
@@ -55,6 +55,7 @@ function myExecSync(command: string, flavor: string, name?: string): void {
55
55
  return;
56
56
  }
57
57
  execSync(getCommand(command, flavor, name), { stdio: "inherit" });
58
+ execSync(getCommand(command, "unittests", name), { stdio: "inherit" });
58
59
  }
59
60
 
60
61
  let venvPath = join(root, "venv");
@@ -38,7 +38,7 @@ def _single_dir_pylint(mod):
38
38
  "--load-plugins=pylint_guidelines_checker",
39
39
  "--output-format=parseable",
40
40
  "--recursive=y",
41
- "--py-version=3.8",
41
+ "--py-version=3.9",
42
42
  str(inner_class.absolute()),
43
43
  ]
44
44
  )
@@ -20,10 +20,12 @@ const argv = parseArgs({
20
20
  export async function executeCommand(command: string, args: string[]) {
21
21
  const execFileAsync = promisify(execFile);
22
22
  try {
23
- await execFileAsync(command, args);
23
+ await execFileAsync(command, args, { shell: true });
24
24
  console.log(chalk.green(`${command} passed`));
25
- } catch (err) {
26
- console.error(chalk.red(`Error executing ${command}: ${err}`));
25
+ } catch (err: any) {
26
+ console.error(chalk.red(`Error executing ${command}`));
27
+ if (err.stdout) console.error(chalk.yellow("STDOUT:"), err.stdout);
28
+ if (err.stderr) console.error(chalk.yellow("STDERR:"), err.stderr);
27
29
  process.exit(1);
28
30
  }
29
31
  }
@@ -7,8 +7,8 @@
7
7
  # --------------------------------------------------------------------------
8
8
  import sys
9
9
 
10
- if not sys.version_info >= (3, 8, 0):
11
- raise Exception("Autorest for Python extension requires Python 3.8 at least")
10
+ if not sys.version_info >= (3, 9, 0):
11
+ raise Exception("Autorest for Python extension requires Python 3.9 at least")
12
12
 
13
13
  try:
14
14
  import pip
@@ -16,7 +16,7 @@ except (ImportError, ModuleNotFoundError):
16
16
  raise Exception("Your Python installation doesn't have pip available")
17
17
 
18
18
 
19
- # Now we have pip and Py >= 3.8, go to work
19
+ # Now we have pip and Py >= 3.9, go to work
20
20
 
21
21
  from pathlib import Path
22
22
 
@@ -7,9 +7,9 @@
7
7
  # --------------------------------------------------------------------------
8
8
  import sys
9
9
 
10
- if not sys.version_info >= (3, 8, 0):
10
+ if not sys.version_info >= (3, 9, 0):
11
11
  raise Warning(
12
- "Autorest for Python extension requires Python 3.8 at least. We will run your code with Pyodide since your Python version isn't adequate."
12
+ "Autorest for Python extension requires Python 3.9 at least. We will run your code with Pyodide since your Python version isn't adequate."
13
13
  )
14
14
 
15
15
  try:
@@ -9,9 +9,9 @@ import sys
9
9
  import os
10
10
  import argparse
11
11
 
12
- if not sys.version_info >= (3, 8, 0):
12
+ if not sys.version_info >= (3, 9, 0):
13
13
  raise Warning(
14
- "Autorest for Python extension requires Python 3.8 at least. We will run your code with Pyodide since your Python version isn't adequate."
14
+ "Autorest for Python extension requires Python 3.9 at least. We will run your code with Pyodide since your Python version isn't adequate."
15
15
  )
16
16
 
17
17
  from pathlib import Path
@@ -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"
@@ -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(
@@ -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)])
@@ -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
 
@@ -67,7 +67,6 @@ setup(
67
67
  "Programming Language :: Python",
68
68
  "Programming Language :: Python :: 3 :: Only",
69
69
  "Programming Language :: Python :: 3",
70
- "Programming Language :: Python :: 3.8",
71
70
  "Programming Language :: Python :: 3.9",
72
71
  "Programming Language :: Python :: 3.10",
73
72
  "Programming Language :: Python :: 3.11",
@@ -110,7 +109,7 @@ setup(
110
109
  "typing-extensions>=4.6.0",
111
110
  ],
112
111
  {% if package_mode %}
113
- python_requires=">=3.8",
112
+ python_requires=">=3.9",
114
113
  {% else %}
115
114
  long_description="""\
116
115
  {{ code_model.description }}
@@ -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"
@@ -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(
@@ -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)])