Skip to content

Commit

Permalink
Add JsonSchemaFlattenAttribute
Browse files Browse the repository at this point in the history
  • Loading branch information
RicoSuter committed Nov 13, 2018
1 parent a45a6b7 commit c1484a0
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using NJsonSchema.Annotations;
using NJsonSchema.Generation;
using Xunit;

Expand Down Expand Up @@ -119,5 +120,40 @@ public async Task When_class_inherits_from_dictionary_then_flatten_inheritance_w

//// Assert
}

public class A : B
{
public string Aaa { get; set; }
}

[JsonSchemaFlatten]
public class B : C
{
public string Bbb { get; set; }
}

public class C
{
public string Ccc { get; set; }
}

[Fact]
public async Task When_JsonSchemaFlattenAttribute_is_used_on_class_then_inherited_classed_are_merged()
{
//// Arrange
var settings = new JsonSchemaGeneratorSettings();

//// Act
var schema = await JsonSchema4.FromTypeAsync<A>(settings);
var data = schema.ToJson();

//// Assert
Assert.True(schema.Definitions.ContainsKey("B"));
Assert.False(schema.Definitions.ContainsKey("C"));

Assert.True(schema.ActualProperties.ContainsKey("Aaa"));
Assert.True(schema.Definitions["B"].Properties.ContainsKey("Bbb"));
Assert.True(schema.Definitions["B"].Properties.ContainsKey("Ccc"));
}
}
}
18 changes: 18 additions & 0 deletions src/NJsonSchema/Annotations/JsonSchemaFlattenAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//-----------------------------------------------------------------------
// <copyright file="JsonSchemaDateAttribute.cs" company="NJsonSchema">
// Copyright (c) Rico Suter. All rights reserved.
// </copyright>
// <license>https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md</license>
// <author>Rico Suter, [email protected]</author>
//-----------------------------------------------------------------------

using System;

namespace NJsonSchema.Annotations
{
/// <summary>Annotation to merge all inherited properties into this class/schema.</summary>
[AttributeUsage(AttributeTargets.Class)]
public class JsonSchemaFlattenAttribute : Attribute
{
}
}
8 changes: 4 additions & 4 deletions src/NJsonSchema/Generation/JsonSchemaGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -645,7 +645,7 @@ protected virtual string[] GetTypeProperties(Type type)
private async Task GenerateKnownTypesAsync(Type type, JsonSchemaResolver schemaResolver)
{
var knownTypeAttributes = type.GetTypeInfo()
.GetCustomAttributes(Settings.FlattenInheritanceHierarchy) // Known types of inherited classes will be generated later (in GenerateInheritanceAsync)
.GetCustomAttributes(Settings.GetActualFlattenInheritanceHierarchy(type)) // Known types of inherited classes will be generated later (in GenerateInheritanceAsync)
.Where(a => a.GetType().Name == "KnownTypeAttribute")
.OfType<Attribute>();

Expand Down Expand Up @@ -689,7 +689,7 @@ private async Task<JsonSchema4> GenerateInheritanceAsync(Type type, JsonSchema4
baseType.GetTypeInfo().GetCustomAttributes(false).TryGetIfAssignableTo("SwaggerIgnoreAttribute", TypeNameStyle.Name) == null &&
Settings.ExcludedTypeNames?.Contains(baseType.FullName) != true)
{
if (Settings.FlattenInheritanceHierarchy)
if (Settings.GetActualFlattenInheritanceHierarchy(type))
{
var typeDescription = Settings.ReflectionService.GetDescription(baseType, null, Settings);
if (!typeDescription.IsDictionary && !type.IsArray)
Expand Down Expand Up @@ -747,7 +747,7 @@ private async Task<JsonSchema4> GenerateInheritanceAsync(Type type, JsonSchema4
}
}

if (Settings.FlattenInheritanceHierarchy && Settings.GenerateAbstractProperties)
if (Settings.GetActualFlattenInheritanceHierarchy(type) && Settings.GenerateAbstractProperties)
{
#if !LEGACY
foreach (var i in type.GetTypeInfo().ImplementedInterfaces)
Expand All @@ -772,7 +772,7 @@ private async Task<JsonSchema4> GenerateInheritanceAsync(Type type, JsonSchema4

private void GenerateInheritanceDiscriminator(Type type, JsonSchema4 schema)
{
if (!Settings.FlattenInheritanceHierarchy)
if (!Settings.GetActualFlattenInheritanceHierarchy(type))
{
var discriminatorConverter = TryGetInheritanceDiscriminatorConverter(type);
if (discriminatorConverter != null)
Expand Down
10 changes: 10 additions & 0 deletions src/NJsonSchema/Generation/JsonSchemaGeneratorSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
using NJsonSchema.Annotations;
using NJsonSchema.Generation.TypeMappers;
using NJsonSchema.Infrastructure;
using System.Linq;

namespace NJsonSchema.Generation
{
Expand Down Expand Up @@ -177,5 +178,14 @@ public JsonContract ResolveContract(Type type)
ActualContractResolver.ResolveContract(type) :
null;
}

/// <summary>Gets the actual computed <see cref="FlattenInheritanceHierarchy"/> setting based on the global setting and the JsonSchemaFlattenAttribute attribute.</summary>
/// <param name="type">The type.</param>
/// <returns>The result.</returns>
public bool GetActualFlattenInheritanceHierarchy(Type type)
{
return FlattenInheritanceHierarchy || type.GetTypeInfo().GetCustomAttributes(false)
.Any(a => a.GetType().IsAssignableTo("JsonSchemaFlattenAttribute", TypeNameStyle.Name));
}
}
}

0 comments on commit c1484a0

Please sign in to comment.