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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
 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')
Ejemplo n.º 4
0
 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')
Ejemplo n.º 5
0
 def test_converts_exception_to_string(self):
     exception = Exception('Salty cookies')
     self.assertEqual(
         resource_util.convert_to_json_parsable_type(exception),
         'Salty cookies')
Ejemplo n.º 6
0
 def test_does_not_convert_json_parsable_type(self):
     self.assertEqual(resource_util.convert_to_json_parsable_type(1), 1)