Fix security definitions ordering consistency

master
Cristi Vîjdea 2018-12-21 02:04:15 +02:00
parent 5418415300
commit a9ec14620c
2 changed files with 10 additions and 6 deletions

View File

@ -16,7 +16,7 @@ from . import openapi
from .app_settings import swagger_settings
from .errors import SwaggerGenerationError
from .inspectors.field import get_basic_type_info, get_queryset_field, get_queryset_from_view
from .openapi import ReferenceResolver
from .openapi import ReferenceResolver, SwaggerDict
from .utils import force_real_str, get_consumes, get_produces
logger = logging.getLogger(__name__)
@ -216,14 +216,14 @@ class OpenAPISchemaGenerator(object):
security_definitions = swagger_settings.SECURITY_DEFINITIONS
if security_definitions is not None:
security_definitions = OrderedDict(sorted([(key, OrderedDict(sorted(sd.items())))
for key, sd in swagger_settings.SECURITY_DEFINITIONS.items()]))
security_definitions = SwaggerDict._as_odict(security_definitions, {})
security_requirements = swagger_settings.SECURITY_REQUIREMENTS
if security_requirements is None:
security_requirements = [{security_scheme: []} for security_scheme in swagger_settings.SECURITY_DEFINITIONS]
security_requirements = sorted(security_requirements, key=lambda od: list(sorted(od)))
security_requirements = [OrderedDict(sorted(sr.items())) for sr in security_requirements]
security_requirements = [SwaggerDict._as_odict(sr, {}) for sr in security_requirements]
security_requirements = sorted(security_requirements, key=list)
url = self.url
if url is None and request is not None:

View File

@ -3,6 +3,7 @@ import six
import collections
import logging
import re
import sys
from collections import OrderedDict
from coreapi.compat import urlparse
@ -139,7 +140,10 @@ class SwaggerDict(OrderedDict):
if isinstance(obj, collections.Mapping):
result = OrderedDict()
memo[id(obj)] = result
for attr, val in obj.items():
items = obj.items()
if not isinstance(obj, OrderedDict):
items = sorted(items)
for attr, val in items:
result[attr] = SwaggerDict._as_odict(val, memo)
return result
elif isinstance(obj, six.string_types):