From 09cf275de920d169c26b8ed364d9e3abb18f8781 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:17:03 -0400 Subject: [PATCH] chore: Update gapic-generator-python to v1.11.9 (#547) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: Update gapic-generator-python to v1.11.7 PiperOrigin-RevId: 573230664 Source-Link: https://github.com/googleapis/googleapis/commit/93beed334607e70709cc60e6145be65fdc8ec386 Source-Link: https://github.com/googleapis/googleapis-gen/commit/f4a4edaa8057639fcf6adf9179872280d1a8f651 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZjRhNGVkYWE4MDU3NjM5ZmNmNmFkZjkxNzk4NzIyODBkMWE4ZjY1MSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * chore: Update gapic-generator-python to v1.11.8 PiperOrigin-RevId: 574178735 Source-Link: https://github.com/googleapis/googleapis/commit/7307199008ee2d57a4337066de29f9cd8c444bc6 Source-Link: https://github.com/googleapis/googleapis-gen/commit/ce3af21b7c559a87c2befc076be0e3aeda3a26f0 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiY2UzYWYyMWI3YzU1OWE4N2MyYmVmYzA3NmJlMGUzYWVkYTNhMjZmMCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * chore: Update gapic-generator-python to v1.11.9 PiperOrigin-RevId: 574520922 Source-Link: https://github.com/googleapis/googleapis/commit/5183984d611beb41e90f65f08609b9d926f779bd Source-Link: https://github.com/googleapis/googleapis-gen/commit/a59af19d4ac6509faedf1cc39029141b6a5b8968 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYTU5YWYxOWQ0YWM2NTA5ZmFlZGYxY2MzOTAyOTE0MWI2YTViODk2OCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update post processor image; remove unused files * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 6 +- docs/index.rst | 12 +- .../speech_v1/{services.rst => services_.rst} | 0 docs/speech_v1/{types.rst => types_.rst} | 0 .../{services.rst => services_.rst} | 0 .../{types.rst => types_.rst} | 0 .../speech_v2/{services.rst => services_.rst} | 0 docs/speech_v2/{types.rst => types_.rst} | 0 tests/unit/gapic/speech_v1/test_adaptation.py | 268 ++++-- tests/unit/gapic/speech_v1/test_speech.py | 15 +- .../gapic/speech_v1p1beta1/test_adaptation.py | 268 ++++-- .../gapic/speech_v1p1beta1/test_speech.py | 15 +- tests/unit/gapic/speech_v2/test_speech.py | 841 ++++++++++++------ 14 files changed, 998 insertions(+), 429 deletions(-) rename docs/speech_v1/{services.rst => services_.rst} (100%) rename docs/speech_v1/{types.rst => types_.rst} (100%) rename docs/speech_v1p1beta1/{services.rst => services_.rst} (100%) rename docs/speech_v1p1beta1/{types.rst => types_.rst} (100%) rename docs/speech_v2/{services.rst => services_.rst} (100%) rename docs/speech_v2/{types.rst => types_.rst} (100%) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index dd98abbd..a934f1e0 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:08e34975760f002746b1d8c86fdc90660be45945ee6d9db914d1508acdf9a547 + digest: sha256:4f9b3b106ad0beafc2c8a415e3f62c1a0cc23cabea115dbe841b848f581cfe99 # created: 2023-10-09T14:06:13.397766266Z diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 0332d326..16170d0c 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -467,9 +467,9 @@ typing-extensions==4.4.0 \ --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via -r requirements.in -urllib3==1.26.17 \ - --hash=sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21 \ - --hash=sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b +urllib3==1.26.18 \ + --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ + --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 # via # requests # twine diff --git a/docs/index.rst b/docs/index.rst index 8c7d97b2..dab25776 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,24 +11,24 @@ API Reference .. toctree:: :maxdepth: 2 - speech_v1/services - speech_v1/types + speech_v1/services_ + speech_v1/types_ API Reference ------------- .. toctree:: :maxdepth: 2 - speech_v1p1beta1/services - speech_v1p1beta1/types + speech_v1p1beta1/services_ + speech_v1p1beta1/types_ API Reference ------------- .. toctree:: :maxdepth: 2 - speech_v2/services - speech_v2/types + speech_v2/services_ + speech_v2/types_ Migration Guide diff --git a/docs/speech_v1/services.rst b/docs/speech_v1/services_.rst similarity index 100% rename from docs/speech_v1/services.rst rename to docs/speech_v1/services_.rst diff --git a/docs/speech_v1/types.rst b/docs/speech_v1/types_.rst similarity index 100% rename from docs/speech_v1/types.rst rename to docs/speech_v1/types_.rst diff --git a/docs/speech_v1p1beta1/services.rst b/docs/speech_v1p1beta1/services_.rst similarity index 100% rename from docs/speech_v1p1beta1/services.rst rename to docs/speech_v1p1beta1/services_.rst diff --git a/docs/speech_v1p1beta1/types.rst b/docs/speech_v1p1beta1/types_.rst similarity index 100% rename from docs/speech_v1p1beta1/types.rst rename to docs/speech_v1p1beta1/types_.rst diff --git a/docs/speech_v2/services.rst b/docs/speech_v2/services_.rst similarity index 100% rename from docs/speech_v2/services.rst rename to docs/speech_v2/services_.rst diff --git a/docs/speech_v2/types.rst b/docs/speech_v2/types_.rst similarity index 100% rename from docs/speech_v2/types.rst rename to docs/speech_v2/types_.rst diff --git a/tests/unit/gapic/speech_v1/test_adaptation.py b/tests/unit/gapic/speech_v1/test_adaptation.py index 5c218b9e..ce9fb5e2 100644 --- a/tests/unit/gapic/speech_v1/test_adaptation.py +++ b/tests/unit/gapic/speech_v1/test_adaptation.py @@ -3576,8 +3576,9 @@ def test_create_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3658,8 +3659,9 @@ def test_create_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3793,8 +3795,9 @@ def test_create_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3861,8 +3864,9 @@ def test_get_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3938,8 +3942,9 @@ def test_get_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4064,8 +4069,9 @@ def test_get_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4129,8 +4135,9 @@ def test_list_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4212,10 +4219,11 @@ def test_list_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4350,8 +4358,9 @@ def test_list_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4467,6 +4476,75 @@ def test_update_phrase_set_rest(request_type): "phrases": [{"value": "value_value", "boost": 0.551}], "boost": 0.551, } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech_adaptation.UpdatePhraseSetRequest.meta.fields[ + "phrase_set" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["phrase_set"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["phrase_set"][field])): + del request_init["phrase_set"][field][i][subfield] + else: + del request_init["phrase_set"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -4480,8 +4558,9 @@ def test_update_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4555,8 +4634,9 @@ def test_update_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4644,11 +4724,6 @@ def test_update_phrase_set_rest_bad_request( request_init = { "phrase_set": {"name": "projects/sample1/locations/sample2/phraseSets/sample3"} } - request_init["phrase_set"] = { - "name": "projects/sample1/locations/sample2/phraseSets/sample3", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -4691,8 +4766,9 @@ def test_update_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5013,8 +5089,9 @@ def test_create_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5095,8 +5172,9 @@ def test_create_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5231,8 +5309,9 @@ def test_create_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5300,8 +5379,9 @@ def test_get_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5377,8 +5457,9 @@ def test_get_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5503,8 +5584,9 @@ def test_get_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5569,10 +5651,11 @@ def test_list_custom_classes_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5654,10 +5737,11 @@ def test_list_custom_classes_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5793,10 +5877,11 @@ def test_list_custom_classes_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5916,6 +6001,75 @@ def test_update_custom_class_rest(request_type): "custom_class_id": "custom_class_id_value", "items": [{"value": "value_value"}], } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech_adaptation.UpdateCustomClassRequest.meta.fields[ + "custom_class" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["custom_class"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["custom_class"][field])): + del request_init["custom_class"][field][i][subfield] + else: + del request_init["custom_class"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -5929,8 +6083,9 @@ def test_update_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -6004,8 +6159,9 @@ def test_update_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -6096,11 +6252,6 @@ def test_update_custom_class_rest_bad_request( "name": "projects/sample1/locations/sample2/customClasses/sample3" } } - request_init["custom_class"] = { - "name": "projects/sample1/locations/sample2/customClasses/sample3", - "custom_class_id": "custom_class_id_value", - "items": [{"value": "value_value"}], - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -6143,8 +6294,9 @@ def test_update_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value diff --git a/tests/unit/gapic/speech_v1/test_speech.py b/tests/unit/gapic/speech_v1/test_speech.py index fc49ecca..0dd09bcf 100644 --- a/tests/unit/gapic/speech_v1/test_speech.py +++ b/tests/unit/gapic/speech_v1/test_speech.py @@ -1162,8 +1162,9 @@ def test_recognize_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -1232,8 +1233,9 @@ def test_recognize_rest_required_fields(request_type=cloud_speech.RecognizeReque response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -1365,8 +1367,9 @@ def test_recognize_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value diff --git a/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py b/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py index 3eabc804..2b317ef5 100644 --- a/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py +++ b/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py @@ -3576,8 +3576,9 @@ def test_create_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3658,8 +3659,9 @@ def test_create_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3793,8 +3795,9 @@ def test_create_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3862,8 +3865,9 @@ def test_get_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3939,8 +3943,9 @@ def test_get_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4065,8 +4070,9 @@ def test_get_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4131,8 +4137,9 @@ def test_list_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4214,10 +4221,11 @@ def test_list_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4352,8 +4360,9 @@ def test_list_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListPhraseSetResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4470,6 +4479,75 @@ def test_update_phrase_set_rest(request_type): "phrases": [{"value": "value_value", "boost": 0.551}], "boost": 0.551, } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech_adaptation.UpdatePhraseSetRequest.meta.fields[ + "phrase_set" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["phrase_set"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["phrase_set"][field])): + del request_init["phrase_set"][field][i][subfield] + else: + del request_init["phrase_set"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -4483,8 +4561,9 @@ def test_update_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4558,8 +4637,9 @@ def test_update_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4647,11 +4727,6 @@ def test_update_phrase_set_rest_bad_request( request_init = { "phrase_set": {"name": "projects/sample1/locations/sample2/phraseSets/sample3"} } - request_init["phrase_set"] = { - "name": "projects/sample1/locations/sample2/phraseSets/sample3", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -4694,8 +4769,9 @@ def test_update_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5017,8 +5093,9 @@ def test_create_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5099,8 +5176,9 @@ def test_create_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5235,8 +5313,9 @@ def test_create_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5304,8 +5383,9 @@ def test_get_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5381,8 +5461,9 @@ def test_get_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5507,8 +5588,9 @@ def test_get_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5573,10 +5655,11 @@ def test_list_custom_classes_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5658,10 +5741,11 @@ def test_list_custom_classes_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5797,10 +5881,11 @@ def test_list_custom_classes_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( + # Convert return value to protobuf type + return_value = cloud_speech_adaptation.ListCustomClassesResponse.pb( return_value ) - json_return_value = json_format.MessageToJson(pb_return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -5920,6 +6005,75 @@ def test_update_custom_class_rest(request_type): "custom_class_id": "custom_class_id_value", "items": [{"value": "value_value"}], } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech_adaptation.UpdateCustomClassRequest.meta.fields[ + "custom_class" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["custom_class"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["custom_class"][field])): + del request_init["custom_class"][field][i][subfield] + else: + del request_init["custom_class"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -5933,8 +6087,9 @@ def test_update_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -6008,8 +6163,9 @@ def test_update_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -6100,11 +6256,6 @@ def test_update_custom_class_rest_bad_request( "name": "projects/sample1/locations/sample2/customClasses/sample3" } } - request_init["custom_class"] = { - "name": "projects/sample1/locations/sample2/customClasses/sample3", - "custom_class_id": "custom_class_id_value", - "items": [{"value": "value_value"}], - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -6147,8 +6298,9 @@ def test_update_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = resource.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = resource.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value diff --git a/tests/unit/gapic/speech_v1p1beta1/test_speech.py b/tests/unit/gapic/speech_v1p1beta1/test_speech.py index 27508054..5ef6362e 100644 --- a/tests/unit/gapic/speech_v1p1beta1/test_speech.py +++ b/tests/unit/gapic/speech_v1p1beta1/test_speech.py @@ -1162,8 +1162,9 @@ def test_recognize_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -1232,8 +1233,9 @@ def test_recognize_rest_required_fields(request_type=cloud_speech.RecognizeReque response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -1365,8 +1367,9 @@ def test_recognize_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value diff --git a/tests/unit/gapic/speech_v2/test_speech.py b/tests/unit/gapic/speech_v2/test_speech.py index a538d57f..1892c846 100644 --- a/tests/unit/gapic/speech_v2/test_speech.py +++ b/tests/unit/gapic/speech_v2/test_speech.py @@ -6880,6 +6880,73 @@ def test_create_recognizer_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.CreateRecognizerRequest.meta.fields["recognizer"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["recognizer"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["recognizer"][field])): + del request_init["recognizer"][field][i][subfield] + else: + del request_init["recognizer"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -7072,89 +7139,6 @@ def test_create_recognizer_rest_bad_request( # send a request that will satisfy transcoding request_init = {"parent": "projects/sample1/locations/sample2"} - request_init["recognizer"] = { - "name": "name_value", - "uid": "uid_value", - "display_name": "display_name_value", - "model": "model_value", - "language_codes": ["language_codes_value1", "language_codes_value2"], - "default_recognition_config": { - "auto_decoding_config": {}, - "explicit_decoding_config": { - "encoding": 1, - "sample_rate_hertz": 1817, - "audio_channel_count": 2002, - }, - "model": "model_value", - "language_codes": ["language_codes_value1", "language_codes_value2"], - "features": { - "profanity_filter": True, - "enable_word_time_offsets": True, - "enable_word_confidence": True, - "enable_automatic_punctuation": True, - "enable_spoken_punctuation": True, - "enable_spoken_emojis": True, - "multi_channel_mode": 1, - "diarization_config": { - "min_speaker_count": 1814, - "max_speaker_count": 1816, - }, - "max_alternatives": 1719, - }, - "adaptation": { - "phrase_sets": [ - { - "phrase_set": "phrase_set_value", - "inline_phrase_set": { - "name": "name_value", - "uid": "uid_value", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - "display_name": "display_name_value", - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - }, - } - ], - "custom_classes": [ - { - "name": "name_value", - "uid": "uid_value", - "display_name": "display_name_value", - "items": [{"value": "value_value"}], - "state": 2, - "create_time": {}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } - ], - }, - }, - "annotations": {}, - "state": 2, - "create_time": {}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -7261,8 +7245,9 @@ def test_list_recognizers_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListRecognizersResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListRecognizersResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7345,8 +7330,9 @@ def test_list_recognizers_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListRecognizersResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListRecognizersResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7478,8 +7464,9 @@ def test_list_recognizers_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListRecognizersResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListRecognizersResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7610,8 +7597,9 @@ def test_get_recognizer_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Recognizer.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Recognizer.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7695,8 +7683,9 @@ def test_get_recognizer_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Recognizer.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Recognizer.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7821,8 +7810,9 @@ def test_get_recognizer_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Recognizer.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Recognizer.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -7960,6 +7950,73 @@ def test_update_recognizer_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.UpdateRecognizerRequest.meta.fields["recognizer"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["recognizer"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["recognizer"][field])): + del request_init["recognizer"][field][i][subfield] + else: + del request_init["recognizer"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -8144,89 +8201,6 @@ def test_update_recognizer_rest_bad_request( request_init = { "recognizer": {"name": "projects/sample1/locations/sample2/recognizers/sample3"} } - request_init["recognizer"] = { - "name": "projects/sample1/locations/sample2/recognizers/sample3", - "uid": "uid_value", - "display_name": "display_name_value", - "model": "model_value", - "language_codes": ["language_codes_value1", "language_codes_value2"], - "default_recognition_config": { - "auto_decoding_config": {}, - "explicit_decoding_config": { - "encoding": 1, - "sample_rate_hertz": 1817, - "audio_channel_count": 2002, - }, - "model": "model_value", - "language_codes": ["language_codes_value1", "language_codes_value2"], - "features": { - "profanity_filter": True, - "enable_word_time_offsets": True, - "enable_word_confidence": True, - "enable_automatic_punctuation": True, - "enable_spoken_punctuation": True, - "enable_spoken_emojis": True, - "multi_channel_mode": 1, - "diarization_config": { - "min_speaker_count": 1814, - "max_speaker_count": 1816, - }, - "max_alternatives": 1719, - }, - "adaptation": { - "phrase_sets": [ - { - "phrase_set": "phrase_set_value", - "inline_phrase_set": { - "name": "name_value", - "uid": "uid_value", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - "display_name": "display_name_value", - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - }, - } - ], - "custom_classes": [ - { - "name": "name_value", - "uid": "uid_value", - "display_name": "display_name_value", - "items": [{"value": "value_value"}], - "state": 2, - "create_time": {}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } - ], - }, - }, - "annotations": {}, - "state": 2, - "create_time": {}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -8879,8 +8853,9 @@ def test_recognize_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -8953,8 +8928,9 @@ def test_recognize_rest_required_fields(request_type=cloud_speech.RecognizeReque response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9081,8 +9057,9 @@ def test_recognize_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.RecognizeResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.RecognizeResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9437,8 +9414,9 @@ def test_get_config_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9512,8 +9490,9 @@ def test_get_config_rest_required_fields(request_type=cloud_speech.GetConfigRequ response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9632,8 +9611,9 @@ def test_get_config_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9690,6 +9670,73 @@ def test_update_config_rest(request_type): "kms_key_name": "kms_key_name_value", "update_time": {"seconds": 751, "nanos": 543}, } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.UpdateConfigRequest.meta.fields["config"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["config"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["config"][field])): + del request_init["config"][field][i][subfield] + else: + del request_init["config"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -9703,8 +9750,9 @@ def test_update_config_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9778,8 +9826,9 @@ def test_update_config_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9863,11 +9912,6 @@ def test_update_config_rest_bad_request( # send a request that will satisfy transcoding request_init = {"config": {"name": "projects/sample1/locations/sample2/config"}} - request_init["config"] = { - "name": "projects/sample1/locations/sample2/config", - "kms_key_name": "kms_key_name_value", - "update_time": {"seconds": 751, "nanos": 543}, - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -9908,8 +9952,9 @@ def test_update_config_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.Config.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.Config.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -9979,6 +10024,73 @@ def test_create_custom_class_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.CreateCustomClassRequest.meta.fields["custom_class"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["custom_class"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["custom_class"][field])): + del request_init["custom_class"][field][i][subfield] + else: + del request_init["custom_class"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -10171,22 +10283,6 @@ def test_create_custom_class_rest_bad_request( # send a request that will satisfy transcoding request_init = {"parent": "projects/sample1/locations/sample2"} - request_init["custom_class"] = { - "name": "name_value", - "uid": "uid_value", - "display_name": "display_name_value", - "items": [{"value": "value_value"}], - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -10293,8 +10389,9 @@ def test_list_custom_classes_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10377,8 +10474,9 @@ def test_list_custom_classes_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10510,8 +10608,9 @@ def test_list_custom_classes_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListCustomClassesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10640,8 +10739,9 @@ def test_get_custom_class_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10723,8 +10823,9 @@ def test_get_custom_class_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10849,8 +10950,9 @@ def test_get_custom_class_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.CustomClass.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.CustomClass.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -10923,6 +11025,73 @@ def test_update_custom_class_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.UpdateCustomClassRequest.meta.fields["custom_class"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["custom_class"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["custom_class"][field])): + del request_init["custom_class"][field][i][subfield] + else: + del request_init["custom_class"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -11109,22 +11278,6 @@ def test_update_custom_class_rest_bad_request( "name": "projects/sample1/locations/sample2/customClasses/sample3" } } - request_init["custom_class"] = { - "name": "projects/sample1/locations/sample2/customClasses/sample3", - "uid": "uid_value", - "display_name": "display_name_value", - "items": [{"value": "value_value"}], - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -11782,6 +11935,73 @@ def test_create_phrase_set_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.CreatePhraseSetRequest.meta.fields["phrase_set"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["phrase_set"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["phrase_set"][field])): + del request_init["phrase_set"][field][i][subfield] + else: + del request_init["phrase_set"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -11974,23 +12194,6 @@ def test_create_phrase_set_rest_bad_request( # send a request that will satisfy transcoding request_init = {"parent": "projects/sample1/locations/sample2"} - request_init["phrase_set"] = { - "name": "name_value", - "uid": "uid_value", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - "display_name": "display_name_value", - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -12096,8 +12299,9 @@ def test_list_phrase_sets_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12180,8 +12384,9 @@ def test_list_phrase_sets_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12313,8 +12518,9 @@ def test_list_phrase_sets_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.ListPhraseSetsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12443,8 +12649,9 @@ def test_get_phrase_set_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12527,8 +12734,9 @@ def test_get_phrase_set_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12653,8 +12861,9 @@ def test_get_phrase_set_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = cloud_speech.PhraseSet.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = cloud_speech.PhraseSet.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -12725,6 +12934,73 @@ def test_update_phrase_set_rest(request_type): "kms_key_name": "kms_key_name_value", "kms_key_version_name": "kms_key_version_name_value", } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = cloud_speech.UpdatePhraseSetRequest.meta.fields["phrase_set"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["phrase_set"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["phrase_set"][field])): + del request_init["phrase_set"][field][i][subfield] + else: + del request_init["phrase_set"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -12909,23 +13185,6 @@ def test_update_phrase_set_rest_bad_request( request_init = { "phrase_set": {"name": "projects/sample1/locations/sample2/phraseSets/sample3"} } - request_init["phrase_set"] = { - "name": "projects/sample1/locations/sample2/phraseSets/sample3", - "uid": "uid_value", - "phrases": [{"value": "value_value", "boost": 0.551}], - "boost": 0.551, - "display_name": "display_name_value", - "state": 2, - "create_time": {"seconds": 751, "nanos": 543}, - "update_time": {}, - "delete_time": {}, - "expire_time": {}, - "annotations": {}, - "etag": "etag_value", - "reconciling": True, - "kms_key_name": "kms_key_name_value", - "kms_key_version_name": "kms_key_version_name_value", - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error.