Skip to content

Commit

Permalink
wip: Add functionality to extract documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
thygesteffensen committed Nov 17, 2023
1 parent 72e4633 commit ad98f5f
Show file tree
Hide file tree
Showing 23 changed files with 487 additions and 100 deletions.
4 changes: 2 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
<PropertyGroup>
<LangVersion>9.0</LangVersion>
<EAVFrameworkVersion>4.0.2</EAVFrameworkVersion>
<UseEAVFromNuget>true</UseEAVFromNuget>
<UseEAVFromNuget>false</UseEAVFromNuget>
<LocalEAVFrameworkPath>$(MSBuildThisFileDirectory)/external/EAVFramework</LocalEAVFrameworkPath>
<LocalExternalpath>$(MSBuildThisFileDirectory)/external</LocalExternalpath>
<ManifestSDKPath>$(MSBuildThisFileDirectory)</ManifestSDKPath>
</PropertyGroup>
</Project>
</Project>
68 changes: 37 additions & 31 deletions src/EAVFW.Extensions.Docs.Extracter/DocumentLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Security.Principal;
using System.Text.Json;
using System.Text.Json.Serialization;
using EAVFramework.Plugins;
using EAVFW.Extensions.Manifest.SDK;
using WorkflowEngine.Core;

namespace EAVFW.Extensions.Docs.Extracter
{
Expand Down Expand Up @@ -80,61 +82,65 @@ where d.FullName.EndsWith($"bin/{pluginInfo.Configuration}/{pluginInfo.Framework
}

/// <inheritdoc/>
public IEnumerable<string> ExtractWizardDocumentation(FileInfo manifestFile, PluginInfo pluginInfo)
public Dictionary<string, EntityDefinition> ExtractWizardDocumentation(FileInfo manifestFile,
PluginInfo pluginInfo)
{
var assembly = LoadAssembly(pluginInfo);

// Preloading types to easily query for documentation
var workflows =
from type in assembly.GetTypes()
// where type.IsAbstract && typeof(Workflow).IsAssignableFrom(type)
select type;
var workflows = assembly.GetTypes()
.Where(type => !type.IsAbstract && !type.IsInterface && typeof(IWorkflow).IsAssignableFrom(type))
.ToDictionary(x => x.Name, x => x);

// Load manifest


using var openStream = manifestFile.OpenRead();
var jsonManifest = JsonDocument.ParseAsync(openStream).Result;

// Find Wizards
var simpleManifest = new Dictionary<string, EntityDefinition>();
ExtractEntitiesWithWizards(jsonManifest.RootElement, simpleManifest);

var tabs =
(from entity in simpleManifest
from wizard in entity.Value.Wizards
from _tabs in wizard.Value.Tabs
select _tabs).AsEnumerable();

// Glorified for loop?
var tabsWithWorkflows =
from entity in simpleManifest
from wizard in entity.Value.Wizards
from tabs in wizard.Value.Tabs
where tabs.Value.OnTransitionOut?.Workflow != null && tabs.Value.OnTransitionIn?.Workflow != null
select tabs.Value;
from tab in tabs
where tab.Value.OnTransitionOut?.Workflow != null || tab.Value.OnTransitionIn?.Workflow != null
select tab;

foreach (var tabsWithWorkflow in tabsWithWorkflows)
foreach (var (key, value) in tabsWithWorkflows)
{
if (!string.IsNullOrWhiteSpace(tabsWithWorkflow?.OnTransitionOut?.Workflow))
if (!string.IsNullOrWhiteSpace(value?.OnTransitionIn?.Workflow) &&
workflows.TryGetValue(value.OnTransitionIn.Workflow, out var type1))
{
var workflow = tabsWithWorkflow.OnTransitionOut.Workflow!;
// look for workflow in types?
Console.WriteLine(workflow);
value.OnTransitionIn.AdditionalData["x-workflowSummary"] = type1.GetDocumentation();
}
}

foreach (var (key, wizard) in simpleManifest)
{
var t = JsonSerializer.Serialize(wizard, new JsonSerializerOptions
if (!string.IsNullOrWhiteSpace(value?.OnTransitionOut?.Workflow) &&
workflows.TryGetValue(value.OnTransitionOut.Workflow, out var type2))
{
WriteIndented = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
});
Console.WriteLine(t);
value.OnTransitionOut.AdditionalData["x-workflowSummary"] = type2.GetDocumentation();
}
}

var actionsWithWorkflows =
from tab in tabs
where tab.Value.Actions != null
from action in tab.Value.Actions
where action.Value.Workflow != null
select action;

foreach (var (key, value) in actionsWithWorkflows)
{
if (workflows.TryGetValue(value.Workflow, out var type))
value.AdditionalFields["x-workflowSummary"] = type.GetDocumentation();
}


// Generate Wizard object


// Return Wizard object
return new List<string>();
return simpleManifest;
}

