public void Humanize_TrimsWhiteSpaceFromStartAndEnd()
        {
            var input = @"
 A line of text
            ";

            var output = XmlCommentsTextHelper.Humanize(input);

            Assert.Equal("A line of text", output, false, true);
        }
        private void ApplyResponseTags(OpenApiOperation operation, XPathNodeIterator responseNodes)
        {
            while (responseNodes.MoveNext())
            {
                var code     = responseNodes.Current !.GetAttribute("code", "");
                var response = operation.Responses.ContainsKey(code)
                    ? operation.Responses[code]
                    : operation.Responses[code] = new OpenApiResponse();

                response.Description = XmlCommentsTextHelper.Humanize(responseNodes.Current.InnerXml);
            }
        }
        private void ApplyResponsesXmlToResponses(IDictionary <string, OpenApiResponse> responses, XPathNodeIterator responseNodes)
        {
            while (responseNodes.MoveNext())
            {
                var code     = responseNodes.Current.GetAttribute("code", "");
                var response = responses.ContainsKey(code)
                    ? responses[code]
                    : responses[code] = new OpenApiResponse();

                response.Description = XmlCommentsTextHelper.Humanize(responseNodes.Current.InnerXml);
            }
        }
 public string GetTypeSummary(string typeFullName)
 {
     foreach (var xmlDoc in _xmlDocs)
     {
         var xnMember = xmlDoc.SelectSingleNode($"/doc/members/member[@name='T:{typeFullName}']");
         if (xnMember != null)
         {
             var xnSummary = xnMember.SelectSingleNode("summary");
             return(XmlCommentsTextHelper.Humanize(xnSummary.InnerXml));
         }
     }
     return(null);
 }
Esempio n. 5
0
        public string GetPropertyExample(PropertyInfo propertyInfo)
        {
            var propertyMemberName  = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(propertyInfo);
            var propertyExampleNode = this.xpathNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/example");

            if (propertyExampleNode == null)
            {
                return(string.Empty);
            }
            var example = XmlCommentsTextHelper.Humanize(propertyExampleNode.InnerXml);

            return(example);
        }
Esempio n. 6
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));
        }
Esempio n. 7
0
 private void ApplyResponsesXmlToResponses(ArrayElement responses, XPathNodeIterator responseNodes)
 {
     while (responseNodes.MoveNext())
     {
         var code     = responseNodes.Current.GetAttribute("code", "");
         var response = responses.TryGetElement <Response>(code);
         if (response == null)
         {
             continue;
         }
         response.Description.Value = XmlCommentsTextHelper.Humanize(responseNodes.Current.InnerXml);
     }
 }
        private void TryApplyTypeComments(OpenApiSchema schema, Type type)
        {
            var typeNode = xmlDocProvider.GetNodeForType(type);

            if (typeNode == null)
            {
                return;
            }
            var summaryNode = typeNode.SelectSingleNode(SummaryTag);

            if (summaryNode != null)
            {
                schema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
            }
        }
Esempio n. 9
0
        public void SetCommentToProperty(PropertyType propertyType, PropertyInfo property)
        {
            if (!Cannavigator())
            {
                return;
            }
            var id          = GetCommentIdForProperty(property);
            var typeNode    = navigator.SelectSingleNode(string.Format(MemberXPath, id));
            var summaryNode = typeNode?.SelectSingleNode(SummaryXPath);

            if (summaryNode != null)
            {
                propertyType.Description.Value = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
            }
        }
Esempio n. 10
0
        public void SetCommentToClass(ObjectType ot, Type type)
        {
            if (!Cannavigator())
            {
                return;
            }
            var id          = GetCommentIdForType(type);
            var typeNode    = navigator.SelectSingleNode(string.Format(MemberXPath, id));
            var summaryNode = typeNode?.SelectSingleNode(SummaryXPath);

            if (summaryNode != null)
            {
                ot.Description.Value = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
            }
        }
Esempio n. 11
0
 private void ApplyParamsXmlToActionParameters(ArrayElement queryParameters, XPathNavigator methodNode)
 {
     if (!queryParameters.HasElements)
     {
         return;
     }
     foreach (var item in queryParameters.Elements)
     {
         var paramNode = methodNode.SelectSingleNode(string.Format(ParamXPath, item.Key));
         if (paramNode != null && item is Parameter p)
         {
             p.Description.Value = XmlCommentsTextHelper.Humanize(paramNode.InnerXml);
         }
     }
 }
