def resolve_serializer(self, serializer, direction) -> ResolvedComponent: assert is_serializer(serializer), ( f'internal assumption violated because we expected a serializer here and instead ' f'got a "{serializer}". This may be the result of another app doing some unexpected ' f'magic or an invalid internal call. Feel free to report this as a bug at ' f'https://github.com/tfranzel/drf-spectacular/issues ') serializer = force_instance(serializer) component = ResolvedComponent( name=self._get_serializer_name(serializer, direction), type=ResolvedComponent.SCHEMA, object=serializer, ) if component in self.registry: return self.registry[component] # return component with schema self.registry.register(component) component.schema = self._map_serializer(serializer, direction) # 4 cases: # 1. polymorphic container component -> use # 2. concrete component with properties -> use # 3. concrete component without properties -> prob. transactional so discard # 4. explicit list component -> demultiplexed at usage location so discard keep_component = (any(nest_tag in component.schema for nest_tag in ['oneOf', 'allOf', 'anyOf']) or component.schema.get('properties', {})) if not keep_component: del self.registry[component] return ResolvedComponent(None, None) # sentinel return component
def resolve_serializer(self, serializer, direction) -> ResolvedComponent: assert is_serializer(serializer) serializer = force_instance(serializer) component = ResolvedComponent( name=self._get_serializer_name(serializer, direction), type=ResolvedComponent.SCHEMA, object=serializer, ) if component in self.registry: return self.registry[component] # return component with schema self.registry.register(component) component.schema = self._map_serializer(serializer, direction) # 4 cases: # 1. polymorphic container component -> use # 2. concrete component with properties -> use # 3. concrete component without properties -> prob. transactional so discard # 4. explicit list component -> demultiplexed at usage location so discard keep_component = ( any(nest_tag in component.schema for nest_tag in ['oneOf', 'allOf', 'anyOf']) or component.schema.get('properties', {}) ) if not keep_component: del self.registry[component] return ResolvedComponent(None, None) # sentinel return component
def resolve_serializer(self, serializer, direction): """Serializer to component.""" component_schema = self._map_serializer(serializer, direction) if not component_schema.get("properties", {}): component = ResolvedComponent( name=self._get_serializer_name(serializer, direction), type=ResolvedComponent.SCHEMA, object=serializer, ) if component in self.registry: return self.registry[component] component.schema = component_schema self.registry.register(component) else: component = super().resolve_serializer(serializer, direction) return component
def resolve_serializer(self, method, serializer) -> ResolvedComponent: assert is_serializer(serializer) serializer = force_instance(serializer) component = ResolvedComponent( name=self._get_serializer_name(method, serializer), type=ResolvedComponent.SCHEMA, object=serializer, ) if component in self.registry: return self.registry[component] # return component with schema self.registry.register(component) component.schema = self._map_serializer(method, serializer) # 3 cases: # 1. polymorphic container component -> use # 2. concrete component with properties -> use # 3. concrete component without properties -> prob. transactional so discard if 'oneOf' not in component.schema and not component.schema[ 'properties']: del self.registry[component] return ResolvedComponent(None, None) # sentinel return component