private void ApplyServiceTags(OpenApiOperation operation, Type controllerType) { var typeMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(controllerType); var responseNodes = _xmlNavigator.Select($"/doc/members/member[@name='{typeMemberName}']/response"); ApplyResponseTags(operation, responseNodes); }
private bool TryAdd(OpenApiDocument swaggerDoc, KeyValuePair <string, ActionDescriptor> nameAndType, Type type) { var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); var typeNode = _xmlNavigator.SelectSingleNode(string.Format(MemberXPath, memberName)); if (typeNode != null) { var summaryNode = typeNode.SelectSingleNode(SummaryTag); if (summaryNode != null) { if (swaggerDoc.Tags == null) { swaggerDoc.Tags = new List <OpenApiTag>(); } swaggerDoc.Tags.Add(new OpenApiTag { Name = nameAndType.Key, Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml) }); } return(true); } return(false); }
private void ApplyTypeTags(OpenApiSchema schema, Type type) { var typeMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); var typeSummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{typeMemberName}']/summary"); if (typeSummaryNode != null) { schema.Description = XmlCommentsTextHelper.Humanize(typeSummaryNode.InnerXml); } }
public void GetMemberNameForType_ReturnsCorrectXmlCommentsMemberName_ForGivenType( Type type, string expectedMemberName ) { var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); _output.WriteLine(expectedMemberName); _output.WriteLine(memberName); Assert.Equal(expectedMemberName, memberName); }
public string GetSummaryForType(Type type) { var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); var typeNode = this.xpathNavigator.SelectSingleNode(string.Format(XmlDocumentationService.MemberXPath, memberName)); if (typeNode == null) { return(string.Empty); } var summaryNode = typeNode.SelectSingleNode(XmlDocumentationService.SummaryTag); return(XmlCommentsTextHelper.Humanize(summaryNode.InnerXml)); }
/// <summary> /// Apply filter. /// </summary> /// <param name="schema"><see cref="OpenApiSchema"/>.</param> /// <param name="context"><see cref="SchemaFilterContext"/>.</param> public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (_excludedTypes.Any() && _excludedTypes.ToList().Contains(context.Type)) { return; } // Try to apply a description for inherited types. var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(context.Type); if (string.IsNullOrEmpty(schema.Description) && _inheritedDocs.ContainsKey(memberName)) { var cref = _inheritedDocs[memberName]; var target = GetTargetRecursive(context.Type, cref); var targetXmlNode = GetMemberXmlNode(XmlCommentsNodeNameHelper.GetMemberNameForType(target)); var summaryNode = targetXmlNode?.SelectSingleNode(SummaryTag); if (summaryNode != null) { schema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); if (_includeRemarks) { var remarksNode = targetXmlNode.SelectSingleNode(RemarksTag); if (remarksNode != null && !string.IsNullOrWhiteSpace(remarksNode.InnerXml)) { schema.Description += $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})"; } } } } if (schema.Properties == null) { return; } // Add the summary and examples for the properties. foreach (var entry in schema.Properties) { var memberInfo = ((TypeInfo)context.Type).DeclaredMembers?.FirstOrDefault(p => p.Name.Equals(entry.Key, StringComparison.OrdinalIgnoreCase)); if (memberInfo != null) { ApplyPropertyComments(entry.Value, memberInfo); } } }
private Type GetTargetRecursive(Type type, string cref) { var target = GetTarget(type, cref); if (target == null) { return(null); } var targetMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(target); if (_inheritedDocs.ContainsKey(targetMemberName)) { return(GetTarget(target, _inheritedDocs[targetMemberName])); } return(target); }
private void ApplyTypeTags(OpenApiSchema schema, Type type) { if (_excludedTypes.Any() && _excludedTypes.ToList().Contains(type)) { return; } var typeMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); var typeSummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{typeMemberName}']/{SummaryTag}"); if (typeSummaryNode != null) { var typeRemarksNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{typeMemberName}']/{RemarksTag}"); if (typeRemarksNode != null && !string.IsNullOrWhiteSpace(typeRemarksNode.InnerXml)) { schema.Description += $" ({XmlCommentsTextHelper.Humanize(typeRemarksNode.InnerXml)})"; } } }
private static Type GetTarget(Type type, string cref) { var targets = type.GetInterfaces(); if (type.BaseType != typeof(object)) { targets = targets.Append(type.BaseType).ToArray(); } // Try to find the target, if one is declared. if (!string.IsNullOrEmpty(cref)) { var crefTarget = targets.SingleOrDefault(t => XmlCommentsNodeNameHelper.GetMemberNameForType(t) == cref); if (crefTarget != null) { return(crefTarget); } } // We use the last since that will be our base class or the "nearest" implemented interface. return(targets.LastOrDefault()); }
/// <summary> /// Apply filter. /// </summary> /// <param name="swaggerDoc"><see cref="OpenApiDocument"/>.</param> /// <param name="context"><see cref="DocumentFilterContext"/>.</param> public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // Collect (unique) controller names and types in a dictionary var controllerNamesAndTypes = context.ApiDescriptions .Select(apiDesc => apiDesc.ActionDescriptor as ControllerActionDescriptor) .SkipWhile(actionDesc => actionDesc == null) .GroupBy(actionDesc => actionDesc.ControllerName) .Select(group => new KeyValuePair <string, Type>(group.Key, group.First().ControllerTypeInfo.AsType())); foreach (var nameAndType in controllerNamesAndTypes) { if (_excludedTypes.Any() && _excludedTypes.ToList().Contains(nameAndType.Value)) { continue; } var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(nameAndType.Value); var typeNode = _xmlNavigator.SelectSingleNode(string.Format(MemberXPath, memberName)); var summaryNode = typeNode?.SelectSingleNode(SummaryTag); if (summaryNode != null) { var remarksNode = typeNode.SelectSingleNode(RemarksTag); if (remarksNode != null && !string.IsNullOrWhiteSpace(remarksNode.InnerXml)) { var tag = swaggerDoc.Tags.FirstOrDefault(t => t.Name.Equals(nameAndType.Key)); if (tag != null && !tag.Description.Contains(XmlCommentsTextHelper.Humanize(remarksNode.InnerXml))) { swaggerDoc.Tags.First(t => t.Name.Equals(nameAndType.Key)).Description += $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})"; } } } } }