Esempio n. 12
0
        private void ApplyPropertyComments(OpenApiSchema propertySchema, MemberInfo memberInfo)
        {
            var memberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(memberInfo);

            if (!_inheritedDocs.ContainsKey(memberName))
            {
                return;
            }

            if (_excludedTypes.Any() && _excludedTypes.ToList()
                .Contains(((PropertyInfo)memberInfo).PropertyType))
            {
                return;
            }

            var cref   = _inheritedDocs[memberName];
            var target = GetTargetRecursive(memberInfo, cref);

            var targetXmlNode = GetMemberXmlNode(XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(target));

            if (targetXmlNode == null)
            {
                return;
            }

            var summaryNode = targetXmlNode.SelectSingleNode(SummaryTag);

            if (summaryNode != null)
            {
                propertySchema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);

                if (_includeRemarks)
                {
                    var remarksNode = targetXmlNode.SelectSingleNode(RemarksTag);
                    if (remarksNode != null && !string.IsNullOrWhiteSpace(remarksNode.InnerXml))
                    {
                        propertySchema.Description += $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})";
                    }
                }
            }

            var exampleNode = targetXmlNode.SelectSingleNode(ExampleTag);

            if (exampleNode != null)
            {
                propertySchema.Example = new OpenApiString(XmlCommentsTextHelper.Humanize(exampleNode.InnerXml));
            }
        }
Esempio n. 13
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);
                }
            }
        }
        private void ApplyMethodXmlToOperation(OpenApiOperation operation, XPathNavigator methodNode)
        {
            var summaryNode = methodNode.SelectSingleNode(SummaryXPath);

            if (summaryNode != null)
            {
                operation.Summary = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
            }

            var remarksNode = methodNode.SelectSingleNode(RemarksXPath);

            if (remarksNode != null)
            {
                operation.Description = XmlCommentsTextHelper.Humanize(remarksNode.InnerXml);
            }
        }
Esempio n. 15
0
        private void ApplyMethodXmlToOperation(Operation operation, XPathNavigator methodNode, ApiDescription apiDescription)
        {
            XPathNavigator xpathNavigator1 = methodNode.SelectSingleNode("summary");

            operation.Summary = GetMemberPermission(apiDescription);
            if (xpathNavigator1 != null)
            {
                operation.Summary += XmlCommentsTextHelper.Humanize(xpathNavigator1.InnerXml);
            }
            XPathNavigator xpathNavigator2 = methodNode.SelectSingleNode("remarks");

            if (xpathNavigator2 == null)
            {
                return;
            }
            operation.Description = XmlCommentsTextHelper.Humanize(xpathNavigator2.InnerXml);
        }
Esempio n. 16
0
        public void Humanize_TrimsCommonSpaceTabIndentations()
        {
            // Common indentation seen in visual studio: {space}{tab}
            var input = @"
                ## Heading 1

                A line of text
            "            ;

            var output = XmlCommentsTextHelper.Humanize(input);

            Assert.Equal(
                @"## Heading 1

A line of text",
                output
                );
        }
Esempio n. 17
0
        public void Humanize_DoesNotTrimInconsistentIndentations()
        {
            var input = @"
                Space Indentation Line 1
                Space Indentation Line 2
                Misplaced Tab Indentation
                Space Indentation Line 4
            ";

            var output = XmlCommentsTextHelper.Humanize(input);

            Assert.Equal(
                @"    Space Indentation Line 1
    Space Indentation Line 2
	Misplaced Tab Indentation
    Space Indentation Line 4",
                output, false, true);
        }
        private static string TryGetMemberComments(MemberInfo memberInfo, IEnumerable <XPathNavigator> xmlNavigators)
        {
            if (xmlNavigators == null)
            {
                return(string.Empty);
            }

            foreach (var xmlNavigator in xmlNavigators)
            {
                var nodeNameForMember = GetNodeNameForMember(memberInfo);
                var xpathNavigator1   = xmlNavigator.SelectSingleNode(
                    $"/doc/members/member[@name='{nodeNameForMember}']");
                var xpathNavigator2 = xpathNavigator1?.SelectSingleNode("summary");
                return(xpathNavigator2 != null?XmlCommentsTextHelper.Humanize(xpathNavigator2.InnerXml) : string.Empty);
            }

            return(string.Empty);
        }
