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);
        }
Пример #5
0
        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));
        }
Пример #6
0
        /// <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);
                }
            }
        }
Пример #7
0
        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);
        }
Пример #8
0
        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)})";
                }
            }
        }
Пример #9
0
        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)})";
                        }
                    }
                }
            }
        }