Refactor CamelCaseJSONFilter to be more extensible
parent
81fa4b44c8
commit
cbae10c434
|
|
@ -675,42 +675,56 @@ try:
|
||||||
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
|
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
|
||||||
from djangorestframework_camel_case.render import camelize
|
from djangorestframework_camel_case.render import camelize
|
||||||
except ImportError: # pragma: no cover
|
except ImportError: # pragma: no cover
|
||||||
class CamelCaseJSONFilter(FieldInspector):
|
CamelCaseJSONParser = CamelCaseJSONRenderer = None
|
||||||
"""Converts property names to camelCase if ``djangorestframework_camel_case`` is used."""
|
|
||||||
pass
|
def camelize(data):
|
||||||
else:
|
return data
|
||||||
def camelize_string(s):
|
|
||||||
"""Hack to force ``djangorestframework_camel_case`` to camelize a plain string."""
|
|
||||||
|
class CamelCaseJSONFilter(FieldInspector):
|
||||||
|
"""Converts property names to camelCase if ``djangorestframework_camel_case`` is used."""
|
||||||
|
|
||||||
|
def camelize_string(self, s):
|
||||||
|
"""Hack to force ``djangorestframework_camel_case`` to camelize a plain string.
|
||||||
|
|
||||||
|
:param str s: the string
|
||||||
|
:return: camelized string
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
return next(iter(camelize({s: ''})))
|
return next(iter(camelize({s: ''})))
|
||||||
|
|
||||||
def camelize_schema(schema_or_ref, components):
|
def camelize_schema(self, schema):
|
||||||
"""Recursively camelize property names for the given schema using ``djangorestframework_camel_case``."""
|
"""Recursively camelize property names for the given schema using ``djangorestframework_camel_case``.
|
||||||
schema = openapi.resolve_ref(schema_or_ref, components)
|
The target schema object must be modified in-place.
|
||||||
|
|
||||||
|
:param openapi.Schema schema: the :class:`.Schema` object
|
||||||
|
"""
|
||||||
if getattr(schema, 'properties', {}):
|
if getattr(schema, 'properties', {}):
|
||||||
schema.properties = OrderedDict(
|
schema.properties = OrderedDict(
|
||||||
(camelize_string(key), camelize_schema(val, components))
|
(self.camelize_string(key), self.camelize_schema(openapi.resolve_ref(val, self.components)) or val)
|
||||||
for key, val in schema.properties.items()
|
for key, val in schema.properties.items()
|
||||||
)
|
)
|
||||||
|
|
||||||
if getattr(schema, 'required', []):
|
if getattr(schema, 'required', []):
|
||||||
schema.required = [camelize_string(p) for p in schema.required]
|
schema.required = [self.camelize_string(p) for p in schema.required]
|
||||||
|
|
||||||
return schema_or_ref
|
def process_result(self, result, method_name, obj, **kwargs):
|
||||||
|
if isinstance(result, openapi.Schema.OR_REF) and self.is_camel_case():
|
||||||
|
schema = openapi.resolve_ref(result, self.components)
|
||||||
|
self.camelize_schema(schema)
|
||||||
|
|
||||||
class CamelCaseJSONFilter(FieldInspector):
|
return result
|
||||||
"""Converts property names to camelCase if ``CamelCaseJSONParser`` or ``CamelCaseJSONRenderer`` are used."""
|
|
||||||
|
|
||||||
|
if CamelCaseJSONParser and CamelCaseJSONRenderer:
|
||||||
def is_camel_case(self):
|
def is_camel_case(self):
|
||||||
return (
|
return (
|
||||||
any(issubclass(parser, CamelCaseJSONParser) for parser in self.view.parser_classes) or
|
any(issubclass(parser, CamelCaseJSONParser) for parser in self.view.parser_classes) or
|
||||||
any(issubclass(renderer, CamelCaseJSONRenderer) for renderer in self.view.renderer_classes)
|
any(issubclass(renderer, CamelCaseJSONRenderer) for renderer in self.view.renderer_classes)
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
def is_camel_case(self):
|
||||||
|
return False
|
||||||
|
|
||||||
def process_result(self, result, method_name, obj, **kwargs):
|
|
||||||
if isinstance(result, openapi.Schema.OR_REF) and self.is_camel_case():
|
|
||||||
return camelize_schema(result, self.components)
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from rest_framework_recursive.fields import RecursiveField
|
from rest_framework_recursive.fields import RecursiveField
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue