@typespec/http-client-python 0.28.2 → 0.29.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/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +7 -6
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/constants.d.ts +6 -0
- package/dist/emitter/constants.d.ts.map +1 -0
- package/dist/emitter/constants.js +27 -0
- package/dist/emitter/constants.js.map +1 -0
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +193 -119
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/http.d.ts.map +1 -1
- package/dist/emitter/http.js +33 -1
- package/dist/emitter/http.js.map +1 -1
- package/dist/emitter/lib.d.ts +37 -3
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.js +17 -0
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/run-python3.js +1 -1
- package/dist/emitter/run-python3.js.map +1 -1
- package/dist/emitter/system-requirements.js +6 -4
- package/dist/emitter/system-requirements.js.map +1 -1
- package/dist/emitter/types.d.ts +2 -5
- package/dist/emitter/types.d.ts.map +1 -1
- package/dist/emitter/types.js +86 -63
- package/dist/emitter/types.js.map +1 -1
- package/dist/emitter/utils.d.ts.map +1 -1
- package/dist/emitter/utils.js +16 -17
- package/dist/emitter/utils.js.map +1 -1
- package/emitter/src/code-model.ts +7 -13
- package/emitter/src/constants.ts +27 -0
- package/emitter/src/emitter.ts +241 -123
- package/emitter/src/http.ts +29 -1
- package/emitter/src/lib.ts +24 -0
- package/emitter/src/run-python3.ts +1 -1
- package/emitter/src/system-requirements.ts +4 -4
- package/emitter/src/types.ts +102 -62
- package/emitter/src/utils.ts +16 -18
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/emitter/test/utils.test.ts +3 -0
- package/emitter/tsconfig.build.json +2 -1
- package/emitter/tsconfig.json +2 -1
- package/eng/scripts/Build-Packages.ps1 +62 -37
- package/eng/scripts/Check-GitChanges.ps1 +30 -3
- package/eng/scripts/Functions.ps1 +54 -15
- package/eng/scripts/Generate.ps1 +42 -8
- package/eng/scripts/Generation.psm1 +44 -15
- package/eng/scripts/Initialize-Repository.ps1 +29 -11
- package/eng/scripts/Test-Packages.ps1 +47 -31
- package/eng/scripts/ci/config/eslint-ci.config.mjs +64 -0
- package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +1 -1
- package/eng/scripts/ci/{pylintrc → config/pylintrc} +1 -1
- package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +1 -1
- package/eng/scripts/ci/dev_requirements.txt +2 -1
- package/eng/scripts/ci/format.ts +232 -2
- package/eng/scripts/ci/lint.ts +223 -20
- package/eng/scripts/ci/regenerate-common.ts +411 -136
- package/eng/scripts/ci/regenerate.ts +247 -101
- package/eng/scripts/ci/run-tests.ts +507 -0
- package/eng/scripts/ci/run_apiview.py +22 -16
- package/eng/scripts/ci/run_mypy.py +34 -23
- package/eng/scripts/ci/run_pylint.py +27 -19
- package/eng/scripts/ci/run_pyright.py +9 -5
- package/eng/scripts/ci/run_sphinx_build.py +24 -9
- package/eng/scripts/ci/typecheck.ts +225 -0
- package/eng/scripts/ci/util.py +61 -25
- package/eng/scripts/ci/utils.ts +5 -5
- package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
- package/eng/scripts/setup/build.ts +1 -1
- package/eng/scripts/setup/build_pygen_wheel.py +4 -3
- package/eng/scripts/setup/install.py +4 -3
- package/eng/scripts/setup/install.ts +1 -1
- package/eng/scripts/setup/prepare.py +3 -2
- package/eng/scripts/setup/prepare.ts +1 -1
- package/eng/scripts/setup/run-python3.ts +1 -1
- package/eng/scripts/setup/run_batch.py +197 -0
- package/eng/scripts/setup/run_tsp.py +3 -3
- package/eng/scripts/setup/system-requirements.ts +8 -4
- package/eng/scripts/setup/venvtools.py +1 -1
- package/generator/build/lib/pygen/__init__.py +1 -3
- package/generator/build/lib/pygen/codegen/__init__.py +0 -1
- package/generator/build/lib/pygen/codegen/models/base.py +0 -1
- package/generator/build/lib/pygen/codegen/models/client.py +2 -1
- package/generator/build/lib/pygen/codegen/models/code_model.py +1 -0
- package/generator/build/lib/pygen/codegen/models/enum_type.py +0 -1
- package/generator/build/lib/pygen/codegen/models/model_type.py +1 -7
- package/generator/build/lib/pygen/codegen/models/parameter.py +16 -14
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +27 -12
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +12 -3
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +6 -2
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +17 -4
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +17 -11
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +176 -71
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +5 -1
- package/generator/build/lib/pygen/preprocess/__init__.py +37 -30
- package/generator/component-detection-pip-report.json +7 -7
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +1 -3
- package/generator/pygen/codegen/__init__.py +0 -1
- package/generator/pygen/codegen/models/base.py +0 -1
- package/generator/pygen/codegen/models/client.py +2 -1
- package/generator/pygen/codegen/models/code_model.py +1 -0
- package/generator/pygen/codegen/models/enum_type.py +0 -1
- package/generator/pygen/codegen/models/model_type.py +1 -7
- package/generator/pygen/codegen/models/parameter.py +16 -14
- package/generator/pygen/codegen/serializers/__init__.py +27 -12
- package/generator/pygen/codegen/serializers/builder_serializer.py +12 -3
- package/generator/pygen/codegen/serializers/general_serializer.py +6 -2
- package/generator/pygen/codegen/serializers/import_serializer.py +17 -4
- package/generator/pygen/codegen/serializers/parameter_serializer.py +17 -11
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +176 -71
- package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
- package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
- package/generator/pygen/codegen/templates/serialization.py.jinja2 +5 -1
- package/generator/pygen/preprocess/__init__.py +37 -30
- package/generator/pygen.egg-info/PKG-INFO +1 -2
- package/generator/pygen.egg-info/requires.txt +1 -1
- package/generator/setup.py +1 -2
- package/package.json +63 -42
- package/eng/scripts/ci/run-ci.ts +0 -89
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
- package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
- package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
- package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
- package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
- package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
- package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
- package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
- package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
- package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
- package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
- package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
- package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
- package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
- package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
- package/generator/test/azure/mock_api_tests/conftest.py +0 -207
- package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
- package/generator/test/azure/mock_api_tests/data/image.png +0 -0
- package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
- package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
- package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
- package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
- package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
- package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
- package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
- package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
- package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
- package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
- package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
- package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
- package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
- package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
- package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
- package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
- package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
- package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
- package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
- package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
- package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
- package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
- package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
- package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
- package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
- package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
- package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
- package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
- package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
- package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
- package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
- package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
- package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
- package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
- package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
- package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
- package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
- package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
- package/generator/test/azure/requirements.txt +0 -125
- package/generator/test/azure/tox.ini +0 -64
- package/generator/test/data/image.jpg +0 -0
- package/generator/test/data/image.png +0 -0
- package/generator/test/dev_requirements.txt +0 -8
- package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
- package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
- package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
- package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
- package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
- package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
- package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
- package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
- package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
- package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
- package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
- package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
- package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
- package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
- package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
- package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
- package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
- package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
- package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
- package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
- package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
- package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
- package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
- package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
- package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
- package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
- package/generator/test/generic_mock_api_tests/conftest.py +0 -75
- package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
- package/generator/test/generic_mock_api_tests/data/image.png +0 -0
- package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
- package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
- package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
- package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
- package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
- package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
- package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
- package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
- package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
- package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
- package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
- package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
- package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
- package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
- package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
- package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
- package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
- package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
- package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
- package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
- package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
- package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
- package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
- package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
- package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
- package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
- package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
- package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
- package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
- package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
- package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
- package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
- package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
- package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
- package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
- package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
- package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
- package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
- package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
- package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
- package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
- package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
- package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
- package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
- package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
- package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
- package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
- package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
- package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
- package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
- package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
- package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
- package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
- package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
- package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
- package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
- package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
- package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
- package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
- package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
- package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
- package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
- package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
- package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
- package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
- package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
- package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
- package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
- package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
- package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
- package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
- package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
- package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
- package/generator/test/unbranded/requirements.txt +0 -69
- package/generator/test/unbranded/tox.ini +0 -64
- package/generator/test/unittests/conftest.py +0 -15
- package/generator/test/unittests/requirements.txt +0 -3
- package/generator/test/unittests/test_enums.py +0 -89
- package/generator/test/unittests/test_model_base_serialization.py +0 -4906
- package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
- package/generator/test/unittests/test_name_converter.py +0 -35
- package/generator/test/unittests/test_optional_return_type.py +0 -268
- package/generator/test/unittests/test_parameter_ordering.py +0 -104
- package/generator/test/unittests/test_sort_schema.py +0 -93
- package/generator/test/unittests/tox.ini +0 -5
- /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
package/emitter/src/lib.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SdkContext,
|
|
3
|
+
SdkType,
|
|
3
4
|
UnbrandedSdkEmitterOptions,
|
|
4
5
|
} from "@azure-tools/typespec-client-generator-core";
|
|
5
6
|
import { createTypeSpecLibrary, JSONSchemaType, paramMessage } from "@typespec/compiler";
|
|
@@ -24,10 +25,14 @@ export interface PythonEmitterOptions {
|
|
|
24
25
|
"use-pyodide"?: boolean;
|
|
25
26
|
"keep-setup-py"?: boolean;
|
|
26
27
|
"clear-output-folder"?: boolean;
|
|
28
|
+
"emit-yaml-only"?: boolean;
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
export interface PythonSdkContext extends SdkContext<PythonEmitterOptions> {
|
|
30
32
|
__endpointPathParameters: Record<string, any>[];
|
|
33
|
+
__typesMap: Map<SdkType, Record<string, any>>;
|
|
34
|
+
__simpleTypesMap: Map<string | null, Record<string, any>>;
|
|
35
|
+
__disableGenerationMap: Set<SdkType>;
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
export const PythonEmitterOptionsSchema: JSONSchemaType<PythonEmitterOptions> = {
|
|
@@ -106,6 +111,12 @@ export const PythonEmitterOptionsSchema: JSONSchemaType<PythonEmitterOptions> =
|
|
|
106
111
|
description:
|
|
107
112
|
"Whether to clear the output folder before generating the code. Defaults to `false`.",
|
|
108
113
|
},
|
|
114
|
+
"emit-yaml-only": {
|
|
115
|
+
type: "boolean",
|
|
116
|
+
nullable: true,
|
|
117
|
+
description:
|
|
118
|
+
"Emit YAML code model only, without running Python generator. For batch processing.",
|
|
119
|
+
},
|
|
109
120
|
},
|
|
110
121
|
required: [],
|
|
111
122
|
};
|
|
@@ -127,6 +138,19 @@ const libDef = {
|
|
|
127
138
|
"Python is not installed. Please follow https://www.python.org/ to install Python or set 'use-pyodide' to true.",
|
|
128
139
|
},
|
|
129
140
|
},
|
|
141
|
+
"no-sdk-clients": {
|
|
142
|
+
severity: "error",
|
|
143
|
+
messages: {
|
|
144
|
+
default:
|
|
145
|
+
"The Python emitter did not find any SDK clients in this TypeSpec program. The current Python generator expects at least one client/service to generate code.",
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
"browser-runtime-load-failed": {
|
|
149
|
+
severity: "error",
|
|
150
|
+
messages: {
|
|
151
|
+
default: paramMessage`Failed to initialize the browser Python runtime.${"details"}`,
|
|
152
|
+
},
|
|
153
|
+
},
|
|
130
154
|
"invalid-paging-items": {
|
|
131
155
|
severity: "warning",
|
|
132
156
|
messages: {
|
|
@@ -11,7 +11,7 @@ import { patchPythonPath } from "./system-requirements.js";
|
|
|
11
11
|
|
|
12
12
|
export async function runPython3(...args: string[]) {
|
|
13
13
|
const command = await patchPythonPath(["python", ...args], {
|
|
14
|
-
version: ">=3.
|
|
14
|
+
version: ">=3.10",
|
|
15
15
|
environmentVariable: "AUTOREST_PYTHON_EXE",
|
|
16
16
|
});
|
|
17
17
|
cp.execSync(command.join(" "), {
|
|
@@ -16,8 +16,8 @@ const execute = (
|
|
|
16
16
|
options.onCreate(cp);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
options.onStdOutData
|
|
20
|
-
options.onStdErrData
|
|
19
|
+
if (options.onStdOutData) cp.stdout.on("data", options.onStdOutData);
|
|
20
|
+
if (options.onStdErrData) cp.stderr.on("data", options.onStdErrData);
|
|
21
21
|
|
|
22
22
|
let err = "";
|
|
23
23
|
let out = "";
|
|
@@ -34,7 +34,7 @@ const execute = (
|
|
|
34
34
|
cp.on("error", (err) => {
|
|
35
35
|
reject(err);
|
|
36
36
|
});
|
|
37
|
-
cp.on("close", (code,
|
|
37
|
+
cp.on("close", (code, _signal) =>
|
|
38
38
|
resolve({
|
|
39
39
|
stdout: out,
|
|
40
40
|
stderr: err,
|
|
@@ -110,7 +110,7 @@ const tryPython = async (
|
|
|
110
110
|
`"${PRINT_PYTHON_VERSION_SCRIPT}"`,
|
|
111
111
|
]);
|
|
112
112
|
return validateVersionRequirement(resolution, result.stdout.trim(), requirement);
|
|
113
|
-
} catch
|
|
113
|
+
} catch {
|
|
114
114
|
return {
|
|
115
115
|
error: true,
|
|
116
116
|
...resolution,
|
package/emitter/src/types.ts
CHANGED
|
@@ -28,10 +28,6 @@ import {
|
|
|
28
28
|
getImplementation,
|
|
29
29
|
} from "./utils.js";
|
|
30
30
|
|
|
31
|
-
export const typesMap = new Map<SdkType, Record<string, any>>();
|
|
32
|
-
export const simpleTypesMap = new Map<string | null, Record<string, any>>();
|
|
33
|
-
export const disableGenerationMap = new Set<SdkType>();
|
|
34
|
-
|
|
35
31
|
export interface CredentialType {
|
|
36
32
|
kind: "Credential";
|
|
37
33
|
scheme: HttpAuth;
|
|
@@ -59,13 +55,16 @@ function isEmptyModel(type: SdkType): boolean {
|
|
|
59
55
|
);
|
|
60
56
|
}
|
|
61
57
|
|
|
62
|
-
export function getSimpleTypeResult(
|
|
58
|
+
export function getSimpleTypeResult(
|
|
59
|
+
context: PythonSdkContext,
|
|
60
|
+
result: Record<string, any>,
|
|
61
|
+
): Record<string, any> {
|
|
63
62
|
const key = dump(result, { sortKeys: true });
|
|
64
|
-
const value =
|
|
63
|
+
const value = context.__simpleTypesMap.get(key);
|
|
65
64
|
if (value) {
|
|
66
65
|
result = value;
|
|
67
66
|
} else {
|
|
68
|
-
|
|
67
|
+
context.__simpleTypesMap.set(key, result);
|
|
69
68
|
}
|
|
70
69
|
return result;
|
|
71
70
|
}
|
|
@@ -82,16 +81,16 @@ export function getType(
|
|
|
82
81
|
case "enum":
|
|
83
82
|
return emitEnum(context, type);
|
|
84
83
|
case "constant":
|
|
85
|
-
return emitConstant(type)!;
|
|
84
|
+
return emitConstant(context, type)!;
|
|
86
85
|
case "array":
|
|
87
86
|
case "dict":
|
|
88
87
|
return emitArrayOrDict(context, type)!;
|
|
89
88
|
case "utcDateTime":
|
|
90
89
|
case "offsetDateTime":
|
|
91
90
|
case "duration":
|
|
92
|
-
return emitDurationOrDateType(type);
|
|
91
|
+
return emitDurationOrDateType(context, type);
|
|
93
92
|
case "enumvalue":
|
|
94
|
-
return emitEnumMember(type, emitEnum(context, type.enumType));
|
|
93
|
+
return emitEnumMember(context, type, emitEnum(context, type.enumType));
|
|
95
94
|
case "credential":
|
|
96
95
|
return emitCredential(context, type);
|
|
97
96
|
case "bytes":
|
|
@@ -116,7 +115,7 @@ export function getType(
|
|
|
116
115
|
case "decimal128":
|
|
117
116
|
case "string":
|
|
118
117
|
case "url":
|
|
119
|
-
return emitBuiltInType(type);
|
|
118
|
+
return emitBuiltInType(context, type);
|
|
120
119
|
case "unknown":
|
|
121
120
|
return KnownTypes.any;
|
|
122
121
|
case "nullable":
|
|
@@ -133,12 +132,12 @@ function emitMultiPartFile(
|
|
|
133
132
|
type: MultiPartFileType,
|
|
134
133
|
): Record<string, any> {
|
|
135
134
|
if (type.type.kind === "array") {
|
|
136
|
-
return getSimpleTypeResult({
|
|
135
|
+
return getSimpleTypeResult(context, {
|
|
137
136
|
type: "list",
|
|
138
137
|
elementType: getType(context, createMultiPartFileType(type.type.valueType)),
|
|
139
138
|
});
|
|
140
139
|
}
|
|
141
|
-
return getSimpleTypeResult({
|
|
140
|
+
return getSimpleTypeResult(context, {
|
|
142
141
|
type: type.kind,
|
|
143
142
|
description: type.type.summary ? type.type.summary : type.type.doc,
|
|
144
143
|
});
|
|
@@ -183,7 +182,7 @@ function emitCredential(
|
|
|
183
182
|
},
|
|
184
183
|
};
|
|
185
184
|
}
|
|
186
|
-
return getSimpleTypeResult(credential_type);
|
|
185
|
+
return getSimpleTypeResult(context, credential_type);
|
|
187
186
|
}
|
|
188
187
|
|
|
189
188
|
function visibilityMapping(visibility?: Visibility[]): string[] | undefined {
|
|
@@ -211,14 +210,14 @@ function createMultiPartFileType(type: SdkType): MultiPartFileType {
|
|
|
211
210
|
return { kind: "multipartfile", type };
|
|
212
211
|
}
|
|
213
212
|
|
|
214
|
-
function addDisableGenerationMap(type: SdkType): void {
|
|
215
|
-
if (
|
|
213
|
+
function addDisableGenerationMap(context: PythonSdkContext, type: SdkType): void {
|
|
214
|
+
if (context.__disableGenerationMap.has(type)) return;
|
|
216
215
|
|
|
217
|
-
|
|
216
|
+
context.__disableGenerationMap.add(type);
|
|
218
217
|
if (type.kind === "model" && type.baseModel) {
|
|
219
|
-
addDisableGenerationMap(type.baseModel);
|
|
218
|
+
addDisableGenerationMap(context, type.baseModel);
|
|
220
219
|
} else if (type.kind === "array") {
|
|
221
|
-
addDisableGenerationMap(type.valueType);
|
|
220
|
+
addDisableGenerationMap(context, type.valueType);
|
|
222
221
|
}
|
|
223
222
|
}
|
|
224
223
|
|
|
@@ -231,7 +230,7 @@ function emitProperty(
|
|
|
231
230
|
if (isMultipartFileInput) {
|
|
232
231
|
sourceType = createMultiPartFileType(property.type);
|
|
233
232
|
// Python convert all the type of file part to FileType so clear these models' usage so that they won't be generated
|
|
234
|
-
addDisableGenerationMap(property.type);
|
|
233
|
+
addDisableGenerationMap(context, property.type);
|
|
235
234
|
}
|
|
236
235
|
return {
|
|
237
236
|
clientName: camelToSnakeCase(property.name),
|
|
@@ -250,6 +249,7 @@ function emitProperty(
|
|
|
250
249
|
isMultipartFileInput: isMultipartFileInput,
|
|
251
250
|
xmlMetadata: getXmlMetadata(property),
|
|
252
251
|
encode: property.encode,
|
|
252
|
+
clientDefaultValue: property.clientDefaultValue,
|
|
253
253
|
};
|
|
254
254
|
}
|
|
255
255
|
|
|
@@ -257,8 +257,8 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
|
|
|
257
257
|
if (isEmptyModel(type)) {
|
|
258
258
|
return KnownTypes.any;
|
|
259
259
|
}
|
|
260
|
-
if (
|
|
261
|
-
return
|
|
260
|
+
if (context.__typesMap.has(type)) {
|
|
261
|
+
return context.__typesMap.get(type)!;
|
|
262
262
|
}
|
|
263
263
|
if (type.crossLanguageDefinitionId === "Azure.Core.Foundations.Error") {
|
|
264
264
|
return {
|
|
@@ -275,7 +275,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
|
|
|
275
275
|
};
|
|
276
276
|
}
|
|
277
277
|
if (type.external) {
|
|
278
|
-
return getSimpleTypeResult({
|
|
278
|
+
return getSimpleTypeResult(context, {
|
|
279
279
|
type: "external",
|
|
280
280
|
externalTypeInfo: type.external,
|
|
281
281
|
});
|
|
@@ -299,7 +299,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
|
|
|
299
299
|
clientNamespace: getClientNamespace(context, type.namespace),
|
|
300
300
|
};
|
|
301
301
|
|
|
302
|
-
|
|
302
|
+
context.__typesMap.set(type, newValue);
|
|
303
303
|
newValue.parents = type.baseModel ? [getType(context, type.baseModel)] : newValue.parents;
|
|
304
304
|
for (const property of type.properties.values()) {
|
|
305
305
|
if (property.kind === "property" && !isHttpMetadata(context, property)) {
|
|
@@ -309,7 +309,7 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
|
|
|
309
309
|
if (type.discriminatedSubtypes && property.discriminator) {
|
|
310
310
|
newValue.properties[newValue.properties.length - 1].isPolymorphic = true;
|
|
311
311
|
if (property.type.kind === "string") {
|
|
312
|
-
newValue.properties[newValue.properties.length - 1].type = getConstantType(null);
|
|
312
|
+
newValue.properties[newValue.properties.length - 1].type = getConstantType(context, null);
|
|
313
313
|
}
|
|
314
314
|
}
|
|
315
315
|
}
|
|
@@ -322,25 +322,28 @@ function emitModel(context: PythonSdkContext, type: SdkModelType): Record<string
|
|
|
322
322
|
return newValue;
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
function getConstantFromEnumValueType(
|
|
326
|
-
|
|
325
|
+
function getConstantFromEnumValueType(
|
|
326
|
+
context: PythonSdkContext,
|
|
327
|
+
type: SdkEnumValueType,
|
|
328
|
+
): Record<string, any> {
|
|
329
|
+
return getSimpleTypeResult(context, {
|
|
327
330
|
type: "constant",
|
|
328
331
|
value: type.value,
|
|
329
|
-
valueType: emitBuiltInType(type.valueType),
|
|
332
|
+
valueType: emitBuiltInType(context, type.valueType),
|
|
330
333
|
});
|
|
331
334
|
}
|
|
332
335
|
|
|
333
336
|
function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string, any> {
|
|
334
|
-
if (
|
|
335
|
-
return
|
|
337
|
+
if (context.__typesMap.has(type)) {
|
|
338
|
+
return context.__typesMap.get(type)!;
|
|
336
339
|
}
|
|
337
340
|
if (type.isGeneratedName) {
|
|
338
341
|
const types = [];
|
|
339
342
|
for (const value of type.values) {
|
|
340
|
-
types.push(getConstantFromEnumValueType(value));
|
|
343
|
+
types.push(getConstantFromEnumValueType(context, value));
|
|
341
344
|
}
|
|
342
345
|
if (!type.isFixed) {
|
|
343
|
-
types.push(emitBuiltInType(type.valueType));
|
|
346
|
+
types.push(emitBuiltInType(context, type.valueType));
|
|
344
347
|
}
|
|
345
348
|
|
|
346
349
|
const newValue = {
|
|
@@ -350,7 +353,7 @@ function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string,
|
|
|
350
353
|
types,
|
|
351
354
|
xmlMetadata: {},
|
|
352
355
|
};
|
|
353
|
-
|
|
356
|
+
context.__typesMap.set(type, newValue);
|
|
354
357
|
return newValue;
|
|
355
358
|
}
|
|
356
359
|
const values: Record<string, any>[] = [];
|
|
@@ -361,36 +364,34 @@ function emitEnum(context: PythonSdkContext, type: SdkEnumType): Record<string,
|
|
|
361
364
|
description: (type.summary ? type.summary : type.doc) ?? `Type of ${name}`,
|
|
362
365
|
internal: type.access === "internal",
|
|
363
366
|
type: type.kind,
|
|
364
|
-
valueType: emitBuiltInType(type.valueType),
|
|
367
|
+
valueType: emitBuiltInType(context, type.valueType),
|
|
365
368
|
values,
|
|
366
369
|
xmlMetadata: {},
|
|
367
370
|
crossLanguageDefinitionId: type.crossLanguageDefinitionId,
|
|
368
371
|
clientNamespace: getClientNamespace(context, type.namespace),
|
|
369
372
|
};
|
|
370
373
|
for (const value of type.values) {
|
|
371
|
-
newValue.values.push(emitEnumMember(value, newValue));
|
|
374
|
+
newValue.values.push(emitEnumMember(context, value, newValue));
|
|
372
375
|
}
|
|
373
|
-
|
|
376
|
+
context.__typesMap.set(type, newValue);
|
|
374
377
|
return newValue;
|
|
375
378
|
}
|
|
376
379
|
|
|
377
380
|
function enumName(name: string): string {
|
|
378
|
-
if (name.toUpperCase() === name) {
|
|
379
|
-
return name;
|
|
380
|
-
}
|
|
381
381
|
return camelToSnakeCase(name).toUpperCase();
|
|
382
382
|
}
|
|
383
383
|
|
|
384
384
|
function emitEnumMember(
|
|
385
|
+
context: PythonSdkContext,
|
|
385
386
|
type: SdkEnumValueType,
|
|
386
387
|
enumType: Record<string, any>,
|
|
387
388
|
): Record<string, any> {
|
|
388
|
-
if (
|
|
389
|
-
return
|
|
389
|
+
if (context.__typesMap.has(type)) {
|
|
390
|
+
return context.__typesMap.get(type)!;
|
|
390
391
|
}
|
|
391
392
|
// python don't generate enum created by TCGC, so we shall not generate type for enum member of the enum, either.
|
|
392
393
|
if (type.enumType.isGeneratedName) {
|
|
393
|
-
return getConstantFromEnumValueType(type);
|
|
394
|
+
return getConstantFromEnumValueType(context, type);
|
|
394
395
|
}
|
|
395
396
|
|
|
396
397
|
const result = {
|
|
@@ -401,14 +402,17 @@ function emitEnumMember(
|
|
|
401
402
|
type: type.kind,
|
|
402
403
|
valueType: enumType["valueType"],
|
|
403
404
|
};
|
|
404
|
-
|
|
405
|
+
context.__typesMap.set(type, result);
|
|
405
406
|
return result;
|
|
406
407
|
}
|
|
407
408
|
|
|
408
|
-
function emitDurationOrDateType(
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
409
|
+
function emitDurationOrDateType(
|
|
410
|
+
context: PythonSdkContext,
|
|
411
|
+
type: SdkDurationType | SdkDateTimeType,
|
|
412
|
+
): Record<string, any> {
|
|
413
|
+
return getSimpleTypeResult(context, {
|
|
414
|
+
...emitBuiltInType(context, type),
|
|
415
|
+
wireType: emitBuiltInType(context, type.wireType),
|
|
412
416
|
});
|
|
413
417
|
}
|
|
414
418
|
|
|
@@ -417,17 +421,17 @@ function emitArrayOrDict(
|
|
|
417
421
|
type: SdkArrayType | SdkDictionaryType,
|
|
418
422
|
): Record<string, any> {
|
|
419
423
|
const kind = type.kind === "array" ? "list" : type.kind;
|
|
420
|
-
return getSimpleTypeResult({
|
|
424
|
+
return getSimpleTypeResult(context, {
|
|
421
425
|
type: kind,
|
|
422
426
|
elementType: getType(context, type.valueType),
|
|
423
427
|
});
|
|
424
428
|
}
|
|
425
429
|
|
|
426
|
-
function emitConstant(type: SdkConstantType) {
|
|
427
|
-
return getSimpleTypeResult({
|
|
430
|
+
function emitConstant(context: PythonSdkContext, type: SdkConstantType) {
|
|
431
|
+
return getSimpleTypeResult(context, {
|
|
428
432
|
type: type.kind,
|
|
429
433
|
value: type.value,
|
|
430
|
-
valueType: emitBuiltInType(type.valueType),
|
|
434
|
+
valueType: emitBuiltInType(context, type.valueType),
|
|
431
435
|
});
|
|
432
436
|
}
|
|
433
437
|
|
|
@@ -461,12 +465,13 @@ const sdkScalarKindToPythonKind: Record<string, string> = {
|
|
|
461
465
|
};
|
|
462
466
|
|
|
463
467
|
function emitBuiltInType(
|
|
468
|
+
context: PythonSdkContext,
|
|
464
469
|
type: SdkBuiltInType | SdkDurationType | SdkDateTimeType,
|
|
465
470
|
): Record<string, any> {
|
|
466
471
|
if (type.encode) {
|
|
467
472
|
if (type.kind === "duration") {
|
|
468
473
|
if (type.encode === "ISO8601") {
|
|
469
|
-
return getSimpleTypeResult({
|
|
474
|
+
return getSimpleTypeResult(context, {
|
|
470
475
|
type: type.kind,
|
|
471
476
|
encode: type.encode,
|
|
472
477
|
});
|
|
@@ -474,13 +479,13 @@ function emitBuiltInType(
|
|
|
474
479
|
}
|
|
475
480
|
if (type.kind === "utcDateTime" || type.kind === "offsetDateTime") {
|
|
476
481
|
if (type.encode === "unixTimestamp") {
|
|
477
|
-
return getSimpleTypeResult({
|
|
482
|
+
return getSimpleTypeResult(context, {
|
|
478
483
|
type: "unixtime",
|
|
479
484
|
encode: type.encode,
|
|
480
485
|
});
|
|
481
486
|
}
|
|
482
487
|
if (type.encode === "rfc3339" || type.encode === "rfc7231") {
|
|
483
|
-
return getSimpleTypeResult({
|
|
488
|
+
return getSimpleTypeResult(context, {
|
|
484
489
|
type: type.kind,
|
|
485
490
|
encode: type.encode,
|
|
486
491
|
});
|
|
@@ -489,21 +494,21 @@ function emitBuiltInType(
|
|
|
489
494
|
|
|
490
495
|
// fallback to wire type for unknown or unsupported encode
|
|
491
496
|
if ("wireType" in type && type.wireType !== undefined) {
|
|
492
|
-
return getSimpleTypeResult({
|
|
497
|
+
return getSimpleTypeResult(context, {
|
|
493
498
|
type: sdkScalarKindToPythonKind[type.wireType.kind] || type.wireType.kind,
|
|
494
499
|
encode: type.encode,
|
|
495
500
|
});
|
|
496
501
|
}
|
|
497
502
|
}
|
|
498
503
|
|
|
499
|
-
return getSimpleTypeResult({
|
|
504
|
+
return getSimpleTypeResult(context, {
|
|
500
505
|
type: sdkScalarKindToPythonKind[type.kind] || type.kind, // TODO: switch to kind
|
|
501
506
|
encode: type.encode,
|
|
502
507
|
});
|
|
503
508
|
}
|
|
504
509
|
|
|
505
510
|
function emitUnion(context: PythonSdkContext, type: SdkUnionType): Record<string, any> {
|
|
506
|
-
return getSimpleTypeResult({
|
|
511
|
+
return getSimpleTypeResult(context, {
|
|
507
512
|
name: type.isGeneratedName ? undefined : type.name,
|
|
508
513
|
snakeCaseName: type.isGeneratedName ? undefined : camelToSnakeCase(type.name),
|
|
509
514
|
description: type.isGeneratedName ? "" : `Type of ${type.name}`,
|
|
@@ -515,8 +520,11 @@ function emitUnion(context: PythonSdkContext, type: SdkUnionType): Record<string
|
|
|
515
520
|
});
|
|
516
521
|
}
|
|
517
522
|
|
|
518
|
-
export function getConstantType(
|
|
519
|
-
|
|
523
|
+
export function getConstantType(
|
|
524
|
+
context: PythonSdkContext,
|
|
525
|
+
key: string | null,
|
|
526
|
+
): Record<string, any> {
|
|
527
|
+
const cache = context.__simpleTypesMap.get(key);
|
|
520
528
|
if (cache) {
|
|
521
529
|
return cache;
|
|
522
530
|
}
|
|
@@ -527,7 +535,7 @@ export function getConstantType(key: string | null): Record<string, any> {
|
|
|
527
535
|
valueType: KnownTypes.string,
|
|
528
536
|
xmlMetadata: {},
|
|
529
537
|
};
|
|
530
|
-
|
|
538
|
+
context.__simpleTypesMap.set(key, type);
|
|
531
539
|
return type;
|
|
532
540
|
}
|
|
533
541
|
|
|
@@ -537,6 +545,22 @@ export const KnownTypes = {
|
|
|
537
545
|
any: { type: "any" },
|
|
538
546
|
};
|
|
539
547
|
|
|
548
|
+
/**
|
|
549
|
+
* Detect whether an endpoint template parameter should be treated as an API
|
|
550
|
+
* version parameter even when TCGC does not flag it as such. This is a
|
|
551
|
+
* compatibility shim for unreleased TCGC changes that gate the name-based
|
|
552
|
+
* heuristic on `isMetadata`, which excludes server template parameters.
|
|
553
|
+
*/
|
|
554
|
+
function isEndpointApiVersionFallback(
|
|
555
|
+
param: { name: string; isApiVersionParam: boolean },
|
|
556
|
+
serviceApiVersions: string[],
|
|
557
|
+
): boolean {
|
|
558
|
+
if (param.isApiVersionParam) return false;
|
|
559
|
+
if (serviceApiVersions.length === 0) return false;
|
|
560
|
+
const lower = param.name.toLowerCase();
|
|
561
|
+
return lower === "apiversion" || lower === "api-version";
|
|
562
|
+
}
|
|
563
|
+
|
|
540
564
|
export function emitEndpointType(
|
|
541
565
|
context: PythonSdkContext,
|
|
542
566
|
type: SdkEndpointType,
|
|
@@ -546,13 +570,29 @@ export function emitEndpointType(
|
|
|
546
570
|
for (const param of type.templateArguments) {
|
|
547
571
|
const paramBase = emitParamBase(context, param, undefined, serviceApiVersions);
|
|
548
572
|
paramBase.clientName = context.arm ? "base_url" : paramBase.clientName;
|
|
573
|
+
|
|
574
|
+
let effectiveClientDefaultValue = param.clientDefaultValue;
|
|
575
|
+
// If this endpoint template param looks like an api-version but TCGC
|
|
576
|
+
// did not flag it, apply fallback: mark as api version and derive defaults.
|
|
577
|
+
if (isEndpointApiVersionFallback(param, serviceApiVersions)) {
|
|
578
|
+
paramBase.isApiVersion = true;
|
|
579
|
+
if (!effectiveClientDefaultValue) {
|
|
580
|
+
effectiveClientDefaultValue = serviceApiVersions[serviceApiVersions.length - 1];
|
|
581
|
+
}
|
|
582
|
+
paramBase.type = getSimpleTypeResult(context, {
|
|
583
|
+
type: "constant",
|
|
584
|
+
value: effectiveClientDefaultValue,
|
|
585
|
+
valueType: paramBase.type,
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
|
|
549
589
|
params.push({
|
|
550
590
|
...paramBase,
|
|
551
|
-
optional: Boolean(
|
|
591
|
+
optional: Boolean(effectiveClientDefaultValue),
|
|
552
592
|
wireName: param.name,
|
|
553
593
|
location: "endpointPath",
|
|
554
594
|
implementation: getImplementation(context, param),
|
|
555
|
-
clientDefaultValue:
|
|
595
|
+
clientDefaultValue: effectiveClientDefaultValue,
|
|
556
596
|
skipUrlEncoding: param.allowReserved,
|
|
557
597
|
});
|
|
558
598
|
context.__endpointPathParameters!.push(params.at(-1)!);
|
package/emitter/src/utils.ts
CHANGED
|
@@ -213,7 +213,7 @@ export function emitParamBase<TServiceOperation extends SdkServiceOperation>(
|
|
|
213
213
|
let type = getType(context, parameter.type);
|
|
214
214
|
if (parameter.isApiVersionParam) {
|
|
215
215
|
if (parameter.clientDefaultValue) {
|
|
216
|
-
type = getSimpleTypeResult({
|
|
216
|
+
type = getSimpleTypeResult(context, {
|
|
217
217
|
type: "constant",
|
|
218
218
|
value: parameter.clientDefaultValue,
|
|
219
219
|
valueType: type,
|
|
@@ -262,6 +262,7 @@ export function capitalize(name: string): string {
|
|
|
262
262
|
return name[0].toUpperCase() + name.slice(1);
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
// Library namespaces that should not be used as client namespaces
|
|
265
266
|
const LIB_NAMESPACE = [
|
|
266
267
|
"azure.core",
|
|
267
268
|
"azure.resourcemanager",
|
|
@@ -272,29 +273,25 @@ const LIB_NAMESPACE = [
|
|
|
272
273
|
];
|
|
273
274
|
|
|
274
275
|
export function getRootNamespace(context: PythonSdkContext): string {
|
|
275
|
-
let rootNamespace = "";
|
|
276
276
|
if (context.sdkPackage.clients.length > 0) {
|
|
277
|
-
|
|
278
|
-
} else if (context.sdkPackage.models.length > 0) {
|
|
279
|
-
const result = context.sdkPackage.models
|
|
280
|
-
.map((model) => model.namespace)
|
|
281
|
-
.filter((namespace) => !LIB_NAMESPACE.includes(namespace));
|
|
282
|
-
if (result.length > 0) {
|
|
283
|
-
result.sort();
|
|
284
|
-
rootNamespace = result[0];
|
|
285
|
-
}
|
|
277
|
+
return context.sdkPackage.clients[0].namespace.toLowerCase();
|
|
286
278
|
} else if (context.sdkPackage.namespaces.length > 0) {
|
|
287
|
-
|
|
279
|
+
return context.sdkPackage.namespaces[0].fullName.toLowerCase();
|
|
288
280
|
}
|
|
281
|
+
return "";
|
|
282
|
+
}
|
|
289
283
|
|
|
290
|
-
|
|
284
|
+
function isLibraryNamespace(namespace: string): boolean {
|
|
285
|
+
const ns = namespace.toLowerCase();
|
|
286
|
+
return LIB_NAMESPACE.some((lib) => ns.startsWith(lib));
|
|
291
287
|
}
|
|
292
288
|
|
|
293
289
|
export function getClientNamespace(context: PythonSdkContext, clientNamespace: string) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
290
|
+
// Namespace precedence: @clientNamespace > --namespace > original namespace
|
|
291
|
+
// These are resolved by TCGC and passed in as clientNamespace.
|
|
292
|
+
// However, models from library namespaces (azure.core, azure.resourcemanager, etc.)
|
|
293
|
+
// should use the SDK's root namespace instead.
|
|
294
|
+
if (clientNamespace === "" || isLibraryNamespace(clientNamespace)) {
|
|
298
295
|
return getRootNamespace(context);
|
|
299
296
|
}
|
|
300
297
|
return clientNamespace.toLowerCase();
|
|
@@ -320,7 +317,7 @@ function parseToken(token: Token): string {
|
|
|
320
317
|
case "codespan":
|
|
321
318
|
parsed += `\`\`${token.text}\`\``;
|
|
322
319
|
break;
|
|
323
|
-
case "code":
|
|
320
|
+
case "code": {
|
|
324
321
|
let codeBlockStyle = token.codeBlockStyle;
|
|
325
322
|
if (codeBlockStyle === undefined) {
|
|
326
323
|
codeBlockStyle = token.raw.split("\n")[0].replace("```", "").trim();
|
|
@@ -331,6 +328,7 @@ function parseToken(token: Token): string {
|
|
|
331
328
|
}
|
|
332
329
|
parsed += `\n\n.. code-block:: ${codeBlockStyle ?? ""}\n\n ${token.text.split("\n").join("\n ")}`;
|
|
333
330
|
break;
|
|
331
|
+
}
|
|
334
332
|
case "link":
|
|
335
333
|
if (token.href !== undefined) {
|
|
336
334
|
parsed += `\`${token.text} <${token.href}>\`_`;
|