From eb98cbba640687fb2d3015a602ca27313390f795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thyge=20Sk=C3=B8dt=20Steffensen?= <31892312+thygesteffensen@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:59:38 +0100 Subject: [PATCH] feat: ProbePattern or list of assemblies replace configuration and dotnet version to find assemblies --- .../DocumentLogic.cs | 18 ++- .../IDocumentLogic.cs | 4 +- .../DocumentationSourceExtractorCommand.cs | 64 ++++++++-- ...sions.Manifest.ManifestEnricherTool.csproj | 116 +++++++++--------- 4 files changed, 120 insertions(+), 82 deletions(-) diff --git a/src/EAVFW.Extensions.Docs.Extractor/DocumentLogic.cs b/src/EAVFW.Extensions.Docs.Extractor/DocumentLogic.cs index 289e801..452e6b8 100644 --- a/src/EAVFW.Extensions.Docs.Extractor/DocumentLogic.cs +++ b/src/EAVFW.Extensions.Docs.Extractor/DocumentLogic.cs @@ -7,7 +7,6 @@ using System.Text.Json; using EAVFramework.Plugins; using EAVFW.Extensions.Manifest.SDK; -using Microsoft.Extensions.FileSystemGlobbing; using WorkflowEngine.Core; namespace EAVFW.Extensions.Docs.Extractor @@ -15,9 +14,9 @@ namespace EAVFW.Extensions.Docs.Extractor public class DocumentLogic : IDocumentLogic { /// - public IEnumerable ExtractPluginDocumentation(PluginInfo pluginInfo) + public IEnumerable ExtractPluginDocumentation(FileInfo assemblyInfo, string[] assemblies) { - var assembly = LoadAssembly(pluginInfo); + var assembly = LoadAssembly(assemblyInfo, assemblies); var implementingTypes = assembly.GetTypes() .Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract); @@ -40,13 +39,10 @@ from implementingType in implementingTypes return plugins; } - private static Assembly LoadAssembly(PluginInfo pluginInfo) + private static Assembly LoadAssembly(FileInfo assemblyInfo, string [] assemblies) { - var matcher = new Matcher(); - matcher.AddInclude(pluginInfo.Search); - var dictionary = new Dictionary(); - foreach (var file in matcher.GetResultsInFullPath(pluginInfo.RootPath.FullName)) + foreach (var file in assemblies) { var assemblyName = AssemblyName.GetAssemblyName(file); @@ -63,15 +59,15 @@ private static Assembly LoadAssembly(PluginInfo pluginInfo) var currentDomain = AppDomain.CurrentDomain; currentDomain.AssemblyResolve += CustomAssemblyResolver.CustomAssemblyResolverEventHandler; - var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(pluginInfo.AssemblyPath.FullName); + var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyInfo.FullName); return assembly; } /// public Dictionary ExtractWizardDocumentation(FileInfo manifestFile, - PluginInfo pluginInfo) + FileInfo assemblyInfo, string[] assemblies) { - var assembly = LoadAssembly(pluginInfo); + var assembly = LoadAssembly(assemblyInfo, assemblies); // Preloading types to easily query for documentation var workflows = assembly.GetTypes() diff --git a/src/EAVFW.Extensions.Docs.Extractor/IDocumentLogic.cs b/src/EAVFW.Extensions.Docs.Extractor/IDocumentLogic.cs index e74952c..6263a3f 100644 --- a/src/EAVFW.Extensions.Docs.Extractor/IDocumentLogic.cs +++ b/src/EAVFW.Extensions.Docs.Extractor/IDocumentLogic.cs @@ -13,7 +13,7 @@ public interface IDocumentLogic /// Remember to enable GenerateDocumentationFile for the project. /// /// - IEnumerable ExtractPluginDocumentation(PluginInfo pluginInfo); + IEnumerable ExtractPluginDocumentation(FileInfo assemblyInfo, string[] assemblies); /// /// Extract Wizards from the given Manifest and generate documentation based on manifest metadata and workflow @@ -22,6 +22,6 @@ public interface IDocumentLogic /// /// /// - Dictionary ExtractWizardDocumentation(FileInfo manifestFile, PluginInfo pluginInfo); + Dictionary ExtractWizardDocumentation(FileInfo manifestFile, FileInfo assemblyInfo, string[] assemblies); } } diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Documentation/DocumentationSourceExtractorCommand.cs b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Documentation/DocumentationSourceExtractorCommand.cs index 3769c3a..0d80c74 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Documentation/DocumentationSourceExtractorCommand.cs +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/Commands/Documentation/DocumentationSourceExtractorCommand.cs @@ -8,15 +8,16 @@ using System.Text.Json; using System.Threading.Tasks; using EAVFW.Extensions.Docs.Extractor; +using Microsoft.Extensions.FileSystemGlobbing; namespace EAVFW.Extensions.Manifest.ManifestEnricherTool.Commands.Documentation { /* * There are many parameters to the command and generating source for both plugin and wizard requires the tool to be * executed twice. Alternatively, the "configuration" could be done using a configuration, which would provide all - * necessary parameters. Both it would be more rigid and could not easily be changed in a pipeline or other. + * necessary parameters. Both it would be more rigid and could not easily be changed in a pipeline or other. */ - + public class DocumentationSourceExtractorCommand : Command { private readonly IDocumentLogic _documentLogic; @@ -34,7 +35,7 @@ public class DocumentationSourceExtractorCommand : Command [Alias("-p")] [Alias("--probing-pattern")] [Description("Path pattern used to probe for assemblies, supporting glob patterns")] - public DirectoryInfo ProbePathOption { get; set; } + public IEnumerable ProbePathOption { get; set; } [Alias("-o")] [Alias("--output")] @@ -46,13 +47,19 @@ public class DocumentationSourceExtractorCommand : Command [Description("What kind of documentation source should be extracted")] public Targets Target { get; set; } + [Alias("-d")] + [Alias("--debug")] + [Description("Enable debug output")] + public bool Debug { get; set; } = false; + public enum Targets { Plugins, Wizards } - public DocumentationSourceExtractorCommand(IDocumentLogic documentLogic) : base("extract", "Extract documentation source") + public DocumentationSourceExtractorCommand(IDocumentLogic documentLogic) : base("extract", + "Extract documentation source") { _documentLogic = documentLogic ?? throw new ArgumentNullException(nameof(documentLogic)); Handler = COmmandExtensions.Create(this, Array.Empty(), Run); @@ -72,6 +79,37 @@ private async Task Run(ParseResult parseResult, IConsole console) return 1; } + if (ProbePathOption.Count() == 1 && ProbePathOption.First().Contains('*')) + { + DebugMsg("No assemblies in list, probing..."); + + var probePath = new DirectoryInfo(ProbePathOption.First()); + + var matcher = new Matcher(); + var basePath = probePath.Parent; + + if (probePath.FullName.Contains("**")) + { + basePath = new DirectoryInfo(probePath.FullName.Split("**").First()); + matcher.AddInclude(probePath.FullName[basePath.FullName.Length..]); + } + else if (probePath.Name.Contains(".")) + { + matcher.AddInclude(probePath.Name); + } + + ProbePathOption = matcher.GetResultsInFullPath(basePath.FullName).ToList(); + + } + + DebugMsg($"Found {ProbePathOption.Count()} assemblies"); + + if (!ProbePathOption.Any()) + { + Console.WriteLine("Did not find any assemblies"); + return 1; + } + switch (Target) { case Targets.Plugins: @@ -92,15 +130,13 @@ private async Task GenerateWizardSource() } var entityDefinitions = _documentLogic.ExtractWizardDocumentation( - ManifestPathOption, - new PluginInfo(ProbePathOption, - AssemblyPathOption)); + ManifestPathOption, AssemblyPathOption, ProbePathOption.ToArray()); var basePath = new DirectoryInfo(CalculateFullPath("wizards")); - if(!basePath.Exists) + if (!basePath.Exists) basePath.Create(); - + foreach (var (key, value) in entityDefinitions) { var fileName = Path.Combine(basePath.FullName, $"{key}.json"); @@ -119,9 +155,9 @@ private async Task GenerateWizardSource() private async Task GeneratePluginSource() { var plugins = _documentLogic - .ExtractPluginDocumentation(new PluginInfo(ProbePathOption, AssemblyPathOption)) + .ExtractPluginDocumentation(AssemblyPathOption, ProbePathOption.ToArray()) .ToArray(); - + var jsonString = JsonSerializer.Serialize(plugins, new JsonSerializerOptions { WriteIndented = true @@ -155,5 +191,11 @@ private bool IsMissingOptions(out List missing) return false; } + + private void DebugMsg(string msg) + { + if (Debug) + Console.WriteLine(msg); + } } } diff --git a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj index c50eb0f..dfa4622 100644 --- a/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj +++ b/src/EAVFW.Extensions.Manifest.ManifestEnricherTool/EAVFW.Extensions.Manifest.ManifestEnricherTool.csproj @@ -1,62 +1,62 @@  - - Exe - net6.0;net8.0 - true - eavfw-manifest - ./../../artifacts - ManifestEnricherTool - Poul Kjeldager - A tool to enrich and transform manifest.json to manifest.g.json - README.md - https://github.com/EAVFW/EAVFW.Extensions.Manifest.ManifestEnricherTool - - - - - - - - - - - - - - - - - - - - - 3.1.31 - - - - - 6.0.11 - - - - - 7.0.13 - - + + Exe + net6.0;net8.0 + true + eavfw-manifest + ./../../artifacts + ManifestEnricherTool + Poul Kjeldager + A tool to enrich and transform manifest.json to manifest.g.json + README.md + https://github.com/EAVFW/EAVFW.Extensions.Manifest.ManifestEnricherTool - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + 3.1.31 + + + + + 6.0.11 + + + + + 7.0.13 + + + + + + + + + + + + + + + + + +