@typespec/http-client-python 0.32.0 → 0.34.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.
- package/dist/emitter/emitter.js +10 -2
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/lib.d.ts +6 -0
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.js +29 -0
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/types.d.ts.map +1 -1
- package/dist/emitter/types.js +2 -0
- package/dist/emitter/types.js.map +1 -1
- package/emitter/src/emitter.ts +9 -1
- package/emitter/src/lib.ts +36 -0
- package/emitter/src/types.ts +2 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate-common.ts +40 -15
- package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
- package/generator/build/lib/pygen/__init__.py +4 -3
- package/generator/build/lib/pygen/codegen/models/__init__.py +4 -2
- package/generator/build/lib/pygen/codegen/models/code_model.py +27 -5
- package/generator/build/lib/pygen/codegen/models/combined_type.py +3 -3
- package/generator/build/lib/pygen/codegen/models/enum_type.py +75 -25
- package/generator/build/lib/pygen/codegen/models/list_type.py +10 -4
- package/generator/build/lib/pygen/codegen/models/model_type.py +145 -4
- package/generator/build/lib/pygen/codegen/models/operation.py +1 -0
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +5 -1
- package/generator/build/lib/pygen/codegen/models/parameter.py +2 -2
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +30 -6
- package/generator/build/lib/pygen/codegen/models/property.py +21 -8
- package/generator/build/lib/pygen/codegen/models/response.py +16 -3
- package/generator/build/lib/pygen/codegen/models/utils.py +12 -10
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +46 -11
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +48 -15
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +32 -2
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -1
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +127 -3
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +263 -12
- package/generator/build/lib/pygen/codegen/serializers/unions_serializer.py +44 -0
- package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +30 -2
- package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +51 -2
- package/generator/build/lib/pygen/codegen/templates/unions.py.jinja2 +9 -0
- package/generator/build/lib/pygen/preprocess/__init__.py +104 -13
- package/generator/build/lib/pygen/utils.py +16 -0
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +4 -3
- package/generator/pygen/codegen/models/__init__.py +4 -2
- package/generator/pygen/codegen/models/code_model.py +27 -5
- package/generator/pygen/codegen/models/combined_type.py +3 -3
- package/generator/pygen/codegen/models/enum_type.py +75 -25
- package/generator/pygen/codegen/models/list_type.py +10 -4
- package/generator/pygen/codegen/models/model_type.py +145 -4
- package/generator/pygen/codegen/models/operation.py +1 -0
- package/generator/pygen/codegen/models/paging_operation.py +5 -1
- package/generator/pygen/codegen/models/parameter.py +2 -2
- package/generator/pygen/codegen/models/primitive_types.py +30 -6
- package/generator/pygen/codegen/models/property.py +21 -8
- package/generator/pygen/codegen/models/response.py +16 -3
- package/generator/pygen/codegen/models/utils.py +12 -10
- package/generator/pygen/codegen/serializers/__init__.py +46 -11
- package/generator/pygen/codegen/serializers/builder_serializer.py +48 -15
- package/generator/pygen/codegen/serializers/general_serializer.py +32 -2
- package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -1
- package/generator/pygen/codegen/serializers/model_serializer.py +127 -3
- package/generator/pygen/codegen/serializers/types_serializer.py +263 -12
- package/generator/pygen/codegen/serializers/unions_serializer.py +44 -0
- package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +30 -2
- package/generator/pygen/codegen/templates/types.py.jinja2 +51 -2
- package/generator/pygen/codegen/templates/unions.py.jinja2 +9 -0
- package/generator/pygen/preprocess/__init__.py +104 -13
- package/generator/pygen/utils.py +16 -0
- package/generator/pygen.egg-info/SOURCES.txt +2 -0
- package/package.json +5 -5
|
@@ -11,15 +11,32 @@ build-backend = "setuptools.build_meta"
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "{{ options.get('package-name')|lower }}"
|
|
13
13
|
{% if options.get('package-mode') %}
|
|
14
|
+
{% if KEEP_FIELDS and KEEP_FIELDS.get('project.authors') %}
|
|
15
|
+
authors = [
|
|
16
|
+
{% for author in KEEP_FIELDS.get('project.authors') %}
|
|
17
|
+
{ {% for key, val in author.items() %}{{ key }} = {{ val|tojson }}{% if not loop.last %}, {% endif %}{% endfor %} },
|
|
18
|
+
{% endfor %}
|
|
19
|
+
]
|
|
20
|
+
{% else %}
|
|
14
21
|
authors = [
|
|
15
22
|
{ name = "{{ code_model.company_name }}"{% if code_model.is_azure_flavor %}, email = "azpysdkhelp@microsoft.com"{% endif %} },
|
|
16
23
|
]
|
|
17
|
-
{%
|
|
24
|
+
{% endif %}
|
|
25
|
+
{% if KEEP_FIELDS and KEEP_FIELDS.get('project.description') %}
|
|
26
|
+
description = {{ KEEP_FIELDS.get('project.description')|tojson }}
|
|
27
|
+
{% elif options.get("azure-arm") %}
|
|
18
28
|
description = "Microsoft Azure {{ options.get('package-pprint-name') }} Client Library for Python"
|
|
19
29
|
{% else %}
|
|
20
30
|
description = "{{ code_model.company_name }} {% if code_model.is_azure_flavor and not options.get('package-pprint-name').startswith('Azure ') %}Azure {% endif %}{{ options.get('package-pprint-name') }} Client Library for Python"
|
|
21
31
|
{% endif %}
|
|
22
32
|
license = "MIT"
|
|
33
|
+
{% if KEEP_FIELDS and KEEP_FIELDS.get('project.classifiers') %}
|
|
34
|
+
classifiers = [
|
|
35
|
+
{% for classifier in KEEP_FIELDS.get('project.classifiers') %}
|
|
36
|
+
{{ classifier|tojson }},
|
|
37
|
+
{% endfor %}
|
|
38
|
+
]
|
|
39
|
+
{% else %}
|
|
23
40
|
classifiers = [
|
|
24
41
|
"Development Status :: {{ dev_status }}",
|
|
25
42
|
"Programming Language :: Python",
|
|
@@ -29,10 +46,15 @@ classifiers = [
|
|
|
29
46
|
"Programming Language :: Python :: 3.{{ version }}",
|
|
30
47
|
{% endfor %}
|
|
31
48
|
]
|
|
49
|
+
{% endif %}
|
|
32
50
|
requires-python = ">={{ MIN_PYTHON_VERSION }}"
|
|
33
51
|
{% else %}
|
|
52
|
+
{% if KEEP_FIELDS and KEEP_FIELDS.get('project.description') %}
|
|
53
|
+
description = {{ KEEP_FIELDS.get('project.description')|tojson }}
|
|
54
|
+
{% else %}
|
|
34
55
|
description = "{{ options.get('package-name') }}"
|
|
35
56
|
{% endif %}
|
|
57
|
+
{% endif %}
|
|
36
58
|
{% if code_model.is_azure_flavor %}
|
|
37
59
|
keywords = ["azure", "azure sdk"]
|
|
38
60
|
{% endif %}
|
|
@@ -77,7 +99,13 @@ version = "{{ options.get("package-version", "unknown") }}"
|
|
|
77
99
|
]
|
|
78
100
|
{% endfor %}
|
|
79
101
|
{% endif %}
|
|
80
|
-
{% if
|
|
102
|
+
{% if KEEP_FIELDS and KEEP_FIELDS.get('project.urls') %}
|
|
103
|
+
|
|
104
|
+
[project.urls]
|
|
105
|
+
{% for key, val in KEEP_FIELDS.get('project.urls').items() %}
|
|
106
|
+
{{ key }} = {{ val|tojson }}
|
|
107
|
+
{% endfor %}
|
|
108
|
+
{% elif code_model.is_azure_flavor %}
|
|
81
109
|
|
|
82
110
|
[project.urls]
|
|
83
111
|
repository = "https://github.com/Azure/azure-sdk-for-python"
|
|
@@ -4,6 +4,55 @@
|
|
|
4
4
|
{% endif %}
|
|
5
5
|
|
|
6
6
|
{{ imports }}
|
|
7
|
-
{%
|
|
8
|
-
{
|
|
7
|
+
{% import 'operation_tools.jinja2' as op_tools %}
|
|
8
|
+
{% import "macros.jinja2" as macros %}
|
|
9
|
+
{% for enum in literal_enums %}
|
|
10
|
+
|
|
11
|
+
{{ serializer.declare_literal_enum(enum) }}
|
|
12
|
+
{% if enum.yaml_data.get("description") %}
|
|
13
|
+
"""{{ op_tools.wrap_string(enum.yaml_data["description"], "\n") }}"""
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% endfor %}
|
|
16
|
+
{% for model in models %}
|
|
17
|
+
{% if serializer.has_keyword_wire_names(model) %}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
{{ serializer.declare_functional_model(model) }}
|
|
21
|
+
{{ model.name }}.__doc__ = """{{ op_tools.wrap_string(model.description(is_operation_file=False), "\n") }}
|
|
22
|
+
|
|
23
|
+
{% if model.properties != None %}
|
|
24
|
+
{% for p in model.properties %}
|
|
25
|
+
{% for line in serializer.variable_documentation_string(p) %}
|
|
26
|
+
{{ macros.wrap_model_string(line, '\n') -}}
|
|
27
|
+
{% endfor %}
|
|
28
|
+
{% endfor %}
|
|
29
|
+
{% endif %}
|
|
30
|
+
"""
|
|
31
|
+
{% else %}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
{{ serializer.declare_model(model) }}
|
|
35
|
+
"""{{ op_tools.wrap_string(model.description(is_operation_file=False), "\n ") }}
|
|
36
|
+
|
|
37
|
+
{% if model.properties != None %}
|
|
38
|
+
{% for p in model.properties %}
|
|
39
|
+
{% for line in serializer.variable_documentation_string(p) %}
|
|
40
|
+
{{ macros.wrap_model_string(line, '\n ') -}}
|
|
41
|
+
{% endfor %}
|
|
42
|
+
{% endfor %}
|
|
43
|
+
{% endif %}
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
{% set shadowed = serializer.get_shadowed_builtins(model) %}
|
|
47
|
+
{% for p in serializer.get_properties_to_declare(model)%}
|
|
48
|
+
{{ serializer.declare_property(p, shadowed) }}
|
|
49
|
+
{% set prop_description = p.description(is_operation_file=False).replace('"', '\\"') %}
|
|
50
|
+
{% if prop_description %}
|
|
51
|
+
"""{{ macros.wrap_model_string(prop_description, '\n ', '\"\"\"') -}}
|
|
52
|
+
{% endif %}
|
|
53
|
+
{% endfor %}
|
|
54
|
+
{% endif %}
|
|
55
|
+
{% endfor %}
|
|
56
|
+
{% for model in discriminated_bases %}
|
|
57
|
+
{{ serializer.discriminated_subtypes_union(model) }}
|
|
9
58
|
{% endfor %}
|
|
@@ -22,6 +22,7 @@ from ..utils import (
|
|
|
22
22
|
get_body_type_for_description,
|
|
23
23
|
JSON_REGEXP,
|
|
24
24
|
KNOWN_TYPES,
|
|
25
|
+
description_ends_with_code_block,
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
|
|
@@ -93,6 +94,8 @@ def add_overloads_for_body_param(yaml_data: dict[str, Any]) -> None:
|
|
|
93
94
|
continue
|
|
94
95
|
if body_type.get("type") == "model" and body_type.get("base") == "json":
|
|
95
96
|
yaml_data["overloads"].append(add_overload(yaml_data, body_type, for_flatten_params=True))
|
|
97
|
+
# Skip single-body JSON overload; the TypedDict overload replaces it
|
|
98
|
+
continue
|
|
96
99
|
yaml_data["overloads"].append(add_overload(yaml_data, body_type))
|
|
97
100
|
content_type_param = next(p for p in yaml_data["parameters"] if p["wireName"].lower() == "content-type")
|
|
98
101
|
content_type_param["inOverload"] = False
|
|
@@ -108,7 +111,9 @@ def update_description(description: Optional[str], default_description: str = ""
|
|
|
108
111
|
if not description:
|
|
109
112
|
description = default_description
|
|
110
113
|
description.rstrip(" ")
|
|
111
|
-
|
|
114
|
+
# Don't append a trailing period when the description ends with a code block: the
|
|
115
|
+
# period would land inside the rendered literal block (e.g. "]." ) and break Sphinx.
|
|
116
|
+
if description and description[-1] != "." and not description_ends_with_code_block(description):
|
|
112
117
|
description += "."
|
|
113
118
|
return description
|
|
114
119
|
|
|
@@ -301,6 +306,44 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
301
306
|
def is_tsp(self) -> bool:
|
|
302
307
|
return self.options.get("tsp_file", False)
|
|
303
308
|
|
|
309
|
+
@staticmethod
|
|
310
|
+
def _find_existing_typeddict(code_model: dict[str, Any], cross_lang_id: Optional[str]) -> Optional[dict[str, Any]]:
|
|
311
|
+
"""Find an existing typeddict copy with the given crossLanguageDefinitionId."""
|
|
312
|
+
if not cross_lang_id:
|
|
313
|
+
return None
|
|
314
|
+
return next(
|
|
315
|
+
(
|
|
316
|
+
t
|
|
317
|
+
for t in code_model["types"]
|
|
318
|
+
if t.get("type") == "model"
|
|
319
|
+
and t.get("base") == "typeddict"
|
|
320
|
+
and t.get("crossLanguageDefinitionId") == cross_lang_id
|
|
321
|
+
),
|
|
322
|
+
None,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
@staticmethod
|
|
326
|
+
def _insert_typeddict_overload(
|
|
327
|
+
code_model: dict[str, Any],
|
|
328
|
+
body_parameter: dict[str, Any],
|
|
329
|
+
source: dict[str, Any],
|
|
330
|
+
origin_type: str,
|
|
331
|
+
existing_td: Optional[dict[str, Any]],
|
|
332
|
+
) -> None:
|
|
333
|
+
"""Insert a typeddict type into the body parameter's combined types."""
|
|
334
|
+
if origin_type == "model":
|
|
335
|
+
td_type = existing_td or {**source, "base": "typeddict"}
|
|
336
|
+
body_parameter["type"]["types"].insert(1, td_type)
|
|
337
|
+
if not existing_td:
|
|
338
|
+
code_model["types"].append(td_type)
|
|
339
|
+
else:
|
|
340
|
+
td_list_or_dict = copy.deepcopy(body_parameter["type"]["types"][0])
|
|
341
|
+
td_elem = existing_td or {**source, "base": "typeddict"}
|
|
342
|
+
td_list_or_dict["elementType"] = td_elem
|
|
343
|
+
body_parameter["type"]["types"].insert(1, td_list_or_dict)
|
|
344
|
+
if not existing_td:
|
|
345
|
+
code_model["types"].append(td_elem)
|
|
346
|
+
|
|
304
347
|
def add_body_param_type(
|
|
305
348
|
self,
|
|
306
349
|
code_model: dict[str, Any],
|
|
@@ -319,25 +362,65 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
319
362
|
body_parameter["type"] if origin_type == "model" else body_parameter["type"].get("elementType", {})
|
|
320
363
|
)
|
|
321
364
|
is_dpg_model = model_type.get("base") == "dpg"
|
|
365
|
+
is_json_model = model_type.get("base") == "json"
|
|
366
|
+
is_typeddict_only = self.options["models-mode"] == "typeddict"
|
|
367
|
+
|
|
322
368
|
body_parameter["type"] = {
|
|
323
369
|
"type": "combined",
|
|
324
370
|
"types": [body_parameter["type"]],
|
|
325
371
|
}
|
|
326
|
-
# don't add binary overload for multipart content type
|
|
327
|
-
if not (self.is_tsp and has_multi_part_content_type(body_parameter)):
|
|
372
|
+
# don't add binary overload for multipart content type or typeddict-only mode
|
|
373
|
+
if not (self.is_tsp and has_multi_part_content_type(body_parameter)) and not is_typeddict_only:
|
|
328
374
|
body_parameter["type"]["types"].append(KNOWN_TYPES["binary"])
|
|
329
375
|
|
|
376
|
+
# Add typeddict overload for non-spread dpg models
|
|
330
377
|
if self.options["models-mode"] == "dpg" and is_dpg_model:
|
|
331
|
-
|
|
332
|
-
|
|
378
|
+
cross_lang_id = model_type.get("crossLanguageDefinitionId")
|
|
379
|
+
existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
|
|
380
|
+
self._insert_typeddict_overload(code_model, body_parameter, model_type, origin_type, existing_td)
|
|
381
|
+
|
|
382
|
+
# For spread bodies (json base), add a typeddict overload that references
|
|
383
|
+
# the original model. This replaces the JSON single-body overload.
|
|
384
|
+
if is_json_model:
|
|
385
|
+
cross_lang_id = model_type.get("crossLanguageDefinitionId")
|
|
386
|
+
original = None
|
|
387
|
+
if cross_lang_id:
|
|
388
|
+
original = next(
|
|
389
|
+
(
|
|
390
|
+
t
|
|
391
|
+
for t in code_model["types"]
|
|
392
|
+
if t.get("type") == "model"
|
|
393
|
+
and t.get("crossLanguageDefinitionId") == cross_lang_id
|
|
394
|
+
and t is not model_type
|
|
395
|
+
),
|
|
396
|
+
None,
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
if is_typeddict_only and original:
|
|
400
|
+
# In typeddict-only mode, the original dpg model already renders
|
|
401
|
+
# as a TypedDict — reference it directly, no copy needed.
|
|
402
|
+
if origin_type == "model":
|
|
403
|
+
body_parameter["type"]["types"].insert(1, original)
|
|
404
|
+
else:
|
|
405
|
+
td_list_or_dict = copy.deepcopy(body_parameter["type"]["types"][0])
|
|
406
|
+
td_list_or_dict["elementType"] = original
|
|
407
|
+
body_parameter["type"]["types"].insert(1, td_list_or_dict)
|
|
333
408
|
else:
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
409
|
+
source = original or model_type
|
|
410
|
+
existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
|
|
411
|
+
self._insert_typeddict_overload(code_model, body_parameter, source, origin_type, existing_td)
|
|
412
|
+
|
|
413
|
+
if len(body_parameter["type"]["types"]) == 1:
|
|
414
|
+
# Only one body variant remains (e.g. typeddict-only mode where the
|
|
415
|
+
# binary and JSON overloads are omitted). Collapse the combined
|
|
416
|
+
# wrapper back to the single type so we don't emit a lone
|
|
417
|
+
# ``@overload`` (mypy rejects a single overload definition).
|
|
418
|
+
body_parameter["type"] = body_parameter["type"]["types"][0]
|
|
419
|
+
return
|
|
420
|
+
|
|
339
421
|
code_model["types"].append(body_parameter["type"])
|
|
340
422
|
|
|
423
|
+
|
|
341
424
|
def pad_reserved_words(self, name: str, pad_type: PadType, yaml_type: dict[str, Any]) -> str:
|
|
342
425
|
# we want to pad hidden variables as well
|
|
343
426
|
if not name:
|
|
@@ -485,7 +568,11 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
485
568
|
if yaml_data.get("isLroInitialOperation") is True:
|
|
486
569
|
yaml_data["name"] = (
|
|
487
570
|
"_"
|
|
488
|
-
+ self.pad_reserved_words(
|
|
571
|
+
+ self.pad_reserved_words(
|
|
572
|
+
extract_original_name(yaml_data["name"]),
|
|
573
|
+
PadType.METHOD,
|
|
574
|
+
yaml_data,
|
|
575
|
+
)
|
|
489
576
|
+ "_initial"
|
|
490
577
|
)
|
|
491
578
|
else:
|
|
@@ -576,7 +663,9 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
576
663
|
item_type = item_type or yaml_data["itemType"]["elementType"]
|
|
577
664
|
if yaml_data.get("nextOperation"):
|
|
578
665
|
yaml_data["nextOperation"]["groupName"] = self.pad_reserved_words(
|
|
579
|
-
yaml_data["nextOperation"]["groupName"],
|
|
666
|
+
yaml_data["nextOperation"]["groupName"],
|
|
667
|
+
PadType.OPERATION_GROUP,
|
|
668
|
+
yaml_data["nextOperation"],
|
|
580
669
|
)
|
|
581
670
|
yaml_data["nextOperation"]["groupName"] = to_snake_case(yaml_data["nextOperation"]["groupName"])
|
|
582
671
|
for response in yaml_data["nextOperation"].get("responses", []):
|
|
@@ -598,7 +687,9 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
598
687
|
)
|
|
599
688
|
operation_group["identifyName"] = to_snake_case(operation_group["identifyName"])
|
|
600
689
|
operation_group["propertyName"] = self.pad_reserved_words(
|
|
601
|
-
operation_group["propertyName"],
|
|
690
|
+
operation_group["propertyName"],
|
|
691
|
+
PadType.OPERATION_GROUP,
|
|
692
|
+
operation_group,
|
|
602
693
|
)
|
|
603
694
|
operation_group["propertyName"] = to_snake_case(operation_group["propertyName"])
|
|
604
695
|
operation_group["className"] = update_operation_group_class_name(
|
package/generator/pygen/utils.py
CHANGED
|
@@ -11,6 +11,22 @@ SWAGGER_PACKAGE_MODE = ["mgmtplane", "dataplane"] # for backward compatibility
|
|
|
11
11
|
TYPESPEC_PACKAGE_MODE = ["azure-mgmt", "azure-dataplane", "generic"]
|
|
12
12
|
VALID_PACKAGE_MODE = SWAGGER_PACKAGE_MODE + TYPESPEC_PACKAGE_MODE
|
|
13
13
|
|
|
14
|
+
CODE_BLOCK_MARKER = ".. code-block::"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def description_ends_with_code_block(description: str) -> bool:
|
|
18
|
+
"""Return True when the description's trailing content is an RST ``.. code-block::``.
|
|
19
|
+
|
|
20
|
+
True when the last ``.. code-block::`` directive (starting its own line, so inline
|
|
21
|
+
mentions are ignored) is followed only by blank or indented lines, i.e. the literal
|
|
22
|
+
block runs to the end of the description.
|
|
23
|
+
"""
|
|
24
|
+
lines = description.rstrip().splitlines()
|
|
25
|
+
directives = [i for i, line in enumerate(lines) if line.lstrip().startswith(CODE_BLOCK_MARKER)]
|
|
26
|
+
if not directives:
|
|
27
|
+
return False
|
|
28
|
+
return all(not line.strip() or line.startswith((" ", "\t")) for line in lines[directives[-1] + 1 :])
|
|
29
|
+
|
|
14
30
|
|
|
15
31
|
def update_enum_value(name: str, value: Any, description: str, enum_type: dict[str, Any]) -> dict[str, Any]:
|
|
16
32
|
return {
|
|
@@ -56,6 +56,7 @@ pygen/codegen/serializers/request_builders_serializer.py
|
|
|
56
56
|
pygen/codegen/serializers/sample_serializer.py
|
|
57
57
|
pygen/codegen/serializers/test_serializer.py
|
|
58
58
|
pygen/codegen/serializers/types_serializer.py
|
|
59
|
+
pygen/codegen/serializers/unions_serializer.py
|
|
59
60
|
pygen/codegen/serializers/utils.py
|
|
60
61
|
pygen/codegen/templates/client.py.jinja2
|
|
61
62
|
pygen/codegen/templates/client_container.py.jinja2
|
|
@@ -90,6 +91,7 @@ pygen/codegen/templates/serialization.py.jinja2
|
|
|
90
91
|
pygen/codegen/templates/test.py.jinja2
|
|
91
92
|
pygen/codegen/templates/testpreparer.py.jinja2
|
|
92
93
|
pygen/codegen/templates/types.py.jinja2
|
|
94
|
+
pygen/codegen/templates/unions.py.jinja2
|
|
93
95
|
pygen/codegen/templates/utils.py.jinja2
|
|
94
96
|
pygen/codegen/templates/validation.py.jinja2
|
|
95
97
|
pygen/codegen/templates/version.py.jinja2
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typespec/http-client-python",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"author": "Microsoft Corporation",
|
|
5
5
|
"description": "TypeSpec emitter for Python SDKs",
|
|
6
6
|
"homepage": "https://typespec.io",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"@azure-tools/typespec-azure-core": ">=0.69.0 <1.0.0",
|
|
69
69
|
"@azure-tools/typespec-azure-resource-manager": ">=0.69.1 <1.0.0",
|
|
70
70
|
"@azure-tools/typespec-azure-rulesets": ">=0.69.1 <1.0.0",
|
|
71
|
-
"@azure-tools/typespec-client-generator-core": ">=0.69.
|
|
71
|
+
"@azure-tools/typespec-client-generator-core": ">=0.69.1 <1.0.0",
|
|
72
72
|
"@typespec/compiler": "^1.13.0",
|
|
73
73
|
"@typespec/http": "^1.13.0",
|
|
74
74
|
"@typespec/openapi": "^1.13.0",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
]
|
|
96
96
|
},
|
|
97
97
|
"dependencies": {
|
|
98
|
-
"js-yaml": "
|
|
98
|
+
"js-yaml": "^4.2.0",
|
|
99
99
|
"marked": "^15.0.6",
|
|
100
100
|
"pyodide": "0.26.2",
|
|
101
101
|
"semver": "~7.6.2",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"@azure-tools/typespec-azure-core": "~0.69.0",
|
|
107
107
|
"@azure-tools/typespec-azure-resource-manager": "~0.69.1",
|
|
108
108
|
"@azure-tools/typespec-azure-rulesets": "~0.69.1",
|
|
109
|
-
"@azure-tools/typespec-client-generator-core": "~0.69.
|
|
109
|
+
"@azure-tools/typespec-client-generator-core": "~0.69.1",
|
|
110
110
|
"@azure-tools/azure-http-specs": "0.1.0-alpha.42",
|
|
111
111
|
"@typespec/compiler": "^1.13.0",
|
|
112
112
|
"@typespec/http": "^1.13.0",
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"@typespec/sse": "~0.83.0",
|
|
120
120
|
"@typespec/streams": "~0.83.0",
|
|
121
121
|
"@typespec/xml": "~0.83.0",
|
|
122
|
-
"@typespec/http-specs": "0.1.0-alpha.39-dev.
|
|
122
|
+
"@typespec/http-specs": "0.1.0-alpha.39-dev.2",
|
|
123
123
|
"@types/js-yaml": "~4.0.5",
|
|
124
124
|
"@types/node": "~25.0.2",
|
|
125
125
|
"@types/semver": "7.5.8",
|