From b135e0fa0a9e3b1eef6aedf59d440707515ffd69 Mon Sep 17 00:00:00 2001 From: Thorsten Franzel Date: Tue, 10 Dec 2019 00:42:29 +0100 Subject: [PATCH] add options to generateschema & prevent yaml aliases --- rest_framework/management/commands/generateschema.py | 10 +++++++++- rest_framework/renderers.py | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/rest_framework/management/commands/generateschema.py b/rest_framework/management/commands/generateschema.py index a7763492c..e64e12bf1 100644 --- a/rest_framework/management/commands/generateschema.py +++ b/rest_framework/management/commands/generateschema.py @@ -18,6 +18,7 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('--title', dest="title", default='', type=str) parser.add_argument('--url', dest="url", default=None, type=str) + parser.add_argument('--api-version', dest="api_version", default=None, type=str) parser.add_argument('--description', dest="description", default=None, type=str) if self.get_mode() == COREAPI_MODE: parser.add_argument('--format', dest="format", choices=['openapi', 'openapi-json', 'corejson'], default='openapi', type=str) @@ -25,6 +26,7 @@ class Command(BaseCommand): parser.add_argument('--format', dest="format", choices=['openapi', 'openapi-json'], default='openapi', type=str) parser.add_argument('--urlconf', dest="urlconf", default=None, type=str) parser.add_argument('--generator_class', dest="generator_class", default=None, type=str) + parser.add_argument('--file', dest="file", default=None, type=str) def handle(self, *args, **options): if options['generator_class']: @@ -36,11 +38,17 @@ class Command(BaseCommand): title=options['title'], description=options['description'], urlconf=options['urlconf'], + version=options['api_version'], ) schema = generator.get_schema(request=None, public=True) renderer = self.get_renderer(options['format']) output = renderer.render(schema, renderer_context={}) - self.stdout.write(output.decode()) + + if options['file']: + with open(options['file'], 'wb') as f: + f.write(output) + else: + self.stdout.write(output.decode()) def get_renderer(self, format): if self.get_mode() == COREAPI_MODE: diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 29ac90ea8..e5281491b 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -1053,6 +1053,8 @@ class OpenAPIRenderer(BaseRenderer): assert yaml, 'Using OpenAPIRenderer, but `pyyaml` is not installed.' def render(self, data, media_type=None, renderer_context=None): + # prevent polluting the output with yaml references (aliases) + yaml.Dumper.ignore_aliases = lambda *args: True return yaml.dump(data, default_flow_style=False, sort_keys=False).encode('utf-8')