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_converts_datetime_to_string(self): time = datetime.datetime(1111, 1, 1, tzinfo=datetime.timezone.utc) self.assertEqual(resource_util.convert_to_json_parsable_type(time), '1111-01-01T00:00:00+0000')
def test_converts_date_to_string(self): time = datetime.date(1111, 1, 1) self.assertEqual(resource_util.convert_to_json_parsable_type(time), '1111-01-01')
def test_converts_exception_to_string(self): exception = Exception('Salty cookies') self.assertEqual( resource_util.convert_to_json_parsable_type(exception), 'Salty cookies')
def test_does_not_convert_json_parsable_type(self): self.assertEqual(resource_util.convert_to_json_parsable_type(1), 1)