private void ExtractEntitiesWithWizards(JsonElement element, IDictionary<string, EntityDefinition> entities)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,13 @@
<PackageReference Include="System.ComponentModel.Composition" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
<Reference Include="EAVFW.Extensions.Manifest.SDK">
<HintPath>..\EAVFW.Extensions.Manifest.ManifestEnricherTool\bin\Debug\net8.0\EAVFW.Extensions.Manifest.SDK.dll</HintPath>
</Reference>
<Reference Include="WorkflowEngine.Core">
<HintPath>..\..\..\..\hafnia\LetterofIndemnity\Hafnia.Tests\bin\Release\net6.0\WorkflowEngine.Core.dll</HintPath>
</Reference>
</ItemGroup>

</Project>
3 changes: 2 additions & 1 deletion src/EAVFW.Extensions.Docs.Extracter/IDocumentLogic.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.IO;
using EAVFW.Extensions.Manifest.SDK;

namespace EAVFW.Extensions.Docs.Extracter
{
Expand All @@ -21,6 +22,6 @@ public interface IDocumentLogic
/// <param name="manifestFile"></param>
/// <param name="pluginInfo"></param>
/// <returns></returns>
IEnumerable<string> ExtractWizardDocumentation(FileInfo manifestFile, PluginInfo pluginInfo);
Dictionary<string, EntityDefinition> ExtractWizardDocumentation(FileInfo manifestFile, PluginInfo pluginInfo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class TypeConverter : JsonConverter<Type>

public override void Write(Utf8JsonWriter writer, Type value, JsonSerializerOptions options)
{
JsonValue.Create(value.Name)?.WriteTo(writer, options);
JsonValue.Create(value.Name).WriteTo(writer, options);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,10 @@
<ProjectReference Include="..\EAVFW.Extensions.Docs.Extracter\EAVFW.Extensions.Docs.Extracter.csproj" />
</ItemGroup>

<ItemGroup>
<Reference Include="EAVFW.Extensions.Manifest.SDK">
<HintPath>..\EAVFW.Extensions.Manifest.ManifestEnricherTool\bin\Debug\net8.0\EAVFW.Extensions.Manifest.SDK.dll</HintPath>
</Reference>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public PluginDocumentationToReadMe(
_writer = new StreamWriter(path);
}

public async Task WriteTables(FileInfo manifest)
public async Task WriteTables(FileInfo manifest, string component)
{
var manifestObject = await JsonSerializer.DeserializeAsync<ManifestDefinition>(manifest.OpenRead());

Expand All @@ -44,7 +44,7 @@ public async Task WriteTables(FileInfo manifest)
}
}

public async Task WritePlugins(IEnumerable<PluginDocumentation> pluginDocumentations)
public async Task WritePlugins(IEnumerable<PluginDocumentation> pluginDocumentations, string component)
{
var groups = pluginDocumentations.GroupBy(x => x.Entity!.Name);
await _writer.WriteLineAsync("## Plugins ");
Expand Down Expand Up @@ -74,8 +74,11 @@ await _writer.WriteLineAsync(
}
}
}

// public async Task WriteWizards()

public async Task WriteWizards()
{

}


private string SanitizeSummary(string summary)
Expand Down
60 changes: 18 additions & 42 deletions src/EAVFW.Extensions.Manifest.ManifestEnricherTool/App.cs
Original file line number Diff line number Diff line change
@@ -1,77 +1,53 @@

// See https://aka.ms/new-console-template for more information


// See https://aka.ms/new-console-template for more information
using System;
using EAVFW.Extensions.Manifest.ManifestEnricherTool;
using EAVFW.Extensions.Manifest.SDK;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.NamingConventionBinder;
using System.CommandLine.Parsing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.Json;
using System.Threading.Tasks;

public class App : System.CommandLine.RootCommand
{
public Option<string> Path = new Option<string>("--path", "The path");
public Option<FileInfo> Path = new Option<FileInfo>("--path", "The path");
public Option<string> Prefix = new Option<string>(new string[] { "--customizationprefix" }, "The prefix");

private readonly ILogger<App> logger;
private readonly IManifestEnricher manifestEnricher;
private readonly IManifestMerger _manifestMerger;

public App(ILogger<App> logger, IEnumerable<Command> commands, IManifestEnricher manifestEnricher) : base($"Generating Manifest: v{Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion}")
public App(ILogger<App> logger, IEnumerable<Command> commands, IManifestEnricher manifestEnricher, IManifestMerger manifestMerger) : base(
$"Generating Manifest: v{Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion}")
{
this.logger=logger;
this.logger = logger;
this.manifestEnricher = manifestEnricher;
Path.IsRequired=true;

Add(Path);
_manifestMerger = manifestMerger ?? throw new ArgumentNullException(nameof(manifestMerger));
Path.IsRequired = true;

Add(Path);
Add(Prefix);

foreach (var command in commands)
Add(command);

Handler = CommandHandler.Create<ParseResult,IConsole>(Run);
Handler = CommandHandler.Create<ParseResult, IConsole>(Run);
}

public async Task Run(ParseResult parseResult, IConsole console) //(string path, string customizationprefix)
public async Task Run(ParseResult parseResult, IConsole console)
{
var path = parseResult.GetValueForOption(Path);
var customizationprefix = parseResult.GetValueForOption(Prefix);

console.Out.Write($"Generating Manifest: v{Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion} - {Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyVersionAttribute>()?.Version}");

// var cmd = new EAVFW.Extensions.Manifest.ManifestEnricherTool.RootCommand();




using (var fs = File.OpenRead(path))
{

var jsonraw = Newtonsoft.Json.Linq.JToken.ReadFrom(new Newtonsoft.Json.JsonTextReader(new StreamReader(fs))) as JObject;
var others = Directory.GetFiles(System.IO.Path.GetDirectoryName(path), "manifest.*.json")
.Where(c => !string.Equals("manifest.schema.json", System.IO.Path.GetFileName(c), System.StringComparison.OrdinalIgnoreCase));
foreach (var other in others)
{
jsonraw.Merge(JToken.Parse(File.ReadAllText(other)), new JsonMergeSettings
{
// union array values together to avoid duplicates
MergeArrayHandling = MergeArrayHandling.Union,
PropertyNameComparison = System.StringComparison.OrdinalIgnoreCase,
MergeNullValueHandling = MergeNullValueHandling.Ignore
});
}

JsonDocument json = await manifestEnricher.LoadJsonDocumentAsync(jsonraw, customizationprefix, logger);
}


console.Out.Write(
$"Generating Manifest: v{Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion} - {Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyVersionAttribute>()?.Version}");

var t = await _manifestMerger.MergeManifests(path);
JsonDocument json = await manifestEnricher.LoadJsonDocumentAsync(t, customizationprefix, logger);
}
}
}
Loading

0 comments on commit ad98f5f

Please sign in to comment.