From 23c2d6619c88486c52699b3ab3fd2fd0d5519ee6 Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Wed, 23 Feb 2022 10:10:57 -0600 Subject: [PATCH 1/5] feat: stricter static analysis --- phpstan.neon.dist | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 phpstan.neon.dist diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000000..56aeebfb59 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,5 @@ +parameters: + level: 7 + paths: + - src + treatPhpDocTypesAsCertain: false From 8a9ebcbbbcc00d43da2b1a01e0b572eb44b35b35 Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Thu, 24 Feb 2022 14:31:44 -0600 Subject: [PATCH 2/5] WIP - add void return type --- appengine/flexible/datastore/app.php | 2 +- appengine/flexible/metadata/app.php | 4 +- appengine/flexible/tasks/src/create_task.php | 2 +- appengine/standard/auth/src/auth_api.php | 2 +- appengine/standard/auth/src/auth_cloud.php | 2 +- appengine/standard/metadata/index.php | 6 +- .../standard/tasks/apps/handler/index.php | 2 +- appengine/standard/trace/index.php | 2 +- asset/src/batch_get_assets_history.php | 13 ++- asset/src/export_assets.php | 2 +- asset/src/list_assets.php | 13 ++- asset/src/search_all_iam_policies.php | 2 +- asset/src/search_all_resources.php | 14 +-- auth/src/auth_api_explicit.php | 2 +- auth/src/auth_api_explicit_compute.php | 2 +- auth/src/auth_api_implicit.php | 2 +- auth/src/auth_cloud_explicit.php | 2 +- auth/src/auth_cloud_explicit_compute.php | 2 +- auth/src/auth_cloud_implicit.php | 2 +- auth/src/auth_http_explicit.php | 2 +- auth/src/auth_http_implicit.php | 2 +- bigquery/api/src/bigquery_client.php | 1 + bigquery/api/src/get_table.php | 3 + bigquery/api/src/import_from_local_csv.php | 5 +- bigquery/api/src/insert_sql.php | 4 +- bigtable/src/filter_composing_chain.php | 5 +- bigtable/src/filter_composing_condition.php | 5 +- bigtable/src/filter_composing_interleave.php | 5 +- bigtable/src/filter_limit_block_all.php | 5 +- bigtable/src/filter_limit_cells_per_col.php | 5 +- bigtable/src/filter_limit_cells_per_row.php | 5 +- .../src/filter_limit_cells_per_row_offset.php | 5 +- .../src/filter_limit_col_family_regex.php | 5 +- .../src/filter_limit_col_qualifier_regex.php | 5 +- bigtable/src/filter_limit_col_range.php | 5 +- bigtable/src/filter_limit_pass_all.php | 5 +- bigtable/src/filter_limit_row_regex.php | 5 +- bigtable/src/filter_limit_row_sample.php | 5 +- bigtable/src/filter_limit_timestamp_range.php | 5 +- bigtable/src/filter_limit_value_range.php | 5 +- bigtable/src/filter_limit_value_regex.php | 5 +- bigtable/src/filter_modify_apply_label.php | 5 +- bigtable/src/filter_modify_strip_value.php | 5 +- bigtable/src/insert_update_rows.php | 2 +- bigtable/src/read_filter.php | 5 +- bigtable/src/read_prefix.php | 5 +- bigtable/src/read_row.php | 5 +- bigtable/src/read_row_partial.php | 5 +- bigtable/src/read_row_range.php | 5 +- bigtable/src/read_row_ranges.php | 5 +- bigtable/src/read_rows.php | 5 +- cdn/signUrl.php | 6 +- compute/api-client/helloworld/app.php | 2 +- .../firewall/src/create_firewall_rule.php | 2 +- .../firewall/src/delete_firewall_rule.php | 2 +- .../firewall/src/list_firewall_rules.php | 2 +- .../firewall/src/patch_firewall_priority.php | 2 +- .../firewall/src/print_firewall_rule.php | 2 +- compute/cloud-client/helloworld/app.php | 2 +- .../src/disable_usage_export_bucket.php | 2 +- .../instances/src/get_usage_export_bucket.php | 2 +- .../instances/src/list_all_images.php | 2 +- .../instances/src/list_all_instances.php | 2 +- .../instances/src/list_images_by_page.php | 2 +- .../instances/src/list_instances.php | 2 +- compute/logging/index.php | 2 +- datastore/api/src/functions/concepts.php | 102 +++++++++--------- datastore/api/test/ConceptsTest.php | 2 +- datastore/tutorial/src/functions.php | 12 +-- dialogflow/src/context_create.php | 2 +- dialogflow/src/context_delete.php | 2 +- dialogflow/src/context_list.php | 2 +- dialogflow/src/detect_intent_audio.php | 2 +- dialogflow/src/detect_intent_stream.php | 2 +- dialogflow/src/detect_intent_texts.php | 2 +- dialogflow/src/entity_create.php | 2 +- dialogflow/src/entity_delete.php | 2 +- dialogflow/src/entity_list.php | 2 +- dialogflow/src/entity_type_create.php | 2 +- dialogflow/src/entity_type_delete.php | 2 +- dialogflow/src/entity_type_list.php | 2 +- dialogflow/src/intent_delete.php | 2 +- dialogflow/src/intent_list.php | 2 +- dialogflow/src/session_entity_type_delete.php | 2 +- dialogflow/src/session_entity_type_list.php | 2 +- endpoints/getting-started/app.php | 2 +- firestore/src/data_delete_collection.php | 2 +- firestore/src/setup_client_create.php | 2 +- functions/concepts_build_extension/index.php | 2 +- functions/firebase_auth/index.php | 2 +- functions/firebase_firestore/index.php | 2 +- .../firebase_firestore_reactive/index.php | 2 +- functions/firebase_remote_config/index.php | 2 +- functions/firebase_rtdb/index.php | 2 +- functions/helloworld_storage/index.php | 2 +- iap/src/make_iap_request.php | 2 +- iap/src/validate_jwt.php | 6 +- logging/src/log_entry_functions.php | 6 +- logging/src/sink_functions.php | 8 +- logging/src/write_with_monolog_logger.php | 2 +- logging/src/write_with_psr_logger.php | 2 +- .../transcoder/src/create_job_from_ad_hoc.php | 2 +- .../transcoder/src/create_job_from_preset.php | 2 +- .../src/create_job_from_template.php | 2 +- media/transcoder/src/create_job_template.php | 2 +- .../src/create_job_with_animated_overlay.php | 2 +- .../create_job_with_concatenated_inputs.php | 2 +- ...e_job_with_periodic_images_spritesheet.php | 2 +- ...job_with_set_number_images_spritesheet.php | 2 +- .../src/create_job_with_static_overlay.php | 2 +- media/transcoder/src/delete_job.php | 2 +- media/transcoder/src/delete_job_template.php | 2 +- media/transcoder/src/get_job.php | 2 +- media/transcoder/src/get_job_state.php | 2 +- media/transcoder/src/get_job_template.php | 2 +- media/transcoder/src/list_job_templates.php | 2 +- media/transcoder/src/list_jobs.php | 2 +- monitoring/src/alert_backup_policies.php | 2 +- monitoring/src/alert_create_channel.php | 2 +- monitoring/src/alert_create_policy.php | 2 +- monitoring/src/alert_delete_channel.php | 2 +- monitoring/src/alert_enable_policies.php | 2 +- monitoring/src/alert_list_channels.php | 2 +- monitoring/src/alert_list_policies.php | 2 +- monitoring/src/alert_replace_channels.php | 2 +- monitoring/src/alert_restore_policies.php | 2 +- monitoring/src/create_metric.php | 2 +- monitoring/src/create_uptime_check.php | 2 +- monitoring/src/delete_metric.php | 2 +- monitoring/src/delete_uptime_check.php | 2 +- monitoring/src/get_descriptor.php | 2 +- monitoring/src/get_resource.php | 2 +- monitoring/src/get_uptime_check.php | 2 +- monitoring/src/list_descriptors.php | 2 +- monitoring/src/list_resources.php | 2 +- monitoring/src/list_uptime_check_ips.php | 2 +- monitoring/src/list_uptime_checks.php | 2 +- monitoring/src/read_timeseries_align.php | 2 +- monitoring/src/read_timeseries_fields.php | 2 +- monitoring/src/read_timeseries_reduce.php | 2 +- monitoring/src/read_timeseries_simple.php | 2 +- monitoring/src/update_uptime_check.php | 2 +- monitoring/src/write_timeseries.php | 2 +- phpstan.neon.dist | 4 +- pubsub/api/src/create_avro_schema.php | 2 +- pubsub/api/src/create_proto_schema.php | 2 +- pubsub/api/src/create_push_subscription.php | 2 +- pubsub/api/src/create_subscription.php | 2 +- pubsub/api/src/create_topic.php | 2 +- pubsub/api/src/create_topic_with_schema.php | 2 +- .../src/dead_letter_create_subscription.php | 2 +- .../api/src/dead_letter_delivery_attempt.php | 2 +- pubsub/api/src/dead_letter_remove.php | 2 +- .../src/dead_letter_update_subscription.php | 2 +- pubsub/api/src/delete_schema.php | 2 +- pubsub/api/src/delete_subscription.php | 2 +- pubsub/api/src/delete_topic.php | 2 +- pubsub/api/src/detach_subscription.php | 2 +- pubsub/api/src/get_schema.php | 2 +- pubsub/api/src/get_subscription_policy.php | 2 +- pubsub/api/src/get_topic_policy.php | 2 +- pubsub/api/src/list_schemas.php | 2 +- pubsub/api/src/list_subscriptions.php | 2 +- pubsub/api/src/list_topics.php | 2 +- pubsub/api/src/publish_avro_records.php | 2 +- pubsub/api/src/publish_message.php | 2 +- pubsub/api/src/publish_message_batch.php | 2 +- pubsub/api/src/publish_proto_messages.php | 2 +- pubsub/api/src/pull_messages.php | 2 +- pubsub/api/src/set_subscription_policy.php | 2 +- pubsub/api/src/set_topic_policy.php | 2 +- pubsub/api/src/subscribe_avro_records.php | 2 +- pubsub/api/src/subscribe_proto_messages.php | 2 +- .../api/src/test_subscription_permissions.php | 2 +- pubsub/api/src/test_topic_permissions.php | 2 +- spanner/src/add_column.php | 2 +- spanner/src/add_json_column.php | 2 +- spanner/src/add_numeric_column.php | 2 +- spanner/src/add_timestamp_column.php | 2 +- spanner/src/batch_query_data.php | 2 +- spanner/src/cancel_backup.php | 2 +- spanner/src/create_backup.php | 2 +- .../src/create_backup_with_encryption_key.php | 2 +- .../src/create_client_with_query_options.php | 2 +- spanner/src/create_database.php | 2 +- .../create_database_with_default_leader.php | 2 +- .../create_database_with_encryption_key.php | 2 +- ...database_with_version_retention_period.php | 2 +- spanner/src/create_index.php | 2 +- spanner/src/create_instance.php | 2 +- spanner/src/create_storing_index.php | 2 +- spanner/src/create_table_with_datatypes.php | 2 +- .../create_table_with_timestamp_column.php | 2 +- spanner/src/delete_backup.php | 2 +- spanner/src/delete_data.php | 2 +- spanner/src/delete_data_with_dml.php | 2 +- .../src/delete_data_with_partitioned_dml.php | 2 +- spanner/src/get_commit_stats.php | 2 +- spanner/src/get_database_ddl.php | 2 +- spanner/src/get_instance_config.php | 2 +- spanner/src/insert_data.php | 2 +- spanner/src/insert_data_with_datatypes.php | 2 +- spanner/src/insert_data_with_dml.php | 2 +- .../src/insert_data_with_timestamp_column.php | 2 +- spanner/src/insert_struct_data.php | 2 +- spanner/src/list_backups.php | 2 +- spanner/src/list_database_operations.php | 2 +- spanner/src/list_databases.php | 2 +- spanner/src/list_instance_configs.php | 2 +- spanner/src/query_data.php | 2 +- .../src/query_data_with_array_of_struct.php | 2 +- .../src/query_data_with_array_parameter.php | 2 +- .../src/query_data_with_bool_parameter.php | 2 +- .../src/query_data_with_bytes_parameter.php | 2 +- .../src/query_data_with_date_parameter.php | 2 +- .../src/query_data_with_float_parameter.php | 2 +- spanner/src/query_data_with_int_parameter.php | 2 +- .../src/query_data_with_json_parameter.php | 2 +- .../query_data_with_nested_struct_field.php | 2 +- spanner/src/query_data_with_new_column.php | 2 +- .../src/query_data_with_numeric_parameter.php | 2 +- spanner/src/query_data_with_parameter.php | 2 +- spanner/src/query_data_with_query_options.php | 2 +- .../src/query_data_with_string_parameter.php | 2 +- spanner/src/query_data_with_struct.php | 2 +- spanner/src/query_data_with_struct_field.php | 2 +- .../src/query_data_with_timestamp_column.php | 2 +- .../query_data_with_timestamp_parameter.php | 2 +- ...ry_information_schema_database_options.php | 2 +- spanner/src/read_data.php | 2 +- spanner/src/read_data_with_index.php | 2 +- spanner/src/read_data_with_storing_index.php | 2 +- spanner/src/read_only_transaction.php | 2 +- spanner/src/read_stale_data.php | 2 +- spanner/src/read_write_transaction.php | 2 +- spanner/src/restore_backup.php | 2 +- .../restore_backup_with_encryption_key.php | 2 +- spanner/src/update_backup.php | 2 +- spanner/src/update_data.php | 2 +- spanner/src/update_data_with_batch_dml.php | 2 +- spanner/src/update_data_with_dml.php | 2 +- spanner/src/update_data_with_dml_structs.php | 2 +- .../src/update_data_with_dml_timestamp.php | 2 +- spanner/src/update_data_with_json_column.php | 2 +- .../src/update_data_with_numeric_column.php | 2 +- .../src/update_data_with_partitioned_dml.php | 2 +- .../src/update_data_with_timestamp_column.php | 2 +- .../update_database_with_default_leader.php | 2 +- spanner/src/write_data_with_dml.php | 2 +- .../src/write_data_with_dml_transaction.php | 2 +- spanner/src/write_read_with_dml.php | 2 +- storage/src/activate_hmac_key.php | 2 +- storage/src/add_bucket_acl.php | 2 +- .../add_bucket_conditional_iam_binding.php | 2 +- storage/src/add_bucket_default_acl.php | 2 +- storage/src/add_bucket_iam_member.php | 2 +- storage/src/add_bucket_label.php | 2 +- storage/src/add_object_acl.php | 2 +- storage/src/bucket_delete_default_kms_key.php | 2 +- storage/src/change_default_storage_class.php | 2 +- storage/src/change_file_storage_class.php | 2 +- storage/src/compose_file.php | 2 +- storage/src/copy_file_archived_generation.php | 2 +- storage/src/copy_object.php | 2 +- storage/src/cors_configuration.php | 2 +- storage/src/create_bucket.php | 2 +- storage/src/create_bucket_class_location.php | 2 +- .../src/create_bucket_turbo_replication.php | 2 +- storage/src/create_hmac_key.php | 2 +- storage/src/deactivate_hmac_key.php | 2 +- .../define_bucket_website_configuration.php | 2 +- storage/src/delete_bucket.php | 2 +- storage/src/delete_bucket_acl.php | 2 +- storage/src/delete_bucket_default_acl.php | 2 +- .../src/delete_file_archived_generation.php | 2 +- storage/src/delete_hmac_key.php | 2 +- storage/src/delete_object.php | 2 +- storage/src/delete_object_acl.php | 2 +- .../disable_bucket_lifecycle_management.php | 2 +- .../src/disable_default_event_based_hold.php | 2 +- storage/src/disable_requester_pays.php | 2 +- .../disable_uniform_bucket_level_access.php | 2 +- storage/src/disable_versioning.php | 2 +- storage/src/download_encrypted_object.php | 2 +- storage/src/download_file_requester_pays.php | 2 +- storage/src/download_object.php | 2 +- storage/src/download_public_file.php | 2 +- .../enable_bucket_lifecycle_management.php | 2 +- .../src/enable_default_event_based_hold.php | 2 +- storage/src/enable_default_kms_key.php | 2 +- storage/src/enable_requester_pays.php | 2 +- .../enable_uniform_bucket_level_access.php | 2 +- storage/src/enable_versioning.php | 2 +- storage/src/generate_encryption_key.php | 2 +- .../src/generate_signed_post_policy_v4.php | 2 +- storage/src/generate_v4_post_policy.php | 2 +- storage/src/get_bucket_acl.php | 2 +- storage/src/get_bucket_acl_for_entity.php | 2 +- storage/src/get_bucket_default_acl.php | 2 +- .../src/get_bucket_default_acl_for_entity.php | 2 +- storage/src/get_bucket_labels.php | 2 +- storage/src/get_bucket_metadata.php | 2 +- storage/src/get_default_event_based_hold.php | 2 +- storage/src/get_hmac_key.php | 2 +- storage/src/get_object_acl.php | 2 +- storage/src/get_object_acl_for_entity.php | 2 +- storage/src/get_object_v2_signed_url.php | 2 +- storage/src/get_object_v4_signed_url.php | 2 +- storage/src/get_public_access_prevention.php | 2 +- storage/src/get_requester_pays_status.php | 2 +- storage/src/get_retention_policy.php | 2 +- storage/src/get_service_account.php | 2 +- storage/src/get_turbo_replication_status.php | 2 +- .../src/get_uniform_bucket_level_access.php | 2 +- storage/src/list_buckets.php | 2 +- .../src/list_file_archived_generations.php | 2 +- storage/src/list_hmac_keys.php | 2 +- storage/src/list_objects.php | 2 +- storage/src/list_objects_with_prefix.php | 2 +- storage/src/lock_retention_policy.php | 2 +- storage/src/make_public.php | 2 +- storage/src/move_object.php | 2 +- storage/src/object_csek_to_cmek.php | 2 +- storage/src/object_metadata.php | 2 +- storage/src/release_event_based_hold.php | 2 +- storage/src/release_temporary_hold.php | 2 +- .../remove_bucket_conditional_iam_binding.php | 2 +- storage/src/remove_bucket_iam_member.php | 2 +- storage/src/remove_bucket_label.php | 2 +- storage/src/remove_cors_configuration.php | 2 +- storage/src/remove_retention_policy.php | 2 +- storage/src/set_bucket_public_iam.php | 2 +- storage/src/set_event_based_hold.php | 2 +- storage/src/set_metadata.php | 2 +- .../set_public_access_prevention_enforced.php | 2 +- ...set_public_access_prevention_inherited.php | 2 +- ...t_public_access_prevention_unspecified.php | 2 +- storage/src/set_retention_policy.php | 2 +- storage/src/set_temporary_hold.php | 2 +- .../src/set_turbo_replication_async_turbo.php | 2 +- storage/src/set_turbo_replication_default.php | 2 +- storage/src/upload_encrypted_object.php | 2 +- storage/src/upload_object.php | 2 +- storage/src/upload_object_v4_signed_url.php | 2 +- storage/src/upload_with_kms_key.php | 2 +- storage/src/view_bucket_iam_members.php | 2 +- storagetransfer/src/quickstart.php | 2 +- testing/sample_helpers.php | 4 +- trace/trace-sample.php | 2 +- vision/src/detect_document_text.php | 2 +- vision/src/detect_document_text_gcs.php | 2 +- vision/src/detect_face.php | 2 +- vision/src/detect_face_gcs.php | 2 +- vision/src/detect_image_property.php | 2 +- vision/src/detect_image_property_gcs.php | 2 +- vision/src/detect_label.php | 2 +- vision/src/detect_label_gcs.php | 2 +- vision/src/detect_landmark.php | 2 +- vision/src/detect_landmark_gcs.php | 2 +- vision/src/detect_logo.php | 2 +- vision/src/detect_logo_gcs.php | 2 +- vision/src/detect_object.php | 2 +- vision/src/detect_object_gcs.php | 2 +- vision/src/detect_pdf_gcs.php | 2 +- vision/src/detect_safe_search.php | 2 +- vision/src/detect_safe_search_gcs.php | 2 +- vision/src/detect_text.php | 2 +- vision/src/detect_text_gcs.php | 2 +- vision/src/detect_web.php | 2 +- vision/src/detect_web_gcs.php | 2 +- vision/src/detect_web_with_geo_metadata.php | 2 +- .../src/detect_web_with_geo_metadata_gcs.php | 2 +- 372 files changed, 546 insertions(+), 450 deletions(-) diff --git a/appengine/flexible/datastore/app.php b/appengine/flexible/datastore/app.php index 4eb850a2f9..ad9e4e0acd 100644 --- a/appengine/flexible/datastore/app.php +++ b/appengine/flexible/datastore/app.php @@ -80,7 +80,7 @@ ->withHeader('Content-Type', 'text/plain'); }); -function get_user_ip(Request $request) +function get_user_ip(Request $request): void { $ip = $request->getAttribute('ip_address'); // Keep only the first two octets of the IP address. diff --git a/appengine/flexible/metadata/app.php b/appengine/flexible/metadata/app.php index bc355f73c1..8938db407d 100644 --- a/appengine/flexible/metadata/app.php +++ b/appengine/flexible/metadata/app.php @@ -19,7 +19,7 @@ use Slim\Factory\AppFactory; # [START gae_flex_metadata] -function get_external_ip_using_google_cloud() +function get_external_ip_using_google_cloud(): void { $metadata = new Google\Cloud\Core\Compute\Metadata(); $externalIp = $metadata->get( @@ -28,7 +28,7 @@ function get_external_ip_using_google_cloud() return $externalIp; } -function get_external_ip_using_curl() +function get_external_ip_using_curl(): void { $url = 'http://metadata.google.internal/computeMetadata/v1/' . 'instance/network-interfaces/0/access-configs/0/external-ip'; diff --git a/appengine/flexible/tasks/src/create_task.php b/appengine/flexible/tasks/src/create_task.php index f06bc6d33f..840eb872b0 100644 --- a/appengine/flexible/tasks/src/create_task.php +++ b/appengine/flexible/tasks/src/create_task.php @@ -42,7 +42,7 @@ * @param integer $inSeconds The number of seconds from now to schedule task attempt. * */ -function create_task($projectId, $queueId, $location, $payload = 'helloworld', $inSeconds = null) +function create_task($projectId, $queueId, $location, $payload = 'helloworld', $inSeconds = null): void { // Instantiate the client, authenticate, and add scopes. $client = new Google_Client(); diff --git a/appengine/standard/auth/src/auth_api.php b/appengine/standard/auth/src/auth_api.php index 09578f2c74..8be907a014 100644 --- a/appengine/standard/auth/src/auth_api.php +++ b/appengine/standard/auth/src/auth_api.php @@ -27,7 +27,7 @@ use Google_Client; use Google_Service_Storage; -function auth_api($projectId) +function auth_api($projectId): void { $client = new Google_Client(); $client->useApplicationDefaultCredentials(); diff --git a/appengine/standard/auth/src/auth_cloud.php b/appengine/standard/auth/src/auth_cloud.php index 1ca0f8eb03..5446ca901f 100644 --- a/appengine/standard/auth/src/auth_cloud.php +++ b/appengine/standard/auth/src/auth_cloud.php @@ -26,7 +26,7 @@ // Imports the Cloud Storage client library. use Google\Cloud\Storage\StorageClient; -function auth_cloud($projectId) +function auth_cloud($projectId): void { # If you don't specify credentials when constructing the client, the # client library will look for credentials in the environment. diff --git a/appengine/standard/metadata/index.php b/appengine/standard/metadata/index.php index 77734f8a79..6ef92d1656 100644 --- a/appengine/standard/metadata/index.php +++ b/appengine/standard/metadata/index.php @@ -34,7 +34,7 @@ * * @param $metadataKey the key for the metadata server */ -function request_metadata_using_google_cloud($metadataKey) +function request_metadata_using_google_cloud($metadataKey): void { $metadata = new Google\Cloud\Core\Compute\Metadata(); $metadataValue = $metadata->get($metadataKey); @@ -47,7 +47,7 @@ function request_metadata_using_google_cloud($metadataKey) * * @param $metadataKey the key for the metadata server */ -function request_metadata_using_curl(http://github.com/$metadataKey) +function request_metadata_using_curl(http://github.com/$metadataKey): void { $url = 'http://metadata/computeMetadata/v1/' . $metadataKey; @@ -60,7 +60,7 @@ function request_metadata_using_curl(http://github.com/$metadataKey) } # [END gae_metadata] -function print_metadata_paths($root = '') +function print_metadata_paths($root = ''): void { $keys = request_metadata_using_google_cloud($root); $html = '