Skip to content

Update counters integration to use string split and fix missing import

b3dea6b
Select commit
Loading
Failed to load commit list.
Draft

[WIP] feat: Add counter-based validations and tests #1977

Update counters integration to use string split and fix missing import
b3dea6b
Select commit
Loading
Failed to load commit list.
Google Cloud Build / data-pull-request-py (datcom-ci) failed Apr 23, 2026 in 9m 0s

Summary

Build Information

Trigger data-pull-request-py
Build 43190826-79d3-4bc2-a387-1ae0320860b9
Start 2026-04-23T01:15:21-07:00
Duration 8m58.625s
Status FAILURE

Steps

Step Status Duration
python_install SUCCESS 5m24.312s
python_test FAILURE 2m54.618s
python_format_check CANCELLED 2m56.623s

Details

starting build "43190826-79d3-4bc2-a387-1ae0320860b9"

FETCHSOURCE
From https://github.com/datacommonsorg/data
 * branch            b3dea6b58e53d8be2c3e60401cdbbf5dce044c1b -> FETCH_HEAD
Updating files:  18% (946/5056)
Updating files:  19% (961/5056)
Updating files:  20% (1012/5056)
Updating files:  20% (1024/5056)
Updating files:  21% (1062/5056)
Updating files:  22% (1113/5056)
Updating files:  23% (1163/5056)
Updating files:  24% (1214/5056)
Updating files:  25% (1264/5056)
Updating files:  26% (1315/5056)
Updating files:  27% (1366/5056)
Updating files:  28% (1416/5056)
Updating files:  29% (1467/5056)
Updating files:  30% (1517/5056)
Updating files:  31% (1568/5056)
Updating files:  32% (1618/5056)
Updating files:  33% (1669/5056)
Updating files:  34% (1720/5056)
Updating files:  35% (1770/5056)
Updating files:  36% (1821/5056)
Updating files:  37% (1871/5056)
Updating files:  38% (1922/5056)
Updating files:  39% (1972/5056)
Updating files:  40% (2023/5056)
Updating files:  41% (2073/5056)
Updating files:  42% (2124/5056)
Updating files:  43% (2175/5056)
Updating files:  43% (2183/5056)
Updating files:  44% (2225/5056)
Updating files:  45% (2276/5056)
Updating files:  46% (2326/5056)
Updating files:  47% (2377/5056)
Updating files:  48% (2427/5056)
Updating files:  49% (2478/5056)
Updating files:  50% (2528/5056)
Updating files:  51% (2579/5056)
Updating files:  52% (2630/5056)
Updating files:  53% (2680/5056)
Updating files:  54% (2731/5056)
Updating files:  55% (2781/5056)
Updating files:  56% (2832/5056)
Updating files:  57% (2882/5056)
Updating files:  58% (2933/5056)
Updating files:  59% (2984/5056)
Updating files:  60% (3034/5056)
Updating files:  61% (3085/5056)
Updating files:  62% (3135/5056)
Updating files:  63% (3186/5056)
Updating files:  64% (3236/5056)
Updating files:  65% (3287/5056)
Updating files:  66% (3337/5056)
Updating files:  67% (3388/5056)
Updating files:  68% (3439/5056)
Updating files:  69% (3489/5056)
Updating files:  70% (3540/5056)
Updating files:  71% (3590/5056)
Updating files:  72% (3641/5056)
Updating files:  73% (3691/5056)
Updating files:  74% (3742/5056)
Updating files:  75% (3792/5056)
Updating files:  76% (3843/5056)
Updating files:  77% (3894/5056)
Updating files:  78% (3944/5056)
Updating files:  79% (3995/5056)
Updating files:  80% (4045/5056)
Updating files:  81% (4096/5056)
Updating files:  82% (4146/5056)
Updating files:  83% (4197/5056)
Updating files:  84% (4248/5056)
Updating files:  85% (4298/5056)
Updating files:  86% (4349/5056)
Updating files:  87% (4399/5056)
Updating files:  88% (4450/5056)
Updating files:  89% (4500/5056)
Updating files:  90% (4551/5056)
Updating files:  91% (4601/5056)
Updating files:  92% (4652/5056)
Updating files:  93% (4703/5056)
Updating files:  94% (4753/5056)
Updating files:  95% (4804/5056)
Updating files:  96% (4854/5056)
Updating files:  96% (4868/5056)
Updating files:  97% (4905/5056)
Updating files:  98% (4955/5056)
Updating files:  99% (5006/5056)
Updating files: 100% (5056/5056)
Updating files: 100% (5056/5056), done.
HEAD is now at b3dea6b Update counters integration to use string split and fix missing import
GitCommit:
b3dea6b58e53d8be2c3e60401cdbbf5dce044c1b
BUILD
Starting Step #0 - "python_install"
Step #0 - "python_install": Pulling image: python:3.12.8
Step #0 - "python_install": 3.12.8: Pulling from library/python
Step #0 - "python_install": a492eee5e559: Pulling fs layer
Step #0 - "python_install": 32b550be6cb6: Pulling fs layer
Step #0 - "python_install": 35af2a7690f2: Pulling fs layer
Step #0 - "python_install": 7576b00d9bb1: Pulling fs layer
Step #0 - "python_install": a57a7d4db735: Pulling fs layer
Step #0 - "python_install": a113cc029c60: Pulling fs layer
Step #0 - "python_install": dc93fee02728: Pulling fs layer
Step #0 - "python_install": dc93fee02728: Waiting
Step #0 - "python_install": a57a7d4db735: Download complete
Step #0 - "python_install": 32b550be6cb6: Verifying Checksum
Step #0 - "python_install": 32b550be6cb6: Download complete
Step #0 - "python_install": dc93fee02728: Verifying Checksum
Step #0 - "python_install": dc93fee02728: Download complete
Step #0 - "python_install": a492eee5e559: Verifying Checksum
Step #0 - "python_install": a492eee5e559: Download complete
Step #0 - "python_install": a113cc029c60: Verifying Checksum
Step #0 - "python_install": a113cc029c60: Download complete
Step #0 - "python_install": 35af2a7690f2: Verifying Checksum
Step #0 - "python_install": 35af2a7690f2: Download complete
Step #0 - "python_install": 7576b00d9bb1: Verifying Checksum
Step #0 - "python_install": 7576b00d9bb1: Download complete
Step #0 - "python_install": a492eee5e559: Pull complete
Step #0 - "python_install": 32b550be6cb6: Pull complete
Step #0 - "python_install": 35af2a7690f2: Pull complete
Step #0 - "python_install": 7576b00d9bb1: Pull complete
Step #0 - "python_install": a57a7d4db735: Pull complete
Step #0 - "python_install": a113cc029c60: Pull complete
Step #0 - "python_install": dc93fee02728: Pull complete
Step #0 - "python_install": Digest: sha256:e74938514dc67ad3eade8798aa929f5dd569e463758c83243636d4e1b54aa559
Step #0 - "python_install": Status: Downloaded newer image for python:3.12.8
Step #0 - "python_install": docker.io/library/python:3.12.8
Step #0 - "python_install": ### Installing Python requirements
Step #0 - "python_install": Installing Python requirements
Step #0 - "python_install": 
Step #0 - "python_install": [notice] A new release of pip is available: 24.3.1 -> 26.0.1
Step #0 - "python_install": [notice] To update, run: pip install --upgrade pip
Finished Step #0 - "python_install"
Starting Step #1 - "python_test"
Starting Step #2 - "python_format_check"
Step #2 - "python_format_check": Already have image (with digest): python:3.12.8
Step #1 - "python_test": Already have image (with digest): python:3.12.8
Step #1 - "python_test": ### Running all tests
Step #2 - "python_format_check": ### Testing lint
Step #2 - "python_format_check": Installing Python requirements
Step #1 - "python_test": Installing Python requirements
Step #1 - "python_test": 
Step #1 - "python_test": [notice] A new release of pip is available: 24.3.1 -> 26.0.1
Step #1 - "python_test": [notice] To update, run: pip install --upgrade pip
Step #2 - "python_format_check": 
Step #2 - "python_format_check": [notice] A new release of pip is available: 24.3.1 -> 26.0.1
Step #2 - "python_format_check": [notice] To update, run: pip install --upgrade pip
Step #1 - "python_test": #### Testing Python code in util/
Step #2 - "python_format_check": #### Testing Python lint
Step #1 - "python_test": test_aggregate_dict (aggregation_util_test.AggregationUtilTest.test_aggregate_dict) ... ok
Step #1 - "python_test": test_aggregate_value (aggregation_util_test.AggregationUtilTest.test_aggregate_value) ... ok
Step #1 - "python_test": test_config_map_with_override (config_map_test.TestConfigMap.test_config_map_with_override) ... ok
Step #1 - "python_test": test_load_config_file (config_map_test.TestConfigMap.test_load_config_file)
Step #1 - "python_test": Test loading of config dictionary from a file. ... ok
Step #1 - "python_test": test_set_config (config_map_test.TestConfigMap.test_set_config) ... ok
Step #1 - "python_test": test_update_config (config_map_test.TestConfigMap.test_update_config) ... ok
Step #1 - "python_test": test_add_counter_decrement (counters_test.TestCounters.test_add_counter_decrement) ... ok
Step #1 - "python_test": test_add_counter_default_increment (counters_test.TestCounters.test_add_counter_default_increment) ... ok
Step #1 - "python_test": test_add_counter_increment (counters_test.TestCounters.test_add_counter_increment) ... ok
Step #1 - "python_test": test_add_counters (counters_test.TestCounters.test_add_counters) ... ok
Step #1 - "python_test": test_counter_dict_is_shared (counters_test.TestCounters.test_counter_dict_is_shared)
Step #1 - "python_test": Verify counter dict is shared across counters. ... ok
Step #1 - "python_test": test_debug_counters_are_correctly_updated (counters_test.TestCounters.test_debug_counters_are_correctly_updated)
Step #1 - "python_test": Verify counters with debug string suffixes. ... ok
Step #1 - "python_test": test_debug_counters_are_not_created_when_debug_is_false (counters_test.TestCounters.test_debug_counters_are_not_created_when_debug_is_false) ... ok
Step #1 - "python_test": test_get_counters_string (counters_test.TestCounters.test_get_counters_string) ... ok
Step #1 - "python_test": test_get_non_existent_counter (counters_test.TestCounters.test_get_non_existent_counter) ... ok
Step #1 - "python_test": test_max_counter (counters_test.TestCounters.test_max_counter) ... ok
Step #1 - "python_test": test_min_counter (counters_test.TestCounters.test_min_counter) ... ok
Step #1 - "python_test": test_prefix (counters_test.TestCounters.test_prefix) ... ok
Step #1 - "python_test": test_processing_rate (counters_test.TestCounters.test_processing_rate) ... ok
Step #1 - "python_test": test_set_counter_overwrites_value (counters_test.TestCounters.test_set_counter_overwrites_value)
Step #1 - "python_test": Verify set_counter overrides current value. ... ok
Step #1 - "python_test": test_show_counters_produces_correct_output (counters_test.TestCounters.test_show_counters_produces_correct_output) ... ok
Step #1 - "python_test": test_convert_v1_to_v2_coordinate_request (dc_api_wrapper_test.TestDCAPIWrapper.test_convert_v1_to_v2_coordinate_request)
Step #1 - "python_test": Test coordinate request conversion from v1 to v2. ... ok
Step #1 - "python_test": test_convert_v2_to_v1_coordinate_response (dc_api_wrapper_test.TestDCAPIWrapper.test_convert_v2_to_v1_coordinate_response)
Step #1 - "python_test": Test coordinate response conversion from v2 to v1. ... ok
Step #1 - "python_test": test_dc_api_batched_wrapper (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_batched_wrapper)
Step #1 - "python_test": Test DC API wrapper for batched calls. ... ok
Step #1 - "python_test": test_dc_api_get_node_property (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_get_node_property)
Step #1 - "python_test": Test API wrapper to get a single property for a node. ... ok
Step #1 - "python_test": test_dc_api_get_node_property_multi_v2 (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_get_node_property_multi_v2)
Step #1 - "python_test": Test API wrapper to get multiple properties for a node. ... ok
Step #1 - "python_test": test_dc_api_is_defined_dcid (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_is_defined_dcid)
Step #1 - "python_test": Test API wrapper for defined DCIDs. ... ok
Step #1 - "python_test": test_dc_api_resolve_latlng (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_resolve_latlng)
Step #1 - "python_test": Test API wrapper for latlng resolution. ... ok
Step #1 - "python_test": test_dc_api_resolve_latlng_v1_compat_shape (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_resolve_latlng_v1_compat_shape)
Step #1 - "python_test": Test latlng resolution supports v1 compatibility response shape. ... ok
Step #1 - "python_test": test_dc_api_resolve_placeid (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_resolve_placeid)
Step #1 - "python_test": Test API wrapper to resolve entity using a placeid. ... ok
Step #1 - "python_test": test_dc_api_wrapper (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper)
Step #1 - "python_test": Test the wrapper for DC API. ... ok
Step #1 - "python_test": test_dc_api_wrapper_attempts_no_extra_retries (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_attempts_no_extra_retries)
Step #1 - "python_test": Test wrapper doesn't retry beyond the max attempts. ... ok
Step #1 - "python_test": test_dc_api_wrapper_does_not_retry_http_400 (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_does_not_retry_http_400)
Step #1 - "python_test": Test wrapper does not retry non-transient HTTP errors. ... ERROR:absl:Got status: 400, not retrying.
Step #1 - "python_test": ok
Step #1 - "python_test": test_dc_api_wrapper_keyerror_returns_none_without_retry (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_keyerror_returns_none_without_retry)
Step #1 - "python_test": Test wrapper returns None and does not retry for KeyError. ... ERROR:absl:Got exception for api: <Mock id='140243562306144'>, 'missing-dcid'
Step #1 - "python_test": ok
Step #1 - "python_test": test_dc_api_wrapper_non_positive_retries_defaults_to_one_attempt (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_non_positive_retries_defaults_to_one_attempt)
Step #1 - "python_test": Test non-positive retries are treated as one attempt. ... ok
Step #1 - "python_test": test_dc_api_wrapper_non_retryable_exception_has_note (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_non_retryable_exception_has_note)
Step #1 - "python_test": Test non-retryable exceptions bubble once with added context note. ... ok
Step #1 - "python_test": test_dc_api_wrapper_retries_http_429 (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_retries_http_429)
Step #1 - "python_test": Test wrapper retries HTTP 429 and succeeds. ... ok
Step #1 - "python_test": test_dc_api_wrapper_retries_http_503_until_exhausted (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_retries_http_503_until_exhausted)
Step #1 - "python_test": Test wrapper retries HTTP 503 until max attempts are exhausted. ... ok
Step #1 - "python_test": test_dc_api_wrapper_stops_after_success (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_api_wrapper_stops_after_success)
Step #1 - "python_test": Test wrapper stops retrying after a successful response. ... ok
Step #1 - "python_test": test_dc_get_node_property_values (dc_api_wrapper_test.TestDCAPIWrapper.test_dc_get_node_property_values)
Step #1 - "python_test": Test API wrapper to get all property:values for a node. ... ok
Step #1 - "python_test": test_non_v2_config_rejected (dc_api_wrapper_test.TestDCAPIWrapper.test_non_v2_config_rejected)
Step #1 - "python_test": Test wrapper rejects non-V2 dc_api_version values. ... ok
Step #1 - "python_test": test_download_and_unzip_file (download_util_script_test.DownloadFileTest.test_download_and_unzip_file) ... ok
Step #1 - "python_test": test_download_failure (download_util_script_test.DownloadFileTest.test_download_failure) ... WARNING:absl:Direct HEAD request failed for 'http://example.com/error' (cannot get Last-Modified): 404 Client Error: Not Found for url: http://example.com/error
Step #1 - "python_test": ERROR:absl:Processing failed: File system error for 'http://example.com/error'. Error: 404 Client Error: Not Found for url: http://example.com/error
Step #1 - "python_test": ok
Step #1 - "python_test": test_download_file_without_extension (download_util_script_test.DownloadFileTest.test_download_file_without_extension) ... ok
Step #1 - "python_test": test_download_invalid_url (download_util_script_test.DownloadFileTest.test_download_invalid_url) ... ERROR:absl:Invalid URL format or missing scheme for 'invalid_url'. Please ensure URL starts with 'http://' or 'https://'.
Step #1 - "python_test": ok
Step #1 - "python_test": test_download_txt_file (download_util_script_test.DownloadFileTest.test_download_txt_file) ... ok
Step #1 - "python_test": test_download_file (download_util_test.TestCounters.test_download_file) ... ok
Step #1 - "python_test": test_prefilled_url (download_util_test.TestCounters.test_prefilled_url) ... ok
Step #1 - "python_test": test_request_url (download_util_test.TestCounters.test_request_url) ... ok
Step #1 - "python_test": test_read_write (file_util_test.FileIOTest.test_read_write) ... ok
Step #1 - "python_test": test_file_get_estimate_num_rows (file_util_test.FileUtilsTest.test_file_get_estimate_num_rows) ... ok
Step #1 - "python_test": test_file_get_matching (file_util_test.FileUtilsTest.test_file_get_matching) ... ok
Step #1 - "python_test": test_file_load_csv_dict (file_util_test.FileUtilsTest.test_file_load_csv_dict) ... ok
Step #1 - "python_test": test_file_type (file_util_test.FileUtilsTest.test_file_type) ... ok
Step #1 - "python_test": test_file_write_load_py_dict (file_util_test.FileUtilsTest.test_file_write_load_py_dict) ... ok
Step #1 - "python_test": test_aa2 (latlng2place_mapsapi_test.Latlng2PlaceMapsAPITest.test_aa2) ... /workspace/.env/lib/python3.12/site-packages/url_normalize/normalize_host.py:35: DeprecationWarning: Transitional processing has been removed from UTS #46. The transitional argument will be removed in a future version.
Step #1 - "python_test":   idna.encode(p, uts46=True, transitional=True).decode(charset)
Step #1 - "python_test": ok
Step #1 - "python_test": test_country (latlng2place_mapsapi_test.Latlng2PlaceMapsAPITest.test_country) ... ok
Step #1 - "python_test": test_main (latlng_recon_geojson_test.LatlngReconGeojsonTest.test_main) ... ok
Step #1 - "python_test": test_basic (latlng_recon_service_test.LatlngReconServiceTest.test_basic) ... ok
Step #1 - "python_test": test_filter (latlng_recon_service_test.LatlngReconServiceTest.test_filter) ... ok
Step #1 - "python_test": test_dict_list_to_mcf_str (mcf_dict_util_test.TestMCFDict.test_dict_list_to_mcf_str) ... ok
Step #1 - "python_test": test_drop_nodes (mcf_dict_util_test.TestMCFDict.test_drop_nodes) ... ok
Step #1 - "python_test": test_get_dcid_node (mcf_dict_util_test.TestMCFDict.test_get_dcid_node) ... ok
Step #1 - "python_test": test_mcf_dict_rename_namespace (mcf_dict_util_test.TestMCFDict.test_mcf_dict_rename_namespace) ... ok
Step #1 - "python_test": test_mcf_dict_rename_prop (mcf_dict_util_test.TestMCFDict.test_mcf_dict_rename_prop) ... ok
Step #1 - "python_test": test_mcf_dict_rename_prop_value (mcf_dict_util_test.TestMCFDict.test_mcf_dict_rename_prop_value) ... ok
Step #1 - "python_test": test_mcf_to_dict_list (mcf_dict_util_test.TestMCFDict.test_mcf_to_dict_list) ... ok
Step #1 - "python_test": test_node_list_check_existence_dc (mcf_dict_util_test.TestMCFDict.test_node_list_check_existence_dc) ... ok
Step #1 - "python_test": test_node_list_check_existence_node_list (mcf_dict_util_test.TestMCFDict.test_node_list_check_existence_node_list) ... ok
Step #1 - "python_test": test_example_usage (mcf_template_filler_test.MCFTemplateFillerTest.test_example_usage) ... ok
Step #1 - "python_test": test_pop_and_2_obs_with_all_pv (mcf_template_filler_test.MCFTemplateFillerTest.test_pop_and_2_obs_with_all_pv)
Step #1 - "python_test": Use separate templates for Pop Obs, and use Obs template repeatedly. ... ok
Step #1 - "python_test": test_pop_with_missing_req_pv (mcf_template_filler_test.MCFTemplateFillerTest.test_pop_with_missing_req_pv) ... ok
Step #1 - "python_test": test_require_node_name (mcf_template_filler_test.MCFTemplateFillerTest.test_require_node_name) ... ok
Step #1 - "python_test": test_unified_pop_obs_with_missing_optional_pv (mcf_template_filler_test.MCFTemplateFillerTest.test_unified_pop_obs_with_missing_optional_pv) ... ok
Step #1 - "python_test": test_place_id_resolution_by_name (state_division_to_dcid_test.PlaceMapTest.test_place_id_resolution_by_name) ... ok
Step #1 - "python_test": test_boolean_naming (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_boolean_naming) ... ok
Step #1 - "python_test": test_double_underscore (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_double_underscore) ... ok
Step #1 - "python_test": test_ignore_props (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_ignore_props) ... ok
Step #1 - "python_test": test_legacy_mapping (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_legacy_mapping) ... ok
Step #1 - "python_test": test_measured_property (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_measured_property) ... ok
Step #1 - "python_test": test_measurement_constraint_removal (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_measurement_constraint_removal) ... ok
Step #1 - "python_test": test_measurement_denominator (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_measurement_denominator) ... ok
Step #1 - "python_test": test_measurement_qualifier (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_measurement_qualifier) ... ok
Step #1 - "python_test": test_naics_name_generation (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_naics_name_generation) ... ok
Step #1 - "python_test": test_namespace_removal (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_namespace_removal) ... ok
Step #1 - "python_test": test_prepend_append_replace (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_prepend_append_replace) ... ok
Step #1 - "python_test": test_quantity_name_generation (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_quantity_name_generation) ... ok
Step #1 - "python_test": test_quantity_range_name_generation (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_quantity_range_name_generation) ... ok
Step #1 - "python_test": test_soc_map (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_soc_map) ... ok
Step #1 - "python_test": test_soc_name_generation (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_soc_name_generation) ... ok
Step #1 - "python_test": test_sorted_constraints (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_sorted_constraints) ... ok
Step #1 - "python_test": test_stat_type (statvar_dcid_generator_test.TestStatVarDcidGenerator.test_stat_type) ... ok
Step #1 - "python_test": test_timer_start (timer_test.TimerTest.test_timer_start) ... ok
Step #1 - "python_test": test_timer_stop (timer_test.TimerTest.test_timer_stop) ... ok
Step #1 - "python_test": test_timer_time (timer_test.TimerTest.test_timer_time) ... ok
Step #1 - "python_test": test_xml_with_different_data_types (xml_to_json_test.XMLToJsonConverterTest.test_xml_with_different_data_types) ... ok
Step #1 - "python_test": 
Step #1 - "python_test": ----------------------------------------------------------------------
Step #1 - "python_test": Ran 96 tests in 8.339s
Step #1 - "python_test": 
Step #1 - "python_test": OK
Step #1 - "python_test": #### Testing Python code in tools/
Step #1 - "python_test": /workspace/tools/statvar_importer/place/place_name_matcher.py:14: SyntaxWarning: invalid escape sequence '\`'
Step #1 - "python_test":   """Script to lookup places by names.
Step #1 - "python_test": test_diff_analysis (import_differ.import_differ_test.TestImportDiffer.test_diff_analysis) ... ok
Step #1 - "python_test": test_empty_differ_file_runs_validation (import_validation.import_validation_test.ImportValidationTest.test_empty_differ_file_runs_validation)
Step #1 - "python_test": Tests that a differ file with only headers (empty DataFrame) still runs ... ok
Step #1 - "python_test": test_failed_run (import_validation.import_validation_test.ImportValidationTest.test_failed_run)
Step #1 - "python_test": Tests a failed run of the script. ... ok
Step #1 - "python_test": test_missing_differ_file_does_not_throw_exception (import_validation.import_validation_test.ImportValidationTest.test_missing_differ_file_does_not_throw_exception)
Step #1 - "python_test": Tests that a missing differ file does not cause the runner to throw an ... ok
Step #1 - "python_test": test_missing_required_file_fails (import_validation.import_validation_test.ImportValidationTest.test_missing_required_file_fails)
Step #1 - "python_test": Tests that the script fails when a required data file is missing. ... ok
Step #1 - "python_test": test_sql_validator_fails (import_validation.import_validation_test.ImportValidationTest.test_sql_validator_fails)
Step #1 - "python_test": Tests that the SQL_VALIDATOR works in a run. ... ok
Step #1 - "python_test": test_successful_run (import_validation.import_validation_test.ImportValidationTest.test_successful_run)
Step #2 - "python_format_check": --- tools/import_validation/validator.py	(original)
Step #2 - "python_format_check": +++ tools/import_validation/validator.py	(reformatted)
Step #2 - "python_format_check": @@ -1202,8 +1202,7 @@
Step #2 - "python_format_check":          constituent_counters = params['constituent_counters']
Step #2 - "python_format_check":  
Step #2 - "python_format_check":          total_value = counters.get(total_counter, 0)
Step #2 - "python_format_check": -        constituent_sum = sum(
Step #2 - "python_format_check": -            counters.get(c, 0) for c in constituent_counters)
Step #2 - "python_format_check": +        constituent_sum = sum(counters.get(c, 0) for c in constituent_counters)
Step #2 - "python_format_check":  
Step #2 - "python_format_check":          if total_value != constituent_sum:
Step #2 - "python_format_check":              return ValidationResult(
Step #2 - "python_format_check": @@ -1218,14 +1217,15 @@
Step #2 - "python_format_check":                      'constituent_sum': constituent_sum
Step #2 - "python_format_check":                  })
Step #2 - "python_format_check":  
Step #2 - "python_format_check": -        return ValidationResult(ValidationStatus.PASSED,
Step #2 - "python_format_check": -                                'COUNTER_SUM_INTEGRITY',
Step #2 - "python_format_check": -                                details={
Step #2 - "python_format_check": -                                    'total_counter': total_counter,
Step #2 - "python_format_check": -                                    'total_value': total_value,
Step #2 - "python_format_check": -                                    'constituent_counters': constituent_counters,
Step #2 - "python_format_check": -                                    'constituent_sum': constituent_sum
Step #2 - "python_format_check": -                                })
Step #2 - "python_format_check": +        return ValidationResult(
Step #2 - "python_format_check": +            ValidationStatus.PASSED,
Step #2 - "python_format_check": +            'COUNTER_SUM_INTEGRITY',
Step #2 - "python_format_check": +            details={
Step #2 - "python_format_check": +                'total_counter': total_counter,
Step #2 - "python_format_check": +                'total_value': total_value,
Step #2 - "python_format_check": +                'constituent_counters': constituent_counters,
Step #2 - "python_format_check": +                'constituent_sum': constituent_sum
Step #2 - "python_format_check": +            })
Step #2 - "python_format_check":  
Step #2 - "python_format_check":      def validate_counter_min_yield(self, counters: dict,
Step #2 - "python_format_check":                                     params: dict) -> ValidationResult:
Step #2 - "python_format_check": @@ -1270,4 +1270,3 @@
Step #2 - "python_format_check":                                      'actual_value': value,
Step #2 - "python_format_check":                                      'min_yield': min_yield
Step #2 - "python_format_check":                                  })
Step #2 - "python_format_check": -
Step #1 - "python_test": Tests a successful run of the script. ... ok
Step #1 - "python_test": test_variables_filtering (import_validation.import_validation_test.ImportValidationTest.test_variables_filtering)
Step #2 - "python_format_check": --- tools/import_validation/runner.py	(original)
Step #2 - "python_format_check": +++ tools/import_validation/runner.py	(reformatted)
Step #2 - "python_format_check": @@ -39,8 +39,12 @@
Step #2 - "python_format_check":    Orchestrates the validation process based on the new schema.
Step #2 - "python_format_check":    """
Step #2 - "python_format_check":  
Step #2 - "python_format_check": -    def __init__(self, validation_config_path: str, differ_output: str,
Step #2 - "python_format_check": -                 stats_summary: str, lint_report: str, validation_output: str,
Step #2 - "python_format_check": +    def __init__(self,
Step #2 - "python_format_check": +                 validation_config_path: str,
Step #2 - "python_format_check": +                 differ_output: str,
Step #2 - "python_format_check": +                 stats_summary: str,
Step #2 - "python_format_check": +                 lint_report: str,
Step #2 - "python_format_check": +                 validation_output: str,
Step #2 - "python_format_check":                   counters_report: str = None):
Step #2 - "python_format_check":          self.config = ValidationConfig(validation_config_path)
Step #2 - "python_format_check":          self.validation_output = validation_output
Step #2 - "python_format_check": @@ -99,10 +103,14 @@
Step #2 - "python_format_check":                  (self.validator.validate_counter_min_yield, 'counters'),
Step #2 - "python_format_check":          }
Step #2 - "python_format_check":  
Step #2 - "python_format_check": -        self._initialize_data_sources(stats_summary, lint_report, differ_output, counters_report)
Step #2 - "python_format_check": -
Step #2 - "python_format_check": -    def _initialize_data_sources(self, stats_summary: str, lint_report: str,
Step #2 - "python_format_check": -                                 differ_output: str, counters_report: str = None):
Step #2 - "python_format_check": +        self._initialize_data_sources(stats_summary, lint_report, differ_output,
Step #2 - "python_format_check": +                                      counters_report)
Step #2 - "python_format_check": +
Step #2 - "python_format_check": +    def _initialize_data_sources(self,
Step #2 - "python_format_check": +                                 stats_summary: str,
Step #2 - "python_format_check": +                                 lint_report: str,
Step #2 - "python_format_check": +                                 differ_output: str,
Step #2 - "python_format_check": +                                 counters_report: str = None):
Step #2 - "python_format_check":          """
Step #2 - "python_format_check":      Checks for and loads the required data sources based on the config.
Step #2 - "python_format_check":      """
Step #2 - "python_format_check": @@ -188,6 +196,7 @@
Step #2 - "python_format_check":                  counters_report) > 0:
Step #2 - "python_format_check":              try:
Step #2 - "python_format_check":                  df = pd.read_csv(counters_report)
Step #2 - "python_format_check": +
Step #2 - "python_format_check":                  def clean_key(x):
Step #2 - "python_format_check":                      if not isinstance(x, str):
Step #2 - "python_format_check":                          return x
Step #2 - "python_format_check": @@ -200,8 +209,8 @@
Step #2 - "python_format_check":                  df['key'] = df['key'].apply(clean_key)
Step #2 - "python_format_check":                  # Aggregate by summing if there are duplicates
Step #2 - "python_format_check":                  df = df.groupby('key')['value'].sum().reset_index()
Step #2 - "python_format_check": -                self.data_sources['counters'] = dict(
Step #2 - "python_format_check": -                    zip(df['key'], df['value']))
Step #2 - "python_format_check": +                self.data_sources['counters'] = dict(zip(
Step #2 - "python_format_check": +                    df['key'], df['value']))
Step #2 - "python_format_check
...
[Logs truncated due to log size limitations. For full logs, see https://console.cloud.google.com/cloud-build/builds/43190826-79d3-4bc2-a387-1ae0320860b9?project=879489846695.]
...
ey': '55 to 59 years', 'age': '[55 59 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:41', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!60 and 61 years', 'Key': '60 and 61 years', 'age': '[60 61 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:42', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!62 to 64 years', 'Key': '62 to 64 years', 'age': '[62 64 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:43', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!65 and 66 years', 'Key': '65 and 66 years', 'age': '[65 66 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:44', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!67 to 69 years', 'Key': '67 to 69 years', 'age': '[67 69 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:45', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!70 to 74 years', 'Key': '70 to 74 years', 'age': '[70 74 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:46', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!75 to 79 years', 'Key': '75 to 79 years', 'age': '[75 79 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:47', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!80 to 84 years', 'Key': '80 to 84 years', 'age': '[80 84 Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:48', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": WARNING:absl:No place in SVObs {'Data': 'Total:!!Female:!!85 years and over', 'Key': '85 years and over', 'age': '[85 - Years]', 'gender': 'dcs:Female', 'populationType': 'dcs:Person', 'value': '{Number}', 'observationDate': '2020', 'measurementMethod': 'dcs:CensusACS5yrSurvey', '#input': '/workspace/tools/statvar_importer/test_data/us_census_B01001_input.csv:1:49', 'typeOf': 'dcs:StatVarObservation'}
Step #1 - "python_test": /workspace/.env/lib/python3.12/site-packages/url_normalize/normalize_host.py:35: DeprecationWarning: Transitional processing has been removed from UTS #46. The transitional argument will be removed in a future version.
Step #1 - "python_test":   idna.encode(p, uts46=True, transitional=True).decode(charset)
Step #1 - "python_test": WARNING:absl:Ignoring node without a dcid: OrderedDict({'# comment1': '# Auto generated using command: "python3 -m unittest discover -v -s tools/ -p *_test.py" on 2026-04-23 08:23:26.096595'})
Step #1 - "python_test": ok
Step #1 - "python_test": test_already_capitalized (statvar_importer.utils_test.TestCapitalizeFirstChar.test_already_capitalized) ... ok
Step #1 - "python_test": test_empty_string (statvar_importer.utils_test.TestCapitalizeFirstChar.test_empty_string) ... ok
Step #1 - "python_test": test_hello (statvar_importer.utils_test.TestCapitalizeFirstChar.test_hello) ... ok
Step #1 - "python_test": test_integer_input (statvar_importer.utils_test.TestCapitalizeFirstChar.test_integer_input) ... ok
Step #1 - "python_test": test_none_input (statvar_importer.utils_test.TestCapitalizeFirstChar.test_none_input) ... ok
Step #1 - "python_test": test_numeric_first_char (statvar_importer.utils_test.TestCapitalizeFirstChar.test_numeric_first_char) ... ok
Step #1 - "python_test": test_single_char (statvar_importer.utils_test.TestCapitalizeFirstChar.test_single_char) ... ok
Step #1 - "python_test": test_space_first_char (statvar_importer.utils_test.TestCapitalizeFirstChar.test_space_first_char) ... ok
Step #1 - "python_test": test_convert_xls_to_csv (statvar_importer.utils_test.TestConvertXlsToCsv.test_convert_xls_to_csv) ... ok
Step #1 - "python_test": test_convert_xls_to_csv_no_xls (statvar_importer.utils_test.TestConvertXlsToCsv.test_convert_xls_to_csv_no_xls) ... ok
Step #1 - "python_test": test_empty_files (statvar_importer.utils_test.TestConvertXlsToCsv.test_empty_files) ... ok
Step #1 - "python_test": test_download_fails (statvar_importer.utils_test.TestDownloadCsvFromUrl.test_download_fails) ... ok
Step #1 - "python_test": test_empty_urls (statvar_importer.utils_test.TestDownloadCsvFromUrl.test_empty_urls) ... ok
Step #1 - "python_test": test_multiple_urls (statvar_importer.utils_test.TestDownloadCsvFromUrl.test_multiple_urls) ... ok
Step #1 - "python_test": test_single_url (statvar_importer.utils_test.TestDownloadCsvFromUrl.test_single_url) ... ok
Step #1 - "python_test": test_single_url_with_filename (statvar_importer.utils_test.TestDownloadCsvFromUrl.test_single_url_with_filename) ... ok
Step #1 - "python_test": test_filename_and_suffixed_exist (statvar_importer.utils_test.TestGetFilenameForUrl.test_filename_and_suffixed_exist) ... ok
Step #1 - "python_test": test_filename_exists (statvar_importer.utils_test.TestGetFilenameForUrl.test_filename_exists) ... ok
Step #1 - "python_test": test_no_existing_files (statvar_importer.utils_test.TestGetFilenameForUrl.test_no_existing_files) ... ok
Step #1 - "python_test": test_url_with_multiple_dots (statvar_importer.utils_test.TestGetFilenameForUrl.test_url_with_multiple_dots) ... ok
Step #1 - "python_test": test_url_with_multiple_dots_and_exists (statvar_importer.utils_test.TestGetFilenameForUrl.test_url_with_multiple_dots_and_exists) ... ok
Step #1 - "python_test": test_url_with_no_extension (statvar_importer.utils_test.TestGetFilenameForUrl.test_url_with_no_extension) ... ok
Step #1 - "python_test": test_url_with_no_extension_and_exists (statvar_importer.utils_test.TestGetFilenameForUrl.test_url_with_no_extension_and_exists) ... ok
Step #1 - "python_test": test_url_with_query_params (statvar_importer.utils_test.TestGetFilenameForUrl.test_url_with_query_params) ... ok
Step #1 - "python_test": test_extra_hyphen (statvar_importer.utils_test.TestGetObservationDateFormat.test_extra_hyphen) ... ok
Step #1 - "python_test": test_slashes (statvar_importer.utils_test.TestGetObservationDateFormat.test_slashes) ... ok
Step #1 - "python_test": test_year (statvar_importer.utils_test.TestGetObservationDateFormat.test_year) ... ok
Step #1 - "python_test": test_year_month (statvar_importer.utils_test.TestGetObservationDateFormat.test_year_month) ... ok
Step #1 - "python_test": test_year_month_day (statvar_importer.utils_test.TestGetObservationDateFormat.test_year_month_day) ... ok
Step #1 - "python_test": test_extra_hyphen (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_extra_hyphen) ... ok
Step #1 - "python_test": test_invalid_date (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_invalid_date) ... ok
Step #1 - "python_test": test_slashes (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_slashes) ... ok
Step #1 - "python_test": test_year (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_year) ... ok
Step #1 - "python_test": test_year_month (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_year_month) ... ok
Step #1 - "python_test": test_year_month_day (statvar_importer.utils_test.TestGetObservationPeriodForDate.test_year_month_day) ... ok
Step #1 - "python_test": test_dcid_prefix (statvar_importer.utils_test.TestIsPlaceDcid.test_dcid_prefix) ... ok
Step #1 - "python_test": test_dcs_prefix (statvar_importer.utils_test.TestIsPlaceDcid.test_dcs_prefix) ... ok
Step #1 - "python_test": test_empty_string (statvar_importer.utils_test.TestIsPlaceDcid.test_empty_string) ... ok
Step #1 - "python_test": test_no_prefix_valid (statvar_importer.utils_test.TestIsPlaceDcid.test_no_prefix_valid) ... ok
Step #1 - "python_test": test_no_slash (statvar_importer.utils_test.TestIsPlaceDcid.test_no_slash) ... ok
Step #1 - "python_test": test_none (statvar_importer.utils_test.TestIsPlaceDcid.test_none) ... ok
Step #1 - "python_test": test_special_chars_no_prefix (statvar_importer.utils_test.TestIsPlaceDcid.test_special_chars_no_prefix) ... ok
Step #1 - "python_test": test_special_chars_with_prefix (statvar_importer.utils_test.TestIsPlaceDcid.test_special_chars_with_prefix) ... ok
Step #1 - "python_test": test_download_and_convert (statvar_importer.utils_test.TestPrepareInputData.test_download_and_convert) ... ok
Step #1 - "python_test": test_local_csv_found (statvar_importer.utils_test.TestPrepareInputData.test_local_csv_found) ... ok
Step #1 - "python_test": test_no_input_data (statvar_importer.utils_test.TestPrepareInputData.test_no_input_data) ... ok
Step #1 - "python_test": test_sharding_enabled (statvar_importer.utils_test.TestPrepareInputData.test_sharding_enabled) ... ok
Step #1 - "python_test": test_empty_props (statvar_importer.utils_test.TestPvsHasAnyProp.test_empty_props) ... ok
Step #1 - "python_test": test_empty_pvs (statvar_importer.utils_test.TestPvsHasAnyProp.test_empty_pvs) ... ok
Step #1 - "python_test": test_none_props (statvar_importer.utils_test.TestPvsHasAnyProp.test_none_props) ... ok
Step #1 - "python_test": test_none_pvs (statvar_importer.utils_test.TestPvsHasAnyProp.test_none_pvs) ... ok
Step #1 - "python_test": test_one_of_props_exists (statvar_importer.utils_test.TestPvsHasAnyProp.test_one_of_props_exists) ... ok
Step #1 - "python_test": test_prop_does_not_exist (statvar_importer.utils_test.TestPvsHasAnyProp.test_prop_does_not_exist) ... ok
Step #1 - "python_test": test_prop_exists (statvar_importer.utils_test.TestPvsHasAnyProp.test_prop_exists) ... ok
Step #1 - "python_test": test_prop_is_none (statvar_importer.utils_test.TestPvsHasAnyProp.test_prop_is_none) ... ok
Step #1 - "python_test": test_empty_files (statvar_importer.utils_test.TestShardCsvData.test_empty_files) ... ok
Step #1 - "python_test": test_shard_csv_data (statvar_importer.utils_test.TestShardCsvData.test_shard_csv_data) ... ok
Step #1 - "python_test": test_float (statvar_importer.utils_test.TestStrFromNumber.test_float) ... ok
Step #1 - "python_test": test_float_with_decimal (statvar_importer.utils_test.TestStrFromNumber.test_float_with_decimal) ... ok
Step #1 - "python_test": test_integer (statvar_importer.utils_test.TestStrFromNumber.test_integer) ... ok
Step #1 - "python_test": test_precision (statvar_importer.utils_test.TestStrFromNumber.test_precision) ... ok
Step #1 - "python_test": test_rounding (statvar_importer.utils_test.TestStrFromNumber.test_rounding) ... ok
Step #1 - "python_test": test_trailing_zeros (statvar_importer.utils_test.TestStrFromNumber.test_trailing_zeros) ... ok
Step #1 - "python_test": 
Step #1 - "python_test": ----------------------------------------------------------------------
Step #1 - "python_test": Ran 327 tests in 96.856s
Step #1 - "python_test": 
Step #1 - "python_test": OK (skipped=2)
Step #1 - "python_test": #### Testing Python code in import-automation/executor
Step #1 - "python_test": test_appengine_job_request (test.cloud_scheduler_test.CloudSchedulerTest.test_appengine_job_request) ... ok
Step #1 - "python_test": test_cloud_run_job_request (test.cloud_scheduler_test.CloudSchedulerTest.test_cloud_run_job_request) ... ok
Step #1 - "python_test": test_gke_job_request (test.cloud_scheduler_test.CloudSchedulerTest.test_gke_job_request) ... ok
Step #1 - "python_test": test_invalid_string_args (test.file_uploader_test.GCSFileUploaderTest.test_invalid_string_args) ... ok
Step #1 - "python_test": test_upload_file (test.file_uploader_test.GCSFileUploaderTest.test_upload_file) ... ok
Step #1 - "python_test": test_upload_string (test.file_uploader_test.GCSFileUploaderTest.test_upload_string) ... ok
Step #1 - "python_test": test_invalid_string_args (test.file_uploader_test.LocalFileUploaderTest.test_invalid_string_args) ... ok
Step #1 - "python_test": test_upload_file (test.file_uploader_test.LocalFileUploaderTest.test_upload_file) ... ok
Step #1 - "python_test": test_upload_string (test.file_uploader_test.LocalFileUploaderTest.test_upload_string) ... ok
Step #1 - "python_test": test_build_commit_query (test.github_api_test.GitHubAPITest.test_build_commit_query) ... ok
Step #1 - "python_test": test_build_content_query (test.github_api_test.GitHubAPITest.test_build_content_query) ... ok
Step #1 - "python_test": test_dir_exists (test.github_api_test.GitHubAPITest.test_dir_exists) ... ok
Step #1 - "python_test": test_dir_exists_not (test.github_api_test.GitHubAPITest.test_dir_exists_not) ... ok
Step #1 - "python_test": test_dir_exists_other_error (test.github_api_test.GitHubAPITest.test_dir_exists_other_error) ... ok
Step #1 - "python_test": test_download_repo (test.github_api_test.GitHubAPITest.test_download_repo) ... /workspace/import-automation/executor/app/service/github_api.py:193: DeprecationWarning: Python 3.14 will, by default, filter extracted tar archives and reject files or modify their metadata. Use the filter argument to control this behavior.
Step #1 - "python_test":   tar.extractall(dest_dir)
Step #1 - "python_test": ok
Step #1 - "python_test": test_download_repo_empty (test.github_api_test.GitHubAPITest.test_download_repo_empty) ... ok
Step #1 - "python_test": test_download_repo_http_error (test.github_api_test.GitHubAPITest.test_download_repo_http_error) ... ok
Step #1 - "python_test": test_download_repo_timeout (test.github_api_test.GitHubAPITest.test_download_repo_timeout) ... ok
Step #1 - "python_test": test_find_dirs_in_commit (test.github_api_test.GitHubAPITest.test_find_dirs_in_commit) ... ok
Step #1 - "python_test": test_find_dirs_in_commit_empty (test.github_api_test.GitHubAPITest.test_find_dirs_in_commit_empty) ... ok
Step #1 - "python_test": test_find_dirs_up_path (test.github_api_test.GitHubAPITest.test_find_dirs_up_path) ... ok
Step #1 - "python_test": test_find_dirs_up_path_empty (test.github_api_test.GitHubAPITest.test_find_dirs_up_path_empty) ... ok
Step #1 - "python_test": test_find_dirs_up_path_root (test.github_api_test.GitHubAPITest.test_find_dirs_up_path_root) ... ok
Step #1 - "python_test": test_find_dirs_up_path_skip_call (test.github_api_test.GitHubAPITest.test_find_dirs_up_path_skip_call) ... ok
Step #1 - "python_test": test_get_path_first_component (test.github_api_test.GitHubAPITest.test_get_path_first_component) ... ok
Step #1 - "python_test": test_path_containing_file (test.github_api_test.GitHubAPITest.test_path_containing_file) ... ok
Step #1 - "python_test": test_path_containing_file_not_exist (test.github_api_test.GitHubAPITest.test_path_containing_file_not_exist) ... ok
Step #1 - "python_test": test_query_changed_files_in_commit (test.github_api_test.GitHubAPITest.test_query_changed_files_in_commit) ... ok
Step #1 - "python_test": test_query_changed_files_in_commit_raise (test.github_api_test.GitHubAPITest.test_query_changed_files_in_commit_raise) ... ok
Step #1 - "python_test": test_query_commit (test.github_api_test.GitHubAPITest.test_query_commit) ... ok
Step #1 - "python_test": test_query_files_in_dir (test.github_api_test.GitHubAPITest.test_query_files_in_dir) ... ok
Step #1 - "python_test": test_query_files_in_dir_raise (test.github_api_test.GitHubAPITest.test_query_files_in_dir_raise) ... ok
Step #1 - "python_test": test_clean_date (test.import_executor_test.ImportExecutorTest.test_clean_date) ... ok
Step #1 - "python_test": test_clean_time (test.import_executor_test.ImportExecutorTest.test_clean_time) ... ok
Step #1 - "python_test": test_construct_process_message (test.import_executor_test.ImportExecutorTest.test_construct_process_message) ... ok
Step #1 - "python_test": test_construct_process_message_no_output (test.import_executor_test.ImportExecutorTest.test_construct_process_message_no_output)
Step #1 - "python_test": Tests that _construct_process_message does not append ... ok
Step #1 - "python_test": test_create_venv (test.import_executor_test.ImportExecutorTest.test_create_venv) ... ERROR:root:An unexpected exception was thrown: Command '['bash', '/tmp/tmpp8yx7a0z.sh']' timed out after 20 seconds when running ['bash', '/tmp/tmpp8yx7a0z.sh']: Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1211, in _run_with_timeout
Step #1 - "python_test":     process = subprocess.run(args,
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 550, in run
Step #1 - "python_test":     stdout, stderr = process.communicate(input, timeout=timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1209, in communicate
Step #1 - "python_test":     stdout, stderr = self._communicate(input, endtime, timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 2116, in _communicate
Step #1 - "python_test":     self._check_timeout(endtime, orig_timeout, stdout, stderr)
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1253, in _check_timeout
Step #1 - "python_test":     raise TimeoutExpired(
Step #1 - "python_test": subprocess.TimeoutExpired: Command '['bash', '/tmp/tmpp8yx7a0z.sh']' timed out after 20 seconds
Step #1 - "python_test": Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1211, in _run_with_timeout
Step #1 - "python_test":     process = subprocess.run(args,
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 550, in run
Step #1 - "python_test":     stdout, stderr = process.communicate(input, timeout=timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1209, in communicate
Step #1 - "python_test":     stdout, stderr = self._communicate(input, endtime, timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 2116, in _communicate
Step #1 - "python_test":     self._check_timeout(endtime, orig_timeout, stdout, stderr)
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1253, in _check_timeout
Step #1 - "python_test":     raise TimeoutExpired(
Step #1 - "python_test": subprocess.TimeoutExpired: Command '['bash', '/tmp/tmpp8yx7a0z.sh']' timed out after 20 seconds
Step #1 - "python_test": ERROR
Step #1 - "python_test": test_run_and_handle_exception (test.import_executor_test.ImportExecutorTest.test_run_and_handle_exception) ... ERROR:root:An unexpected exception was thrown
Step #1 - "python_test": Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1108, in run_and_handle_exception
Step #1 - "python_test":     return exec_func(*args)
Step #1 - "python_test":            ^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/workspace/import-automation/executor/test/import_executor_test.py", line 69, in raise_exception
Step #1 - "python_test":     raise Exception
Step #1 - "python_test": Exception
Step #1 - "python_test": ok
Step #1 - "python_test": test_run_with_timeout (test.import_executor_test.ImportExecutorTest.test_run_with_timeout) ... ERROR:root:An unexpected exception was thrown: Command '['sleep', '5']' timed out after 0.1 seconds when running ['sleep', '5']: Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1211, in _run_with_timeout
Step #1 - "python_test":     process = subprocess.run(args,
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 550, in run
Step #1 - "python_test":     stdout, stderr = process.communicate(input, timeout=timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1209, in communicate
Step #1 - "python_test":     stdout, stderr = self._communicate(input, endtime, timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 2116, in _communicate
Step #1 - "python_test":     self._check_timeout(endtime, orig_timeout, stdout, stderr)
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1253, in _check_timeout
Step #1 - "python_test":     raise TimeoutExpired(
Step #1 - "python_test": subprocess.TimeoutExpired: Command '['sleep', '5']' timed out after 0.1 seconds
Step #1 - "python_test": Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1211, in _run_with_timeout
Step #1 - "python_test":     process = subprocess.run(args,
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 550, in run
Step #1 - "python_test":     stdout, stderr = process.communicate(input, timeout=timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1209, in communicate
Step #1 - "python_test":     stdout, stderr = self._communicate(input, endtime, timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 2116, in _communicate
Step #1 - "python_test":     self._check_timeout(endtime, orig_timeout, stdout, stderr)
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1253, in _check_timeout
Step #1 - "python_test":     raise TimeoutExpired(
Step #1 - "python_test": subprocess.TimeoutExpired: Command '['sleep', '5']' timed out after 0.1 seconds
Step #1 - "python_test": ok
Step #1 - "python_test": test_are_imports_finished (test.import_service_test.ImportServiceTest.test_are_imports_finished) ... ok
Step #1 - "python_test": test_block_on_import (test.import_service_test.ImportServiceTest.test_block_on_import) ... ok
Step #1 - "python_test": test_fix_input_path (test.import_service_test.ImportServiceTest.test_fix_input_path) ... ok
Step #1 - "python_test": test_format_import_info (test.import_service_test.ImportServiceTest.test_format_import_info) ... ok
Step #1 - "python_test": test_get_fixed_absolute_import_name (test.import_service_test.ImportServiceTest.test_get_fixed_absolute_import_name) ... ok
Step #1 - "python_test": test_get_import_id (test.import_service_test.ImportServiceTest.test_get_import_id) ... ok
Step #1 - "python_test": test_smart_import (test.import_service_test.ImportServiceTest.test_smart_import) ... ok
Step #1 - "python_test": test_absolute_import_name (test.import_target_test.ImportTargetTest.test_absolute_import_name) ... ok
Step #1 - "python_test": test_is_import_targetted_by_commit (test.import_target_test.ImportTargetTest.test_is_import_targetted_by_commit) ... ok
Step #1 - "python_test": test_parse_commit_message_targets (test.import_target_test.ImportTargetTest.test_parse_commit_message_targets) ... ok
Step #1 - "python_test": test_download_file (test.utils_test.AppUtilsTest.test_download_file)
Step #1 - "python_test": Response does not have a Content-Disposition header. ... ok
Step #1 - "python_test": test_download_file_timeout (test.utils_test.AppUtilsTest.test_download_file_timeout)
Step #1 - "python_test": Raises requests.Timeout exception. ... ok
Step #1 - "python_test": test_get_filename (test.utils_test.AppUtilsTest.test_get_filename) ... ok
Step #1 - "python_test": test_get_filename_raise (test.utils_test.AppUtilsTest.test_get_filename_raise) ... ok
Step #1 - "python_test": test_next_utc_date (test.utils_test.AppUtilsTest.test_next_utc_date)
Step #1 - "python_test": Tests next_utc_date. ... ok
Step #1 - "python_test": test_pacific_time_to_datetime (test.utils_test.AppUtilsTest.test_pacific_time_to_datetime)
Step #1 - "python_test": Tests that the string returned by pacific_time can be converted to ... ok
Step #1 - "python_test": test_pacific_time_to_datetime_then_back (test.utils_test.AppUtilsTest.test_pacific_time_to_datetime_then_back)
Step #1 - "python_test": Tests that the string returned by pacific_time can be converted to ... ok
Step #1 - "python_test": test_compare_lines (test.utils_test.TestUtilsTest.test_compare_lines) ... ok
Step #1 - "python_test": test_import_spec_valid (test.validation_test.ValidationTest.test_import_spec_valid) ... ok
Step #1 - "python_test": test_import_spec_valid_fields_absent (test.validation_test.ValidationTest.test_import_spec_valid_fields_absent) ... ok
Step #1 - "python_test": test_import_spec_valid_script_not_exist (test.validation_test.ValidationTest.test_import_spec_valid_script_not_exist) ... ok
Step #1 - "python_test": test_import_targets_valid_absolute_names (test.validation_test.ValidationTest.test_import_targets_valid_absolute_names) ... ok
Step #1 - "python_test": test_import_targets_valid_manifest_not_exist (test.validation_test.ValidationTest.test_import_targets_valid_manifest_not_exist) ... ok
Step #1 - "python_test": test_import_targets_valid_name_not_exist (test.validation_test.ValidationTest.test_import_targets_valid_name_not_exist) ... ok
Step #1 - "python_test": test_import_targets_valid_relative_names (test.validation_test.ValidationTest.test_import_targets_valid_relative_names) ... ok
Step #1 - "python_test": test_import_targets_valid_relative_names_multiple_dirs (test.validation_test.ValidationTest.test_import_targets_valid_relative_names_multiple_dirs) ... ok
Step #1 - "python_test": test_manifest_valid_fields_absent (test.validation_test.ValidationTest.test_manifest_valid_fields_absent) ... ok
Step #1 - "python_test": 
Step #1 - "python_test": ======================================================================
Step #1 - "python_test": ERROR: test_create_venv (test.import_executor_test.ImportExecutorTest.test_create_venv)
Step #1 - "python_test": ----------------------------------------------------------------------
Step #1 - "python_test": Traceback (most recent call last):
Step #1 - "python_test":   File "/workspace/import-automation/executor/test/import_executor_test.py", line 52, in test_create_venv
Step #1 - "python_test":     interpreter_path, proc = import_executor._create_venv(
Step #1 - "python_test":                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/workspace/util/log_util.py", line 148, in wrapper
Step #1 - "python_test":     result = func(*args, **kwargs)
Step #1 - "python_test":              ^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1264, in _create_venv
Step #1 - "python_test":     process = _run_with_timeout(['bash', script.name], timeout)
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/workspace/util/log_util.py", line 148, in wrapper
Step #1 - "python_test":     result = func(*args, **kwargs)
Step #1 - "python_test":              ^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1226, in _run_with_timeout
Step #1 - "python_test":     raise e
Step #1 - "python_test":   File "/workspace/import-automation/executor/app/executor/import_executor.py", line 1211, in _run_with_timeout
Step #1 - "python_test":     process = subprocess.run(args,
Step #1 - "python_test":               ^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 550, in run
Step #1 - "python_test":     stdout, stderr = process.communicate(input, timeout=timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1209, in communicate
Step #1 - "python_test":     stdout, stderr = self._communicate(input, endtime, timeout)
Step #1 - "python_test":                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 2116, in _communicate
Step #1 - "python_test":     self._check_timeout(endtime, orig_timeout, stdout, stderr)
Step #1 - "python_test":   File "/usr/local/lib/python3.12/subprocess.py", line 1253, in _check_timeout
Step #1 - "python_test":     raise TimeoutExpired(
Step #1 - "python_test": subprocess.TimeoutExpired: Command '['bash', '/tmp/tmpp8yx7a0z.sh']' timed out after 20 seconds
Step #1 - "python_test": 
Step #1 - "python_test": ----------------------------------------------------------------------
Step #1 - "python_test": Ran 66 tests in 21.163s
Step #1 - "python_test": 
Step #1 - "python_test": FAILED (errors=1)
Finished Step #1 - "python_test"
ERROR
ERROR: build step 1 "python:3.12.8" failed: step exited with non-zero status: 1
Finished Step #2 - "python_format_check"

Build Log: https://console.cloud.google.com/cloud-build/builds/43190826-79d3-4bc2-a387-1ae0320860b9?project=879489846695