From a9ec14620c79e2c8b02ea7ed6f7100d1976f5c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristi=20V=C3=AEjdea?= Date: Fri, 21 Dec 2018 02:04:15 +0200 Subject: [PATCH] Fix security definitions ordering consistency --- src/drf_yasg/generators.py | 10 +++++----- src/drf_yasg/openapi.py | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/drf_yasg/generators.py b/src/drf_yasg/generators.py index a83377a..2d20ff5 100644 --- a/src/drf_yasg/generators.py +++ b/src/drf_yasg/generators.py @@ -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: diff --git a/src/drf_yasg/openapi.py b/src/drf_yasg/openapi.py index 17716fa..46889d2 100644 --- a/src/drf_yasg/openapi.py +++ b/src/drf_yasg/openapi.py @@ -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):