Skip to content

Commit

Permalink
Ability to log a summary message
Browse files Browse the repository at this point in the history
  • Loading branch information
NikolayPianikov committed Feb 7, 2025
1 parent a977f2a commit 9ddb946
Show file tree
Hide file tree
Showing 17 changed files with 119 additions and 10 deletions.
11 changes: 11 additions & 0 deletions CSharpInteractive.HostApi/IHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,17 @@ public interface IHost
/// <param name="warning">Warning message.</param>
void Warning(string? warning);

/// <summary>
/// Writes a summary message to stdOut.
/// <example>
/// <code>
/// Info("Some info");
/// </code>
/// </example>
/// </summary>
/// <param name="summary">Summary message.</param>
void Summary(string? summary);

/// <summary>
/// Writes an information message to stdOut.
/// <example>
Expand Down
4 changes: 2 additions & 2 deletions CSharpInteractive.Tests/ProcessResultHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal void ShouldLogInfoWhenFinishedAndHasHandler(ProcessState state)
}

[Fact]
public void ShouldLogInfoWhenFinishedAndHasNoHandler()
public void ShouldLogSummaryWhenFinishedAndHasNoHandler()
{
// Given
var handler = CreateInstance();
Expand All @@ -38,7 +38,7 @@ public void ShouldLogInfoWhenFinishedAndHasNoHandler()
handler.Handle(new ProcessResult(_processInfo, ProcessState.Finished, 12, _description), default(Action<object>));

// Then
_log.Verify(i => i.Info(_description));
_log.Verify(i => i.Summary(_description));
}

[Fact]
Expand Down
2 changes: 2 additions & 0 deletions CSharpInteractive.Tests/UsageScenarios/BaseScenario.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ public bool HasSdk(string sdkVersion)

public void Warning(string? warning) => Composition.Shared.Root.Host.Warning(warning);

public void Summary(string? summary) => Composition.Shared.Root.Host.Summary(summary);

public void Info(string? text) => Composition.Shared.Root.Host.Info(text);

public void Trace(string? trace, string? origin = null) => Composition.Shared.Root.Host.Trace(trace, origin);
Expand Down
23 changes: 23 additions & 0 deletions CSharpInteractive.Tests/UsageScenarios/LogSummaryScenario.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// ReSharper disable StringLiteralTypo
// ReSharper disable SuggestVarOrType_BuiltInTypes

namespace CSharpInteractive.Tests.UsageScenarios;

using System;

public class LogSummaryScenario(ITestOutputHelper output) : BaseScenario(output)
{
[SkippableFact]
public void Run()
{
Skip.IfNot(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("TEAMCITY_VERSION")));

// $visible=true
// $tag=01 Output, logging and tracing
// $priority=04
// $description=Registering a summary in the build log
// {
Summary("Summary message");
// }
}
}
8 changes: 8 additions & 0 deletions CSharpInteractive/Core/HostService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ public void Warning(string? warning)
}
}

public void Summary(string? summary)
{
if (summary != null)
{
log.Summary(summary);
}
}

public void Info(string? text)
{
if (text != null)
Expand Down
2 changes: 2 additions & 0 deletions CSharpInteractive/Core/ILog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ internal interface ILog<T>

void Warning(params Text[] warning);

void Summary(params Text[] summary);

void Info(params Text[] message);

void Trace(Func<Text[]> traceMessagesFactory, string origin = "");
Expand Down
2 changes: 2 additions & 0 deletions CSharpInteractive/Core/IStatistics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ internal interface IStatistics

IReadOnlyCollection<Text[]> Warnings { get; }

IReadOnlyCollection<Text[]> Summary { get; }

TimeSpan TimeElapsed { get; }

IReadOnlyCollection<CommandLineInfo> CommandLines { get; }
Expand Down
2 changes: 2 additions & 0 deletions CSharpInteractive/Core/IStatisticsRegistry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ internal interface IStatisticsRegistry
void RegisterError(Text[] error);

void RegisterWarning(Text[] warning);

void RegisterSummary(Text[] summary);
}
11 changes: 11 additions & 0 deletions CSharpInteractive/Core/Log.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ public void Warning(params Text[] warning)
stdOut.WriteLine(warning);
}

public void Summary(params Text[] summary)
{
if (summary.Length == 0)
{
return;
}

statisticsRegistry.RegisterSummary(summary);
stdOut.WriteLine(GetMessage(summary, Color.Highlighted));
}

