Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/architecture-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Current rules:

| File | Rule(s) |
|---|---|
| `LayeringSpecs` | `Core` / `Utilities` are foundations (no in-repo deps); utility satellites depend only on `Utilities`; `Tooling` / `ProjectModel` / `Build.Shared` don't reach upward; `Solution` is a thin facade; nothing depends on the `Cli` composition root; `Fallout.*` never depends on the `Nuke.*` shims. |
| `LayeringSpecs` | `Core` / `Utilities` and the `Application.Tooling.Execution` / `Application.Tooling.Requirements` contract leaves are foundations (no in-repo deps); utility satellites depend only on `Utilities`; `Tooling` / `ProjectModel` / `Build.Shared` don't reach upward; `Solution` is a thin facade; nothing depends on the `Cli` composition root; `Fallout.*` never depends on the `Nuke.*` shims. |
| `PuritySpecs` | `Fallout.Core` takes no dependency on `System.IO`, `System.Diagnostics.Process`, `System.Console`, or Serilog (issue #88). |
| `NamingSpecs` | A type's namespace should be rooted at its assembly name. The main debt-bearing rule. |

Expand Down
2 changes: 2 additions & 0 deletions fallout.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
<Project Path="src\Persistence\Fallout.Persistence.Solution\Fallout.Persistence.Solution.csproj" />
<Project Path="src\Persistence\Fallout.Solution\Fallout.Solution.csproj" />
<Project Path="src\Fallout.SourceGenerators\Fallout.SourceGenerators.csproj" />
<Project Path="src\Fallout.Application.Tooling.Execution\Fallout.Application.Tooling.Execution.csproj" />
<Project Path="src\Fallout.Application.Tooling.Requirements\Fallout.Application.Tooling.Requirements.csproj" />
<Project Path="src\Fallout.Tooling.Generator\Fallout.Tooling.Generator.csproj" />
<Project Path="src\Fallout.Tooling\Fallout.Tooling.csproj" />
<Project Path="src\Fallout.Utilities.IO.Compression\Fallout.Utilities.IO.Compression.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;net10.0</TargetFrameworks>
<Description>Application-layer process-execution contract for Fallout tools — the IProcess abstraction and its Output model. No I/O, no logging. Targets netstandard2.0 so the source-generator and MSBuild-task layers can consume it.</Description>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;net10.0</TargetFrameworks>
<Description>Application-layer tool-requirement marker interfaces — how a target declares the tools/packages it needs present before it runs. No I/O, no logging. Targets netstandard2.0 so the source-generator and MSBuild-task layers can consume it.</Description>
</PropertyGroup>

</Project>
13 changes: 13 additions & 0 deletions src/Fallout.Application.Tooling.Requirements/ToolRequirements.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Fallout.Common.Tooling;

public interface IRequireTool;
public interface IRequireToolWithVersion;


public interface IRequirePathTool : IRequireTool;

public interface IRequireNuGetPackage : IRequireTool, IRequireToolWithVersion;

public interface IRequireNpmPackage : IRequireTool, IRequireToolWithVersion;

public interface IRequireAptGetPackage : IRequireTool;
2 changes: 2 additions & 0 deletions src/Fallout.Tooling/Fallout.Tooling.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Fallout.Application.Tooling.Execution\Fallout.Application.Tooling.Execution.csproj" />
<ProjectReference Include="..\Fallout.Application.Tooling.Requirements\Fallout.Application.Tooling.Requirements.csproj" />
<ProjectReference Include="..\Fallout.Utilities.Text.Json\Fallout.Utilities.Text.Json.csproj" />
<ProjectReference Include="..\Fallout.Utilities\Fallout.Utilities.csproj" />
</ItemGroup>
Expand Down
13 changes: 0 additions & 13 deletions src/Fallout.Tooling/ToolRequirement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,6 @@

namespace Fallout.Common.Tooling;

public interface IRequireTool;
public interface IRequireToolWithVersion;


public interface IRequirePathTool : IRequireTool;

public interface IRequireNuGetPackage : IRequireTool, IRequireToolWithVersion;

public interface IRequireNpmPackage : IRequireTool, IRequireToolWithVersion;

public interface IRequireAptGetPackage : IRequireTool;


public class ToolRequirement;

public class PathToolRequirement(string pathExecutable) : ToolRequirement
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

<!-- Foundation: depend on nothing else in the repo. -->
<ItemGroup>
<ProjectReference Include="..\..\src\Fallout.Application.Tooling.Execution\Fallout.Application.Tooling.Execution.csproj" />
<ProjectReference Include="..\..\src\Fallout.Application.Tooling.Requirements\Fallout.Application.Tooling.Requirements.csproj" />
<ProjectReference Include="..\..\src\Fallout.Core\Fallout.Core.csproj" />
<ProjectReference Include="..\..\src\Fallout.Utilities\Fallout.Utilities.csproj" />
</ItemGroup>
Expand Down
6 changes: 4 additions & 2 deletions tests/Fallout.Architecture.Specs/FalloutArchitecture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ internal static class FalloutArchitecture
public const string UtilitiesTextJson = "Fallout.Utilities.Text.Json";
public const string UtilitiesTextYaml = "Fallout.Utilities.Text.Yaml";
public const string Solution = "Fallout.Solution";
public const string ToolingExecution = "Fallout.Application.Tooling.Execution";
public const string ToolingRequirements = "Fallout.Application.Tooling.Requirements";
public const string Tooling = "Fallout.Tooling";
public const string ProjectModel = "Fallout.ProjectModel";
public const string BuildShared = "Fallout.Build.Shared";
Expand All @@ -52,8 +54,8 @@ internal static class FalloutArchitecture
public static readonly string[] RuntimeLibraries =
[
Core, Utilities, UtilitiesIoCompression, UtilitiesIoGlobbing, UtilitiesNet, UtilitiesTextJson,
UtilitiesTextYaml, Solution, Tooling, ProjectModel, BuildShared, Build, Common, Components, Cli,
NukeCommon, NukeBuild, NukeComponents,
UtilitiesTextYaml, Solution, ToolingExecution, ToolingRequirements, Tooling, ProjectModel, BuildShared,
Build, Common, Components, Cli, NukeCommon, NukeBuild, NukeComponents,
];

private static readonly IReadOnlyDictionary<string, System.Reflection.Assembly> Loaded = LoadProductionAssemblies();
Expand Down
10 changes: 10 additions & 0 deletions tests/Fallout.Architecture.Specs/LayeringSpecs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,16 @@ public void Utility_satellite_depends_only_on_Fallout_Utilities(string satellite
$"{satellite} is a utility satellite and may depend only on Fallout.Utilities",
KnownViolations.None);

[Theory]
[InlineData(Arch.ToolingExecution)]
[InlineData(Arch.ToolingRequirements)]
public void Tooling_contract_leaf_is_a_foundation(string leaf) =>
Ratchet.Enforce(
Arch.TypesIn(leaf)
.Should().NotDependOnAny(Arch.TypesIn(Arch.AllAssembliesExcept(leaf))),
$"{leaf} is a pure Application-layer tooling-contract leaf and must reference no other Fallout/Nuke assembly",
KnownViolations.None);

[Fact]
public void Tooling_does_not_depend_on_upper_layers() =>
Ratchet.Enforce(
Expand Down