@typespec/http-client-python 0.28.1 → 0.28.3
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 +6 -6
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +27 -28
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/lib.d.ts +4 -1
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.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 +55 -58
- 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 +6 -13
- package/emitter/src/emitter.ts +29 -31
- package/emitter/src/lib.ts +4 -0
- package/emitter/src/system-requirements.ts +4 -4
- package/emitter/src/types.ts +67 -57
- package/emitter/src/utils.ts +16 -18
- package/emitter/temp/tsconfig.tsbuildinfo +1 -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 +54 -0
- package/eng/scripts/ci/dev_requirements.txt +1 -0
- package/eng/scripts/ci/format.ts +232 -2
- package/eng/scripts/ci/lint.ts +216 -20
- package/eng/scripts/ci/regenerate-common.ts +18 -14
- package/eng/scripts/ci/regenerate.ts +305 -68
- package/eng/scripts/ci/run-tests.ts +402 -0
- package/eng/scripts/ci/run_mypy.py +4 -3
- package/eng/scripts/ci/run_pylint.py +4 -3
- package/eng/scripts/ci/run_pyright.py +4 -3
- package/eng/scripts/ci/typecheck.ts +225 -0
- package/eng/scripts/ci/util.py +1 -1
- 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 +1 -0
- package/eng/scripts/setup/install.py +1 -0
- package/eng/scripts/setup/prepare.py +1 -0
- package/eng/scripts/setup/prepare.ts +1 -1
- 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 -0
- package/generator/build/lib/pygen/codegen/models/operation.py +9 -8
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +157 -64
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/codegen/models/operation.py +9 -8
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +157 -64
- package/package.json +48 -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/{mypy.ini → config/mypy.ini} +0 -0
- /package/eng/scripts/ci/{pylintrc → config/pylintrc} +0 -0
- /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
- /package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +0 -0
|
@@ -622,57 +622,9 @@ class Model(_MyMutableMapping):
|
|
|
622
622
|
for rest_field in self._attr_to_rest_field.values()
|
|
623
623
|
if rest_field._default is not _UNSET
|
|
624
624
|
}
|
|
625
|
-
if args:
|
|
625
|
+
if args:
|
|
626
626
|
if isinstance(args[0], ET.Element):
|
|
627
|
-
|
|
628
|
-
model_meta = getattr(self, "_xml", {})
|
|
629
|
-
|
|
630
|
-
for rf in self._attr_to_rest_field.values():
|
|
631
|
-
prop_meta = getattr(rf, "_xml", {})
|
|
632
|
-
xml_name = prop_meta.get("name", rf._rest_name)
|
|
633
|
-
xml_ns = prop_meta.get("ns", model_meta.get("ns", None))
|
|
634
|
-
if xml_ns:
|
|
635
|
-
xml_name = "{" + xml_ns + "}" + xml_name
|
|
636
|
-
|
|
637
|
-
# attribute
|
|
638
|
-
if prop_meta.get("attribute", False) and args[0].get(xml_name) is not None:
|
|
639
|
-
existed_attr_keys.append(xml_name)
|
|
640
|
-
dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].get(xml_name))
|
|
641
|
-
continue
|
|
642
|
-
|
|
643
|
-
# unwrapped element is array
|
|
644
|
-
if prop_meta.get("unwrapped", False):
|
|
645
|
-
# unwrapped array could either use prop items meta/prop meta
|
|
646
|
-
if prop_meta.get("itemsName"):
|
|
647
|
-
xml_name = prop_meta.get("itemsName")
|
|
648
|
-
xml_ns = prop_meta.get("itemNs")
|
|
649
|
-
if xml_ns:
|
|
650
|
-
xml_name = "{" + xml_ns + "}" + xml_name
|
|
651
|
-
items = args[0].findall(xml_name) # pyright: ignore
|
|
652
|
-
if len(items) > 0:
|
|
653
|
-
existed_attr_keys.append(xml_name)
|
|
654
|
-
dict_to_pass[rf._rest_name] = _deserialize(rf._type, items)
|
|
655
|
-
elif not rf._is_optional:
|
|
656
|
-
existed_attr_keys.append(xml_name)
|
|
657
|
-
dict_to_pass[rf._rest_name] = []
|
|
658
|
-
continue
|
|
659
|
-
|
|
660
|
-
# text element is primitive type
|
|
661
|
-
if prop_meta.get("text", False):
|
|
662
|
-
if args[0].text is not None:
|
|
663
|
-
dict_to_pass[rf._rest_name] = _deserialize(rf._type, args[0].text)
|
|
664
|
-
continue
|
|
665
|
-
|
|
666
|
-
# wrapped element could be normal property or array, it should only have one element
|
|
667
|
-
item = args[0].find(xml_name)
|
|
668
|
-
if item is not None:
|
|
669
|
-
existed_attr_keys.append(xml_name)
|
|
670
|
-
dict_to_pass[rf._rest_name] = _deserialize(rf._type, item)
|
|
671
|
-
|
|
672
|
-
# rest thing is additional properties
|
|
673
|
-
for e in args[0]:
|
|
674
|
-
if e.tag not in existed_attr_keys:
|
|
675
|
-
dict_to_pass[e.tag] = _convert_element(e)
|
|
627
|
+
dict_to_pass.update(self._init_from_xml(args[0]))
|
|
676
628
|
else:
|
|
677
629
|
dict_to_pass.update(
|
|
678
630
|
{k: _create_value(_get_rest_field(self._attr_to_rest_field, k), v) for k, v in args[0].items()}
|
|
@@ -691,6 +643,69 @@ class Model(_MyMutableMapping):
|
|
|
691
643
|
)
|
|
692
644
|
super().__init__(dict_to_pass)
|
|
693
645
|
|
|
646
|
+
def _init_from_xml(self, element: ET.Element) -> dict[str, typing.Any]:
|
|
647
|
+
"""Deserialize an XML element into a dict mapping rest field names to values.
|
|
648
|
+
|
|
649
|
+
:param ET.Element element: The XML element to deserialize from.
|
|
650
|
+
:returns: A dictionary of rest_name to deserialized value pairs.
|
|
651
|
+
:rtype: dict
|
|
652
|
+
"""
|
|
653
|
+
result: dict[str, typing.Any] = {}
|
|
654
|
+
model_meta = getattr(self, "_xml", {})
|
|
655
|
+
existed_attr_keys: list[str] = []
|
|
656
|
+
|
|
657
|
+
for rf in self._attr_to_rest_field.values():
|
|
658
|
+
prop_meta = getattr(rf, "_xml", {})
|
|
659
|
+
xml_name = prop_meta.get("name", rf._rest_name)
|
|
660
|
+
xml_ns = _resolve_xml_ns(prop_meta, model_meta)
|
|
661
|
+
if xml_ns:
|
|
662
|
+
xml_name = "{" + xml_ns + "}" + xml_name
|
|
663
|
+
|
|
664
|
+
# attribute
|
|
665
|
+
if prop_meta.get("attribute", False) and element.get(xml_name) is not None:
|
|
666
|
+
existed_attr_keys.append(xml_name)
|
|
667
|
+
result[rf._rest_name] = _deserialize(rf._type, element.get(xml_name))
|
|
668
|
+
continue
|
|
669
|
+
|
|
670
|
+
# unwrapped element is array
|
|
671
|
+
if prop_meta.get("unwrapped", False):
|
|
672
|
+
# unwrapped array could either use prop items meta/prop meta
|
|
673
|
+
_items_name = prop_meta.get("itemsName")
|
|
674
|
+
if _items_name:
|
|
675
|
+
xml_name = _items_name
|
|
676
|
+
_items_ns = prop_meta.get("itemsNs")
|
|
677
|
+
if _items_ns is not None:
|
|
678
|
+
xml_ns = _items_ns
|
|
679
|
+
if xml_ns:
|
|
680
|
+
xml_name = "{" + xml_ns + "}" + xml_name
|
|
681
|
+
items = element.findall(xml_name) # pyright: ignore
|
|
682
|
+
if len(items) > 0:
|
|
683
|
+
existed_attr_keys.append(xml_name)
|
|
684
|
+
result[rf._rest_name] = _deserialize(rf._type, items)
|
|
685
|
+
elif not rf._is_optional:
|
|
686
|
+
existed_attr_keys.append(xml_name)
|
|
687
|
+
result[rf._rest_name] = []
|
|
688
|
+
continue
|
|
689
|
+
|
|
690
|
+
# text element is primitive type
|
|
691
|
+
if prop_meta.get("text", False):
|
|
692
|
+
if element.text is not None:
|
|
693
|
+
result[rf._rest_name] = _deserialize(rf._type, element.text)
|
|
694
|
+
continue
|
|
695
|
+
|
|
696
|
+
# wrapped element could be normal property or array, it should only have one element
|
|
697
|
+
item = element.find(xml_name)
|
|
698
|
+
if item is not None:
|
|
699
|
+
existed_attr_keys.append(xml_name)
|
|
700
|
+
result[rf._rest_name] = _deserialize(rf._type, item)
|
|
701
|
+
|
|
702
|
+
# rest thing is additional properties
|
|
703
|
+
for e in element:
|
|
704
|
+
if e.tag not in existed_attr_keys:
|
|
705
|
+
result[e.tag] = _convert_element(e)
|
|
706
|
+
|
|
707
|
+
return result
|
|
708
|
+
|
|
694
709
|
def copy(self) -> "Model":
|
|
695
710
|
return Model(self.__dict__)
|
|
696
711
|
|
|
@@ -761,7 +776,7 @@ class Model(_MyMutableMapping):
|
|
|
761
776
|
model_meta = getattr(cls, "_xml", {})
|
|
762
777
|
prop_meta = getattr(discriminator, "_xml", {})
|
|
763
778
|
xml_name = prop_meta.get("name", discriminator._rest_name)
|
|
764
|
-
xml_ns = prop_meta
|
|
779
|
+
xml_ns = _resolve_xml_ns(prop_meta, model_meta)
|
|
765
780
|
if xml_ns:
|
|
766
781
|
xml_name = "{" + xml_ns + "}" + xml_name
|
|
767
782
|
|
|
@@ -1243,6 +1258,58 @@ def serialize_xml(model: Model, exclude_readonly: bool = False) -> str:
|
|
|
1243
1258
|
return ET.tostring(_get_element(model, exclude_readonly), encoding="unicode") # type: ignore
|
|
1244
1259
|
|
|
1245
1260
|
|
|
1261
|
+
def _get_xml_ns(meta: dict[str, typing.Any]) -> typing.Optional[str]:
|
|
1262
|
+
"""Return the XML namespace from a metadata dict, checking both 'ns' (old-style) and 'namespace' (DPG) keys.
|
|
1263
|
+
|
|
1264
|
+
:param dict meta: The metadata dictionary to extract namespace from.
|
|
1265
|
+
:returns: The namespace string if 'ns' or 'namespace' key is present, None otherwise.
|
|
1266
|
+
:rtype: str or None
|
|
1267
|
+
"""
|
|
1268
|
+
ns = meta.get("ns")
|
|
1269
|
+
if ns is None:
|
|
1270
|
+
ns = meta.get("namespace")
|
|
1271
|
+
return ns
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
def _resolve_xml_ns(
|
|
1275
|
+
prop_meta: dict[str, typing.Any], model_meta: typing.Optional[dict[str, typing.Any]] = None
|
|
1276
|
+
) -> typing.Optional[str]:
|
|
1277
|
+
"""Resolve XML namespace for a property, falling back to model namespace when appropriate.
|
|
1278
|
+
|
|
1279
|
+
Checks the property metadata first; if no namespace is found and the model does not declare
|
|
1280
|
+
an explicit prefix, falls back to the model-level namespace.
|
|
1281
|
+
|
|
1282
|
+
:param dict prop_meta: The property metadata dictionary.
|
|
1283
|
+
:param dict model_meta: The model metadata dictionary, used as fallback.
|
|
1284
|
+
:returns: The resolved namespace string, or None.
|
|
1285
|
+
:rtype: str or None
|
|
1286
|
+
"""
|
|
1287
|
+
ns = _get_xml_ns(prop_meta)
|
|
1288
|
+
if ns is None and model_meta is not None and not model_meta.get("prefix"):
|
|
1289
|
+
ns = _get_xml_ns(model_meta)
|
|
1290
|
+
return ns
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
def _set_xml_attribute(
|
|
1294
|
+
element: ET.Element, name: str, value: typing.Any, prop_meta: dict[str, typing.Any]
|
|
1295
|
+
) -> None:
|
|
1296
|
+
"""Set an XML attribute on an element, handling namespace prefix registration.
|
|
1297
|
+
|
|
1298
|
+
:param ET.Element element: The element to set the attribute on.
|
|
1299
|
+
:param str name: The default attribute name (wire name).
|
|
1300
|
+
:param any value: The attribute value.
|
|
1301
|
+
:param dict prop_meta: The property metadata dictionary.
|
|
1302
|
+
"""
|
|
1303
|
+
xml_name = prop_meta.get("name", name)
|
|
1304
|
+
_attr_ns = _get_xml_ns(prop_meta)
|
|
1305
|
+
if _attr_ns:
|
|
1306
|
+
_attr_prefix = prop_meta.get("prefix")
|
|
1307
|
+
if _attr_prefix:
|
|
1308
|
+
_safe_register_namespace(_attr_prefix, _attr_ns)
|
|
1309
|
+
xml_name = "{" + _attr_ns + "}" + xml_name
|
|
1310
|
+
element.set(xml_name, _get_primitive_type_value(value))
|
|
1311
|
+
|
|
1312
|
+
|
|
1246
1313
|
def _get_element(
|
|
1247
1314
|
o: typing.Any,
|
|
1248
1315
|
exclude_readonly: bool = False,
|
|
@@ -1254,10 +1321,16 @@ def _get_element(
|
|
|
1254
1321
|
|
|
1255
1322
|
# if prop is a model, then use the prop element directly, else generate a wrapper of model
|
|
1256
1323
|
if wrapped_element is None:
|
|
1324
|
+
# When serializing as an array item (parent_meta is set), check if the parent has an
|
|
1325
|
+
# explicit itemsName. This ensures correct element names for unwrapped arrays (where
|
|
1326
|
+
# the element tag is the property/items name, not the model type name).
|
|
1327
|
+
_items_name = parent_meta.get("itemsName") if parent_meta is not None else None
|
|
1328
|
+
element_name = _items_name if _items_name else (model_meta.get("name") or o.__class__.__name__)
|
|
1329
|
+
_model_ns = _get_xml_ns(model_meta)
|
|
1257
1330
|
wrapped_element = _create_xml_element(
|
|
1258
|
-
|
|
1331
|
+
element_name,
|
|
1259
1332
|
model_meta.get("prefix"),
|
|
1260
|
-
|
|
1333
|
+
_model_ns,
|
|
1261
1334
|
)
|
|
1262
1335
|
|
|
1263
1336
|
readonly_props = []
|
|
@@ -1279,7 +1352,9 @@ def _get_element(
|
|
|
1279
1352
|
# additional properties will not have rest field, use the wire name as xml name
|
|
1280
1353
|
prop_meta = {"name": k}
|
|
1281
1354
|
|
|
1282
|
-
#
|
|
1355
|
+
# Propagate model namespace to properties only for old-style "ns"-keyed models.
|
|
1356
|
+
# DPG-generated models use the "namespace" key and explicitly declare namespace on
|
|
1357
|
+
# each property that needs it, so propagation is intentionally skipped for them.
|
|
1283
1358
|
if prop_meta.get("ns") is None and model_meta.get("ns"):
|
|
1284
1359
|
prop_meta["ns"] = model_meta.get("ns")
|
|
1285
1360
|
prop_meta["prefix"] = model_meta.get("prefix")
|
|
@@ -1291,12 +1366,7 @@ def _get_element(
|
|
|
1291
1366
|
# text could only set on primitive type
|
|
1292
1367
|
wrapped_element.text = _get_primitive_type_value(v)
|
|
1293
1368
|
elif prop_meta.get("attribute", False):
|
|
1294
|
-
|
|
1295
|
-
if prop_meta.get("ns"):
|
|
1296
|
-
ET.register_namespace(prop_meta.get("prefix"), prop_meta.get("ns")) # pyright: ignore
|
|
1297
|
-
xml_name = "{" + prop_meta.get("ns") + "}" + xml_name # pyright: ignore
|
|
1298
|
-
# attribute should be primitive type
|
|
1299
|
-
wrapped_element.set(xml_name, _get_primitive_type_value(v))
|
|
1369
|
+
_set_xml_attribute(wrapped_element, k, v, prop_meta)
|
|
1300
1370
|
else:
|
|
1301
1371
|
# other wrapped prop element
|
|
1302
1372
|
wrapped_element.append(_get_wrapped_element(v, exclude_readonly, prop_meta))
|
|
@@ -1305,6 +1375,7 @@ def _get_element(
|
|
|
1305
1375
|
return [_get_element(x, exclude_readonly, parent_meta) for x in o] # type: ignore
|
|
1306
1376
|
if isinstance(o, dict):
|
|
1307
1377
|
result = []
|
|
1378
|
+
_dict_ns = _get_xml_ns(parent_meta) if parent_meta else None
|
|
1308
1379
|
for k, v in o.items():
|
|
1309
1380
|
result.append(
|
|
1310
1381
|
_get_wrapped_element(
|
|
@@ -1312,7 +1383,7 @@ def _get_element(
|
|
|
1312
1383
|
exclude_readonly,
|
|
1313
1384
|
{
|
|
1314
1385
|
"name": k,
|
|
1315
|
-
"ns":
|
|
1386
|
+
"ns": _dict_ns,
|
|
1316
1387
|
"prefix": parent_meta.get("prefix") if parent_meta else None,
|
|
1317
1388
|
},
|
|
1318
1389
|
)
|
|
@@ -1321,13 +1392,16 @@ def _get_element(
|
|
|
1321
1392
|
|
|
1322
1393
|
# primitive case need to create element based on parent_meta
|
|
1323
1394
|
if parent_meta:
|
|
1395
|
+
_items_ns = parent_meta.get("itemsNs")
|
|
1396
|
+
if _items_ns is None:
|
|
1397
|
+
_items_ns = _get_xml_ns(parent_meta)
|
|
1324
1398
|
return _get_wrapped_element(
|
|
1325
1399
|
o,
|
|
1326
1400
|
exclude_readonly,
|
|
1327
1401
|
{
|
|
1328
1402
|
"name": parent_meta.get("itemsName", parent_meta.get("name")),
|
|
1329
1403
|
"prefix": parent_meta.get("itemsPrefix", parent_meta.get("prefix")),
|
|
1330
|
-
"ns":
|
|
1404
|
+
"ns": _items_ns,
|
|
1331
1405
|
},
|
|
1332
1406
|
)
|
|
1333
1407
|
|
|
@@ -1339,8 +1413,9 @@ def _get_wrapped_element(
|
|
|
1339
1413
|
exclude_readonly: bool,
|
|
1340
1414
|
meta: typing.Optional[dict[str, typing.Any]],
|
|
1341
1415
|
) -> ET.Element:
|
|
1416
|
+
_meta_ns = _get_xml_ns(meta) if meta else None
|
|
1342
1417
|
wrapped_element = _create_xml_element(
|
|
1343
|
-
meta.get("name") if meta else None, meta.get("prefix") if meta else None,
|
|
1418
|
+
meta.get("name") if meta else None, meta.get("prefix") if meta else None, _meta_ns
|
|
1344
1419
|
)
|
|
1345
1420
|
if isinstance(v, (dict, list)):
|
|
1346
1421
|
wrapped_element.extend(_get_element(v, exclude_readonly, meta))
|
|
@@ -1361,11 +1436,29 @@ def _get_primitive_type_value(v) -> str:
|
|
|
1361
1436
|
return str(v)
|
|
1362
1437
|
|
|
1363
1438
|
|
|
1439
|
+
def _safe_register_namespace(prefix: str, ns: str) -> None:
|
|
1440
|
+
"""Register an XML namespace prefix, handling reserved prefix patterns.
|
|
1441
|
+
|
|
1442
|
+
Some prefixes (e.g. 'ns2') match Python's reserved 'ns\\d+' pattern used for
|
|
1443
|
+
auto-generated prefixes, causing register_namespace to raise ValueError.
|
|
1444
|
+
Falls back to directly registering in the internal namespace map.
|
|
1445
|
+
|
|
1446
|
+
:param str prefix: The namespace prefix to register.
|
|
1447
|
+
:param str ns: The namespace URI.
|
|
1448
|
+
"""
|
|
1449
|
+
try:
|
|
1450
|
+
ET.register_namespace(prefix, ns)
|
|
1451
|
+
except ValueError:
|
|
1452
|
+
_ns_map = getattr(ET, "_namespace_map", None)
|
|
1453
|
+
if _ns_map is not None:
|
|
1454
|
+
_ns_map[ns] = prefix
|
|
1455
|
+
|
|
1456
|
+
|
|
1364
1457
|
def _create_xml_element(
|
|
1365
1458
|
tag: typing.Any, prefix: typing.Optional[str] = None, ns: typing.Optional[str] = None
|
|
1366
1459
|
) -> ET.Element:
|
|
1367
1460
|
if prefix and ns:
|
|
1368
|
-
|
|
1461
|
+
_safe_register_namespace(prefix, ns)
|
|
1369
1462
|
if ns:
|
|
1370
1463
|
return ET.Element("{" + ns + "}" + tag)
|
|
1371
1464
|
return ET.Element(tag)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typespec/http-client-python",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.3",
|
|
4
4
|
"author": "Microsoft Corporation",
|
|
5
5
|
"description": "TypeSpec emitter for Python SDKs",
|
|
6
6
|
"homepage": "https://typespec.io",
|
|
@@ -29,19 +29,25 @@
|
|
|
29
29
|
"node": ">=20.0.0"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
|
-
"clean": "rimraf ./dist ./temp ./
|
|
32
|
+
"clean": "rimraf ./dist ./temp ./venv ./tests/generated",
|
|
33
33
|
"build": "tsc -p ./emitter/tsconfig.build.json && tsx ./eng/scripts/setup/build.ts",
|
|
34
34
|
"watch": "tsc -p ./emitter/tsconfig.build.json --watch",
|
|
35
|
-
"lint": "eslint emitter/ --max-warnings=0",
|
|
36
|
-
"lint:py": "tsx ./eng/scripts/ci/lint.ts --folderName generator/pygen",
|
|
37
|
-
"format": "pnpm -w format:dir packages/http-client-python && tsx ./eng/scripts/ci/format.ts",
|
|
38
35
|
"install": "tsx ./eng/scripts/setup/install.ts",
|
|
39
36
|
"prepare": "tsx ./eng/scripts/setup/prepare.ts",
|
|
37
|
+
"setup": "npm run build && npm run install",
|
|
38
|
+
"test": "tsx ./eng/scripts/ci/run-tests.ts",
|
|
39
|
+
"test:emitter": "tsx ./eng/scripts/ci/run-tests.ts --emitter",
|
|
40
|
+
"test:generator": "tsx ./eng/scripts/ci/run-tests.ts --generator",
|
|
41
|
+
"lint": "tsx ./eng/scripts/ci/lint.ts",
|
|
42
|
+
"lint:generated": "tsx ./eng/scripts/ci/lint.ts --generated",
|
|
43
|
+
"format": "tsx ./eng/scripts/ci/format.ts",
|
|
44
|
+
"format:check": "tsx ./eng/scripts/ci/format.ts --check",
|
|
45
|
+
"format:generated": "tsx ./eng/scripts/ci/format.ts --generated",
|
|
46
|
+
"typecheck": "tsx ./eng/scripts/ci/typecheck.ts",
|
|
47
|
+
"typecheck:generated": "tsx ./eng/scripts/ci/typecheck.ts --generated",
|
|
40
48
|
"regenerate": "tsx ./eng/scripts/ci/regenerate.ts",
|
|
41
|
-
"ci": "npm run test
|
|
42
|
-
"ci:
|
|
43
|
-
"test:generator": "tsx ./eng/scripts/ci/run-ci.ts --command=test",
|
|
44
|
-
"test:emitter": "vitest run -c ./emitter/vitest.config.ts",
|
|
49
|
+
"ci": "npm run test && npm run lint && npm run typecheck",
|
|
50
|
+
"ci:generated": "tsx ./eng/scripts/ci/run-tests.ts --generator --env=ci",
|
|
45
51
|
"change:version": "pnpm chronus version --ignore-policies --only @typespec/http-client-python",
|
|
46
52
|
"change:add": "pnpm chronus add",
|
|
47
53
|
"regen-docs": "node ../../packages/tspd/cmd/tspd.js doc . --enable-experimental --output-dir ../../website/src/content/docs/docs/emitters/clients/http-client-python/reference --skip-js"
|
|
@@ -54,20 +60,20 @@
|
|
|
54
60
|
"emitter"
|
|
55
61
|
],
|
|
56
62
|
"peerDependencies": {
|
|
57
|
-
"@azure-tools/typespec-autorest": ">=0.
|
|
58
|
-
"@azure-tools/typespec-azure-core": ">=0.
|
|
59
|
-
"@azure-tools/typespec-azure-resource-manager": ">=0.
|
|
60
|
-
"@azure-tools/typespec-azure-rulesets": ">=0.
|
|
61
|
-
"@azure-tools/typespec-client-generator-core": ">=0.
|
|
62
|
-
"@typespec/compiler": "^1.
|
|
63
|
-
"@typespec/http": "^1.
|
|
64
|
-
"@typespec/openapi": "^1.
|
|
65
|
-
"@typespec/rest": ">=0.
|
|
66
|
-
"@typespec/versioning": ">=0.
|
|
67
|
-
"@typespec/events": ">=0.
|
|
68
|
-
"@typespec/sse": ">=0.
|
|
69
|
-
"@typespec/streams": ">=0.
|
|
70
|
-
"@typespec/xml": ">=0.
|
|
63
|
+
"@azure-tools/typespec-autorest": ">=0.67.0 <1.0.0",
|
|
64
|
+
"@azure-tools/typespec-azure-core": ">=0.67.0 <1.0.0",
|
|
65
|
+
"@azure-tools/typespec-azure-resource-manager": ">=0.67.0 <1.0.0",
|
|
66
|
+
"@azure-tools/typespec-azure-rulesets": ">=0.67.0 <1.0.0",
|
|
67
|
+
"@azure-tools/typespec-client-generator-core": ">=0.67.0 <1.0.0",
|
|
68
|
+
"@typespec/compiler": "^1.11.0",
|
|
69
|
+
"@typespec/http": "^1.11.0",
|
|
70
|
+
"@typespec/openapi": "^1.11.0",
|
|
71
|
+
"@typespec/rest": ">=0.81.0 <1.0.0",
|
|
72
|
+
"@typespec/versioning": ">=0.81.0 <1.0.0",
|
|
73
|
+
"@typespec/events": ">=0.81.0 <1.0.0",
|
|
74
|
+
"@typespec/sse": ">=0.81.0 <1.0.0",
|
|
75
|
+
"@typespec/streams": ">=0.81.0 <1.0.0",
|
|
76
|
+
"@typespec/xml": ">=0.81.0 <1.0.0"
|
|
71
77
|
},
|
|
72
78
|
"dependencies": {
|
|
73
79
|
"js-yaml": "~4.1.0",
|
|
@@ -77,29 +83,29 @@
|
|
|
77
83
|
"tsx": "^4.21.0"
|
|
78
84
|
},
|
|
79
85
|
"devDependencies": {
|
|
80
|
-
"@azure-tools/typespec-autorest": "~0.
|
|
81
|
-
"@azure-tools/typespec-azure-core": "~0.
|
|
82
|
-
"@azure-tools/typespec-azure-resource-manager": "~0.
|
|
83
|
-
"@azure-tools/typespec-azure-rulesets": "~0.
|
|
84
|
-
"@azure-tools/typespec-client-generator-core": "~0.
|
|
85
|
-
"@azure-tools/azure-http-specs": "0.1.0-alpha.39
|
|
86
|
-
"@typespec/compiler": "^1.
|
|
87
|
-
"@typespec/http": "^1.
|
|
88
|
-
"@typespec/openapi": "^1.
|
|
89
|
-
"@typespec/rest": "~0.
|
|
90
|
-
"@typespec/versioning": "~0.
|
|
91
|
-
"@typespec/events": "~0.
|
|
92
|
-
"@typespec/spector": "0.1.0-alpha.
|
|
93
|
-
"@typespec/spec-api": "0.1.0-alpha.14
|
|
94
|
-
"@typespec/sse": "~0.
|
|
95
|
-
"@typespec/streams": "~0.
|
|
96
|
-
"@typespec/xml": "~0.
|
|
97
|
-
"@typespec/http-specs": "0.1.0-alpha.
|
|
86
|
+
"@azure-tools/typespec-autorest": "~0.67.0",
|
|
87
|
+
"@azure-tools/typespec-azure-core": "~0.67.0",
|
|
88
|
+
"@azure-tools/typespec-azure-resource-manager": "~0.67.0",
|
|
89
|
+
"@azure-tools/typespec-azure-rulesets": "~0.67.0",
|
|
90
|
+
"@azure-tools/typespec-client-generator-core": "~0.67.0",
|
|
91
|
+
"@azure-tools/azure-http-specs": "0.1.0-alpha.39",
|
|
92
|
+
"@typespec/compiler": "^1.11.0",
|
|
93
|
+
"@typespec/http": "^1.11.0",
|
|
94
|
+
"@typespec/openapi": "^1.11.0",
|
|
95
|
+
"@typespec/rest": "~0.81.0",
|
|
96
|
+
"@typespec/versioning": "~0.81.0",
|
|
97
|
+
"@typespec/events": "~0.81.0",
|
|
98
|
+
"@typespec/spector": "0.1.0-alpha.25",
|
|
99
|
+
"@typespec/spec-api": "0.1.0-alpha.14",
|
|
100
|
+
"@typespec/sse": "~0.81.0",
|
|
101
|
+
"@typespec/streams": "~0.81.0",
|
|
102
|
+
"@typespec/xml": "~0.81.0",
|
|
103
|
+
"@typespec/http-specs": "0.1.0-alpha.36",
|
|
98
104
|
"@types/js-yaml": "~4.0.5",
|
|
99
105
|
"@types/node": "~25.0.2",
|
|
100
106
|
"@types/semver": "7.5.8",
|
|
101
107
|
"c8": "^10.1.3",
|
|
102
|
-
"
|
|
108
|
+
"picocolors": "~1.1.1",
|
|
103
109
|
"rimraf": "~6.1.2",
|
|
104
110
|
"typescript": "~5.9.2",
|
|
105
111
|
"typescript-eslint": "^8.49.0",
|
package/eng/scripts/ci/run-ci.ts
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import { execSync } from "child_process";
|
|
3
|
-
import fs, { readFileSync } from "fs";
|
|
4
|
-
import { platform } from "os";
|
|
5
|
-
import { dirname, join } from "path";
|
|
6
|
-
import { fileURLToPath } from "url";
|
|
7
|
-
import { parseArgs } from "util";
|
|
8
|
-
|
|
9
|
-
const root = join(dirname(fileURLToPath(import.meta.url)), "../../../");
|
|
10
|
-
|
|
11
|
-
const argv = parseArgs({
|
|
12
|
-
args: process.argv.slice(2),
|
|
13
|
-
options: {
|
|
14
|
-
validFolders: { type: "string", required: true, multiple: true },
|
|
15
|
-
flavor: { type: "string" },
|
|
16
|
-
command: { type: "string" },
|
|
17
|
-
name: { type: "string" },
|
|
18
|
-
testFolder: { type: "string" },
|
|
19
|
-
},
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const foldersToProcess = argv.values.flavor
|
|
23
|
-
? [argv.values.flavor]
|
|
24
|
-
: argv.values.validFolders || ["azure", "unbranded"];
|
|
25
|
-
|
|
26
|
-
const commandToRun = argv.values.command || "ci";
|
|
27
|
-
const TEST_FOLDER = argv.values.testFolder || "generator/test";
|
|
28
|
-
|
|
29
|
-
function getCommand(command: string, flavor: string, name?: string): string {
|
|
30
|
-
let retval: string;
|
|
31
|
-
if (platform() === "win32") {
|
|
32
|
-
retval = `set FOLDER=${flavor} && ${venvPath} -m tox -c ./${TEST_FOLDER}/${flavor}/tox.ini -e ${command}`;
|
|
33
|
-
} else {
|
|
34
|
-
// Linux and macOS
|
|
35
|
-
retval = `FOLDER=${flavor} ${venvPath} -m tox -c ./${TEST_FOLDER}/${flavor}/tox.ini -e ${command}`;
|
|
36
|
-
}
|
|
37
|
-
if (name) {
|
|
38
|
-
return `${retval} -- -f ${name}`;
|
|
39
|
-
}
|
|
40
|
-
return retval;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function sectionExistsInToxIni(command: string, flavor: string): boolean {
|
|
44
|
-
const toxIniPath = join(root, `${TEST_FOLDER}/${flavor}/tox.ini`);
|
|
45
|
-
const toxIniContent = readFileSync(toxIniPath, "utf-8");
|
|
46
|
-
return command
|
|
47
|
-
.split(",")
|
|
48
|
-
.map((c) => `[testenv:${c}]`)
|
|
49
|
-
.every((section) => toxIniContent.includes(section));
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function myExecSync(command: string, flavor: string, name?: string): void {
|
|
53
|
-
if (!sectionExistsInToxIni(command, flavor)) {
|
|
54
|
-
console.log(`No section for ${command} in tox.ini for flavor ${flavor}. Skipping...`);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
execSync(getCommand(command, flavor, name), { stdio: "inherit" });
|
|
58
|
-
execSync(getCommand(command, "unittests", name), { stdio: "inherit" });
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
let venvPath = join(root, "venv");
|
|
62
|
-
if (fs.existsSync(join(venvPath, "bin"))) {
|
|
63
|
-
venvPath = join(venvPath, "bin", "python");
|
|
64
|
-
} else if (fs.existsSync(join(venvPath, "Scripts"))) {
|
|
65
|
-
venvPath = join(venvPath, "Scripts", "python.exe");
|
|
66
|
-
} else {
|
|
67
|
-
throw new Error("Virtual environment doesn't exist.");
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
foldersToProcess.forEach((flavor) => {
|
|
71
|
-
try {
|
|
72
|
-
if (getCommand(commandToRun, flavor, argv.values.name)) {
|
|
73
|
-
console.log(`Running ${commandToRun} for flavor ${flavor}...`);
|
|
74
|
-
myExecSync(commandToRun, flavor, argv.values.name);
|
|
75
|
-
} else {
|
|
76
|
-
console.error(`Error: Unknown command '${commandToRun}'.`);
|
|
77
|
-
process.exit(1);
|
|
78
|
-
}
|
|
79
|
-
} catch (error) {
|
|
80
|
-
const message = (error as Error).message;
|
|
81
|
-
if (message.includes("pyright") || message.includes("mypy") || message.includes("lint")) {
|
|
82
|
-
// fixing linting issues that come from upgrading python version in separate pr
|
|
83
|
-
process.exit(0);
|
|
84
|
-
}
|
|
85
|
-
console.error(message);
|
|
86
|
-
console.error(`Error executing command for flavor ${flavor}: ${message}`);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
});
|
package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
import pytest
|
|
7
|
-
from azure.resourcemanager.commonproperties.aio import CommonPropertiesClient
|
|
8
|
-
from azure.resourcemanager.commonproperties import models
|
|
9
|
-
from azure.core import exceptions
|
|
10
|
-
|
|
11
|
-
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
12
|
-
RESOURCE_GROUP_NAME = "test-rg"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@pytest.fixture
|
|
16
|
-
async def client(credential, authentication_policy):
|
|
17
|
-
async with CommonPropertiesClient(
|
|
18
|
-
credential, SUBSCRIPTION_ID, "http://localhost:3000", authentication_policy=authentication_policy
|
|
19
|
-
) as client:
|
|
20
|
-
yield client
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@pytest.mark.asyncio
|
|
24
|
-
async def test_managed_identity_get(client):
|
|
25
|
-
result = await client.managed_identity.get(
|
|
26
|
-
resource_group_name=RESOURCE_GROUP_NAME, managed_identity_tracked_resource_name="identity"
|
|
27
|
-
)
|
|
28
|
-
assert result.location == "eastus"
|
|
29
|
-
assert result.identity.type == "SystemAssigned"
|
|
30
|
-
assert result.properties.provisioning_state == "Succeeded"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@pytest.mark.asyncio
|
|
34
|
-
async def test_managed_identity_create_with_system_assigned(client):
|
|
35
|
-
result = await client.managed_identity.create_with_system_assigned(
|
|
36
|
-
resource_group_name=RESOURCE_GROUP_NAME,
|
|
37
|
-
managed_identity_tracked_resource_name="identity",
|
|
38
|
-
resource=models.ManagedIdentityTrackedResource(
|
|
39
|
-
location="eastus", identity=models.ManagedServiceIdentity(type="SystemAssigned")
|
|
40
|
-
),
|
|
41
|
-
)
|
|
42
|
-
assert result.location == "eastus"
|
|
43
|
-
assert result.identity.type == "SystemAssigned"
|
|
44
|
-
assert result.properties.provisioning_state == "Succeeded"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@pytest.mark.asyncio
|
|
48
|
-
async def test_managed_identity_update_with_user_assigned_and_system_assigned(client):
|
|
49
|
-
result = await client.managed_identity.update_with_user_assigned_and_system_assigned(
|
|
50
|
-
resource_group_name=RESOURCE_GROUP_NAME,
|
|
51
|
-
managed_identity_tracked_resource_name="identity",
|
|
52
|
-
properties=models.ManagedIdentityTrackedResource(
|
|
53
|
-
location="eastus",
|
|
54
|
-
identity=models.ManagedServiceIdentity(
|
|
55
|
-
type="SystemAssigned,UserAssigned",
|
|
56
|
-
user_assigned_identities={
|
|
57
|
-
"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/id1": models.UserAssignedIdentity()
|
|
58
|
-
},
|
|
59
|
-
),
|
|
60
|
-
),
|
|
61
|
-
)
|
|
62
|
-
assert result.location == "eastus"
|
|
63
|
-
assert result.identity.type == "SystemAssigned,UserAssigned"
|
|
64
|
-
assert result.properties.provisioning_state == "Succeeded"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
@pytest.mark.asyncio
|
|
68
|
-
async def test_error_get_for_predefined_error(client):
|
|
69
|
-
try:
|
|
70
|
-
await client.error.get_for_predefined_error(
|
|
71
|
-
resource_group_name=RESOURCE_GROUP_NAME,
|
|
72
|
-
confidential_resource_name="confidential",
|
|
73
|
-
)
|
|
74
|
-
except exceptions.ResourceNotFoundError as e:
|
|
75
|
-
assert e.status_code == 404
|
|
76
|
-
assert (
|
|
77
|
-
e.error.message
|
|
78
|
-
== "The Resource 'Azure.ResourceManager.CommonProperties/confidentialResources/confidential' under resource group 'test-rg' was not found."
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
@pytest.mark.asyncio
|
|
83
|
-
async def test_error_create_for_user_defined_error(client):
|
|
84
|
-
try:
|
|
85
|
-
await client.error.create_for_user_defined_error(
|
|
86
|
-
resource_group_name=RESOURCE_GROUP_NAME,
|
|
87
|
-
confidential_resource_name="confidential",
|
|
88
|
-
resource=models.ConfidentialResource(
|
|
89
|
-
location="eastus", properties=models.ConfidentialResourceProperties(username="00")
|
|
90
|
-
),
|
|
91
|
-
)
|
|
92
|
-
except exceptions.HttpResponseError as e:
|
|
93
|
-
assert e.status_code == 400
|
|
94
|
-
assert e.error.message == "Username should not contain only numbers."
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
import pytest
|
|
7
|
-
from azure.resourcemanager.largeheader.aio import LargeHeaderClient
|
|
8
|
-
from azure.resourcemanager.largeheader import models
|
|
9
|
-
|
|
10
|
-
SUBSCRIPTION_ID = "00000000-0000-0000-0000-000000000000"
|
|
11
|
-
RESOURCE_GROUP_NAME = "test-rg"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@pytest.fixture
|
|
15
|
-
async def client(credential, authentication_policy):
|
|
16
|
-
async with LargeHeaderClient(
|
|
17
|
-
credential, SUBSCRIPTION_ID, "http://localhost:3000", authentication_policy=authentication_policy
|
|
18
|
-
) as client:
|
|
19
|
-
yield client
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@pytest.mark.asyncio
|
|
23
|
-
async def test_large_headers_begin_two6_k(client: LargeHeaderClient):
|
|
24
|
-
result = await (
|
|
25
|
-
await client.large_headers.begin_two6_k(
|
|
26
|
-
resource_group_name=RESOURCE_GROUP_NAME,
|
|
27
|
-
large_header_name="header1",
|
|
28
|
-
)
|
|
29
|
-
).result()
|
|
30
|
-
assert result == models.CancelResult(succeeded=True)
|