From 0846801cf285a773d8bc0ae55f88d48728abfe1f Mon Sep 17 00:00:00 2001 From: danielmarbach Date: Fri, 8 Nov 2019 09:20:44 +0100 Subject: [PATCH 1/3] Quick stab at options --- src/PublicApiGenerator/ApiGenerator.cs | 30 ++++++++++++++----- src/PublicApiGenerator/ApiGeneratorOptions.cs | 17 +++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/PublicApiGenerator/ApiGeneratorOptions.cs diff --git a/src/PublicApiGenerator/ApiGenerator.cs b/src/PublicApiGenerator/ApiGenerator.cs index 849cd33..8522beb 100644 --- a/src/PublicApiGenerator/ApiGenerator.cs +++ b/src/PublicApiGenerator/ApiGenerator.cs @@ -18,13 +18,13 @@ namespace PublicApiGenerator { public static class ApiGenerator { - static readonly string[] defaultWhitelistedNamespacePrefixes = new string[0]; - - public static string GeneratePublicApi(Assembly assembly, Type[]? includeTypes = null, bool shouldIncludeAssemblyAttributes = true, string[]? whitelistedNamespacePrefixes = null, string[]? excludeAttributes = null) + public static string GeneratePublicApi(Assembly assembly, ApiGeneratorOptions? options = null) { if (assembly is null) throw new ArgumentNullException(nameof(assembly)); - var attributeFilter = new AttributeFilter(excludeAttributes); + options ??= new ApiGeneratorOptions(); + + var attributeFilter = new AttributeFilter(options.ExcludeAttributes); using (var assemblyResolver = new DefaultAssemblyResolver()) { @@ -41,14 +41,30 @@ public static string GeneratePublicApi(Assembly assembly, Type[]? includeTypes = { return CreatePublicApiForAssembly( asm, - typeDefinition => includeTypes == null || includeTypes.Any(type => type.FullName == typeDefinition.FullName && type.Assembly.FullName == typeDefinition.Module.Assembly.FullName), - shouldIncludeAssemblyAttributes, - whitelistedNamespacePrefixes ?? defaultWhitelistedNamespacePrefixes, + typeDefinition => options.IncludeTypes == null || options.IncludeTypes.Any(type => type.FullName == typeDefinition.FullName && type.Assembly.FullName == typeDefinition.Module.Assembly.FullName), + options.IncludeAssemblyAttributes, + options.WhitelistedNamespacePrefixes, attributeFilter); } } } + [Obsolete("Use `GeneratePublicApi(Assembly assembly, ApiGeneratorOptions? options = null)` instead. Will be removed in the next major.")] + public static string GeneratePublicApi(Assembly assembly, Type[]? includeTypes = null, bool shouldIncludeAssemblyAttributes = true, string[]? whitelistedNamespacePrefixes = null, string[]? excludeAttributes = null) + { + var options = new ApiGeneratorOptions + { + IncludeTypes = includeTypes, + IncludeAssemblyAttributes = shouldIncludeAssemblyAttributes, + ExcludeAttributes = excludeAttributes, + }; + if (whitelistedNamespacePrefixes != null) + { + options.WhitelistedNamespacePrefixes = whitelistedNamespacePrefixes; + } + return GeneratePublicApi(assembly, options); + } + // TODO: Assembly references? // TODO: Better handle namespaces - using statements? - requires non-qualified type names static string CreatePublicApiForAssembly(AssemblyDefinition assembly, Func shouldIncludeType, bool shouldIncludeAssemblyAttributes, string[] whitelistedNamespacePrefixes, AttributeFilter attributeFilter) diff --git a/src/PublicApiGenerator/ApiGeneratorOptions.cs b/src/PublicApiGenerator/ApiGeneratorOptions.cs new file mode 100644 index 0000000..40c8815 --- /dev/null +++ b/src/PublicApiGenerator/ApiGeneratorOptions.cs @@ -0,0 +1,17 @@ +using System; + +namespace PublicApiGenerator +{ + public class ApiGeneratorOptions + { + public Type[]? IncludeTypes { get; set; } + + public bool IncludeAssemblyAttributes { get; set; } = true; + + public string[] WhitelistedNamespacePrefixes { get; set; } = DefaultWhitelistedNamespacePrefixes; + + public string[]? ExcludeAttributes { get; set; } + + static readonly string[] DefaultWhitelistedNamespacePrefixes = Array.Empty(); + } +} From 31a293280382e2d9a975cd86e6dae41da98a87ff Mon Sep 17 00:00:00 2001 From: danielmarbach Date: Fri, 8 Nov 2019 15:11:34 +0100 Subject: [PATCH 2/3] Switch to options --- .../ApiGeneratorTestsBase.cs | 22 ++++++++++++------- .../Assembly_attributes.cs | 3 ++- .../Class_attributes.cs | 10 +++++++-- .../Class_event_attributes.cs | 8 ++++++- .../DefaultApiGeneratorOptions.cs | 12 ++++++++++ .../Delegate_attributes.cs | 10 +++++++-- .../Field_attributes.cs | 10 +++++++-- .../Interface_attributes.cs | 10 +++++++-- .../Interface_event_attributes.cs | 9 +++++++- .../Interface_method_attributes.cs | 10 +++++++-- ...nterface_method_return_value_attributes.cs | 10 +++++++-- .../Method_attributes.cs | 8 ++++++- .../Method_parameter_attributes.cs | 10 +++++++-- .../Method_return_value_attributes.cs | 10 +++++++-- .../Namespaces_whitelisting.cs | 17 +++++++++++--- .../Property_attributes.cs | 10 +++++++-- .../PublicApiGeneratorTests.csproj | 2 +- .../Struct_attributes.cs | 10 +++++++-- .../Struct_member_order.cs | 17 +++++++++++--- 19 files changed, 159 insertions(+), 39 deletions(-) create mode 100644 src/PublicApiGeneratorTests/DefaultApiGeneratorOptions.cs diff --git a/src/PublicApiGeneratorTests/ApiGeneratorTestsBase.cs b/src/PublicApiGeneratorTests/ApiGeneratorTestsBase.cs index 59f7c2b..e1b3122 100644 --- a/src/PublicApiGeneratorTests/ApiGeneratorTestsBase.cs +++ b/src/PublicApiGeneratorTests/ApiGeneratorTestsBase.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using System.Text.RegularExpressions; +using PublicApiGenerator; using Xunit; namespace PublicApiGeneratorTests @@ -9,24 +10,29 @@ public abstract class ApiGeneratorTestsBase { private static readonly Regex StripEmptyLines = new Regex(@"^\s+$[\r\n]*", RegexOptions.Multiline | RegexOptions.Compiled); - protected void AssertPublicApi(string expectedOutput, bool includeAssemblyAttributes = false, string[]? excludeAttributes = null) + protected void AssertPublicApi(string expectedOutput, ApiGeneratorOptions? options = null) { - AssertPublicApi(typeof(T), expectedOutput, includeAssemblyAttributes, excludeAttributes); + AssertPublicApi(typeof(T), expectedOutput, options); } - protected void AssertPublicApi(Type type, string expectedOutput, bool includeAssemblyAttributes = false, string[]? excludeAttributes = null) + protected void AssertPublicApi(Type type, string expectedOutput, ApiGeneratorOptions? options = null) { - AssertPublicApi(new[] { type }, expectedOutput, includeAssemblyAttributes, excludeAttributes: excludeAttributes); + AssertPublicApi(new[] { type }, expectedOutput, options); } - protected void AssertPublicApi(Type[] types, string expectedOutput, bool includeAssemblyAttributes = false, string[]? whitelistedNamespacePrefixes = null, string[]? excludeAttributes = null) + protected void AssertPublicApi(Type[] types, string expectedOutput, ApiGeneratorOptions? options = null) { - AssertPublicApi(types[0].Assembly, types, expectedOutput, includeAssemblyAttributes, whitelistedNamespacePrefixes, excludeAttributes); + options ??= new DefaultApiGeneratorOptions(); + options.IncludeTypes = types; + + AssertPublicApi(types[0].Assembly, expectedOutput, options); } - private static void AssertPublicApi(Assembly assembly, Type[] types, string expectedOutput, bool includeAssemblyAttributes, string[]? whitelistedNamespacePrefixes, string[]? excludeAttributes) + private static void AssertPublicApi(Assembly assembly, string expectedOutput, ApiGeneratorOptions? options = null) { - var actualOutput = PublicApiGenerator.ApiGenerator.GeneratePublicApi(assembly, types, includeAssemblyAttributes, whitelistedNamespacePrefixes, excludeAttributes); + options ??= new DefaultApiGeneratorOptions(); + + var actualOutput = ApiGenerator.GeneratePublicApi(assembly, options); actualOutput = StripEmptyLines.Replace(actualOutput, string.Empty); Assert.Equal(expectedOutput, actualOutput, ignoreCase: false, ignoreLineEndingDifferences: true, ignoreWhiteSpaceDifferences: true); diff --git a/src/PublicApiGeneratorTests/Assembly_attributes.cs b/src/PublicApiGeneratorTests/Assembly_attributes.cs index ee88149..a6283d4 100644 --- a/src/PublicApiGeneratorTests/Assembly_attributes.cs +++ b/src/PublicApiGeneratorTests/Assembly_attributes.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using PublicApiGenerator; using PublicApiGeneratorTests.Examples; using Xunit; @@ -36,7 +37,7 @@ public class NotImportant } }"; - AssertPublicApi(api, true); + AssertPublicApi(api, new ApiGeneratorOptions { IncludeAssemblyAttributes = true }); } } diff --git a/src/PublicApiGeneratorTests/Class_attributes.cs b/src/PublicApiGeneratorTests/Class_attributes.cs index 6094d84..6d4ec4a 100644 --- a/src/PublicApiGeneratorTests/Class_attributes.cs +++ b/src/PublicApiGeneratorTests/Class_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -277,6 +278,11 @@ public class ClassWithInternalAttribute [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] {"PublicApiGeneratorTests.Examples.Attribute_MM"} + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -286,7 +292,7 @@ public class ClassWithMultipleAttributes { public ClassWithMultipleAttributes() { } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.Attribute_MM" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Class_event_attributes.cs b/src/PublicApiGeneratorTests/Class_event_attributes.cs index 4ee95b3..5833886 100644 --- a/src/PublicApiGeneratorTests/Class_event_attributes.cs +++ b/src/PublicApiGeneratorTests/Class_event_attributes.cs @@ -1,4 +1,5 @@ using System; +using PublicApiGenerator; using PublicApiGeneratorTests.Examples; using Xunit; @@ -24,6 +25,11 @@ public class ClassWithEventWithAttribute [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -32,7 +38,7 @@ public class ClassWithEventWithAttribute public ClassWithEventWithAttribute() { } public event System.EventHandler OnClicked; } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/DefaultApiGeneratorOptions.cs b/src/PublicApiGeneratorTests/DefaultApiGeneratorOptions.cs new file mode 100644 index 0000000..8ddc7a0 --- /dev/null +++ b/src/PublicApiGeneratorTests/DefaultApiGeneratorOptions.cs @@ -0,0 +1,12 @@ +using PublicApiGenerator; + +namespace PublicApiGeneratorTests +{ + class DefaultApiGeneratorOptions : ApiGeneratorOptions + { + public DefaultApiGeneratorOptions() + { + IncludeAssemblyAttributes = false; + } + } +} diff --git a/src/PublicApiGeneratorTests/Delegate_attributes.cs b/src/PublicApiGeneratorTests/Delegate_attributes.cs index 80d7893..2aa0df8 100644 --- a/src/PublicApiGeneratorTests/Delegate_attributes.cs +++ b/src/PublicApiGeneratorTests/Delegate_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -215,13 +216,18 @@ public void Should_output_attribute_for_parameter() [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.Attribute_ZZ" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { [PublicApiGeneratorTests.Examples.Attribute_AA] [PublicApiGeneratorTests.Examples.Attribute_MM] public delegate void DelegateWithMultipleAttributes(); -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.Attribute_ZZ" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Field_attributes.cs b/src/PublicApiGeneratorTests/Field_attributes.cs index bfd39c1..8933373 100644 --- a/src/PublicApiGeneratorTests/Field_attributes.cs +++ b/src/PublicApiGeneratorTests/Field_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -161,6 +162,11 @@ public class FieldWithMultipleAttributes [Fact] public void Should_skip_excluded_attributes() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.Attribute_MM", "PublicApiGeneratorTests.Examples.Attribute_ZZ" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -170,7 +176,7 @@ public class FieldWithMultipleAttributes public string Value; public FieldWithMultipleAttributes() { } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.Attribute_MM", "PublicApiGeneratorTests.Examples.Attribute_ZZ" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Interface_attributes.cs b/src/PublicApiGeneratorTests/Interface_attributes.cs index b85e1fc..8f05223 100644 --- a/src/PublicApiGeneratorTests/Interface_attributes.cs +++ b/src/PublicApiGeneratorTests/Interface_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -154,11 +155,16 @@ public interface IInterfaceWithAttributeWithStringArrayInitialiser { } [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { public interface IInterfaceWithSimpleAttribute { } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Interface_event_attributes.cs b/src/PublicApiGeneratorTests/Interface_event_attributes.cs index f872219..5797fda 100644 --- a/src/PublicApiGeneratorTests/Interface_event_attributes.cs +++ b/src/PublicApiGeneratorTests/Interface_event_attributes.cs @@ -1,4 +1,5 @@ using System; +using PublicApiGenerator; using PublicApiGeneratorTests.Examples; using Xunit; @@ -23,6 +24,12 @@ public interface IInterfaceWithEventWithAttribute [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + }; + + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -30,7 +37,7 @@ public interface IInterfaceWithEventWithAttribute { public event System.EventHandler OnClicked; } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Interface_method_attributes.cs b/src/PublicApiGeneratorTests/Interface_method_attributes.cs index 609b7ea..dbceb3d 100644 --- a/src/PublicApiGeneratorTests/Interface_method_attributes.cs +++ b/src/PublicApiGeneratorTests/Interface_method_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -132,6 +133,11 @@ public interface IMethodWithMultipleAttributes [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -140,7 +146,7 @@ public interface IMethodsWithAttributeWithNamedParameters void Method1(); void Method2(); } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Interface_method_return_value_attributes.cs b/src/PublicApiGeneratorTests/Interface_method_return_value_attributes.cs index 5ea9d94..b1aafd7 100644 --- a/src/PublicApiGeneratorTests/Interface_method_return_value_attributes.cs +++ b/src/PublicApiGeneratorTests/Interface_method_return_value_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -129,6 +130,11 @@ public interface IMethodWithAttributesOnMethodAndReturnValue [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -136,7 +142,7 @@ public interface IMethodReturnValueWithAttributeWithMultipleNamedParameters { void Method(); } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Method_attributes.cs b/src/PublicApiGeneratorTests/Method_attributes.cs index 6241a72..5b96f9d 100644 --- a/src/PublicApiGeneratorTests/Method_attributes.cs +++ b/src/PublicApiGeneratorTests/Method_attributes.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; +using PublicApiGenerator; using PublicApiGeneratorTests.Examples; using Xunit; @@ -159,6 +160,11 @@ public class MethodWithCompilerAttributes [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -167,7 +173,7 @@ public class MethodWithAttributeWithMultipleNamedParameters public MethodWithAttributeWithMultipleNamedParameters() { } public void Method() { } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Method_parameter_attributes.cs b/src/PublicApiGeneratorTests/Method_parameter_attributes.cs index ea2a622..847e7e0 100644 --- a/src/PublicApiGeneratorTests/Method_parameter_attributes.cs +++ b/src/PublicApiGeneratorTests/Method_parameter_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -109,6 +110,11 @@ public class MethodParameterWithMultipleAttributes [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.AttributeWithPositionalParameters2Attribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -119,7 +125,7 @@ public class MethodParameterWithAttributeWithPositionalParameters public void Method2(int value) { } public void Method3([PublicApiGeneratorTests.Examples.AttributeWithMultiplePositionalParameters(42, ""Hello"")] int value) { } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.AttributeWithPositionalParameters2Attribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Method_return_value_attributes.cs b/src/PublicApiGeneratorTests/Method_return_value_attributes.cs index af0c237..7dc6dab 100644 --- a/src/PublicApiGeneratorTests/Method_return_value_attributes.cs +++ b/src/PublicApiGeneratorTests/Method_return_value_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -137,6 +138,11 @@ public class MethodWithAttributesOnMethodAndReturnValue [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -145,7 +151,7 @@ public class MethodReturnValueWithAttributeWithMultipleNamedParameters public MethodReturnValueWithAttributeWithMultipleNamedParameters() { } public void Method() { } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.AttributeWithNamedParameterAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Namespaces_whitelisting.cs b/src/PublicApiGeneratorTests/Namespaces_whitelisting.cs index b814cbb..cd8f5ae 100644 --- a/src/PublicApiGeneratorTests/Namespaces_whitelisting.cs +++ b/src/PublicApiGeneratorTests/Namespaces_whitelisting.cs @@ -1,5 +1,6 @@ using Microsoft.Whitelisted; using System.Whitelisted; +using PublicApiGenerator; using Xunit; namespace PublicApiGeneratorTests @@ -9,6 +10,11 @@ public class Namespaces_whitelisting : ApiGeneratorTestsBase [Fact] public void Should_allow_microsoft_namespace_whitelisting() { + var options = new DefaultApiGeneratorOptions + { + WhitelistedNamespacePrefixes = new[] {"Microsoft.Whitelisted"} + }; + AssertPublicApi(new[] { typeof(Simple1), typeof(Simple2) }, @"namespace Microsoft.Whitelisted { @@ -22,7 +28,7 @@ public class Simple2 public Simple2() { } public void Simple() { } } -}", whitelistedNamespacePrefixes: new[] { "Microsoft.Whitelisted" }); +}", options); } [Fact] @@ -39,6 +45,11 @@ public class Simple2 { } [Fact] public void Should_allow_system_namespace_whitelisting() { + var options = new DefaultApiGeneratorOptions + { + WhitelistedNamespacePrefixes = new[] { "System.Whitelisted" } + }; + AssertPublicApi(new[] { typeof(System1), typeof(System2)}, @"namespace System.Whitelisted { @@ -52,7 +63,7 @@ public class System2 public System2() { } public void System() { } } -}", whitelistedNamespacePrefixes: new[] { "System.Whitelisted" }); +}", options); } [Fact] @@ -92,4 +103,4 @@ public class System2 { public void System() { } } -} \ No newline at end of file +} diff --git a/src/PublicApiGeneratorTests/Property_attributes.cs b/src/PublicApiGeneratorTests/Property_attributes.cs index 0aa9d07..cd9955b 100644 --- a/src/PublicApiGeneratorTests/Property_attributes.cs +++ b/src/PublicApiGeneratorTests/Property_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -178,6 +179,11 @@ public class PropertyWithSimpleAttributeOnGetterAndSetter [Fact] public void Should_skip_excluded_attributes() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { @@ -186,7 +192,7 @@ public class PropertyWithSimpleAttributeOnGetterAndSetter public PropertyWithSimpleAttributeOnGetterAndSetter() { } public string Value { get; set; } } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/PublicApiGeneratorTests.csproj b/src/PublicApiGeneratorTests/PublicApiGeneratorTests.csproj index fc71df3..9b9a983 100644 --- a/src/PublicApiGeneratorTests/PublicApiGeneratorTests.csproj +++ b/src/PublicApiGeneratorTests/PublicApiGeneratorTests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.2 diff --git a/src/PublicApiGeneratorTests/Struct_attributes.cs b/src/PublicApiGeneratorTests/Struct_attributes.cs index 00c547c..ad2ef78 100644 --- a/src/PublicApiGeneratorTests/Struct_attributes.cs +++ b/src/PublicApiGeneratorTests/Struct_attributes.cs @@ -1,4 +1,5 @@ -using PublicApiGeneratorTests.Examples; +using PublicApiGenerator; +using PublicApiGeneratorTests.Examples; using Xunit; namespace PublicApiGeneratorTests @@ -106,11 +107,16 @@ public struct StructWithMultipleAttributes { } [Fact] public void Should_skip_excluded_attribute() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + }; + AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples { public struct StructWithSimpleAttribute { } -}", excludeAttributes: new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" }); +}", options); } } diff --git a/src/PublicApiGeneratorTests/Struct_member_order.cs b/src/PublicApiGeneratorTests/Struct_member_order.cs index 52e7787..271a8ee 100644 --- a/src/PublicApiGeneratorTests/Struct_member_order.cs +++ b/src/PublicApiGeneratorTests/Struct_member_order.cs @@ -1,4 +1,5 @@ using System; +using PublicApiGenerator; using PublicApiGeneratorTests.Examples; using Xunit; @@ -9,6 +10,11 @@ public class Struct_member_order : ApiGeneratorTestsBase [Fact] public void Should_output_in_known_order_and_alphabetically() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "System.Runtime.CompilerServices.IsReadOnlyAttribute" } + }; + // Fields, properties, events, methods, nested type (inc. delegates) AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples @@ -36,12 +42,17 @@ public struct StructMemberOrder public delegate System.EventHandler IDelegate2(); public delegate System.EventHandler iDelegate1(); } -}", excludeAttributes: new[] { "System.Runtime.CompilerServices.IsReadOnlyAttribute" }); +}", options); } [Fact] public void Should_output_in_known_order_with_nested_class() { + var options = new DefaultApiGeneratorOptions + { + ExcludeAttributes = new[] { "System.Runtime.CompilerServices.IsReadOnlyAttribute" } + }; + // Fields, properties, events, methods AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples @@ -99,7 +110,7 @@ public class ClassMemberOrderAsNestedClass public delegate System.EventHandler IDelegate2(); public delegate System.EventHandler iDelegate1(); } -}", excludeAttributes: new[] { "System.Runtime.CompilerServices.IsReadOnlyAttribute" }); +}", options); } } // ReSharper disable EventNeverInvoked @@ -204,4 +215,4 @@ public struct AnotherNestedStruct // ReSharper restore ClassNeverInstantiated.Global // ReSharper restore EventNeverSubscribedTo.Global // ReSharper restore EventNeverInvoked -} \ No newline at end of file +} From ccb5a3a602471a9a8a1fa42bf23cd1fb31c94f34 Mon Sep 17 00:00:00 2001 From: danielmarbach Date: Fri, 8 Nov 2019 15:46:10 +0100 Subject: [PATCH 3/3] Documentation --- src/PublicApiGenerator/ApiGeneratorOptions.cs | 32 +++++++++++++++++++ .../Interface_event_attributes.cs | 1 - 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/PublicApiGenerator/ApiGeneratorOptions.cs b/src/PublicApiGenerator/ApiGeneratorOptions.cs index 40c8815..ea5c082 100644 --- a/src/PublicApiGenerator/ApiGeneratorOptions.cs +++ b/src/PublicApiGenerator/ApiGeneratorOptions.cs @@ -2,14 +2,46 @@ namespace PublicApiGenerator { + /// + /// Options to influence the ApiGenerator + /// public class ApiGeneratorOptions { + /// + /// Allows to control which types of the generated assembly should be included. If this option is specified all other types found in the assembly that are not present here will be exclude. + /// public Type[]? IncludeTypes { get; set; } + /// + /// Instructs the generator to include assembly level attributes. + /// + /// Defaults to true public bool IncludeAssemblyAttributes { get; set; } = true; + /// + /// Allows to whitelist certain namespace prefixes. For example by default types found in Microsoft or System namespaces are not treated as part of the public API. + /// + /// + /// + /// var options = new DefaultApiGeneratorOptions + /// { + /// WhitelistedNamespacePrefixes = new[] {"Microsoft.Whitelisted" } + /// }; + /// + /// public string[] WhitelistedNamespacePrefixes { get; set; } = DefaultWhitelistedNamespacePrefixes; + /// + /// Allows to exclude attributes by specifying the fullname of the attribute to exclude. + /// + /// + /// + /// var options = new DefaultApiGeneratorOptions + /// { + /// ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } + /// }; + /// + /// public string[]? ExcludeAttributes { get; set; } static readonly string[] DefaultWhitelistedNamespacePrefixes = Array.Empty(); diff --git a/src/PublicApiGeneratorTests/Interface_event_attributes.cs b/src/PublicApiGeneratorTests/Interface_event_attributes.cs index 5797fda..3dfdb4f 100644 --- a/src/PublicApiGeneratorTests/Interface_event_attributes.cs +++ b/src/PublicApiGeneratorTests/Interface_event_attributes.cs @@ -29,7 +29,6 @@ public void Should_skip_excluded_attribute() ExcludeAttributes = new[] { "PublicApiGeneratorTests.Examples.SimpleAttribute" } }; - AssertPublicApi( @"namespace PublicApiGeneratorTests.Examples {