refactor!: fixed missed namespaces

- reformatted code and cleaned up references
This commit is contained in:
D. Moonfire 2023-01-14 18:19:42 -06:00
parent 6a397f5284
commit 9e93eb6ce6
109 changed files with 748 additions and 432 deletions

View file

@ -7,20 +7,20 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj"/>
<ProjectReference Include="..\..\src\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride\MfGames.Nitride.csproj"/>
<ProjectReference Include="..\..\tests\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj" /> <ProjectReference Include="..\..\tests\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CliWrap" Version="3.5.0" /> <PackageReference Include="CliWrap" Version="3.5.0"/>
<PackageReference Include="JunitXml.TestLogger" Version="3.0.114" /> <PackageReference Include="JunitXml.TestLogger" Version="3.0.114"/>
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="MfGames.IO" Version="1.2.7" /> <PackageReference Include="MfGames.IO" Version="1.2.7"/>
<PackageReference Include="coverlet.collector" Version="3.1.2"> <PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View file

@ -1,9 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride; using MfGames.Nitride;
using MfGames.Nitride.IO.Contents; using MfGames.Nitride.IO.Contents;
using MfGames.Nitride.IO.Directories; using MfGames.Nitride.IO.Directories;

View file

@ -4,7 +4,6 @@ using System.Threading.Tasks;
using Autofac; using Autofac;
using MfGames.IO.Extensions; using MfGames.IO.Extensions;
using MfGames.Nitride; using MfGames.Nitride;
using MfGames.Nitride.IO; using MfGames.Nitride.IO;
@ -27,7 +26,8 @@ public static class CopyFilesProgram
// system. At the moment, we set the "root" directory which will // system. At the moment, we set the "root" directory which will
// contains all the paths, both input and output. // contains all the paths, both input and output.
DirectoryInfo rootDir = DirectoryInfo rootDir =
typeof(CopyFilesProgram).GetDirectory()!.FindGitRoot()!.GetDirectory("examples/CopyFiles"); typeof(CopyFilesProgram).GetDirectory()!.FindGitRoot()!
.GetDirectory("examples/CopyFiles");
builder.WithRootDirectory(rootDir); builder.WithRootDirectory(rootDir);

View file

@ -4,7 +4,6 @@ using System.Threading.Tasks;
using CliWrap; using CliWrap;
using MfGames.IO.Extensions; using MfGames.IO.Extensions;
using MfGames.Nitride.Tests; using MfGames.Nitride.Tests;
using Xunit; using Xunit;
@ -27,7 +26,8 @@ public class CopyFilesTest : NitrideTestBase
{ {
// Figure out the paths for this test. // Figure out the paths for this test.
DirectoryInfo rootDir = DirectoryInfo rootDir =
typeof(CopyFilesProgram).GetDirectory()!.FindGitRoot()!.GetDirectory("examples/CopyFiles"); typeof(CopyFilesProgram).GetDirectory()!.FindGitRoot()!
.GetDirectory("examples/CopyFiles");
DirectoryInfo outputDir = rootDir.GetDirectory("output"); DirectoryInfo outputDir = rootDir.GetDirectory("output");
FileInfo projectFile = rootDir.GetFile("CopyFiles.csproj"); FileInfo projectFile = rootDir.GetFile("CopyFiles.csproj");

View file

@ -4,12 +4,11 @@ using System.Linq;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using Ical.Net.CalendarComponents; using Ical.Net.CalendarComponents;
using Ical.Net.DataTypes; using Ical.Net.DataTypes;
using Ical.Net.Serialization; using Ical.Net.Serialization;
using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using MfGames.Nitride.Temporal; using MfGames.Nitride.Temporal;
@ -62,12 +61,14 @@ public partial class CreateCalender : OperationBase
this.validator.ValidateAndThrow(this); this.validator.ValidateAndThrow(this);
SplitEntityEnumerations split = input.SplitEntity<Instant>(); SplitEntityEnumerations split = input.SplitEntity<Instant>();
IEnumerable<Entity> datedAndCalendars = this.CreateCalendarEntity(split.HasAll); IEnumerable<Entity> datedAndCalendars =
this.CreateCalendarEntity(split.HasAll);
return datedAndCalendars.Union(split.NotHasAll); return datedAndCalendars.Union(split.NotHasAll);
} }
private IEnumerable<Entity> CreateCalendarEntity(IEnumerable<Entity> entities) private IEnumerable<Entity> CreateCalendarEntity(
IEnumerable<Entity> entities)
{ {
// Create the calendar in the same time zone as the rest of the system. // Create the calendar in the same time zone as the rest of the system.
var calendar = new Ical.Net.Calendar(); var calendar = new Ical.Net.Calendar();
@ -76,7 +77,8 @@ public partial class CreateCalender : OperationBase
// Go through the events and add all of them. // Go through the events and add all of them.
var input = entities.ToList(); var input = entities.ToList();
IEnumerable<CalendarEvent> events = input.Select(this.CreateCalendarEvent); IEnumerable<CalendarEvent> events =
input.Select(this.CreateCalendarEvent);
calendar.Events.AddRange(events); calendar.Events.AddRange(events);

View file

@ -10,16 +10,16 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj" /> <ProjectReference Include="..\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj"/>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Ical.Net" Version="4.2.0" /> <PackageReference Include="Ical.Net" Version="4.2.0"/>
<PackageReference Include="NodaTime" Version="3.1.2" /> <PackageReference Include="NodaTime" Version="3.1.2"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -8,7 +8,8 @@ public static class NitrideCalendarBuilderExtensions
{ {
public static NitrideBuilder UseCalendar(this NitrideBuilder builder) public static NitrideBuilder UseCalendar(this NitrideBuilder builder)
{ {
return builder.UseTemporal() return builder
.UseTemporal()
.ConfigureContainer(x => x.RegisterModule<NitrideCalendarModule>()); .ConfigureContainer(x => x.RegisterModule<NitrideCalendarModule>());
} }
} }

View file

@ -5,7 +5,6 @@ using System.Linq;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using MfGames.Nitride.Feeds.Structure; using MfGames.Nitride.Feeds.Structure;

View file

@ -10,15 +10,15 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj" /> <ProjectReference Include="..\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj"/>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="NodaTime" Version="3.1.2" /> <PackageReference Include="NodaTime" Version="3.1.2"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -29,7 +29,10 @@ public partial class AtomAuthor
if (!string.IsNullOrEmpty(this.Name)) if (!string.IsNullOrEmpty(this.Name))
{ {
author.Add(new XElement(XmlConstants.AtomNamespace + "name", new XText(this.Name))); author.Add(
new XElement(
XmlConstants.AtomNamespace + "name",
new XText(this.Name)));
} }
return author; return author;

View file

@ -36,7 +36,9 @@ public partial class AtomCategory
throw new NullReferenceException("Category term cannot be null."); throw new NullReferenceException("Category term cannot be null.");
} }
var elem = new XElement(XmlConstants.AtomNamespace + "category", new XAttribute("term", this.Term)); var elem = new XElement(
XmlConstants.AtomNamespace + "category",
new XAttribute("term", this.Term));
if (this.Scheme != null) if (this.Scheme != null)
{ {

View file

@ -24,7 +24,10 @@ public static class AtomHelper
{ {
if (!string.IsNullOrWhiteSpace(text)) if (!string.IsNullOrWhiteSpace(text))
{ {
elem.Add(new XElement(XmlConstants.AtomNamespace + name, new XText(text))); elem.Add(
new XElement(
XmlConstants.AtomNamespace + name,
new XText(text)));
} }
} }
} }

View file

@ -10,10 +10,12 @@ public static class XmlConstants
/// <summary> /// <summary>
/// The XML namespace for Atom feeds. /// The XML namespace for Atom feeds.
/// </summary> /// </summary>
public static readonly XNamespace AtomNamespace = "http://www.w3.org/2005/Atom"; public static readonly XNamespace AtomNamespace =
"http://www.w3.org/2005/Atom";
/// <summary> /// <summary>
/// The XML namespace for media. /// The XML namespace for media.
/// </summary> /// </summary>
public static readonly XNamespace MediaNamespace = "http://search.yahoo.com/mrss/"; public static readonly XNamespace MediaNamespace =
"http://search.yahoo.com/mrss/";
} }

View file

@ -6,6 +6,7 @@ public static class NitrideGemtextBuilderExtensions
{ {
public static NitrideBuilder UseGemtext(this NitrideBuilder builder) public static NitrideBuilder UseGemtext(this NitrideBuilder builder)
{ {
return builder.ConfigureContainer(x => x.RegisterModule<NitrideGemtextModule>()); return builder.ConfigureContainer(
x => x.RegisterModule<NitrideGemtextModule>());
} }
} }

View file

@ -38,7 +38,12 @@ public static class CodeAnalysisExtensions
string format, string format,
params object[] parameters) params object[] parameters)
{ {
context.Message(messageCode, location, DiagnosticSeverity.Error, format, parameters); context.Message(
messageCode,
location,
DiagnosticSeverity.Error,
format,
parameters);
} }
/// <summary> /// <summary>
@ -72,7 +77,12 @@ public static class CodeAnalysisExtensions
string format, string format,
params object[] parameters) params object[] parameters)
{ {
context.Message(messageCode, location, DiagnosticSeverity.Info, format, parameters); context.Message(
messageCode,
location,
DiagnosticSeverity.Info,
format,
parameters);
} }
/// <summary> /// <summary>
@ -106,7 +116,12 @@ public static class CodeAnalysisExtensions
string format, string format,
params object[] parameters) params object[] parameters)
{ {
context.Message(messageCode, location, DiagnosticSeverity.Warning, format, parameters); context.Message(
messageCode,
location,
DiagnosticSeverity.Warning,
format,
parameters);
} }
/// <summary> /// <summary>
@ -134,7 +149,10 @@ public static class CodeAnalysisExtensions
severity, severity,
severity, severity,
true, true,
severity is DiagnosticSeverity.Warning or DiagnosticSeverity.Info ? 4 : 0, severity is DiagnosticSeverity.Warning
or DiagnosticSeverity.Info
? 4
: 0,
location: location)); location: location));
} }
} }

View file

@ -10,10 +10,10 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.3.1" /> <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.3.1"/>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.1" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.1"/>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.3.1" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.3.1"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -22,7 +22,8 @@ public class WithPropertySourceGenerator : ISourceGenerator
// Get the generator infrastructure will create a receiver and // Get the generator infrastructure will create a receiver and
// populate it we can retrieve the populated instance via the // populate it we can retrieve the populated instance via the
// context. // context.
var syntaxReceiver = (WithPropertySyntaxReceiver?)context.SyntaxReceiver; var syntaxReceiver =
(WithPropertySyntaxReceiver?)context.SyntaxReceiver;
if (syntaxReceiver == null) if (syntaxReceiver == null)
{ {
@ -37,7 +38,9 @@ public class WithPropertySourceGenerator : ISourceGenerator
Location.Create( Location.Create(
"Temporary.g.cs", "Temporary.g.cs",
TextSpan.FromBounds(0, 0), TextSpan.FromBounds(0, 0),
new LinePositionSpan(new LinePosition(0, 0), new LinePosition(0, 0))), new LinePositionSpan(
new LinePosition(0, 0),
new LinePosition(0, 0))),
"Generating additional identifier code: {0}", "Generating additional identifier code: {0}",
message); message);
} }
@ -58,7 +61,8 @@ public class WithPropertySourceGenerator : ISourceGenerator
public void Initialize(GeneratorInitializationContext context) public void Initialize(GeneratorInitializationContext context)
{ {
// Register a factory that can create our custom syntax receiver // Register a factory that can create our custom syntax receiver
context.RegisterForSyntaxNotifications(() => new WithPropertySyntaxReceiver(context)); context.RegisterForSyntaxNotifications(
() => new WithPropertySyntaxReceiver(context));
} }
private void GenerateClassFile( private void GenerateClassFile(
@ -96,7 +100,10 @@ public class WithPropertySourceGenerator : ISourceGenerator
foreach (PropertyDeclarationSyntax pds in properties) foreach (PropertyDeclarationSyntax pds in properties)
{ {
// See if we have a setter. // See if we have a setter.
bool found = pds.AccessorList?.Accessors.Any(x => x.Keyword.ToString() == "set") ?? false; bool found =
pds.AccessorList?.Accessors.Any(
x => x.Keyword.ToString() == "set")
?? false;
if (!found) if (!found)
{ {
@ -132,7 +139,8 @@ public class WithPropertySourceGenerator : ISourceGenerator
pds.Type)); pds.Type));
buffer.AppendLine(" {"); buffer.AppendLine(" {");
buffer.AppendLine(string.Format(" this.{0} = value;", pds.Identifier)); buffer.AppendLine(
string.Format(" this.{0} = value;", pds.Identifier));
buffer.AppendLine(" return this;"); buffer.AppendLine(" return this;");
buffer.AppendLine(" }"); buffer.AppendLine(" }");
} }

