def _json_dump_recursion_helper(metadata): """See _get_json_dump docstring.""" if isinstance(metadata, list): return [_json_dump_recursion_helper(item) for item in metadata] if not isinstance(metadata, dict): return resource_util.convert_to_json_parsable_type(metadata) # Sort by key to make sure dictionary always prints in correct order. formatted_dict = collections.OrderedDict(sorted(metadata.items())) for key, value in formatted_dict.items(): if isinstance(value, dict): # Recursively handle dictionaries. formatted_dict[key] = _json_dump_recursion_helper(value) elif isinstance(value, list): # Recursively handled lists, which may contain more dicts, like ACLs. formatted_list = [ _json_dump_recursion_helper(item) for item in value ] if formatted_list: # Ignore empty lists. formatted_dict[key] = formatted_list elif value or resource_util.should_preserve_falsy_metadata_value( value): formatted_dict[key] = resource_util.convert_to_json_parsable_type( value) return formatted_dict
def _json_dump_recursion_helper(metadata): """See _get_json_dump docstring.""" if isinstance(metadata, list): return [_json_dump_recursion_helper(item) for item in metadata] if not isinstance(metadata, messages.Message): # Recursive function down the stack may have been processing a list. return resource_util.convert_to_json_parsable_type(metadata) # Construct dictionary from Apitools object. formatted_dict = collections.OrderedDict() # Similar to Apitools messages.py Message __repr__ implementation. for field in sorted(metadata.all_fields(), key=lambda f: f.name): value = metadata.get_assigned_value(field.name) if isinstance(value, messages.Message): # Recursively handled nested Apitools objects. formatted_dict[field.name] = _json_dump_recursion_helper(value) elif isinstance(value, list): # Recursively handled lists, which may contain Apitools objects. # Example: ACL list. formatted_list = [ _json_dump_recursion_helper(item) for item in value ] if formatted_list: # Ignore empty lists. formatted_dict[field.name] = formatted_list elif value or resource_util.should_preserve_falsy_metadata_value( value): # 0, 0.0, and False are acceptables Falsy-types. Lists handled later. formatted_dict[field.name] = ( resource_util.convert_to_json_parsable_type(value)) return formatted_dict
def test_preserves_false_metadata(self): self.assertTrue( resource_util.should_preserve_falsy_metadata_value(False))
def test_does_not_preserve_unexpected_falsy_metadata(self): self.assertFalse(resource_util.should_preserve_falsy_metadata_value( []))
def test_preserves_zero_float_metadata(self): self.assertTrue( resource_util.should_preserve_falsy_metadata_value(0.0))