Skip to content

Commit

Permalink
Merge branch 'PANDATEEN-master' into master
Browse files Browse the repository at this point in the history
+semver:feature
  • Loading branch information
aaubry committed Mar 30, 2021
2 parents 0b03529 + ed66b8d commit 27c7bc3
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 1 deletion.
41 changes: 41 additions & 0 deletions YamlDotNet.Test/Serialization/YamlCommentTests.cs
@@ -0,0 +1,41 @@
using Xunit;
using Xunit.Abstractions;
using YamlDotNet.Serialization;

namespace YamlDotNet.Test.Serialization
{
public class YamlCommentTests
{
protected readonly ITestOutputHelper Output;
public YamlCommentTests(ITestOutputHelper helper)
{
Output = helper;
}

[Fact]
public void SerializationWithComment()
{
var person = new Person();
person.Name = "PandaTea";
person.Age = 100;
person.Sex = "male";

Serializer serializer = new Serializer();
string result = serializer.Serialize(person);

Assert.Contains("# this is a yaml comment about name property", result);
Assert.Contains("# this is age", result);
Assert.Contains("# male or female", result);
}

class Person
{
[YamlMember(Description = "this is a yaml comment about name property")]
public string Name { get; set; }
[YamlMember(Description = "this is age")]
public int Age { get; set; }
[YamlMember(Description = "male or female")]
public string Sex { get; set; }
}
}
}
@@ -0,0 +1,50 @@
// This file is part of YamlDotNet - A .NET library for YAML.
// Copyright (c) Antoine Aubry and contributors

// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
// of the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

using System;
using YamlDotNet.Core;

namespace YamlDotNet.Serialization.ObjectGraphVisitors
{
public sealed class CommentsObjectGraphVisitor : ChainedObjectGraphVisitor
{
public CommentsObjectGraphVisitor(IObjectGraphVisitor<IEmitter> nextVisitor)
: base(nextVisitor)
{
}

private static object? GetDefault(Type type)
{
return type.IsValueType() ? Activator.CreateInstance(type) : null;
}

public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, IEmitter context)
{
var yamlMember = key.GetCustomAttribute<YamlMemberAttribute>();
if (yamlMember?.Description != null)
{
context.Emit(new Core.Events.Comment(yamlMember.Description, false));
}

return base.EnterMapping(key, value, context);
}
}
}
Expand Up @@ -70,4 +70,4 @@ public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor val
return base.EnterMapping(key, value, context);
}
}
}
}
4 changes: 4 additions & 0 deletions YamlDotNet/Serialization/SerializerBuilder.cs
Expand Up @@ -76,6 +76,10 @@ public SerializerBuilder()
{
typeof(DefaultValuesObjectGraphVisitor),
args => new DefaultValuesObjectGraphVisitor(defaultValuesHandlingConfiguration, args.InnerVisitor)
},
{
typeof(CommentsObjectGraphVisitor),
args => new CommentsObjectGraphVisitor(args.InnerVisitor)
}
};

Expand Down
6 changes: 6 additions & 0 deletions YamlDotNet/Serialization/YamlMemberAttribute.cs
Expand Up @@ -30,6 +30,12 @@ namespace YamlDotNet.Serialization
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public sealed class YamlMemberAttribute : Attribute
{
/// <summary>
/// Decription/Comment about this property.
/// When set, a comment will be emitted when serializing this member.
/// </summary>
public string? Description { get; set; }

/// <summary>
/// Specifies that this property should be serialized as the given type, rather than using the actual runtime value's type.
/// </summary>
Expand Down

0 comments on commit 27c7bc3

Please sign in to comment.