Files
LowPolyBattleSim/Library/PackageCache/com.unity.package-validation-suite@536239bd7458/Editor/ValidationSuite/ValidationTests/Standards/US0041-APIDocumentationIncluded.cs
Caleb Sandford deQuincey ecdd3e2a9e intial commit
2025-06-27 23:27:49 +01:00

99 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
namespace UnityEditor.PackageManager.ValidationSuite.ValidationTests.Standards
{
class APIDocumentationIncludedUS0041 : BaseStandardChecker
{
public override string StandardCode => "US-0041";
public override StandardVersion Version => new StandardVersion(2, 1, 1);
public void Check(string packagePath, AssemblyInfo[] assemblyInfo, ValidationAssemblyInformation validationAssemblyInformation)
{
var monopath = Utilities.GetMonoPath();
var exePath = Path.GetFullPath("packages/com.unity.package-validation-suite/Bin~/FindMissingDocs/FindMissingDocs.exe");
List<string> excludePaths = new List<string>();
excludePaths.AddRange(LongPathUtils.Directory.GetDirectories(packagePath, "*~", SearchOption.AllDirectories));
excludePaths.AddRange(LongPathUtils.Directory.GetDirectories(packagePath, ".*", SearchOption.AllDirectories));
excludePaths.AddRange(LongPathUtils.Directory.GetDirectories(packagePath, "Tests", SearchOption.AllDirectories));
foreach (var assembly in assemblyInfo)
{
//exclude sources from test assemblies explicitly. Do not exclude entire directories, as there may be nested public asmdefs
if (validationAssemblyInformation.IsTestAssembly(assembly) && assembly.assemblyKind == AssemblyInfo.AssemblyKind.Asmdef)
excludePaths.AddRange(assembly.assembly.sourceFiles);
}
string responseFileParameter = string.Empty;
string responseFilePath = null;
if (excludePaths.Count > 0)
{
responseFilePath = Path.GetTempFileName();
var excludedPathsParameter = $@"--excluded-paths=""{string.Join(",", excludePaths.Select(s => Path.GetFullPath(s)))}""";
File.WriteAllText(responseFilePath, excludedPathsParameter);
responseFileParameter = $@"--response-file=""{responseFilePath}""";
}
var filterYamlParameter = "";
var filterYamlPath = Path.Combine(packagePath, "Documentation~", "filter.yml");
if (Utilities.FileExists(filterYamlPath))
{
filterYamlParameter = $@"--path-to-filter-yaml=""{filterYamlPath}""";
}
var startInfo = new ProcessStartInfo(monopath, $@"""{exePath}"" --root-path=""{packagePath}"" {filterYamlParameter} {responseFileParameter}")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
var process = Process.Start(startInfo);
var stdout = new ProcessOutputStreamReader(process, process.StandardOutput);
var stderr = new ProcessOutputStreamReader(process, process.StandardError);
process.WaitForExit();
var stdoutLines = stdout.GetOutput();
var stderrLines = stderr.GetOutput();
if (process.ExitCode != 0)
{
// If FindMissingDocs fails and returns a non-zero exit code (like an unhandled exception) it means that
// we couldn't validate the XmdDocValidation because the result is inconclusive. For that reason, we
// should add it as an error to be addressed by the developer. If there's any bug with the tool itself
// then that will need to be addressed in the XmlDoc repo and rebuild the binaries from PVS.
AddError($"FindMissingDocs.exe returned {process.ExitCode}, a non-zero exit code and XmlDocValidation test is inconclusive.");
}
if (stderrLines.Length > 0)
{
AddWarning($"Internal Error running FindMissingDocs. Output:\n{string.Join("\n", stderrLines)}");
return;
}
if (stdoutLines.Length > 0)
{
var errorMessage = FormatErrorMessage(stdoutLines);
AddWarning(errorMessage);
//// JonH: Enable errors in non-preview packages once the check has been put through its paces and the change is coordinated with RM and PM
// if (Context.ProjectPackageInfo.IsPreview)
// Warning(errorMessage);
// else
// {
// TestState = TestState.Failed;
// Error(errorMessage);
// }
}
if (responseFilePath != null)
File.Delete(responseFilePath);
}
public static string FormatErrorMessage(IEnumerable<string> expectedMessages)
{
return $@"The following APIs are missing documentation: {string.Join(Environment.NewLine, expectedMessages)}";
}
}
}