public void Info(params Text[] message)
{
if (settings.VerbosityLevel >= VerbosityLevel.Normal)
Expand Down
6 changes: 6 additions & 0 deletions CSharpInteractive/Core/LogExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,10 @@ public static ILog<T> Warning<T>(this ILog<T> log, params string[] warning)
log.Warning(warning.Select(i => new Text(i, Color.Warning)).ToArray());
return log;
}

public static ILog<T> Summary<T>(this ILog<T> log, params string[] summary)
{
log.Summary(summary.Select(i => new Text(i, Color.Highlighted)).ToArray());
return log;
}
}
2 changes: 1 addition & 1 deletion CSharpInteractive/Core/ProcessResultHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public void Handle<T>(ProcessResult result, Action<T>? handler)

case ProcessState.Finished:
default:
log.Info(description);
log.Summary(description);
break;
}
}
Expand Down
28 changes: 26 additions & 2 deletions CSharpInteractive/Core/Statistics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ internal class Statistics : IStatisticsRegistry, IStatistics, ICommandLineStatis
private readonly Stopwatch _stopwatch = new();
private readonly List<Text[]> _errors = [];
private readonly List<Text[]> _warnings = [];
private readonly List<Text[]> _summary = [];
private readonly List<CommandLineInfo> _info = [];

public bool IsEmpty => Errors.Count == 0 && Warnings.Count == 0 && CommandLines.Count == 0;
Expand All @@ -22,7 +23,7 @@ public IReadOnlyCollection<Text[]> Errors
{
lock (_lockObject)
{
return new ReadOnlyCollection<Text[]>(_errors);
return _errors.AsReadOnly();
}
}
}
Expand All @@ -33,7 +34,18 @@ public IReadOnlyCollection<Text[]> Warnings
{
lock (_lockObject)
{
return new ReadOnlyCollection<Text[]>(_warnings);
return _warnings.AsReadOnly();
}
}
}

public IReadOnlyCollection<Text[]> Summary
{
get
{
lock (_lockObject)
{
return _summary.AsReadOnly();
}
}
}
Expand Down Expand Up @@ -70,6 +82,18 @@ public void RegisterWarning(Text[] warning)
}
}

public void RegisterSummary(Text[] summary)
{
summary = summary.Trim();
if (!summary.IsEmptyOrWhiteSpace())
{
lock (_lockObject)
{
_summary.Add(summary);
}
}
}

public IReadOnlyCollection<CommandLineInfo> CommandLines
{
get
Expand Down
5 changes: 5 additions & 0 deletions CSharpInteractive/Core/StatisticsPresenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ public void Show(IStatistics statistics)

Show(tests);

foreach (var summary in statistics.Summary)
{
log.Info(summary.AddPrefix(_ => Tab));
}

foreach (var warning in statistics.Warnings)
{
log.Info(warning.AddPrefix(_ => Tab));
Expand Down
5 changes: 0 additions & 5 deletions CSharpInteractive/Core/SummaryPresenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,6 @@ public void Show(Summary summary)
if (!statistics.IsEmpty)
{
log.Info(new Text("Summary:", Color.Header));
foreach (var commandLineInfo in statistics.CommandLines)
{
log.Info(commandLineInfo.ProcessResult.Description.AddPrefix(_ => Tab));
}

statisticsPresenter.Show(statistics);
}

Expand Down
6 changes: 6 additions & 0 deletions CSharpInteractive/Core/TeamCityLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ public void Warning(params Text[] warning)
teamCityWriter.WriteWarning(message);
}

public void Summary(params Text[] summary)
{
statisticsRegistry.RegisterSummary(summary);
teamCityWriter.WriteMessage(lineFormatter.Format(summary));
}

public void Info(params Text[] message)
{
if (settings.VerbosityLevel >= VerbosityLevel.Normal)
Expand Down
11 changes: 11 additions & 0 deletions CSharpInteractive/Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,17 @@ private static void CurrentDomainOnUnhandledException(object sender, UnhandledEx
/// <param name="warning">Warning message.</param>
public static void Warning(string? warning) => CurHost.Warning(warning);

/// <summary>
/// Writes a summary message to stdOut.
/// <example>
/// <code>
/// Info("Some info");
/// </code>
/// </example>
/// </summary>
/// <param name="summary">Summary message.</param>
public static void Summary(string? summary) => CurHost.Summary(summary);

/// <summary>
/// Writes an information message to stdOut.
/// <example>
Expand Down
1 change: 1 addition & 0 deletions Samples/MySampleLib/Build/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
// Output, logging and tracing API
WriteLine("Hello");
WriteLine("Hello !!!", Color.Highlighted);
Summary("Summary message");
Error("Error details", "ErrorId");
Warning("Warning");
Info("Some info");
Expand Down

0 comments on commit 9ddb946

Please sign in to comment.