@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
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
"""
|
|
7
|
+
Batch process multiple TypeSpec YAML files in a single Python process.
|
|
8
|
+
This avoids the overhead of spawning a new Python process for each spec.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
import os
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from concurrent.futures import ProcessPoolExecutor, as_completed
|
|
17
|
+
from multiprocessing import freeze_support
|
|
18
|
+
|
|
19
|
+
# Add the generator to the path
|
|
20
|
+
_ROOT_DIR = Path(__file__).parent.parent.parent.parent
|
|
21
|
+
sys.path.insert(0, str(_ROOT_DIR / "generator"))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def process_single_spec(config_path_str: str) -> tuple[str, bool, str]:
|
|
25
|
+
"""Process a single spec from its config file.
|
|
26
|
+
|
|
27
|
+
Returns: (output_dir, success, error_message)
|
|
28
|
+
"""
|
|
29
|
+
# Import inside function for multiprocessing compatibility
|
|
30
|
+
from pygen import preprocess, codegen
|
|
31
|
+
|
|
32
|
+
config_path = Path(config_path_str)
|
|
33
|
+
try:
|
|
34
|
+
with open(config_path, "r", encoding="utf-8") as f:
|
|
35
|
+
config = json.load(f)
|
|
36
|
+
|
|
37
|
+
yaml_path = config["yamlPath"]
|
|
38
|
+
command_args = config["commandArgs"]
|
|
39
|
+
output_dir = config["outputDir"]
|
|
40
|
+
|
|
41
|
+
# Pass command args directly to pygen - pygen expects hyphenated keys
|
|
42
|
+
# Remove keys that shouldn't be passed to pygen.
|
|
43
|
+
# Also coerce the string values "true"/"false" to real booleans, matching the behavior
|
|
44
|
+
# of pygen.utils.parse_args (the CLI path). Without this, the emitter passes string
|
|
45
|
+
# "false" for flags like keep-setup-py, which is truthy in Python and causes pygen to
|
|
46
|
+
# take the wrong branch (e.g. generating setup.py instead of pyproject.toml).
|
|
47
|
+
def _coerce(value):
|
|
48
|
+
if value == "true":
|
|
49
|
+
return True
|
|
50
|
+
if value == "false":
|
|
51
|
+
return False
|
|
52
|
+
return value
|
|
53
|
+
|
|
54
|
+
pygen_args = {k: _coerce(v) for k, v in command_args.items() if k not in ["emit-yaml-only"]}
|
|
55
|
+
|
|
56
|
+
# Run preprocess and codegen (black is batched at the end for performance)
|
|
57
|
+
preprocess.PreProcessPlugin(output_folder=output_dir, tsp_file=yaml_path, **pygen_args).process()
|
|
58
|
+
|
|
59
|
+
codegen.CodeGenerator(output_folder=output_dir, tsp_file=yaml_path, **pygen_args).process()
|
|
60
|
+
|
|
61
|
+
# Clean up the config file
|
|
62
|
+
config_path.unlink()
|
|
63
|
+
|
|
64
|
+
return (output_dir, True, "")
|
|
65
|
+
except Exception as e:
|
|
66
|
+
return (str(config_path), False, str(e))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def render_progress_bar(completed: int, failed: int, total: int, width: int = 40) -> str:
|
|
70
|
+
"""Render a progress bar with green for success and red for failures."""
|
|
71
|
+
success_count = completed - failed
|
|
72
|
+
success_width = round((success_count / total) * width) if total > 0 else 0
|
|
73
|
+
fail_width = round((failed / total) * width) if total > 0 else 0
|
|
74
|
+
empty_width = width - success_width - fail_width
|
|
75
|
+
|
|
76
|
+
# ANSI color codes
|
|
77
|
+
green_bg = "\033[42m"
|
|
78
|
+
red_bg = "\033[41m"
|
|
79
|
+
reset = "\033[0m"
|
|
80
|
+
dim = "\033[2m"
|
|
81
|
+
cyan = "\033[36m"
|
|
82
|
+
|
|
83
|
+
success_bar = f"{green_bg}{' ' * success_width}{reset}"
|
|
84
|
+
fail_bar = f"{red_bg}{' ' * fail_width}{reset}" if failed > 0 else ""
|
|
85
|
+
empty_bar = f"{dim}{'░' * max(0, empty_width)}{reset}"
|
|
86
|
+
|
|
87
|
+
percent = round((completed / total) * 100) if total > 0 else 0
|
|
88
|
+
return f"{success_bar}{fail_bar}{empty_bar} {cyan}{percent}%{reset} ({completed}/{total})"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def collect_config_files(generated_dir: str, flavor: str) -> list[str]:
|
|
92
|
+
"""Collect all .tsp-codegen-*.json config files from the generated directory."""
|
|
93
|
+
flavor_dir = Path(generated_dir) / "tests" / "generated" / flavor
|
|
94
|
+
if not flavor_dir.exists():
|
|
95
|
+
return []
|
|
96
|
+
|
|
97
|
+
config_files = []
|
|
98
|
+
for pkg_dir in flavor_dir.iterdir():
|
|
99
|
+
if pkg_dir.is_dir():
|
|
100
|
+
for f in pkg_dir.iterdir():
|
|
101
|
+
if f.name.startswith(".tsp-codegen-") and f.name.endswith(".json"):
|
|
102
|
+
config_files.append(str(f))
|
|
103
|
+
return config_files
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def main():
|
|
107
|
+
parser = argparse.ArgumentParser(description="Batch process TypeSpec YAML files")
|
|
108
|
+
parser.add_argument(
|
|
109
|
+
"--generated-dir",
|
|
110
|
+
required=True,
|
|
111
|
+
help="Path to the generator directory (config files are in ../tests/generated/<flavor>/)",
|
|
112
|
+
)
|
|
113
|
+
parser.add_argument(
|
|
114
|
+
"--flavor",
|
|
115
|
+
required=True,
|
|
116
|
+
help="Flavor to process (azure or unbranded)",
|
|
117
|
+
)
|
|
118
|
+
parser.add_argument(
|
|
119
|
+
"--jobs",
|
|
120
|
+
type=int,
|
|
121
|
+
default=4,
|
|
122
|
+
help="Number of parallel jobs (default: 4)",
|
|
123
|
+
)
|
|
124
|
+
args = parser.parse_args()
|
|
125
|
+
|
|
126
|
+
# Discover config files from the generated directory
|
|
127
|
+
config_files = collect_config_files(args.generated_dir, args.flavor)
|
|
128
|
+
total = len(config_files)
|
|
129
|
+
|
|
130
|
+
if total == 0:
|
|
131
|
+
print("No config files found, nothing to process")
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
print(f"Processing {total} specs with {args.jobs} parallel jobs...")
|
|
135
|
+
|
|
136
|
+
succeeded = 0
|
|
137
|
+
failed = 0
|
|
138
|
+
failed_specs = []
|
|
139
|
+
output_dirs = []
|
|
140
|
+
is_tty = sys.stdout.isatty()
|
|
141
|
+
|
|
142
|
+
def update_progress():
|
|
143
|
+
if is_tty:
|
|
144
|
+
sys.stdout.write(f"\r{render_progress_bar(succeeded + failed, failed, total)}")
|
|
145
|
+
sys.stdout.flush()
|
|
146
|
+
|
|
147
|
+
# Initial progress bar
|
|
148
|
+
update_progress()
|
|
149
|
+
|
|
150
|
+
# Use ProcessPoolExecutor for true parallelism (bypasses GIL)
|
|
151
|
+
with ProcessPoolExecutor(max_workers=args.jobs) as executor:
|
|
152
|
+
futures = {executor.submit(process_single_spec, cf): cf for cf in config_files}
|
|
153
|
+
|
|
154
|
+
for future in as_completed(futures):
|
|
155
|
+
output_dir, success, error = future.result()
|
|
156
|
+
if success:
|
|
157
|
+
succeeded += 1
|
|
158
|
+
output_dirs.append(output_dir)
|
|
159
|
+
else:
|
|
160
|
+
failed += 1
|
|
161
|
+
failed_specs.append(f"{output_dir}: {error}")
|
|
162
|
+
# Fail-fast: cancel pending futures on first failure
|
|
163
|
+
print(f"\n\033[31m[FAIL-FAST] Cancelling remaining tasks after failure...\033[0m")
|
|
164
|
+
for f in futures:
|
|
165
|
+
f.cancel()
|
|
166
|
+
break
|
|
167
|
+
update_progress()
|
|
168
|
+
|
|
169
|
+
# Clear progress bar line
|
|
170
|
+
if is_tty:
|
|
171
|
+
sys.stdout.write("\r" + " " * 60 + "\r")
|
|
172
|
+
sys.stdout.flush()
|
|
173
|
+
|
|
174
|
+
# Print failures at the end
|
|
175
|
+
if failed_specs:
|
|
176
|
+
print("\n\033[31mFailed specs:\033[0m")
|
|
177
|
+
for spec in failed_specs:
|
|
178
|
+
print(f" \033[31m•\033[0m {spec}")
|
|
179
|
+
|
|
180
|
+
print(f"\nBatch processing complete: {succeeded} succeeded, {failed} failed")
|
|
181
|
+
|
|
182
|
+
if failed > 0:
|
|
183
|
+
sys.exit(1)
|
|
184
|
+
|
|
185
|
+
# Run black formatting after all codegen completes. Running black separately
|
|
186
|
+
# avoids duplicating black's import/startup cost in each worker process.
|
|
187
|
+
if output_dirs:
|
|
188
|
+
from pygen.black import BlackScriptPlugin
|
|
189
|
+
|
|
190
|
+
print(f"Formatting {len(output_dirs)} packages with black...")
|
|
191
|
+
for d in output_dirs:
|
|
192
|
+
BlackScriptPlugin(output_folder=d).process()
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
if __name__ == "__main__":
|
|
196
|
+
freeze_support() # Required for Windows multiprocessing
|
|
197
|
+
main()
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
import sys
|
|
7
|
-
import venv
|
|
8
7
|
import logging
|
|
9
8
|
from pathlib import Path
|
|
10
9
|
from pygen import preprocess, codegen
|
|
11
10
|
from pygen.utils import parse_args
|
|
12
11
|
|
|
12
|
+
# eng/scripts/setup/run_tsp.py -> need to go up 4 levels to get to package root
|
|
13
13
|
_ROOT_DIR = Path(__file__).parent.parent.parent.parent
|
|
14
14
|
|
|
15
15
|
_LOGGER = logging.getLogger(__name__)
|
|
@@ -20,8 +20,8 @@ if __name__ == "__main__":
|
|
|
20
20
|
|
|
21
21
|
assert venv_preexists # Otherwise install was not done
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
# Don't use EnvBuilder.ensure_directories() - it causes race conditions
|
|
24
|
+
# when multiple processes run in parallel. The venv already exists.
|
|
25
25
|
|
|
26
26
|
if "--debug" in sys.argv or "--debug=true" in sys.argv:
|
|
27
27
|
try:
|
|
@@ -15,8 +15,12 @@ const execute = (
|
|
|
15
15
|
options.onCreate(cp);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (options.onStdOutData) {
|
|
19
|
+
cp.stdout.on("data", options.onStdOutData);
|
|
20
|
+
}
|
|
21
|
+
if (options.onStdErrData) {
|
|
22
|
+
cp.stderr.on("data", options.onStdErrData);
|
|
23
|
+
}
|
|
20
24
|
|
|
21
25
|
let err = "";
|
|
22
26
|
let out = "";
|
|
@@ -33,7 +37,7 @@ const execute = (
|
|
|
33
37
|
cp.on("error", (err) => {
|
|
34
38
|
reject(err);
|
|
35
39
|
});
|
|
36
|
-
cp.on("close", (code,
|
|
40
|
+
cp.on("close", (code, _signal) =>
|
|
37
41
|
resolve({
|
|
38
42
|
stdout: out,
|
|
39
43
|
stderr: err,
|
|
@@ -118,7 +122,7 @@ const tryPython = async (
|
|
|
118
122
|
`"${PRINT_PYTHON_VERSION_SCRIPT}"`,
|
|
119
123
|
]);
|
|
120
124
|
return validateVersionRequirement(resolution, result.stdout.trim(), requirement);
|
|
121
|
-
} catch
|
|
125
|
+
} catch {
|
|
122
126
|
return {
|
|
123
127
|
error: true,
|
|
124
128
|
...resolution,
|
|
@@ -16,7 +16,6 @@ from .utils import TYPESPEC_PACKAGE_MODE, VALID_PACKAGE_MODE
|
|
|
16
16
|
|
|
17
17
|
from ._version import VERSION
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
__version__ = VERSION
|
|
21
20
|
_LOGGER = logging.getLogger(__name__)
|
|
22
21
|
|
|
@@ -237,8 +236,7 @@ class ReaderAndWriter:
|
|
|
237
236
|
def write_file(self, filename: Union[str, Path], file_content: str) -> None:
|
|
238
237
|
"""Directly writing to disk"""
|
|
239
238
|
file_folder = Path(filename).parent
|
|
240
|
-
|
|
241
|
-
Path.mkdir(self.output_folder / file_folder, parents=True)
|
|
239
|
+
Path.mkdir(self.output_folder / file_folder, parents=True, exist_ok=True)
|
|
242
240
|
with open(self.output_folder / Path(filename), "w", encoding="utf-8") as fd:
|
|
243
241
|
fd.write(file_content)
|
|
244
242
|
|
|
@@ -291,11 +291,12 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
|
|
|
291
291
|
ImportType.SDKCORE,
|
|
292
292
|
)
|
|
293
293
|
|
|
294
|
-
# import for "Self"
|
|
294
|
+
# import for "Self" (typing.Self available from Python 3.11+)
|
|
295
295
|
file_import.add_submodule_import(
|
|
296
296
|
"typing_extensions",
|
|
297
297
|
"Self",
|
|
298
298
|
ImportType.STDLIB,
|
|
299
|
+
version_modules=(((3, 11), "typing", None),),
|
|
299
300
|
)
|
|
300
301
|
if self.need_cloud_setting:
|
|
301
302
|
file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
|
|
@@ -95,6 +95,7 @@ class CodeModel: # pylint: disable=too-many-public-methods, disable=too-many-in
|
|
|
95
95
|
t for t in self.types_map.values() if isinstance(t, CombinedType) and t.name
|
|
96
96
|
]
|
|
97
97
|
self.cross_language_package_id = self.yaml_data.get("crossLanguagePackageId")
|
|
98
|
+
self.cross_language_version = self.yaml_data.get("crossLanguageVersion")
|
|
98
99
|
self.for_test: bool = False
|
|
99
100
|
# key is typespec namespace, value is models/clients/opeartion_groups/enums cache in the namespace
|
|
100
101
|
self._client_namespace_types: dict[str, ClientNamespaceType] = {}
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from collections import OrderedDict
|
|
8
|
-
from typing import Any, Optional, TYPE_CHECKING, cast
|
|
9
|
-
import sys
|
|
8
|
+
from typing import Any, Literal, Optional, TYPE_CHECKING, cast
|
|
10
9
|
from .utils import add_to_pylint_disable, NamespaceType, LOCALS_LENGTH_LIMIT
|
|
11
10
|
from .base import BaseType
|
|
12
11
|
from .constant_type import ConstantType
|
|
@@ -14,11 +13,6 @@ from .property import Property
|
|
|
14
13
|
from .imports import FileImport, ImportType, TypingSection
|
|
15
14
|
from ...utils import NAME_LENGTH_LIMIT
|
|
16
15
|
|
|
17
|
-
if sys.version_info >= (3, 8):
|
|
18
|
-
from typing import Literal
|
|
19
|
-
else:
|
|
20
|
-
from typing_extensions import Literal # type: ignore
|
|
21
|
-
|
|
22
16
|
if TYPE_CHECKING:
|
|
23
17
|
from .code_model import CodeModel
|
|
24
18
|
|
|
@@ -61,6 +61,7 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
|
|
|
61
61
|
) -> None:
|
|
62
62
|
super().__init__(yaml_data, code_model)
|
|
63
63
|
self.wire_name: str = yaml_data.get("wireName", "")
|
|
64
|
+
self.etag_role: Optional[str] = yaml_data.get("etagRole", None)
|
|
64
65
|
self.client_name: str = self.yaml_data["clientName"]
|
|
65
66
|
self.optional: bool = self.yaml_data["optional"]
|
|
66
67
|
self.implementation: Optional[str] = yaml_data.get("implementation", None)
|
|
@@ -108,25 +109,24 @@ class _ParameterBase(BaseModel, abc.ABC): # pylint: disable=too-many-instance-a
|
|
|
108
109
|
type_description = self.type.description(is_operation_file=True)
|
|
109
110
|
if type_description:
|
|
110
111
|
base_description = add_to_description(base_description, type_description)
|
|
111
|
-
if self.optional and isinstance(self.type, ConstantType):
|
|
112
|
-
|
|
113
|
-
base_description
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
)
|
|
117
|
-
else:
|
|
118
|
-
base_description = add_to_description(
|
|
119
|
-
base_description,
|
|
120
|
-
f"Known values are {self.get_declaration()} and None.",
|
|
121
|
-
)
|
|
112
|
+
if (self.optional or self.is_api_version) and isinstance(self.type, ConstantType):
|
|
113
|
+
base_description = add_to_description(
|
|
114
|
+
base_description,
|
|
115
|
+
f"Known values are {self.get_declaration()} and None.",
|
|
116
|
+
)
|
|
122
117
|
if not (self.optional or self.client_default_value):
|
|
123
118
|
base_description = add_to_description(base_description, "Required.")
|
|
124
|
-
if self.
|
|
119
|
+
if self.is_api_version:
|
|
120
|
+
base_description = add_to_description(
|
|
121
|
+
base_description,
|
|
122
|
+
"Default value is None. If not set, the operation's default API version will be used.",
|
|
123
|
+
)
|
|
124
|
+
elif self.client_default_value is not None:
|
|
125
125
|
base_description = add_to_description(
|
|
126
126
|
base_description,
|
|
127
127
|
f"Default value is {self.client_default_value_declaration}.",
|
|
128
128
|
)
|
|
129
|
-
|
|
129
|
+
elif self.optional:
|
|
130
130
|
base_description = add_to_description(
|
|
131
131
|
base_description,
|
|
132
132
|
f"Default value is {self.client_default_value_declaration}.",
|
|
@@ -378,6 +378,8 @@ class ClientParameter(Parameter):
|
|
|
378
378
|
def method_location(self) -> ParameterMethodLocation:
|
|
379
379
|
if self.constant:
|
|
380
380
|
return ParameterMethodLocation.KWARG
|
|
381
|
+
if self.is_api_version:
|
|
382
|
+
return ParameterMethodLocation.KWARG
|
|
381
383
|
if (
|
|
382
384
|
self.is_host
|
|
383
385
|
and (self.code_model.options["version-tolerant"] or self.code_model.options["low-level-client"])
|
|
@@ -409,6 +411,6 @@ class ConfigParameter(Parameter):
|
|
|
409
411
|
|
|
410
412
|
@property
|
|
411
413
|
def method_location(self) -> ParameterMethodLocation:
|
|
412
|
-
if self.constant:
|
|
414
|
+
if self.constant or self.is_api_version:
|
|
413
415
|
return ParameterMethodLocation.KWARG
|
|
414
416
|
return ParameterMethodLocation.POSITIONAL
|
|
@@ -42,15 +42,15 @@ __all__ = [
|
|
|
42
42
|
"JinjaSerializer",
|
|
43
43
|
]
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
_DEFAULT_PACKAGE_FILES = (
|
|
46
46
|
"CHANGELOG.md.jinja2",
|
|
47
47
|
"dev_requirements.txt.jinja2",
|
|
48
48
|
"LICENSE.jinja2",
|
|
49
49
|
"MANIFEST.in.jinja2",
|
|
50
50
|
"README.md.jinja2",
|
|
51
|
-
|
|
51
|
+
)
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
_DEFAULT_REGENERATE_FILES = frozenset({"MANIFEST.in"})
|
|
54
54
|
AsyncInfo = namedtuple("AsyncInfo", ["async_mode", "async_path"])
|
|
55
55
|
|
|
56
56
|
|
|
@@ -75,15 +75,17 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
75
75
|
) -> None:
|
|
76
76
|
super().__init__(output_folder=output_folder, **kwargs)
|
|
77
77
|
self.code_model = code_model
|
|
78
|
+
self._package_files: list[str] = list(_DEFAULT_PACKAGE_FILES)
|
|
79
|
+
self._regenerate_files: set[str] = set(_DEFAULT_REGENERATE_FILES)
|
|
78
80
|
self._regenerate_setup_py()
|
|
79
81
|
|
|
80
82
|
def _regenerate_setup_py(self):
|
|
81
83
|
if self.code_model.options["keep-setup-py"] or self.code_model.options["basic-setup-py"]:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
self._package_files.append("setup.py.jinja2")
|
|
85
|
+
self._regenerate_files.add("setup.py")
|
|
84
86
|
else:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
self._package_files.append("pyproject.toml.jinja2")
|
|
88
|
+
self._regenerate_files.add("pyproject.toml")
|
|
87
89
|
|
|
88
90
|
@property
|
|
89
91
|
def has_aio_folder(self) -> bool:
|
|
@@ -180,6 +182,17 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
180
182
|
elif client_namespace_type.clients:
|
|
181
183
|
# add clients folder if there are clients in this namespace
|
|
182
184
|
self._serialize_client_and_config_files(client_namespace, client_namespace_type.clients, env)
|
|
185
|
+
# When generation-subdir is configured, generated code goes into a subdirectory
|
|
186
|
+
# (e.g., _generated/). We also need an __init__.py in the parent namespace dir
|
|
187
|
+
# so that the package is discoverable by find_packages() / pip install.
|
|
188
|
+
root_dir = self.code_model.get_root_dir()
|
|
189
|
+
if self.code_model.options.get("generation-subdir") and not self.read_file(
|
|
190
|
+
root_dir / Path("__init__.py")
|
|
191
|
+
):
|
|
192
|
+
self.write_file(
|
|
193
|
+
root_dir / Path("__init__.py"),
|
|
194
|
+
general_serializer.serialize_pkgutil_init_file(),
|
|
195
|
+
)
|
|
183
196
|
else:
|
|
184
197
|
# add pkgutil init file if no clients in this namespace
|
|
185
198
|
self.write_file(
|
|
@@ -242,7 +255,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
242
255
|
lstrip_blocks=True,
|
|
243
256
|
)
|
|
244
257
|
|
|
245
|
-
package_files =
|
|
258
|
+
package_files = list(self._package_files)
|
|
246
259
|
if not self.code_model.license_description:
|
|
247
260
|
package_files.remove("LICENSE.jinja2")
|
|
248
261
|
elif Path(self.code_model.options["package-mode"]).exists():
|
|
@@ -261,7 +274,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
261
274
|
continue
|
|
262
275
|
file = template_name.replace(".jinja2", "")
|
|
263
276
|
output_file = root_of_sdk / file
|
|
264
|
-
if not self.read_file(output_file) or file in
|
|
277
|
+
if not self.read_file(output_file) or file in self._regenerate_files:
|
|
265
278
|
if self.keep_version_file and file == "setup.py" and not self.code_model.options["azure-arm"]:
|
|
266
279
|
# don't regenerate setup.py file if the version file is more up to date for data-plane
|
|
267
280
|
continue
|
|
@@ -482,32 +495,34 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
482
495
|
|
|
483
496
|
def _serialize_and_write_top_level_folder(self, env: Environment, namespace: str) -> None:
|
|
484
497
|
root_dir = self.code_model.get_root_dir()
|
|
498
|
+
generation_dir = self.code_model.get_generation_dir(namespace)
|
|
485
499
|
# write _utils folder
|
|
486
500
|
self._serialize_and_write_utils_folder(env, self.code_model.namespace)
|
|
487
501
|
|
|
488
502
|
general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False)
|
|
489
503
|
|
|
490
504
|
# write _version.py
|
|
505
|
+
# Always write at root namespace since pyproject.toml references it there
|
|
491
506
|
self._serialize_and_write_version_file(general_serializer)
|
|
492
|
-
# if there's a subdir, we need to write another version file in the subdir
|
|
493
507
|
if self.code_model.options.get("generation-subdir"):
|
|
494
508
|
self._serialize_and_write_version_file(general_serializer, namespace)
|
|
495
509
|
|
|
496
510
|
# write the empty py.typed file
|
|
511
|
+
# Always write at root namespace since MANIFEST.in references it there
|
|
497
512
|
pytyped_value = "# Marker file for PEP 561."
|
|
498
513
|
self.write_file(root_dir / Path("py.typed"), pytyped_value)
|
|
499
514
|
|
|
500
515
|
# write _validation.py
|
|
501
516
|
if any(og for client in self.code_model.clients for og in client.operation_groups if og.need_validation):
|
|
502
517
|
self.write_file(
|
|
503
|
-
|
|
518
|
+
generation_dir / Path("_validation.py"),
|
|
504
519
|
general_serializer.serialize_validation_file(),
|
|
505
520
|
)
|
|
506
521
|
|
|
507
522
|
# write _types.py
|
|
508
523
|
if self.code_model.named_unions:
|
|
509
524
|
self.write_file(
|
|
510
|
-
|
|
525
|
+
generation_dir / Path("_types.py"),
|
|
511
526
|
TypesSerializer(code_model=self.code_model, env=env).serialize(),
|
|
512
527
|
)
|
|
513
528
|
|
|
@@ -107,10 +107,18 @@ def _serialize_grouped_body(builder: BuilderType) -> list[str]:
|
|
|
107
107
|
groupers = [p for p in builder.parameters if p.grouper]
|
|
108
108
|
for grouper in groupers:
|
|
109
109
|
retval.append(f"if {grouper.client_name} is not None:")
|
|
110
|
+
# Keys in property_to_parameter_name are original client names (e.g. "from", "custom_header").
|
|
111
|
+
# Attribute access needs the padded client_name from the model property (e.g. "from_property").
|
|
112
|
+
# Build lookup from both wire_name and client_name to handle all cases.
|
|
113
|
+
grouper_model = cast(ModelType, grouper.type)
|
|
114
|
+
prop_name_to_client = {}
|
|
115
|
+
for prop in grouper_model.properties:
|
|
116
|
+
prop_name_to_client[prop.wire_name] = prop.client_name
|
|
117
|
+
prop_name_to_client[prop.client_name] = prop.client_name
|
|
110
118
|
retval.extend(
|
|
111
119
|
[
|
|
112
|
-
f" {parameter} = {grouper.client_name}.{
|
|
113
|
-
for
|
|
120
|
+
f" {parameter} = {grouper.client_name}.{prop_name_to_client[prop_name]}"
|
|
121
|
+
for prop_name, parameter in grouper.property_to_parameter_name.items()
|
|
114
122
|
]
|
|
115
123
|
)
|
|
116
124
|
return retval
|
|
@@ -1353,7 +1361,8 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
|
1353
1361
|
except StopIteration:
|
|
1354
1362
|
pass
|
|
1355
1363
|
|
|
1356
|
-
|
|
1364
|
+
header_str = ", headers=_headers"
|
|
1365
|
+
retval.append(f'_request = HttpRequest("{builder.next_link_verb}", {next_link_str}{header_str}{query_str})')
|
|
1357
1366
|
retval.extend(self._postprocess_http_request(builder, "_request.url"))
|
|
1358
1367
|
|
|
1359
1368
|
return retval
|
|
@@ -28,7 +28,7 @@ VERSION_MAP = {
|
|
|
28
28
|
"corehttp": "1.0.0b6",
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
MIN_PYTHON_VERSION = "3.
|
|
31
|
+
MIN_PYTHON_VERSION = "3.10"
|
|
32
32
|
MAX_PYTHON_VERSION = "3.13"
|
|
33
33
|
|
|
34
34
|
|
|
@@ -155,7 +155,10 @@ class GeneralSerializer(BaseSerializer):
|
|
|
155
155
|
"VERSION_MAP": VERSION_MAP,
|
|
156
156
|
"MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
|
|
157
157
|
"MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
|
|
158
|
-
"ADDITIONAL_DEPENDENCIES": [
|
|
158
|
+
"ADDITIONAL_DEPENDENCIES": [
|
|
159
|
+
dep if dep.startswith('"') else f'"{dep}"'
|
|
160
|
+
for dep in (f"{item[0]}>={item[1]}" for item in additional_version_map.items())
|
|
161
|
+
],
|
|
159
162
|
}
|
|
160
163
|
params |= {"options": self.code_model.options}
|
|
161
164
|
params |= kwargs
|
|
@@ -326,6 +329,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
326
329
|
{
|
|
327
330
|
"CrossLanguagePackageId": self.code_model.cross_language_package_id,
|
|
328
331
|
"CrossLanguageDefinitionId": cross_langauge_def_dict,
|
|
332
|
+
"CrossLanguageVersion": self.code_model.cross_language_version,
|
|
329
333
|
},
|
|
330
334
|
indent=4,
|
|
331
335
|
)
|
|
@@ -50,20 +50,25 @@ def _serialize_import_type(imports: list[ImportModel], delimiter: str) -> str:
|
|
|
50
50
|
import_list = []
|
|
51
51
|
for module_name in sorted(set(i.module_name for i in imports)):
|
|
52
52
|
normal_imports = [i for i in imports if i.module_name == module_name and not i.version_modules]
|
|
53
|
-
versioned_imports = [i for i in imports if i.module_name == module_name and i.version_modules]
|
|
54
53
|
if normal_imports:
|
|
55
54
|
import_list.append(_serialize_package(normal_imports, delimiter))
|
|
56
|
-
for i in versioned_imports:
|
|
57
|
-
import_list.append(_serialize_versioned_package(i, delimiter))
|
|
58
55
|
return delimiter.join(import_list)
|
|
59
56
|
|
|
60
57
|
|
|
58
|
+
def _serialize_versioned_imports(imports: list[ImportModel], delimiter: str) -> str:
|
|
59
|
+
"""Serialize all versioned imports together, to be emitted after all regular imports."""
|
|
60
|
+
return delimiter.join(_serialize_versioned_package(i, delimiter) for i in imports if i.version_modules)
|
|
61
|
+
|
|
62
|
+
|
|
61
63
|
def _get_import_clauses(imports: list[ImportModel], delimiter: str) -> list[str]:
|
|
62
64
|
import_clause = []
|
|
63
65
|
for import_type in ImportType:
|
|
64
|
-
imports_with_import_type = [i for i in imports if i.import_type == import_type]
|
|
66
|
+
imports_with_import_type = [i for i in imports if i.import_type == import_type and not i.version_modules]
|
|
65
67
|
if imports_with_import_type:
|
|
66
68
|
import_clause.append(_serialize_import_type(imports_with_import_type, delimiter))
|
|
69
|
+
versioned = [i for i in imports if i.version_modules]
|
|
70
|
+
if versioned:
|
|
71
|
+
import_clause.append(_serialize_versioned_imports(versioned, delimiter))
|
|
67
72
|
return import_clause
|
|
68
73
|
|
|
69
74
|
|
|
@@ -79,6 +84,13 @@ class FileImportSerializer:
|
|
|
79
84
|
if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
|
|
80
85
|
self.file_import.add_submodule_import("typing", "TYPE_CHECKING", ImportType.STDLIB)
|
|
81
86
|
|
|
87
|
+
def _add_sys_import_if_needed(self):
|
|
88
|
+
all_imports = list(self.file_import.get_imports_from_section(TypingSection.REGULAR)) + list(
|
|
89
|
+
self.file_import.get_imports_from_section(TypingSection.TYPING)
|
|
90
|
+
)
|
|
91
|
+
if any(i.version_modules for i in all_imports):
|
|
92
|
+
self.file_import.add_import("sys", ImportType.STDLIB)
|
|
93
|
+
|
|
82
94
|
def get_typing_definitions(self) -> str:
|
|
83
95
|
def declare_definition(type_name: str, type_definition: TypeDefinition) -> list[str]:
|
|
84
96
|
ret: list[str] = []
|
|
@@ -95,6 +107,7 @@ class FileImportSerializer:
|
|
|
95
107
|
|
|
96
108
|
def __str__(self) -> str:
|
|
97
109
|
self._add_type_checking_import()
|
|
110
|
+
self._add_sys_import_if_needed()
|
|
98
111
|
regular_imports = ""
|
|
99
112
|
regular_imports_list = self._get_imports_list(TypingSection.REGULAR)
|
|
100
113
|
|