Esempio n. 19
0
 public void SetCommentToMethod(ApiDescription api, Method method)
 {
     if (Cannavigator() && api.ActionDescriptor is ControllerActionDescriptor controller)
     {
         var id         = GetCommentIdForMethod(controller.MethodInfo);
         var methodNode = navigator.SelectSingleNode(string.Format(MemberXPath, id));
         if (methodNode == null)
         {
             return;
         }
         var summaryNode = methodNode.SelectSingleNode(SummaryXPath);
         if (summaryNode != null)
         {
             method.Description.Value = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
         }
         ApplyResponsesXmlToResponses(method.Responses, methodNode.Select(ResponsesXPath));
         ApplyParamsXmlToActionParameters(method.QueryParameters, methodNode);
     }
 }
Esempio n. 20
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)})";
                }
            }
        }
Esempio n. 21
0
 private void ApplyParamsXmlToActionParameters(IList <IParameter> parameters, XPathNavigator methodNode, ApiDescription apiDescription)
 {
     if (parameters == null)
     {
         return;
     }
     foreach (IParameter parameter1 in (IEnumerable <IParameter>)parameters)
     {
         IParameter          parameter           = parameter1;
         ParameterDescriptor parameterDescriptor = apiDescription.ActionDescriptor.Parameters.FirstOrDefault <ParameterDescriptor>((Func <ParameterDescriptor, bool>)(p => parameter.Name.Equals(p.BindingInfo?.BinderModelName ?? p.Name, StringComparison.OrdinalIgnoreCase)));
         if (parameterDescriptor != null)
         {
             XPathNavigator xpathNavigator = methodNode.SelectSingleNode(string.Format("param[@name='{0}']", (object)parameterDescriptor.Name));
             if (xpathNavigator != null)
             {
                 parameter.Description = XmlCommentsTextHelper.Humanize(xpathNavigator.InnerXml);
             }
         }
     }
 }
Esempio n. 22
0
        private void ApplyPropertyTags(OpenApiRequestBody requestBody, PropertyInfo propertyInfo)
        {
            if (propertyInfo.DeclaringType != null && _excludedTypes.Any() && _excludedTypes.ToList().Contains(propertyInfo.DeclaringType))
            {
                return;
            }

            var propertyMemberName  = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(propertyInfo);
            var propertySummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/{SummaryTag}");

            if (propertySummaryNode != null)
            {
                var propertyRemarksNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/{RemarksTag}");
                if (propertyRemarksNode != null &&
                    !string.IsNullOrWhiteSpace(propertyRemarksNode.InnerXml) &&
                    !requestBody.Description.Contains(XmlCommentsTextHelper.Humanize(propertyRemarksNode.InnerXml)))
                {
                    requestBody.Description +=
                        $" ({XmlCommentsTextHelper.Humanize(propertyRemarksNode.InnerXml)})";
                }
            }
        }
        public IEnumerable <KeyValuePair <string, int> > GetEnumValuesSummary(Type type)
        {
            var lstRetn = new List <KeyValuePair <string, int> >();

            var enumTypeName = type.FullName;
            var xmlDoc       = _xmlDocs.FirstOrDefault(p =>
            {
                var xnMember = p.SelectSingleNode($"/doc/members/member[@name='T:{enumTypeName}']");
                return(xnMember != null);
            });

            var eVals = Enum.GetValues(type);

            foreach (var eVal in eVals)
            {
                var xnField = xmlDoc?.SelectSingleNode($"/doc/members/member[@name=\'F:{enumTypeName}.{eVal}\']");
                var sStr    = xnField != null?XmlCommentsTextHelper.Humanize(xnField.SelectSingleNode("summary").InnerXml) : eVal.ToString();

                lstRetn.Add(new KeyValuePair <string, int>(sStr, (int)eVal));
            }
            return(lstRetn);
        }
Esempio n. 24
0
        public void Humanize_TrimsCommonSpaceIndentations()
        {
            var input = @"
                ## Heading 1

                  * list item 1

                ## Heading 2

                    POST /api/test

                    {
                      ""prop1"": {
                        ""name"": ""value""
                      }
                    }
            ";

            var output = XmlCommentsTextHelper.Humanize(input);

            Assert.Equal(
                @"## Heading 1

  * list item 1

## Heading 2

	POST /api/test

	{
	  ""prop1"": {
	    ""name"": ""value""
	  }
	}"    ,
                output,
                false,
                true
                );
        }
