Skip to content

Commit 4137ef4

Browse files
author
Thorsten
authored
Disable yaml aliases for schema generation. (#7131)
1 parent 79d37bc commit 4137ef4

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

rest_framework/renderers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,11 @@ def __init__(self):
10531053
assert yaml, 'Using OpenAPIRenderer, but `pyyaml` is not installed.'
10541054

10551055
def render(self, data, media_type=None, renderer_context=None):
1056-
return yaml.dump(data, default_flow_style=False, sort_keys=False).encode('utf-8')
1056+
# disable yaml advanced feature 'alias' for clean, portable, and readable output
1057+
class Dumper(yaml.Dumper):
1058+
def ignore_aliases(self, data):
1059+
return True
1060+
return yaml.dump(data, default_flow_style=False, sort_keys=False, Dumper=Dumper).encode('utf-8')
10571061

10581062

10591063
class JSONOpenAPIRenderer(BaseRenderer):

tests/schemas/test_openapi.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from rest_framework import filters, generics, pagination, routers, serializers
99
from rest_framework.compat import uritemplate
1010
from rest_framework.parsers import JSONParser, MultiPartParser
11-
from rest_framework.renderers import JSONRenderer
11+
from rest_framework.renderers import JSONRenderer, OpenAPIRenderer
1212
from rest_framework.request import Request
1313
from rest_framework.schemas.openapi import AutoSchema, SchemaGenerator
1414

@@ -473,6 +473,19 @@ class View(generics.CreateAPIView):
473473
assert len(success_response['content'].keys()) == 1
474474
assert 'application/json' in success_response['content']
475475

476+
def test_openapi_yaml_rendering_without_aliases(self):
477+
renderer = OpenAPIRenderer()
478+
479+
reused_object = {'test': 'test'}
480+
data = {
481+
'o1': reused_object,
482+
'o2': reused_object,
483+
}
484+
assert (
485+
renderer.render(data) == b'o1:\n test: test\no2:\n test: test\n' or
486+
renderer.render(data) == b'o2:\n test: test\no1:\n test: test\n' # py <= 3.5
487+
)
488+
476489
def test_serializer_filefield(self):
477490
path = '/{id}/'
478491
method = 'POST'

0 commit comments

Comments
 (0)