Source code for swh.web.api.parsers

# Copyright (C) 2024  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information

import yaml

from django.conf import settings
from django.utils.encoding import force_str
from rest_framework.exceptions import ParseError
from rest_framework.parsers import BaseParser


[docs] class YAMLParser(BaseParser): """ Parses YAML-serialized data (more robust version than djangorestframork-yaml). """ media_type = "application/yaml"
[docs] def parse(self, stream, media_type=None, parser_context=None): """ Parses the incoming bytestream as YAML and returns the resulting data. """ assert yaml, "YAMLParser requires pyyaml to be installed" parser_context = parser_context or {} encoding = parser_context.get("encoding", settings.DEFAULT_CHARSET) try: data = stream.read().decode(encoding) return yaml.safe_load(data) except (ValueError, yaml.parser.ParserError) as exc: raise ParseError("YAML parse error - %s" % force_str(exc)) except yaml.scanner.ScannerError as e: raise ParseError(f"YAML scan error - {force_str(e)}")