Esempio n. 25
0
        private void ApplyFieldOrPropertyTags(OpenApiSchema schema, MemberInfo fieldOrPropertyInfo)
        {
            if (fieldOrPropertyInfo.DeclaringType != null && _excludedTypes.Any() && _excludedTypes.ToList().Contains(fieldOrPropertyInfo.DeclaringType))
            {
                return;
            }

            var fieldOrPropertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(fieldOrPropertyInfo);
            var fieldOrPropertyNode       = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{fieldOrPropertyMemberName}']");
            var summaryNode = fieldOrPropertyNode?.SelectSingleNode(SummaryTag);

            if (summaryNode != null)
            {
                var remarksNode = fieldOrPropertyNode.SelectSingleNode(RemarksTag);
                if (remarksNode != null &&
                    !string.IsNullOrWhiteSpace(remarksNode.InnerXml) &&
                    !schema.Description.Contains(XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)))
                {
                    schema.Description +=
                        $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})";
                }
            }
        }
        /// <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)})";
                        }
                    }
                }
            }
        }
        private void ApplyFieldOrPropertyTags(OpenApiSchema schema, MemberInfo fieldOrPropertyInfo)
        {
            var fieldOrPropertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(fieldOrPropertyInfo);
            var fieldOrPropertyNode       = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{fieldOrPropertyMemberName}']");

            if (fieldOrPropertyNode == null)
            {
                return;
            }

            var summaryNode = fieldOrPropertyNode.SelectSingleNode("summary");

            if (summaryNode != null)
            {
                schema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml);
            }

            var exampleNode = fieldOrPropertyNode.SelectSingleNode("example");

            if (exampleNode != null)
            {
                schema.Example = JsonMapper.CreateFromJson(exampleNode.InnerXml);
            }
        }
Esempio n. 28
0
 private void ApplyPropertiesXmlToPropertyParameters(IList <IParameter> parameters, ApiDescription apiDescription)
 {
     if (parameters == null)
     {
         return;
     }
     foreach (IParameter parameter1 in (IEnumerable <IParameter>)parameters)
     {
         IParameter parameter = parameter1;
         ApiParameterDescription parameterDescription = apiDescription.ParameterDescriptions.Where <ApiParameterDescription>((Func <ApiParameterDescription, bool>)(p =>
         {
             if (p.ModelMetadata?.ContainerType != (Type)null)
             {
                 return(p.ModelMetadata?.PropertyName != null);
             }
             return(false);
         })).FirstOrDefault <ApiParameterDescription>((Func <ApiParameterDescription, bool>)(p => parameter.Name.Equals(p.Name, StringComparison.OrdinalIgnoreCase)));
         if (parameterDescription != null)
         {
             ModelMetadata modelMetadata = parameterDescription.ModelMetadata;
             MemberInfo    memberInfo    = ((IEnumerable <MemberInfo>)modelMetadata.ContainerType.GetMember(modelMetadata.PropertyName)).FirstOrDefault <MemberInfo>();
             if (!(memberInfo == (MemberInfo)null))
             {
                 XPathNavigator xpathNavigator1 = this._xmlNavigator.SelectSingleNode(string.Format("/doc/members/member[@name='{0}']", (object)XmlCommentsMemberNameHelper.GetMemberNameForMember(memberInfo)));
                 if (xpathNavigator1 != null)
                 {
                     XPathNavigator xpathNavigator2 = xpathNavigator1.SelectSingleNode("summary");
                     if (xpathNavigator2 != null)
                     {
                         parameter.Description = XmlCommentsTextHelper.Humanize(xpathNavigator2.InnerXml);
                     }
                 }
             }
         }
     }
 }
Esempio n. 29
0
 private void ApplyResponsesXmlToResponses(IDictionary <string, Response> responses, XPathNodeIterator responseNodes)
 {
     while (responseNodes.MoveNext())
     {
         string attribute = responseNodes.Current.GetAttribute("code", "");
         (responses.ContainsKey(attribute) ? responses[attribute] : (responses[attribute] = new Response())).Description = XmlCommentsTextHelper.Humanize(responseNodes.Current.InnerXml);
     }
 }