View file

@ -3,10 +3,9 @@ using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using HandlebarsDotNet; using HandlebarsDotNet;
using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
namespace MfGames.Nitride.Handlebars; namespace MfGames.Nitride.Handlebars;
@ -61,7 +60,8 @@ public partial class ApplyStyleTemplate : OperationBase
{ {
object model = this.CreateModelCallback!(entity); object model = this.CreateModelCallback!(entity);
string name = this.GetTemplateName!(entity); string name = this.GetTemplateName!(entity);
HandlebarsTemplate<object, object> template = this.cache.GetNamedTemplate(name); HandlebarsTemplate<object, object> template =
this.cache.GetNamedTemplate(name);
string result = template(model!); string result = template(model!);
return entity.SetTextContent(result); return entity.SetTextContent(result);

View file

@ -23,12 +23,14 @@ public class ForEachHandlebarsBlock<TModel> : HandlebarsBlockBase
/// <summary> /// <summary>
/// Gets or sets the callback that is called when nothing is found. /// Gets or sets the callback that is called when nothing is found.
/// </summary> /// </summary>
public Action<EncodedTextWriter, BlockHelperOptions, Context, Arguments>? NothingFound { get; set; } public Action<EncodedTextWriter, BlockHelperOptions, Context, Arguments>?
NothingFound { get; set; }
/// <inheritdoc /> /// <inheritdoc />
protected override string HelperName { get; } protected override string HelperName { get; }
public ForEachHandlebarsBlock<TModel> WithGetList(Func<TModel, IEnumerable<object>>? callback) public ForEachHandlebarsBlock<TModel> WithGetList(
Func<TModel, IEnumerable<object>>? callback)
{ {
this.GetList = callback; this.GetList = callback;
@ -36,7 +38,8 @@ public class ForEachHandlebarsBlock<TModel> : HandlebarsBlockBase
} }
public ForEachHandlebarsBlock<TModel> WithNothingFoundText( public ForEachHandlebarsBlock<TModel> WithNothingFoundText(
Action<EncodedTextWriter, BlockHelperOptions, Context, Arguments>? callback) Action<EncodedTextWriter, BlockHelperOptions, Context, Arguments>?
callback)
{ {
this.NothingFound = callback; this.NothingFound = callback;

View file

@ -16,13 +16,15 @@ public class HandlebarsTemplateCache
private readonly ModificationSynchronizer locker; private readonly ModificationSynchronizer locker;
private readonly Dictionary<string, HandlebarsTemplate<object, object>> templates; private readonly Dictionary<string, HandlebarsTemplate<object, object>>
templates;
public HandlebarsTemplateCache(IHandlebars handlebars) public HandlebarsTemplateCache(IHandlebars handlebars)
{ {
this.handlebars = handlebars; this.handlebars = handlebars;
this.locker = new ModificationSynchronizer(); this.locker = new ModificationSynchronizer();
this.templates = new Dictionary<string, HandlebarsTemplate<object, object>>(); this.templates =
new Dictionary<string, HandlebarsTemplate<object, object>>();
} }
/// <summary> /// <summary>
@ -39,7 +41,8 @@ public class HandlebarsTemplateCache
() => !this.templates.ContainsKey(literal), () => !this.templates.ContainsKey(literal),
() => () =>
{ {
HandlebarsTemplate<object, object> template = this.handlebars!.Compile(literal); HandlebarsTemplate<object, object> template =
this.handlebars!.Compile(literal);
this.templates[literal] = template; this.templates[literal] = template;
@ -56,7 +59,8 @@ public class HandlebarsTemplateCache
/// </summary> /// </summary>
/// <param name="templateName"></param> /// <param name="templateName"></param>
/// <returns></returns> /// <returns></returns>
public HandlebarsTemplate<object, object> GetNamedTemplate(string templateName) public HandlebarsTemplate<object, object> GetNamedTemplate(
string templateName)
{ {
string template = $"{{{{> {templateName}}}}}"; string template = $"{{{{> {templateName}}}}}";

View file

@ -17,7 +17,8 @@ public partial class IdentifyHandlebarsFromComponent : IOperation
{ {
private readonly IValidator<IdentifyHandlebarsFromComponent> validator; private readonly IValidator<IdentifyHandlebarsFromComponent> validator;
public IdentifyHandlebarsFromComponent(IValidator<IdentifyHandlebarsFromComponent> validator) public IdentifyHandlebarsFromComponent(
IValidator<IdentifyHandlebarsFromComponent> validator)
{ {
this.validator = validator; this.validator = validator;
} }
@ -30,6 +31,8 @@ public partial class IdentifyHandlebarsFromComponent : IOperation
this.validator.ValidateAndThrow(this); this.validator.ValidateAndThrow(this);
return input.Select( return input.Select(
(entity) => this.HasHandlebarsTest.Invoke(entity) ? entity.Set(HasHandlebarsTemplate.Instance) : entity); (entity) => this.HasHandlebarsTest.Invoke(entity)
? entity.Set(HasHandlebarsTemplate.Instance)
: entity);
} }
} }

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Handlebars; namespace MfGames.Nitride.Handlebars;
public class IdentifyHandlebarsFromComponentValidator : AbstractValidator<IdentifyHandlebarsFromComponent> public class IdentifyHandlebarsFromComponentValidator
: AbstractValidator<IdentifyHandlebarsFromComponent>
{ {
public IdentifyHandlebarsFromComponentValidator() public IdentifyHandlebarsFromComponentValidator()
{ {

View file

@ -1,7 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
namespace MfGames.Nitride.Handlebars; namespace MfGames.Nitride.Handlebars;

View file

@ -10,15 +10,15 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="6.4.0" /> <PackageReference Include="Autofac" Version="6.4.0"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Handlebars.Net" Version="2.1.2" /> <PackageReference Include="Handlebars.Net" Version="2.1.2"/>
<PackageReference Include="NodaTime.Testing" Version="3.1.2" /> <PackageReference Include="NodaTime.Testing" Version="3.1.2"/>
<PackageReference Include="Open.Threading" Version="2.2.1" /> <PackageReference Include="Open.Threading" Version="2.2.1"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -12,7 +12,8 @@ public static class NitrideHandlebarsBuilderExtensions
public static NitrideBuilder UseHandlebars(this NitrideBuilder builder) public static NitrideBuilder UseHandlebars(this NitrideBuilder builder)
{ {
return builder return builder
.ConfigureContainer(x => x.RegisterModule<NitrideHandlebarsModule>()); .ConfigureContainer(
x => x.RegisterModule<NitrideHandlebarsModule>());
} }
public static NitrideBuilder UseHandlebars( public static NitrideBuilder UseHandlebars(

View file

@ -23,8 +23,10 @@ public class NitrideHandlebarsModule : Module
builder.Register( builder.Register(
(context) => (context) =>
{ {
IHandlebars handlebars = HandlebarsDotNet.Handlebars.Create(); IHandlebars handlebars =
IEnumerable<IHandlebarsLoader> helpers = context.Resolve<IEnumerable<IHandlebarsLoader>>(); HandlebarsDotNet.Handlebars.Create();
IEnumerable<IHandlebarsLoader> helpers =
context.Resolve<IEnumerable<IHandlebarsLoader>>();
foreach (IHandlebarsLoader helper in helpers) foreach (IHandlebarsLoader helper in helpers)
{ {

View file

@ -3,10 +3,9 @@ using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using HandlebarsDotNet; using HandlebarsDotNet;
using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
namespace MfGames.Nitride.Handlebars; namespace MfGames.Nitride.Handlebars;
@ -43,7 +42,8 @@ public partial class RenderContentTemplate : OperationBase
{ {
this.validator.ValidateAndThrow(this); this.validator.ValidateAndThrow(this);
return input.SelectEntity<HasHandlebarsTemplate, ITextContent>(this.Apply); return input.SelectEntity<HasHandlebarsTemplate, ITextContent>(
this.Apply);
} }
private Entity Apply( private Entity Apply(
@ -52,7 +52,8 @@ public partial class RenderContentTemplate : OperationBase
ITextContent content) ITextContent content)
{ {
string text = content.GetText(); string text = content.GetText();
HandlebarsTemplate<object, object> template = this.cache.GetLiteralTemplate(text); HandlebarsTemplate<object, object> template =
this.cache.GetLiteralTemplate(text);
object model = this.CreateModelCallback!(entity); object model = this.CreateModelCallback!(entity);
string result = template(model!); string result = template(model!);

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Handlebars; namespace MfGames.Nitride.Handlebars;
public class RenderContentTemplateValidator : AbstractValidator<RenderContentTemplate> public class RenderContentTemplateValidator
: AbstractValidator<RenderContentTemplate>
{ {
public RenderContentTemplateValidator() public RenderContentTemplateValidator()
{ {

View file

@ -2,7 +2,6 @@ using System.Collections.Generic;
using System.Net; using System.Net;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
namespace MfGames.Nitride.Html; namespace MfGames.Nitride.Html;

View file

@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->
@ -25,7 +25,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -6,6 +6,7 @@ public static class NitrideHtmlBuilderExtensions
{ {
public static NitrideBuilder UseHtml(this NitrideBuilder builder) public static NitrideBuilder UseHtml(this NitrideBuilder builder)
{ {
return builder.ConfigureContainer(x => x.RegisterModule<NitrideHtmlModule>()); return builder.ConfigureContainer(
x => x.RegisterModule<NitrideHtmlModule>());
} }
} }

View file

@ -22,7 +22,9 @@ public class FileEntryTextContent : ITextContent, IBinaryContentConvertable
/// <inheritdoc /> /// <inheritdoc />
public TextReader GetReader() public TextReader GetReader()
{ {
return new StreamReader(this.entry.Open(FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.UTF8); return new StreamReader(
this.entry.Open(FileMode.Open, FileAccess.Read, FileShare.Read),
Encoding.UTF8);
} }
/// <inheritdoc /> /// <inheritdoc />

View file

@ -8,7 +8,6 @@ using DotNet.Globbing;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using Zio; using Zio;
@ -59,7 +58,8 @@ public partial class ReadFiles : FileSystemOperationBase
var glob = Glob.Parse(this.Pattern); var glob = Glob.Parse(this.Pattern);
IEnumerable<FileEntry> files = this.FileSystem.EnumerateFileEntries("/", "*", SearchOption.AllDirectories) IEnumerable<FileEntry> files = this.FileSystem
.EnumerateFileEntries("/", "*", SearchOption.AllDirectories)
.Where(x => glob.IsMatch(x.Path.ToString())); .Where(x => glob.IsMatch(x.Path.ToString()));
IEnumerable<Entity> entities = files.Select(this.ToEntity); IEnumerable<Entity> entities = files.Select(this.ToEntity);

View file

@ -7,7 +7,6 @@ using System.Text;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using Serilog; using Serilog;
@ -48,7 +47,8 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
public Dictionary<Type, Func<IContent, Stream>> StreamFactories public Dictionary<Type, Func<IContent, Stream>> StreamFactories
{ {
get => this.factories; get => this.factories;
set => this.factories = value ?? throw new ArgumentNullException(nameof(value)); set => this.factories =
value ?? throw new ArgumentNullException(nameof(value));
} }
/// <summary> /// <summary>
@ -102,7 +102,9 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
.ReadToEnd(); .ReadToEnd();
var stream = new MemoryStream(); var stream = new MemoryStream();
var writer = new StreamWriter(stream, this.TextEncoding ?? Encoding.UTF8); var writer = new StreamWriter(
stream,
this.TextEncoding ?? Encoding.UTF8);
writer.Write(text); writer.Write(text);
writer.Flush(); writer.Flush();
@ -133,7 +135,9 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
// First see if we have a factory for the exact type of content. // First see if we have a factory for the exact type of content.
IContent content = entity.GetContent(); IContent content = entity.GetContent();
if (this.factories.TryGetValue(content.GetType(), out Func<IContent, Stream>? getStream)) if (this.factories.TryGetValue(
content.GetType(),
out Func<IContent, Stream>? getStream))
{ {
Stream stream = getStream(content); Stream stream = getStream(content);
@ -143,7 +147,9 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
// If we have an easy conversion, then use that so we don't have to // If we have an easy conversion, then use that so we don't have to
// walk up the tree looking for one we do have. // walk up the tree looking for one we do have.
if (content is IBinaryContentConvertable binaryConvertable if (content is IBinaryContentConvertable binaryConvertable
&& this.factories.TryGetValue(typeof(IBinaryContent), out Func<IContent, Stream>? binaryContent)) && this.factories.TryGetValue(
typeof(IBinaryContent),
out Func<IContent, Stream>? binaryContent))
{ {
Stream stream = binaryContent(binaryConvertable.ToBinaryContent()); Stream stream = binaryContent(binaryConvertable.ToBinaryContent());
@ -151,7 +157,9 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
} }
if (content is ITextContentConvertable textConvertable if (content is ITextContentConvertable textConvertable
&& this.factories.TryGetValue(typeof(ITextContent), out Func<IContent, Stream>? textContent)) && this.factories.TryGetValue(
typeof(ITextContent),
out Func<IContent, Stream>? textContent))
{ {
Stream stream = textContent(textConvertable.ToTextContent()); Stream stream = textContent(textConvertable.ToTextContent());
@ -167,7 +175,12 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
{ {
// Check to see if we have any of these types. // Check to see if we have any of these types.
Func<IContent, Stream>? found = types Func<IContent, Stream>? found = types
.Select(x => this.factories.TryGetValue(x, out Func<IContent, Stream>? factory) ? factory : null) .Select(
x => this.factories.TryGetValue(
x,
out Func<IContent, Stream>? factory)
? factory
: null)
.FirstOrDefault(x => x != null); .FirstOrDefault(x => x != null);
if (found != null) if (found != null)
@ -179,7 +192,8 @@ public partial class WriteFiles : FileSystemOperationBase, IOperation
// We didn't find one, so add all the parent types and try // We didn't find one, so add all the parent types and try
// again with the new list. // again with the new list.
types = types.SelectMany(x => new[] { x.BaseType }.Union(x.GetInterfaces())) types = types
.SelectMany(x => new[] { x.BaseType }.Union(x.GetInterfaces()))
.Where(x => x != null) .Where(x => x != null)
.Select(x => x!) .Select(x => x!)
.ToList(); .ToList();

View file

@ -71,7 +71,8 @@ public partial class ClearDirectory : FileSystemOperationBase, IOperation
// Clear out the contents. // Clear out the contents.
IEnumerable<UPath> files = this.FileSystem.EnumerateFiles(path); IEnumerable<UPath> files = this.FileSystem.EnumerateFiles(path);
IEnumerable<UPath> directories = this.FileSystem.EnumerateDirectories(path); IEnumerable<UPath> directories =
this.FileSystem.EnumerateDirectories(path);
foreach (UPath file in files) foreach (UPath file in files)
{ {

View file

@ -8,17 +8,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="6.4.0" /> <PackageReference Include="Autofac" Version="6.4.0"/>
<PackageReference Include="DotNet.Glob" Version="3.1.3" /> <PackageReference Include="DotNet.Glob" Version="3.1.3"/>
<PackageReference Include="FluentValidation" Version="11.2.1" /> <PackageReference Include="FluentValidation" Version="11.2.1"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="MAB.DotIgnore" Version="3.0.2" /> <PackageReference Include="MAB.DotIgnore" Version="3.0.2"/>
<PackageReference Include="Serilog" Version="2.11.0" /> <PackageReference Include="Serilog" Version="2.11.0"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -6,6 +6,7 @@ public static class NitrideIOBuilderExtensions
{ {
public static NitrideBuilder UseIO(this NitrideBuilder builder) public static NitrideBuilder UseIO(this NitrideBuilder builder)
{ {
return builder.ConfigureContainer(x => x.RegisterModule<NitrideIOModule>()); return builder.ConfigureContainer(
x => x.RegisterModule<NitrideIOModule>());
} }
} }

View file

@ -1,9 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using MfGames.Gallium;
using MAB.DotIgnore; using MAB.DotIgnore;
using MfGames.Gallium;
using Zio; using Zio;
namespace MfGames.Nitride.IO; namespace MfGames.Nitride.IO;

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.IO.Paths; namespace MfGames.Nitride.IO.Paths;
public class ChangePathExtensionValidator : AbstractValidator<ChangePathExtension> public class ChangePathExtensionValidator
: AbstractValidator<ChangePathExtension>
{ {
public ChangePathExtensionValidator() public ChangePathExtensionValidator()
{ {

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Entities; using MfGames.Nitride.Entities;
using Zio; using Zio;
@ -41,6 +40,8 @@ public partial class DirectChildPathScanner : EntityScanner
// If we are using directory indexes, skip when we have an index root. // If we are using directory indexes, skip when we have an index root.
// Otherwise, get the parent and use that as the key. // Otherwise, get the parent and use that as the key.
return path.GetDirectoryIndexPath() == "/" ? null : new[] { path.GetParentDirectoryIndexPath() }; return path.GetDirectoryIndexPath() == "/"
? null
: new[] { path.GetParentDirectoryIndexPath() };
} }
} }

View file

@ -4,7 +4,6 @@ using System.Linq;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Entities; using MfGames.Nitride.Entities;
using Serilog; using Serilog;

View file

@ -3,10 +3,9 @@ using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using Markdig; using Markdig;
using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
namespace MfGames.Nitride.Markdown; namespace MfGames.Nitride.Markdown;

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Markdown; namespace MfGames.Nitride.Markdown;
public class ConvertMarkdownToBaseValidator : AbstractValidator<ConvertMarkdownToBase> public class ConvertMarkdownToBaseValidator
: AbstractValidator<ConvertMarkdownToBase>
{ {
public ConvertMarkdownToBaseValidator() public ConvertMarkdownToBaseValidator()
{ {

View file

@ -2,12 +2,10 @@ using System;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using Markdig; using Markdig;
using MfGames.Gallium;
using MfGames.Markdown.Gemtext; using MfGames.Markdown.Gemtext;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using MfGames.Nitride.Gemtext; using MfGames.Nitride.Gemtext;
@ -26,7 +24,8 @@ public class ConvertMarkdownToGemtext : ConvertMarkdownToBase
} }
/// <inheritdoc /> /// <inheritdoc />
public override ConvertMarkdownToGemtext WithConfigureMarkdown(Action<MarkdownPipelineBuilder>? value) public override ConvertMarkdownToGemtext WithConfigureMarkdown(
Action<MarkdownPipelineBuilder>? value)
{ {
base.WithConfigureMarkdown(value); base.WithConfigureMarkdown(value);

View file

@ -2,10 +2,9 @@ using System;
using FluentValidation; using FluentValidation;
using MfGames.Gallium;
using Markdig; using Markdig;
using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using MfGames.Nitride.Html; using MfGames.Nitride.Html;
@ -23,7 +22,8 @@ public class ConvertMarkdownToHtml : ConvertMarkdownToBase
} }
/// <inheritdoc /> /// <inheritdoc />
public override ConvertMarkdownToHtml WithConfigureMarkdown(Action<MarkdownPipelineBuilder>? value) public override ConvertMarkdownToHtml WithConfigureMarkdown(
Action<MarkdownPipelineBuilder>? value)
{ {
base.WithConfigureMarkdown(value); base.WithConfigureMarkdown(value);

View file

@ -4,7 +4,6 @@ using System.Collections.Generic;
using FluentValidation; using FluentValidation;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using Zio; using Zio;

View file

@ -18,7 +18,8 @@ public class IdentifyMarkdownFromPath : IdentifyMarkdown
Entity entity, Entity entity,
UPath path) UPath path)
{ {
return (path.GetExtensionWithDot() ?? string.Empty).ToLowerInvariant() switch return (path.GetExtensionWithDot() ?? string.Empty).ToLowerInvariant()
switch
{ {
".md" => true, ".md" => true,
".markdown" => true, ".markdown" => true,

View file

@ -85,9 +85,6 @@ public class MakeSingleLinkListItems : IOperation
match => match =>
{ {
string link1 = match.Groups["label"].ToString(); string link1 = match.Groups["label"].ToString();
string path1 = string.Format(
"/{0}/",
this.slugs.ToSlug(link1.Split('|').First()));
string label1 = link1.Split('|').Last(); string label1 = link1.Split('|').Last();
return label1; return label1;

View file

@ -10,17 +10,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride.Gemtext\MfGames.Nitride.Gemtext.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Gemtext\MfGames.Nitride.Gemtext.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Html\MfGames.Nitride.Html.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Html\MfGames.Nitride.Html.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Slugs\MfGames.Nitride.Slugs.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Slugs\MfGames.Nitride.Slugs.csproj"/>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Markdig" Version="0.30.3" /> <PackageReference Include="Markdig" Version="0.30.3"/>
<PackageReference Include="MfGames.Markdown.Gemtext" Version="1.2.2" /> <PackageReference Include="MfGames.Markdown.Gemtext" Version="1.2.2"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -6,6 +6,7 @@ public static class NitrideMarkdownBuilderExtensions
{ {
public static NitrideBuilder UseMarkdown(this NitrideBuilder builder) public static NitrideBuilder UseMarkdown(this NitrideBuilder builder)
{ {
return builder.ConfigureContainer(x => x.RegisterModule<NitrideMarkdownModule>()); return builder.ConfigureContainer(
x => x.RegisterModule<NitrideMarkdownModule>());
} }
} }

View file

@ -21,7 +21,8 @@ public class SimpleSlugConverter : ISlugConverter, IEnumerable<string>
public SimpleSlugConverter( public SimpleSlugConverter(
IDictionary<string, string> replacements, IDictionary<string, string> replacements,
StringComparison comparison = StringComparison.InvariantCultureIgnoreCase) StringComparison comparison =
StringComparison.InvariantCultureIgnoreCase)
: this() : this()
{ {
foreach (KeyValuePair<string, string> pair in replacements) foreach (KeyValuePair<string, string> pair in replacements)
@ -44,7 +45,8 @@ public class SimpleSlugConverter : ISlugConverter, IEnumerable<string>
public void Add( public void Add(
string search, string search,
string replace, string replace,
StringComparison comparison = StringComparison.InvariantCultureIgnoreCase) StringComparison comparison =
StringComparison.InvariantCultureIgnoreCase)
{ {
this.replacements.Add((search, replace, comparison)); this.replacements.Add((search, replace, comparison));
} }
@ -62,12 +64,15 @@ public class SimpleSlugConverter : ISlugConverter, IEnumerable<string>
// If we have null or whitespace, we have a problem. // If we have null or whitespace, we have a problem.
if (string.IsNullOrWhiteSpace(input)) if (string.IsNullOrWhiteSpace(input))
{ {
throw new ArgumentException("Cannot have a blank or null input", nameof(input)); throw new ArgumentException(
"Cannot have a blank or null input",
nameof(input));
} }
// We need to do the replacements before we slugify. // We need to do the replacements before we slugify.
// Perform any additional replacements. // Perform any additional replacements.
foreach ((string search, string replace, StringComparison comparison) in this.replacements) foreach ((string search, string replace, StringComparison comparison) in
this.replacements)
{ {
input = input.Replace(search, replace, comparison); input = input.Replace(search, replace, comparison);
} }

View file

@ -18,7 +18,8 @@ public class UnicodeNormalizingSlugConverter : SimpleSlugConverter
} }
/// <inheritdoc /> /// <inheritdoc />
public UnicodeNormalizingSlugConverter(IDictionary<string, string> replacements) public UnicodeNormalizingSlugConverter(
IDictionary<string, string> replacements)
: base(replacements) : base(replacements)
{ {
} }
@ -29,7 +30,9 @@ public class UnicodeNormalizingSlugConverter : SimpleSlugConverter
// If we have null or whitespace, we have a problem. // If we have null or whitespace, we have a problem.
if (string.IsNullOrWhiteSpace(input)) if (string.IsNullOrWhiteSpace(input))
{ {
throw new ArgumentException("Cannot have a blank or null input", nameof(input)); throw new ArgumentException(
"Cannot have a blank or null input",
nameof(input));
} }
// Normalize the Unicode objects. // Normalize the Unicode objects.
@ -38,7 +41,8 @@ public class UnicodeNormalizingSlugConverter : SimpleSlugConverter
.Where(this.IsNonSpacingMark) .Where(this.IsNonSpacingMark)
.ToArray(); .ToArray();
string normalized = new string(chars).Normalize(NormalizationForm.FormC); string normalized =
new string(chars).Normalize(NormalizationForm.FormC);
// Return the base implementation. // Return the base implementation.
return base.ToSlug(normalized); return base.ToSlug(normalized);

View file

@ -44,14 +44,16 @@ public class DatePipelineCommandOption : IPipelineCommandOption
{ {
// If we got a date, then use NodaTime's fake clock to set it so // If we got a date, then use NodaTime's fake clock to set it so
// everything will use that. // everything will use that.
var value = (DateTime?)context.ParseResult.GetValueForOption(this.Option); var value =
(DateTime?)context.ParseResult.GetValueForOption(this.Option);
if (value.HasValue && value.Value != DateTime.MinValue) if (value.HasValue && value.Value != DateTime.MinValue)
{ {
// We have a date, so we need to create a fake clock that has this // We have a date, so we need to create a fake clock that has this
// date for the entire run. // date for the entire run.
var local = LocalDateTime.FromDateTime(value.Value); var local = LocalDateTime.FromDateTime(value.Value);
ZonedDateTime zoned = local.InZoneStrictly(this.timekeeper.DateTimeZone); ZonedDateTime zoned =
local.InZoneStrictly(this.timekeeper.DateTimeZone);
var instant = zoned.ToInstant(); var instant = zoned.ToInstant();
this.timekeeper.Clock = new FakeClock(instant); this.timekeeper.Clock = new FakeClock(instant);

View file

@ -32,7 +32,8 @@ public class ExpiresPipelineCommandOption : IPipelineCommandOption
this.Option = new Option<string?>("--expires", () => defaultValue) this.Option = new Option<string?>("--expires", () => defaultValue)
{ {
Description = "Sets the expiration time as time before the current date", Description =
"Sets the expiration time as time before the current date",
ArgumentHelpName = "TIMESPAN", ArgumentHelpName = "TIMESPAN",
}; };
} }
@ -46,7 +47,8 @@ public class ExpiresPipelineCommandOption : IPipelineCommandOption
// If we have a format, then we are going to set one. If the format // If we have a format, then we are going to set one. If the format
// is blank or never, then we are going to treat it as not // is blank or never, then we are going to treat it as not
// expiring anything. // expiring anything.
string? value = (string?)context.ParseResult.GetValueForOption(this.Option); string? value =
(string?)context.ParseResult.GetValueForOption(this.Option);
if (value != null && value.ToLowerInvariant() != "never") if (value != null && value.ToLowerInvariant() != "never")
{ {
@ -65,7 +67,9 @@ public class ExpiresPipelineCommandOption : IPipelineCommandOption
// Figure out when we are going to be expiring. // Figure out when we are going to be expiring.
Instant when = this.clock.Expiration.Value; Instant when = this.clock.Expiration.Value;
ZonedDateTime dateTime = when.InZone(this.clock.DateTimeZone); ZonedDateTime dateTime = when.InZone(this.clock.DateTimeZone);
string formatted = dateTime.ToString("yyyy-MM-dd HH:mm:ss x", CultureInfo.CurrentCulture); string formatted = dateTime.ToString(
"yyyy-MM-dd HH:mm:ss x",
CultureInfo.CurrentCulture);
this.logger.Information("Expiring entries before {When:l}", formatted); this.logger.Information("Expiring entries before {When:l}", formatted);
} }

View file

@ -10,21 +10,6 @@ using NodaTime;
namespace MfGames.Nitride.Temporal; namespace MfGames.Nitride.Temporal;
public class CreateDateIndexesValidator : AbstractValidator<CreateDateIndexes>
{
public CreateDateIndexesValidator()
{
this.RuleFor(a => a.Timekeeper)
.NotNull();
this.RuleFor(a => a.CreateIndex)
.NotNull();
this.RuleFor(a => a.Formats)
.NotNull();
}
}
/// <summary> /// <summary>
/// Constructs indexes for any arbitrary formatting of date time to allow for /// Constructs indexes for any arbitrary formatting of date time to allow for
/// nested structures. This takes a list /// nested structures. This takes a list
@ -116,17 +101,24 @@ public partial class CreateDateIndexes : OperationBase, IResolvingOperation
// The new entities are going to always be added, but if the new + seen is <= the threshold, we'll be // The new entities are going to always be added, but if the new + seen is <= the threshold, we'll be
// including both of them. // including both of them.
List<Entity>? childEntities = (newEntities.Count + seenEntities.Count) <= this.LessThanEqualCollapse List<Entity>? childEntities =
(newEntities.Count + seenEntities.Count)
<= this.LessThanEqualCollapse
? pair.Value ? pair.Value
: newEntities; : newEntities;
// Figure out which child indexes need to be included. If there isn't a list, then return an empty one. // Figure out which child indexes need to be included. If there isn't a list, then return an empty one.
List<Entity>? childIndexes = indexes.TryGetValue(pair.Key, out List<Entity>? list) List<Entity>? childIndexes =
indexes.TryGetValue(pair.Key, out List<Entity>? list)
? list ? list
: new List<Entity>(); : new List<Entity>();
// Create the index then add it to the output list. // Create the index then add it to the output list.
var index = new DateIndex(pair.Key, this.Formats[i], childEntities, childIndexes); var index = new DateIndex(
pair.Key,
this.Formats[i],
childEntities,
childIndexes);
Entity? indexEntity = this.CreateIndex!(index); Entity? indexEntity = this.CreateIndex!(index);
output.Add(indexEntity); output.Add(indexEntity);
@ -140,7 +132,8 @@ public partial class CreateDateIndexes : OperationBase, IResolvingOperation
Entity? first = pair.Value[0]; Entity? first = pair.Value[0];
string? nextKey = this.Timekeeper.ToDateTime(first.Get<Instant>()) string? nextKey = this.Timekeeper
.ToDateTime(first.Get<Instant>())
.ToString(this.Formats[i + 1]); .ToString(this.Formats[i + 1]);
if (!indexes.ContainsKey(nextKey)) if (!indexes.ContainsKey(nextKey))

View file

@ -0,0 +1,18 @@
using FluentValidation;
namespace MfGames.Nitride.Temporal;
public class CreateDateIndexesValidator : AbstractValidator<CreateDateIndexes>
{
public CreateDateIndexesValidator()
{
this.RuleFor(a => a.Timekeeper)
.NotNull();
this.RuleFor(a => a.CreateIndex)
.NotNull();
this.RuleFor(a => a.Formats)
.NotNull();
}
}

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Temporal; namespace MfGames.Nitride.Temporal;
public class FilterOutExpiredInstantValidator : AbstractValidator<FilterOutExpiredInstant> public class FilterOutExpiredInstantValidator
: AbstractValidator<FilterOutExpiredInstant>
{ {
public FilterOutExpiredInstantValidator() public FilterOutExpiredInstantValidator()
{ {

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Temporal; namespace MfGames.Nitride.Temporal;
public class FilterOutFutureInstantValidator : AbstractValidator<FilterOutFutureInstant> public class FilterOutFutureInstantValidator
: AbstractValidator<FilterOutFutureInstant>
{ {
public FilterOutFutureInstantValidator() public FilterOutFutureInstantValidator()
{ {

View file

@ -11,18 +11,18 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="6.4.0" /> <PackageReference Include="Autofac" Version="6.4.0"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0"/>
<PackageReference Include="NodaTime" Version="3.1.2" /> <PackageReference Include="NodaTime" Version="3.1.2"/>
<PackageReference Include="NodaTime.Testing" Version="3.1.2" /> <PackageReference Include="NodaTime.Testing" Version="3.1.2"/>
<PackageReference Include="Serilog" Version="2.11.0" /> <PackageReference Include="Serilog" Version="2.11.0"/>
<PackageReference Include="TimeSpanParserUtil" Version="1.2.0" /> <PackageReference Include="TimeSpanParserUtil" Version="1.2.0"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -7,8 +7,6 @@ using MfGames.Nitride.Temporal.Cli;
using Serilog; using Serilog;
using Expires = MfGames.Nitride.Temporal.Cli.ExpiresPipelineCommandOption;
namespace MfGames.Nitride.Temporal; namespace MfGames.Nitride.Temporal;
public static class NitrideTemporalBuilderExtensions public static class NitrideTemporalBuilderExtensions
@ -40,15 +38,20 @@ public static class NitrideTemporalBuilderExtensions
.As<IPipelineCommandOption>(); .As<IPipelineCommandOption>();
} }
if (config.AddExpireOptionToCommandLine && config.Expiration != null) if (config.AddExpireOptionToCommandLine
&& config.Expiration != null)
{ {
x.Register( x.Register(
context => context =>
{ {
ILogger logger = context.Resolve<ILogger>(); ILogger logger = context.Resolve<ILogger>();
Timekeeper clock = context.Resolve<Timekeeper>(); Timekeeper
clock = context.Resolve<Timekeeper>();
return new Expires(logger, clock, config.Expiration); return new ExpiresPipelineCommandOption(
logger,
clock,
config.Expiration);
}) })
.As<IPipelineCommandOption>(); .As<IPipelineCommandOption>();
} }
@ -65,7 +68,9 @@ public static class NitrideTemporalBuilderExtensions
Timekeeper timekeeper = scope.Resolve<Timekeeper>(); Timekeeper timekeeper = scope.Resolve<Timekeeper>();
timekeeper.DateTimeZone = config.DateTimeZone; timekeeper.DateTimeZone = config.DateTimeZone;
logger.Verbose("Setting time zone to {Zone:l}", timekeeper.DateTimeZone); logger.Verbose(
"Setting time zone to {Zone:l}",
timekeeper.DateTimeZone);
}); });
} }

View file

@ -44,7 +44,8 @@ public partial class NitrideTemporalConfiguration
/// such /// such
/// as "500000:00:00.0". /// as "500000:00:00.0".
/// </summary> /// </summary>
public NitrideTemporalConfiguration WithExpiresCommandLineOption(TimeSpan? timeSpan) public NitrideTemporalConfiguration WithExpiresCommandLineOption(
TimeSpan? timeSpan)
{ {
return this.WithExpiresCommandLineOption(timeSpan?.ToString()); return this.WithExpiresCommandLineOption(timeSpan?.ToString());
} }
@ -54,7 +55,8 @@ public partial class NitrideTemporalConfiguration
/// "XXX" is a format like "5y" or "500000:00:00.0". This is parsed by /// "XXX" is a format like "5y" or "500000:00:00.0". This is parsed by
/// TimeSpanParser which gives an easy format. /// TimeSpanParser which gives an easy format.
/// </summary> /// </summary>
public NitrideTemporalConfiguration WithExpiresCommandLineOption(string? defaultValue) public NitrideTemporalConfiguration WithExpiresCommandLineOption(
string? defaultValue)
{ {
this.AddExpireOptionToCommandLine = defaultValue != null; this.AddExpireOptionToCommandLine = defaultValue != null;
this.Expiration = defaultValue; this.Expiration = defaultValue;

View file

@ -50,7 +50,8 @@ public class SetInstantFromComponent<TComponent> : OperationBase
/// into an Instant automatically. This can handle DateTime, /// into an Instant automatically. This can handle DateTime,
/// DateTimeOffset, LocalDate, and Instant. Nulls are skipped. /// DateTimeOffset, LocalDate, and Instant. Nulls are skipped.
/// </summary> /// </summary>
public SetInstantFromComponent<TComponent> WithGetDateTimeObject(Func<Entity, TComponent, object?>? callback) public SetInstantFromComponent<TComponent> WithGetDateTimeObject(
Func<Entity, TComponent, object?>? callback)
{ {
this.GetDateTimeObject = callback; this.GetDateTimeObject = callback;

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Temporal; namespace MfGames.Nitride.Temporal;
public class SetInstantFromComponentValidator<TComponent> : AbstractValidator<SetInstantFromComponent<TComponent>> public class SetInstantFromComponentValidator
<TComponent> : AbstractValidator<SetInstantFromComponent<TComponent>>
{ {
public SetInstantFromComponentValidator() public SetInstantFromComponentValidator()
{ {

View file

@ -31,7 +31,8 @@ public partial class SetInstantFromPath : OperationBase
{ {
this.validator = validator; this.validator = validator;
this.clock = clock; this.clock = clock;
this.PathRegex = new Regex(@"(?<year>\d{4})[/-](?<month>\d{2})[/-](?<day>\d{2})"); this.PathRegex = new Regex(
@"(?<year>\d{4})[/-](?<month>\d{2})[/-](?<day>\d{2})");
} }
/// <summary> /// <summary>

View file

@ -10,12 +10,12 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj" /> <ProjectReference Include="..\MfGames.Nitride\MfGames.Nitride.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="YamlDotNet" Version="12.0.0" /> <PackageReference Include="YamlDotNet" Version="12.0.0"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -6,6 +6,7 @@ public static class NitrideYamlBuilderExtensions
{ {
public static NitrideBuilder UseYaml(this NitrideBuilder builder) public static NitrideBuilder UseYaml(this NitrideBuilder builder)
{ {
return builder.ConfigureContainer(x => x.RegisterModule<NitrideYamlModule>()); return builder.ConfigureContainer(
x => x.RegisterModule<NitrideYamlModule>());
} }
} }

View file

@ -1,7 +1,6 @@
using System; using System;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using YamlDotNet.Serialization; using YamlDotNet.Serialization;

View file

@ -4,7 +4,6 @@ using System.IO;
using System.Text; using System.Text;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using YamlDotNet.Serialization; using YamlDotNet.Serialization;
@ -31,7 +30,8 @@ public class ParseYamlHeader<TModel> : OperationBase
this.RemoveHeader = true; this.RemoveHeader = true;
} }
public Func<Entity, string, Exception, ParseYamlHeaderErrorHandling>? EntityError { get; set; } public Func<Entity, string, Exception, ParseYamlHeaderErrorHandling>?
EntityError { get; set; }
/// <summary> /// <summary>
/// Gets or sets a value indicating whether the header should be removed /// Gets or sets a value indicating whether the header should be removed
@ -43,7 +43,9 @@ public class ParseYamlHeader<TModel> : OperationBase
public override IEnumerable<Entity> Run(IEnumerable<Entity> input) public override IEnumerable<Entity> Run(IEnumerable<Entity> input)
{ {
// Set up the YAML parsing. // Set up the YAML parsing.
DeserializerBuilder builder = new DeserializerBuilder().WithNamingConvention(this.namingConvention); DeserializerBuilder builder =
new DeserializerBuilder().WithNamingConvention(
this.namingConvention);
if (this.ignoreUnmatchedProperties) if (this.ignoreUnmatchedProperties)
{ {
@ -62,7 +64,8 @@ public class ParseYamlHeader<TModel> : OperationBase
content) => this.Parse(entity, content, deserializer)); content) => this.Parse(entity, content, deserializer));
} }
public ParseYamlHeader<TModel> WithEntityError(Func<Entity, string, Exception, ParseYamlHeaderErrorHandling>? value) public ParseYamlHeader<TModel> WithEntityError(
Func<Entity, string, Exception, ParseYamlHeaderErrorHandling>? value)
{ {
this.EntityError = value; this.EntityError = value;
@ -157,7 +160,8 @@ public class ParseYamlHeader<TModel> : OperationBase
} }
catch (Exception exception) catch (Exception exception)
{ {
ParseYamlHeaderErrorHandling disposition = this.EntityError?.Invoke(entity, yaml, exception) ParseYamlHeaderErrorHandling disposition =
this.EntityError?.Invoke(entity, yaml, exception)
?? ParseYamlHeaderErrorHandling.Throw; ?? ParseYamlHeaderErrorHandling.Throw;
if (disposition == ParseYamlHeaderErrorHandling.Ignore) if (disposition == ParseYamlHeaderErrorHandling.Ignore)

View file

@ -49,7 +49,9 @@ public class BuildCommand : Command, ICommandHandler
public async Task<int> InvokeAsync(InvocationContext context) public async Task<int> InvokeAsync(InvocationContext context)
{ {
// Process any injected options. // Process any injected options.
this.logger.Debug("Processing {Count:N0} pipeline options", this.pipelineOptions.Count); this.logger.Debug(
"Processing {Count:N0} pipeline options",
this.pipelineOptions.Count);
foreach (IPipelineCommandOption? option in this.pipelineOptions) foreach (IPipelineCommandOption? option in this.pipelineOptions)
{ {

View file

@ -28,7 +28,11 @@ public class FileBinaryContent : IBinaryContent, ITextContentConvertable
/// <inheritdoc /> /// <inheritdoc />
public Stream GetStream() public Stream GetStream()
{ {
return File.Open(this.path, FileMode.Open, FileAccess.Read, FileShare.Read); return File.Open(
this.path,
FileMode.Open,
FileAccess.Read,
FileShare.Read);
} }
/// <inheritdoc /> /// <inheritdoc />

View file

@ -29,7 +29,13 @@ public class FileTextContent : ITextContent, IBinaryContentConvertable
/// <inheritdoc /> /// <inheritdoc />
public TextReader GetReader() public TextReader GetReader()
{ {
return new StreamReader(File.Open(this.path, FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.UTF8); return new StreamReader(
File.Open(
this.path,
FileMode.Open,
FileAccess.Read,
FileShare.Read),
Encoding.UTF8);
} }
/// <inheritdoc /> /// <inheritdoc />

View file

@ -41,7 +41,8 @@ public partial class CreateOrUpdateIndex : OperationBase
/// index that has been already created. If this is null, no new indexes /// index that has been already created. If this is null, no new indexes
/// will be made. /// will be made.
/// </summary> /// </summary>
public Func<string, IList<Entity>, Entity>? CreateIndex { get; set; } = null!; public Func<string, IList<Entity>, Entity>? CreateIndex { get; set; } =
null!;
/// <summary> /// <summary>
/// Gets or sets the function to retrieve the key from an existing /// Gets or sets the function to retrieve the key from an existing
@ -58,7 +59,11 @@ public partial class CreateOrUpdateIndex : OperationBase
/// <summary> /// <summary>
/// Updates an existing index entity to include new information. /// Updates an existing index entity to include new information.
/// </summary> /// </summary>
public Func<Entity, string, IEnumerable<Entity>, Entity> UpdateIndex { get; set; } = null!; public Func<Entity, string, IEnumerable<Entity>, Entity> UpdateIndex
{
get;
set;
} = null!;
/// <inheritdoc /> /// <inheritdoc />
public override IEnumerable<Entity> Run(IEnumerable<Entity> input) public override IEnumerable<Entity> Run(IEnumerable<Entity> input)
@ -89,7 +94,9 @@ public partial class CreateOrUpdateIndex : OperationBase
{ {
// This is an existing entity page that needs to be updated. // This is an existing entity page that needs to be updated.
IEnumerable<Entity> entries = IEnumerable<Entity> entries =
scanned.TryGetValue(key, out List<Entity>? list) ? list : Array.Empty<Entity>(); scanned.TryGetValue(key, out List<Entity>? list)
? list
: Array.Empty<Entity>();
existing.Add(key); existing.Add(key);
@ -100,7 +107,8 @@ public partial class CreateOrUpdateIndex : OperationBase
// Once we're done with the list, we need to create the missing indexes. // Once we're done with the list, we need to create the missing indexes.
if (this.CreateIndex != null) if (this.CreateIndex != null)
{ {
foreach (string key in scanned.Keys.Where(key => !existing.Contains(key))) foreach (string key in scanned.Keys.Where(
key => !existing.Contains(key)))
{ {
yield return this.CreateIndex(key, scanned[key]); yield return this.CreateIndex(key, scanned[key]);
} }

View file

@ -2,7 +2,8 @@ using FluentValidation;
namespace MfGames.Nitride.Entities; namespace MfGames.Nitride.Entities;
public class CreateOrUpdateIndexValidator : AbstractValidator<CreateOrUpdateIndex> public class CreateOrUpdateIndexValidator
: AbstractValidator<CreateOrUpdateIndex>
{ {
public CreateOrUpdateIndexValidator() public CreateOrUpdateIndexValidator()
{ {

View file

@ -39,7 +39,8 @@ public partial class EntityScanner : OperationBase
/// Gets or sets a callback function that gets the keys associated with /// Gets or sets a callback function that gets the keys associated with
/// the given entity. /// the given entity.
/// </summary> /// </summary>
public Func<Entity, IEnumerable<string>?> GetKeysFromEntity { get; set; } = null!; public Func<Entity, IEnumerable<string>?> GetKeysFromEntity { get; set; } =
null!;
/// <summary> /// <summary>
/// Gets the list of entities associated with the given key. if the key has not /// Gets the list of entities associated with the given key. if the key has not
@ -106,7 +107,8 @@ public partial class EntityScanner : OperationBase
{ {
// Scan the given entity and see where it needs to be included. // Scan the given entity and see where it needs to be included.
// The entity is added to each of the keys returned by this class. // The entity is added to each of the keys returned by this class.
IEnumerable<string>? keysFromEntity = this.GetKeysFromEntity(entity); IEnumerable<string>? keysFromEntity =
this.GetKeysFromEntity(entity);
if (keysFromEntity != null) if (keysFromEntity != null)
{ {

View file

@ -25,11 +25,13 @@ public class EntitySequence
public bool IsFirst => this.Sequence.Count > 0 && this.Index == 0; public bool IsFirst => this.Sequence.Count > 0 && this.Index == 0;
public bool IsLast => this.Sequence.Count > 0 && this.Index == this.Sequence.Count - 1; public bool IsLast => this.Sequence.Count > 0
&& this.Index == this.Sequence.Count - 1;
public Entity? Next => this.HasNext ? this.Sequence[this.Index + 1] : null; public Entity? Next => this.HasNext ? this.Sequence[this.Index + 1] : null;
public Entity? Previous => this.HasPrevious ? this.Sequence[this.Index - 1] : null; public Entity? Previous =>
this.HasPrevious ? this.Sequence[this.Index - 1] : null;
public IReadOnlyList<Entity> Sequence { get; } public IReadOnlyList<Entity> Sequence { get; }
} }

View file

@ -38,7 +38,11 @@ public partial class LinkEntitySequence : OperationBase, IResolvingOperation
/// <summary> /// <summary>
/// Gets or sets the function used to create the sequence index. /// Gets or sets the function used to create the sequence index.
/// </summary> /// </summary>
public Func<IReadOnlyList<Entity>, int, EntitySequence> CreateSequenceIndex { get; set; } public Func<IReadOnlyList<Entity>, int, EntitySequence> CreateSequenceIndex
{
get;
set;
}
/// <inheritdoc /> /// <inheritdoc />
public override IEnumerable<Entity> Run(IEnumerable<Entity> input) public override IEnumerable<Entity> Run(IEnumerable<Entity> input)
@ -56,7 +60,9 @@ public partial class LinkEntitySequence : OperationBase, IResolvingOperation
for (int i = 0; i < list.Count; i++) for (int i = 0; i < list.Count; i++)
{ {
Entity entity = list[i]; Entity entity = list[i];
EntitySequence index = this.CreateSequenceIndex(list.AsReadOnly(), i); EntitySequence index = this.CreateSequenceIndex(
list.AsReadOnly(),
i);
yield return this.AddSequenceIndex(entity, index); yield return this.AddSequenceIndex(entity, index);
} }

View file

@ -10,12 +10,14 @@ namespace MfGames.Nitride;
/// </summary> /// </summary>
public static class ExpressionHelper public static class ExpressionHelper
{ {
public static string GetMemberName<T>(Expression<Func<T, object?>> expression) public static string GetMemberName<T>(
Expression<Func<T, object?>> expression)
{ {
return GetMemberName(expression.Body); return GetMemberName(expression.Body);
} }
public static IEnumerable<string> GetMemberNames<T>(params Expression<Func<T, object?>>[] expressions) public static IEnumerable<string> GetMemberNames<T>(
params Expression<Func<T, object?>>[] expressions)
{ {
return expressions.Select(x => GetMemberName(x.Body)); return expressions.Select(x => GetMemberName(x.Body));
} }
@ -54,7 +56,8 @@ public static class ExpressionHelper
private static string GetMemberName(UnaryExpression unaryExpression) private static string GetMemberName(UnaryExpression unaryExpression)
{ {
if (unaryExpression.Operand is MethodCallExpression methodCallExpression) if (unaryExpression.Operand is MethodCallExpression
methodCallExpression)
{ {
return methodCallExpression.Method.Name; return methodCallExpression.Method.Name;
} }

View file

@ -15,22 +15,22 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac" Version="6.4.0" /> <PackageReference Include="Autofac" Version="6.4.0"/>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0"/>
<PackageReference Include="FluentValidation" Version="11.2.1" /> <PackageReference Include="FluentValidation" Version="11.2.1"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Humanizer.Core" Version="2.14.1" /> <PackageReference Include="Humanizer.Core" Version="2.14.1"/>
<PackageReference Include="MfGames.ToolBuilder" Version="1.0.0" /> <PackageReference Include="MfGames.ToolBuilder" Version="1.0.0"/>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1"/>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0"/>
<PackageReference Include="Serilog" Version="2.11.0" /> <PackageReference Include="Serilog" Version="2.11.0"/>
<PackageReference Include="Serilog.Extensions.Autofac.DependencyInjection" Version="5.0.0" /> <PackageReference Include="Serilog.Extensions.Autofac.DependencyInjection" Version="5.0.0"/>
<PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1" /> <PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1"/>
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0"/>
<PackageReference Include="SerilogAnalyzer" Version="0.15.0" /> <PackageReference Include="SerilogAnalyzer" Version="0.15.0"/>
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" /> <PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1"/>
<PackageReference Include="System.Linq.Async" Version="6.0.1" /> <PackageReference Include="System.Linq.Async" Version="6.0.1"/>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
</ItemGroup> </ItemGroup>
<!-- Include the source generator --> <!-- Include the source generator -->

View file

@ -32,14 +32,16 @@ public class NitrideBuilder
/// An event that is called after the container is built but before /// An event that is called after the container is built but before
/// the application runs. /// the application runs.
/// </summary> /// </summary>
private readonly List<Action<NitrideBuilder, ILifetimeScope>> configureSiteCallbacks; private readonly List<Action<NitrideBuilder, ILifetimeScope>>
configureSiteCallbacks;
private readonly NitrideModule nitrideModule; private readonly NitrideModule nitrideModule;
public NitrideBuilder(string[] arguments) public NitrideBuilder(string[] arguments)
{ {
this.arguments = arguments; this.arguments = arguments;
this.configureSiteCallbacks = new List<Action<NitrideBuilder, ILifetimeScope>>(); this.configureSiteCallbacks =
new List<Action<NitrideBuilder, ILifetimeScope>>();
this.configureContainerCallbacks = new List<Action<ContainerBuilder>>(); this.configureContainerCallbacks = new List<Action<ContainerBuilder>>();
this.nitrideModule = new NitrideModule(); this.nitrideModule = new NitrideModule();
@ -74,7 +76,8 @@ public class NitrideBuilder
/// </summary> /// </summary>
/// <param name="callback">The callback to register.</param> /// <param name="callback">The callback to register.</param>
/// <returns>The builder for chaining.</returns> /// <returns>The builder for chaining.</returns>
public NitrideBuilder ConfigureSite(Action<NitrideBuilder, ILifetimeScope> callback) public NitrideBuilder ConfigureSite(
Action<NitrideBuilder, ILifetimeScope> callback)
{ {
this.configureSiteCallbacks.Add(callback); this.configureSiteCallbacks.Add(callback);
@ -173,12 +176,14 @@ public class NitrideBuilder
this.RegisterRootDirectory(Log.Logger, builder); this.RegisterRootDirectory(Log.Logger, builder);
// Finish up the registration by running our events. // Finish up the registration by running our events.
foreach (Action<NitrideBuilder, ILifetimeScope>? callback in this.configureSiteCallbacks) foreach (Action<NitrideBuilder, ILifetimeScope>? callback in this
.configureSiteCallbacks)
{ {
builder.RegisterBuildCallback(scope => callback(this, scope)); builder.RegisterBuildCallback(scope => callback(this, scope));
} }
foreach (Action<ContainerBuilder>? configureContainer in this.configureContainerCallbacks) foreach (Action<ContainerBuilder>? configureContainer in this
.configureContainerCallbacks)
{ {
configureContainer.Invoke(builder); configureContainer.Invoke(builder);
} }
@ -195,10 +200,14 @@ public class NitrideBuilder
return; return;
} }
logger.Debug("Setting root directory to {Path}", this.RootDirectory.FullName); logger.Debug(
"Setting root directory to {Path}",
this.RootDirectory.FullName);
var rootFileSystem = new PhysicalFileSystem(); var rootFileSystem = new PhysicalFileSystem();
var subFileSystem = new SubFileSystem(rootFileSystem, this.RootDirectory.FullName); var subFileSystem = new SubFileSystem(
rootFileSystem,
this.RootDirectory.FullName);
builder.RegisterInstance(subFileSystem) builder.RegisterInstance(subFileSystem)
.As<IFileSystem>() .As<IFileSystem>()

View file

@ -59,7 +59,8 @@ public class NitrideModule : Module
; ;
// Add in the commands. // Add in the commands.
IEnumerable<Command> commands = c.Resolve<IEnumerable<Command>>(); IEnumerable<Command> commands =
c.Resolve<IEnumerable<Command>>();
foreach (Command command in commands) foreach (Command command in commands)
{ {

View file

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using MfGames.Gallium; using MfGames.Gallium;

View file

@ -1,5 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using MfGames.Gallium; using MfGames.Gallium;
@ -31,7 +30,8 @@ public abstract class PipelineBase : IPipeline
} }
/// <inheritdoc /> /// <inheritdoc />
public abstract IAsyncEnumerable<Entity> RunAsync(IEnumerable<Entity> entities); public abstract IAsyncEnumerable<Entity> RunAsync(
IEnumerable<Entity> entities);
/// <inheritdoc /> /// <inheritdoc />
public override string ToString() public override string ToString()

View file

@ -40,7 +40,8 @@ public class PipelineManager
public ICollection<IPipeline> Pipelines public ICollection<IPipeline> Pipelines
{ {
get => this.pipelines; get => this.pipelines;
set => this.pipelines = value ?? throw new ArgumentNullException(nameof(value)); set => this.pipelines =
value ?? throw new ArgumentNullException(nameof(value));
} }
/// <summary> /// <summary>
@ -60,9 +61,12 @@ public class PipelineManager
// Go through all the entries and start each one. We gather the // Go through all the entries and start each one. We gather the
// resulting tasks and then wait for all of them to end. // resulting tasks and then wait for all of them to end.
this.logger.Verbose("Starting {Count:l}", "pipeline".ToQuantity(this.pipelines.Count)); this.logger.Verbose(
"Starting {Count:l}",
"pipeline".ToQuantity(this.pipelines.Count));
Task[] tasks = this.entries.Select(x => Task.Run(async () => await x.RunAsync())) Task[] tasks = this.entries
.Select(x => Task.Run(async () => await x.RunAsync()))
.ToArray(); .ToArray();
var report = TimeSpan.FromSeconds(15); var report = TimeSpan.FromSeconds(15);
@ -72,13 +76,17 @@ public class PipelineManager
var waiting = this.entries.Where(x => !x.IsFinished) var waiting = this.entries.Where(x => !x.IsFinished)
.ToList(); .ToList();
this.logger.Debug("Waiting for {Count:l} to finish running", "pipeline".ToQuantity(waiting.Count)); this.logger.Debug(
"Waiting for {Count:l} to finish running",
"pipeline".ToQuantity(waiting.Count));
IOrderedEnumerable<IGrouping<PipelineRunnerState, PipelineRunner>> states = IOrderedEnumerable<IGrouping<PipelineRunnerState, PipelineRunner>>
states =
waiting.GroupBy(x => x.State, x => x) waiting.GroupBy(x => x.State, x => x)
.OrderBy(x => (int)x.Key); .OrderBy(x => (int)x.Key);
foreach (IGrouping<PipelineRunnerState, PipelineRunner>? state in states) foreach (IGrouping<PipelineRunnerState, PipelineRunner>? state in
states)
{ {
var statePipelines = state.OrderBy(x => x.Pipeline.ToString()) var statePipelines = state.OrderBy(x => x.Pipeline.ToString())
.ToList(); .ToList();
@ -90,15 +98,20 @@ public class PipelineManager
string.Join( string.Join(
", ", ", ",
state.Key == PipelineRunnerState.Started state.Key == PipelineRunnerState.Started
? statePipelines.Select(x => $"{x.Pipeline} ({x.ElapsedFromState})") ? statePipelines.Select(
: statePipelines.Select(x => x.Pipeline.ToString()))); x => $"{x.Pipeline} ({x.ElapsedFromState})")
: statePipelines.Select(
x => x.Pipeline.ToString())));
} }
} }
// Figure out our return code. // Figure out our return code.
bool hasErrors = this.entries.Any(x => x.State == PipelineRunnerState.Errored); bool hasErrors =
this.entries.Any(x => x.State == PipelineRunnerState.Errored);
this.logger.Information("Completed in {Elapsed}", DateTime.UtcNow - started); this.logger.Information(
"Completed in {Elapsed}",
DateTime.UtcNow - started);
return Task.FromResult(hasErrors ? 2 : 0); return Task.FromResult(hasErrors ? 2 : 0);
} }
@ -119,12 +132,15 @@ public class PipelineManager
if (this.pipelines.Count == 0) if (this.pipelines.Count == 0)
{ {
this.logger.Error( this.logger.Error(
"There are no registered pipelines run, use" + " ConfigureContainer to include IPipeline instances"); "There are no registered pipelines run, use"
+ " ConfigureContainer to include IPipeline instances");
return false; return false;
} }
this.logger.Verbose("Setting up {Count:l}", "pipeline".ToQuantity(this.pipelines.Count)); this.logger.Verbose(
"Setting up {Count:l}",
"pipeline".ToQuantity(this.pipelines.Count));
// Wrap all the pipelines into entries. We do this before the next // Wrap all the pipelines into entries. We do this before the next
// step so we can have the entries depend on the entries. // step so we can have the entries depend on the entries.
@ -140,7 +156,8 @@ public class PipelineManager
foreach (IPipeline? dependency in dependencies) foreach (IPipeline? dependency in dependencies)
{ {
// Get the entry for the dependency. // Get the entry for the dependency.
PipelineRunner dependencyPipeline = this.entries.Single(x => x.Pipeline == dependency); PipelineRunner dependencyPipeline =
this.entries.Single(x => x.Pipeline == dependency);
// Set up the bi-directional connection. // Set up the bi-directional connection.
entry.Incoming.Add(dependencyPipeline); entry.Incoming.Add(dependencyPipeline);

View file

@ -4,10 +4,10 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MfGames.Gallium;
using Humanizer; using Humanizer;
using MfGames.Gallium;
using Serilog; using Serilog;
namespace MfGames.Nitride.Pipelines; namespace MfGames.Nitride.Pipelines;
@ -50,7 +50,8 @@ public class PipelineRunner
ILogger logger, ILogger logger,
IPipeline pipeline) IPipeline pipeline)
{ {
this.Pipeline = pipeline ?? throw new ArgumentNullException(nameof(pipeline)); this.Pipeline =
pipeline ?? throw new ArgumentNullException(nameof(pipeline));
this.Incoming = new List<PipelineRunner>(); this.Incoming = new List<PipelineRunner>();
this.Outgoing = new List<PipelineRunner>(); this.Outgoing = new List<PipelineRunner>();
this.Outputs = new List<Entity>(); this.Outputs = new List<Entity>();
@ -84,7 +85,8 @@ public class PipelineRunner
/// <summary> /// <summary>
/// Gets a value indicating whether this pipeline is done running. /// Gets a value indicating whether this pipeline is done running.
/// </summary> /// </summary>
public bool IsFinished => this.State is PipelineRunnerState.Finalized or PipelineRunnerState.Errored; public bool IsFinished => this.State is PipelineRunnerState.Finalized
or PipelineRunnerState.Errored;
/// <summary> /// <summary>
/// Gets a value indicating whether this entry is a starting one /// Gets a value indicating whether this entry is a starting one
@ -123,7 +125,10 @@ public class PipelineRunner
{ {
int current = Interlocked.Decrement(ref this.waitingOnConsumers); int current = Interlocked.Decrement(ref this.waitingOnConsumers);
this.logger.Verbose("{Pipeline:l}: Consumer signalled, waiting for {Count:n0}", this.Pipeline, current); this.logger.Verbose(
"{Pipeline:l}: Consumer signalled, waiting for {Count:n0}",
this.Pipeline,
current);
if (current == 0) if (current == 0)
{ {
@ -205,7 +210,10 @@ public class PipelineRunner
catch (Exception exception) catch (Exception exception)
{ {
// Report the exception. // Report the exception.
this.logger.Error(exception, "{Pipeline:l}: There was an exception running pipeline", this.Pipeline); this.logger.Error(
exception,
"{Pipeline:l}: There was an exception running pipeline",
this.Pipeline);
// Change our state and then release any pipeline waiting for us // Change our state and then release any pipeline waiting for us
// so they can pick up the error and fail themselves. // so they can pick up the error and fail themselves.
@ -287,7 +295,9 @@ public class PipelineRunner
} }
// Make sure our internal wait for the consumers it set. // Make sure our internal wait for the consumers it set.
this.logger.Verbose("{Pipeline:l}: Setting up internal thread controls", this.Pipeline); this.logger.Verbose(
"{Pipeline:l}: Setting up internal thread controls",
this.Pipeline);
this.waitingOnConsumers = this.Outgoing.Count; this.waitingOnConsumers = this.Outgoing.Count;
this.consumersDone.Reset(); this.consumersDone.Reset();
@ -300,7 +310,9 @@ public class PipelineRunner
// Release our manual reset to allow operations to continue. // Release our manual reset to allow operations to continue.
this.ChangeState(PipelineRunnerState.Providing); this.ChangeState(PipelineRunnerState.Providing);
this.logger.Verbose("{Pipeline:l}: Release manual reset for consumers", this.Pipeline); this.logger.Verbose(
"{Pipeline:l}: Release manual reset for consumers",
this.Pipeline);
this.blockDependencies.Set(); this.blockDependencies.Set();
// Wait until all consumers have finished processing. // Wait until all consumers have finished processing.
@ -316,7 +328,10 @@ public class PipelineRunner
this.signaledDoneWithInputs = true; this.signaledDoneWithInputs = true;
this.logger.Debug("{Pipeline:l}: Signaling {Count:n0} dependencies done", this.Pipeline, this.Incoming.Count); this.logger.Debug(
"{Pipeline:l}: Signaling {Count:n0} dependencies done",
this.Pipeline,
this.Incoming.Count);
foreach (PipelineRunner? dependency in this.Incoming) foreach (PipelineRunner? dependency in this.Incoming)
{ {
@ -346,14 +361,17 @@ public class PipelineRunner
// Check for any error state in the dependency, if we have one, // Check for any error state in the dependency, if we have one,
// then we need to stop ourselves. // then we need to stop ourselves.
bool hasError = this.Incoming.Any(x => x.State == PipelineRunnerState.Errored); bool hasError =
this.Incoming.Any(x => x.State == PipelineRunnerState.Errored);
if (!hasError) if (!hasError)
{ {
return false; return false;
} }
this.logger.Error("{Pipeline:l}: There was an exception in an dependency", this.Pipeline); this.logger.Error(
"{Pipeline:l}: There was an exception in an dependency",
this.Pipeline);
this.ChangeState(PipelineRunnerState.Errored); this.ChangeState(PipelineRunnerState.Errored);
this.blockDependencies.Set(); this.blockDependencies.Set();

View file

@ -16,7 +16,7 @@ A pipeline implements the `IPipeline` interface or extends the convenience
class `Pipeline`. class `Pipeline`.
```c# ```c#
using Nitride.Pipelines; using MfGames.Nitride.Pipelines;
public class LoadFilesPipeline : Pipeline {} public class LoadFilesPipeline : Pipeline {}
``` ```

View file

@ -6,22 +6,22 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CompareNETObjects" Version="4.78.0" /> <PackageReference Include="CompareNETObjects" Version="4.78.0"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1"/>
<PackageReference Include="JunitXml.TestLogger" Version="3.0.114" /> <PackageReference Include="JunitXml.TestLogger" Version="3.0.114"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
<PackageReference Include="coverlet.collector" Version="3.1.2"> <PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View file

@ -8,7 +8,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class AddPathPrefixTest : NitrideIOTestBase public class AddPathPrefixTest : NitrideIOTestBase
{ {
@ -36,9 +36,10 @@ public class AddPathPrefixTest : NitrideIOTestBase
.WithPathPrefix("/prefix"); .WithPathPrefix("/prefix");
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(op) .Run(),
op)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())

View file

@ -10,7 +10,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class DirectChildPathScannerTests : NitrideIOTestBase public class DirectChildPathScannerTests : NitrideIOTestBase
{ {
@ -45,9 +45,10 @@ public class DirectChildPathScannerTests : NitrideIOTestBase
DirectChildPathScanner op = context.Resolve<DirectChildPathScanner>(); DirectChildPathScanner op = context.Resolve<DirectChildPathScanner>();
// Read and replace the paths. // Read and replace the paths.
var _ = readFiles.WithPattern("/**") var _ = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(op) .Run(),
op)
.ToList(); .ToList();
KeyValuePair<string, string[]>[] actual = op.GetScannedResults() KeyValuePair<string, string[]>[] actual = op.GetScannedResults()
@ -64,9 +65,15 @@ public class DirectChildPathScannerTests : NitrideIOTestBase
// Verify the results. // Verify the results.
KeyValuePair<string, string[]>[] expected = new[] KeyValuePair<string, string[]>[] expected = new[]
{ {
new KeyValuePair<string, string[]>("/", new[] { "/a/index.md", "/b/index.md" }), new KeyValuePair<string, string[]>(
new KeyValuePair<string, string[]>("/a/", new[] { "/a/c/index.md", "/a/d/index.md" }), "/",
new KeyValuePair<string, string[]>("/a/d/", new[] { "/a/d/e/index.md" }), new[] { "/a/index.md", "/b/index.md" }),
new KeyValuePair<string, string[]>(
"/a/",
new[] { "/a/c/index.md", "/a/d/index.md" }),
new KeyValuePair<string, string[]>(
"/a/d/",
new[] { "/a/d/e/index.md" }),
}; };
TestHelper.CompareObjects(expected, actual); TestHelper.CompareObjects(expected, actual);

View file

@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Linq; using System.Linq;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.IO.Contents; using MfGames.Nitride.IO.Contents;
using Xunit; using Xunit;
@ -9,7 +9,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class GetEntityByPathTests : NitrideIOTestBase public class GetEntityByPathTests : NitrideIOTestBase
{ {
@ -34,9 +34,12 @@ public class GetEntityByPathTests : NitrideIOTestBase
ReadFiles readFiles = context.Resolve<ReadFiles>(); ReadFiles readFiles = context.Resolve<ReadFiles>();
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideIOEnumerableEntityExtensions
.Run() .GetEntityByPath(
.GetEntityByPath("/c1.md", out Entity? found) readFiles.WithPattern("/**")
.Run(),
"/c1.md",
out Entity? found)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())
@ -70,9 +73,13 @@ public class GetEntityByPathTests : NitrideIOTestBase
ReadFiles readFiles = context.Resolve<ReadFiles>(); ReadFiles readFiles = context.Resolve<ReadFiles>();
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideIOEnumerableEntityExtensions
.Run() .GetEntityByPath(
.GetEntityByPath("/c1.md", out Entity? found, IfFoundOutput.ReturnInOutput) (IEnumerable<Entity>)readFiles.WithPattern("/**")
.Run(),
(UPath)"/c1.md",
out Entity? found,
(IfFoundOutput)IfFoundOutput.ReturnInOutput)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())
@ -107,9 +114,12 @@ public class GetEntityByPathTests : NitrideIOTestBase
ReadFiles readFiles = context.Resolve<ReadFiles>(); ReadFiles readFiles = context.Resolve<ReadFiles>();
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideIOEnumerableEntityExtensions
.Run() .GetEntityByPath(
.GetEntityByPath("/not-found.md", out Entity? found) readFiles.WithPattern("/**")
.Run(),
"/not-found.md",
out Entity? found)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())

View file

@ -11,7 +11,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class LinkDirectChildrenTests : NitrideIOTestBase public class LinkDirectChildrenTests : NitrideIOTestBase
{ {
@ -43,15 +43,17 @@ public class LinkDirectChildrenTests : NitrideIOTestBase
// Set up the operation. // Set up the operation.
ReadFiles readFiles = context.Resolve<ReadFiles>(); ReadFiles readFiles = context.Resolve<ReadFiles>();
DirectChildPathScanner scanner = context.Resolve<DirectChildPathScanner>(); DirectChildPathScanner scanner =
context.Resolve<DirectChildPathScanner>();
CreateOrUpdateIndex op = context.Resolve<LinkDirectChildren>() CreateOrUpdateIndex op = context.Resolve<LinkDirectChildren>()
.WithScanner(scanner); .WithScanner(scanner);
// Read and replace the paths. // Read and replace the paths.
Tuple<string, string[]?>[]? actual = readFiles.WithPattern("/**") Tuple<string, string[]?>[]? actual = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(scanner) .Run(),
scanner)
.ToList() .ToList()
.Run(op) .Run(op)
.Select( .Select(
@ -72,10 +74,16 @@ public class LinkDirectChildrenTests : NitrideIOTestBase
{ {
new Tuple<string, string[]?>("/a/c/index.md", new string[] { }), new Tuple<string, string[]?>("/a/c/index.md", new string[] { }),
new Tuple<string, string[]?>("/a/d/e/index.md", new string[] { }), new Tuple<string, string[]?>("/a/d/e/index.md", new string[] { }),
new Tuple<string, string[]?>("/a/d/index.md", new[] { "/a/d/e/index.md" }), new Tuple<string, string[]?>(
new Tuple<string, string[]?>("/a/index.md", new[] { "/a/c/index.md", "/a/d/index.md" }), "/a/d/index.md",
new[] { "/a/d/e/index.md" }),
new Tuple<string, string[]?>(
"/a/index.md",
new[] { "/a/c/index.md", "/a/d/index.md" }),
new Tuple<string, string[]?>("/b/index.md", new string[] { }), new Tuple<string, string[]?>("/b/index.md", new string[] { }),
new Tuple<string, string[]?>("/index.md", new[] { "/a/index.md", "/b/index.md" }), new Tuple<string, string[]?>(
"/index.md",
new[] { "/a/index.md", "/b/index.md" }),
}; };
TestHelper.CompareObjects(expected, actual); TestHelper.CompareObjects(expected, actual);

View file

@ -8,7 +8,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class MoveToIndexPathsTest : NitrideIOTestBase public class MoveToIndexPathsTest : NitrideIOTestBase
{ {
@ -30,9 +30,10 @@ public class MoveToIndexPathsTest : NitrideIOTestBase
MoveToIndexPath op = context.Resolve<MoveToIndexPath>(); MoveToIndexPath op = context.Resolve<MoveToIndexPath>();
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(op) .Run(),
op)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())
@ -67,9 +68,10 @@ public class MoveToIndexPathsTest : NitrideIOTestBase
.Contains("a1")); .Contains("a1"));
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(op) .Run(),
op)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())

View file

@ -8,7 +8,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class RemovePathPrefixTest : NitrideIOTestBase public class RemovePathPrefixTest : NitrideIOTestBase
{ {
@ -38,9 +38,10 @@ public class RemovePathPrefixTest : NitrideIOTestBase
.WithPathPrefix("/a"); .WithPathPrefix("/a");
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideOperationExtensions.Run(
.Run() readFiles.WithPattern("/**")
.Run(op) .Run(),
op)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())

View file

@ -1,7 +1,9 @@
using System.Collections.Generic;
using System.Linq; using System.Linq;
using MAB.DotIgnore; using MAB.DotIgnore;
using MfGames.Gallium;
using MfGames.Nitride.IO.Contents; using MfGames.Nitride.IO.Contents;
using Xunit; using Xunit;
@ -9,7 +11,7 @@ using Xunit.Abstractions;
using Zio; using Zio;
namespace MfGames.Nitride.IO.Tests; namespace MfGames.Nitride.IO.Tests.Paths;
public class WhereNotIgnoredTests : NitrideIOTestBase public class WhereNotIgnoredTests : NitrideIOTestBase
{ {
@ -39,9 +41,11 @@ public class WhereNotIgnoredTests : NitrideIOTestBase
ReadFiles readFiles = context.Resolve<ReadFiles>(); ReadFiles readFiles = context.Resolve<ReadFiles>();
// Read and replace the paths. // Read and replace the paths.
IOrderedEnumerable<string> output = readFiles.WithPattern("/**") IOrderedEnumerable<string> output = NitrideIOEnumerableEntityExtensions
.Run() .WhereNotIgnored(
.WhereNotIgnored(ignore) (IEnumerable<Entity>)readFiles.WithPattern("/**")
.Run(),
ignore)
.Select( .Select(
x => x.Get<UPath>() x => x.Get<UPath>()
.ToString()) .ToString())

View file

@ -51,7 +51,9 @@ public class WriteFilesTest : NitrideIOTestBase
.Run() .Run()
.Select( .Select(
x => x.Get<UPath>() == "/b1/b.md" x => x.Get<UPath>() == "/b1/b.md"
? x.SetTextContent(((ITextContentConvertable)x.GetBinaryContent()).ToTextContent()) ? x.SetTextContent(
((ITextContentConvertable)x.GetBinaryContent())
.ToTextContent())
: x) : x)
.Run(op); .Run(op);

View file

@ -3,14 +3,12 @@ using System.Linq;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Contents; using MfGames.Nitride.Contents;
using MfGames.Nitride.Markdown;
using MfGames.Nitride.Tests;
using MfGames.TestSetup; using MfGames.TestSetup;
using Xunit; using Xunit;
using Xunit.Abstractions; using Xunit.Abstractions;
namespace MfGames.Nitride.Slugs.Tests; namespace MfGames.Nitride.Markdown.Tests;
/// <summary> /// <summary>
/// Tests the functionality of the WriteFiles(). /// Tests the functionality of the WriteFiles().

View file

@ -1,9 +1,9 @@
using Autofac; using Autofac;
using MfGames.Nitride.Markdown; using MfGames.Nitride.Slugs;
using MfGames.Nitride.Tests; using MfGames.Nitride.Tests;
namespace MfGames.Nitride.Slugs.Tests; namespace MfGames.Nitride.Markdown.Tests;
public class MarkdownTestContext : NitrideTestContext public class MarkdownTestContext : NitrideTestContext
{ {

View file

@ -6,18 +6,18 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\MfGames.Nitride.Markdown\MfGames.Nitride.Markdown.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.Markdown\MfGames.Nitride.Markdown.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Markdig" Version="0.30.4" /> <PackageReference Include="Markdig" Version="0.30.4"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="MfGames.Markdown.Gemtext" Version="1.2.2" /> <PackageReference Include="MfGames.Markdown.Gemtext" Version="1.2.2"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1"/>
<PackageReference Include="JunitXml.TestLogger" Version="3.0.114" /> <PackageReference Include="JunitXml.TestLogger" Version="3.0.114"/>
<PackageReference Include="Slugify.Core" Version="3.0.0" /> <PackageReference Include="Slugify.Core" Version="3.0.0"/>
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View file

@ -6,21 +6,21 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.IO\MfGames.Nitride.IO.csproj"/>
<ProjectReference Include="..\..\src\MfGames.Nitride.Slugs\MfGames.Nitride.Slugs.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.Slugs\MfGames.Nitride.Slugs.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1"/>
<PackageReference Include="JunitXml.TestLogger" Version="3.0.114" /> <PackageReference Include="JunitXml.TestLogger" Version="3.0.114"/>
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Zio" Version="0.15.0" /> <PackageReference Include="Zio" Version="0.15.0"/>
<PackageReference Include="coverlet.collector" Version="3.1.2"> <PackageReference Include="coverlet.collector" Version="3.1.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using MfGames.Gallium; using MfGames.Gallium;
using MfGames.Nitride.Tests; using MfGames.Nitride.Tests;
using Xunit; using Xunit;
@ -38,13 +37,23 @@ public class CreateDateIndexesTests : TemporalTestBase
.Add(timekeeper.CreateInstant(2022, 1, 2)), .Add(timekeeper.CreateInstant(2022, 1, 2)),
}; };
List<Tuple<string, List<string>?, List<string>?>> actual = this.GetActual(op, input); List<Tuple<string, List<string>?, List<string>?>> actual =
this.GetActual(op, input);
var expected = new List<Tuple<string, List<string>?, List<string>?>> var expected = new List<Tuple<string, List<string>?, List<string>?>>
{ {
new("index-2021-01", new List<string> { "page1" }, new List<string>()), new(
new("index-2021-02", new List<string> { "page2" }, new List<string>()), "index-2021-01",
new("index-2022-01", new List<string> { "page3" }, new List<string>()), new List<string> { "page1" },
new List<string>()),
new(
"index-2021-02",
new List<string> { "page2" },
new List<string>()),
new(
"index-2022-01",
new List<string> { "page3" },
new List<string>()),
new("page1", null, null), new("page1", null, null),
new("page2", null, null), new("page2", null, null),
new("page3", null, null), new("page3", null, null),
@ -73,18 +82,43 @@ public class CreateDateIndexesTests : TemporalTestBase
.Add(timekeeper.CreateInstant(2022, 1, 2)), .Add(timekeeper.CreateInstant(2022, 1, 2)),
}; };
List<Tuple<string, List<string>?, List<string>?>> actual = this.GetActual(op, input); List<Tuple<string, List<string>?, List<string>?>> actual =
this.GetActual(op, input);
var expected = new List<Tuple<string, List<string>?, List<string>?>> var expected = new List<Tuple<string, List<string>?, List<string>?>>
{ {
new("index-2021", new List<string>(), new List<string> { "index-2021/01", "index-2021/02" }), new(
new("index-2021/01", new List<string>(), new List<string> { "index-2021/01/02" }), "index-2021",
new("index-2021/01/02", new List<string> { "page1" }, new List<string>()), new List<string>(),
new("index-2021/02", new List<string>(), new List<string> { "index-2021/02/02" }), new List<string> { "index-2021/01", "index-2021/02" }),
new("index-2021/02/02", new List<string> { "page2" }, new List<string>()), new(
new("index-2022", new List<string>(), new List<string> { "index-2022/01" }), "index-2021/01",
new("index-2022/01", new List<string>(), new List<string> { "index-2022/01/02" }), new List<string>(),
new("index-2022/01/02", new List<string> { "page3" }, new List<string>()), new List<string> { "index-2021/01/02" }),
new(
"index-2021/01/02",
new List<string> { "page1" },
new List<string>()),
new(
"index-2021/02",
new List<string>(),
new List<string> { "index-2021/02/02" }),
new(
"index-2021/02/02",
new List<string> { "page2" },
new List<string>()),
new(
"index-2022",
new List<string>(),
new List<string> { "index-2022/01" }),
new(
"index-2022/01",
new List<string>(),
new List<string> { "index-2022/01/02" }),
new(
"index-2022/01/02",
new List<string> { "page3" },
new List<string>()),
new("page1", null, null), new("page1", null, null),
new("page2", null, null), new("page2", null, null),
new("page3", null, null), new("page3", null, null),
@ -114,18 +148,43 @@ public class CreateDateIndexesTests : TemporalTestBase
.Add(timekeeper.CreateInstant(2022, 1, 2)), .Add(timekeeper.CreateInstant(2022, 1, 2)),
}; };
List<Tuple<string, List<string>?, List<string>?>> actual = this.GetActual(op, input); List<Tuple<string, List<string>?, List<string>?>> actual =
this.GetActual(op, input);
var expected = new List<Tuple<string, List<string>?, List<string>?>> var expected = new List<Tuple<string, List<string>?, List<string>?>>
{ {
new("index-2021", new List<string>(), new List<string> { "index-2021/01", "index-2021/02" }), new(
new("index-2021/01", new List<string> { "page1" }, new List<string> { "index-2021/01/02" }), "index-2021",
new("index-2021/01/02", new List<string> { "page1" }, new List<string>()), new List<string>(),
new("index-2021/02", new List<string> { "page2" }, new List<string> { "index-2021/02/02" }), new List<string> { "index-2021/01", "index-2021/02" }),
new("index-2021/02/02", new List<string> { "page2" }, new List<string>()), new(
new("index-2022", new List<string> { "page3" }, new List<string> { "index-2022/01" }), "index-2021/01",
new("index-2022/01", new List<string> { "page3" }, new List<string> { "index-2022/01/02" }), new List<string> { "page1" },
new("index-2022/01/02", new List<string> { "page3" }, new List<string>()), new List<string> { "index-2021/01/02" }),
new(
"index-2021/01/02",
new List<string> { "page1" },
new List<string>()),
new(
"index-2021/02",
new List<string> { "page2" },
new List<string> { "index-2021/02/02" }),
new(
"index-2021/02/02",
new List<string> { "page2" },
new List<string>()),
new(
"index-2022",
new List<string> { "page3" },
new List<string> { "index-2022/01" }),
new(
"index-2022/01",
new List<string> { "page3" },
new List<string> { "index-2022/01/02" }),
new(
"index-2022/01/02",
new List<string> { "page3" },
new List<string>()),
new("page1", null, null), new("page1", null, null),
new("page2", null, null), new("page2", null, null),
new("page3", null, null), new("page3", null, null),
@ -154,15 +213,31 @@ public class CreateDateIndexesTests : TemporalTestBase
.Add(timekeeper.CreateInstant(2022, 1, 2)), .Add(timekeeper.CreateInstant(2022, 1, 2)),
}; };
List<Tuple<string, List<string>?, List<string>?>> actual = this.GetActual(op, input); List<Tuple<string, List<string>?, List<string>?>> actual =
this.GetActual(op, input);
var expected = new List<Tuple<string, List<string>?, List<string>?>> var expected = new List<Tuple<string, List<string>?, List<string>?>>
{ {
new("index-2021", new List<string>(), new List<string> { "index-2021-01", "index-2021-02" }), new(
new("index-2021-01", new List<string> { "page1" }, new List<string>()), "index-2021",
new("index-2021-02", new List<string> { "page2" }, new List<string>()), new List<string>(),
new("index-2022", new List<string>(), new List<string> { "index-2022-01" }), new List<string> { "index-2021-01", "index-2021-02" }),
new("index-2022-01", new List<string> { "page3" }, new List<string>()), new(
"index-2021-01",
new List<string> { "page1" },
new List<string>()),
new(
"index-2021-02",
new List<string> { "page2" },
new List<string>()),
new(
"index-2022",
new List<string>(),
new List<string> { "index-2022-01" }),
new(
"index-2022-01",
new List<string> { "page3" },
new List<string>()),
new("page1", null, null), new("page1", null, null),
new("page2", null, null), new("page2", null, null),
new("page3", null, null), new("page3", null, null),
@ -191,11 +266,15 @@ public class CreateDateIndexesTests : TemporalTestBase
.Add(timekeeper.CreateInstant(2022, 1, 2)), .Add(timekeeper.CreateInstant(2022, 1, 2)),
}; };
List<Tuple<string, List<string>?, List<string>?>> actual = this.GetActual(op, input); List<Tuple<string, List<string>?, List<string>?>> actual =
this.GetActual(op, input);
var expected = new List<Tuple<string, List<string>?, List<string>?>> var expected = new List<Tuple<string, List<string>?, List<string>?>>
{ {
new("index-2021", new List<string> { "page1", "page2" }, new List<string>()), new(
"index-2021",
new List<string> { "page1", "page2" },
new List<string>()),
new("index-2022", new List<string> { "page3" }, new List<string>()), new("index-2022", new List<string> { "page3" }, new List<string>()),
new("page1", null, null), new("page1", null, null),
new("page2", null, null), new("page2", null, null),

View file

@ -6,17 +6,17 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj" /> <ProjectReference Include="..\..\src\MfGames.Nitride.Temporal\MfGames.Nitride.Temporal.csproj"/>
<ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj" /> <ProjectReference Include="..\MfGames.Nitride.Tests\MfGames.Nitride.Tests.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CompareNETObjects" Version="4.78.0" /> <PackageReference Include="CompareNETObjects" Version="4.78.0"/>
<PackageReference Include="MfGames.Gallium" Version="0.3.0" /> <PackageReference Include="MfGames.Gallium" Version="0.3.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1"/>
<PackageReference Include="JunitXml.TestLogger" Version="3.0.114" /> <PackageReference Include="JunitXml.TestLogger" Version="3.0.114"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

Some files were not shown because too many files have changed in this diff Show more