Skip to content

Commit 9ddb946

Browse files
Ability to log a summary message
1 parent a977f2a commit 9ddb946

File tree

17 files changed

+119
-10
lines changed

17 files changed

+119
-10
lines changed

CSharpInteractive.HostApi/IHost.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ public interface IHost
8888
/// <param name="warning">Warning message.</param>
8989
void Warning(string? warning);
9090

91+
/// <summary>
92+
/// Writes a summary message to stdOut.
93+
/// <example>
94+
/// <code>
95+
/// Info("Some info");
96+
/// </code>
97+
/// </example>
98+
/// </summary>
99+
/// <param name="summary">Summary message.</param>
100+
void Summary(string? summary);
101+
91102
/// <summary>
92103
/// Writes an information message to stdOut.
93104
/// <example>

CSharpInteractive.Tests/ProcessResultHandlerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal void ShouldLogInfoWhenFinishedAndHasHandler(ProcessState state)
2929
}
3030

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

4040
// Then
41-
_log.Verify(i => i.Info(_description));
41+
_log.Verify(i => i.Summary(_description));
4242
}
4343

4444
[Fact]

CSharpInteractive.Tests/UsageScenarios/BaseScenario.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public bool HasSdk(string sdkVersion)
7373

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

76+
public void Summary(string? summary) => Composition.Shared.Root.Host.Summary(summary);
77+
7678
public void Info(string? text) => Composition.Shared.Root.Host.Info(text);
7779

7880
public void Trace(string? trace, string? origin = null) => Composition.Shared.Root.Host.Trace(trace, origin);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// ReSharper disable StringLiteralTypo
2+
// ReSharper disable SuggestVarOrType_BuiltInTypes
3+
4+
namespace CSharpInteractive.Tests.UsageScenarios;
5+
6+
using System;
7+
8+
public class LogSummaryScenario(ITestOutputHelper output) : BaseScenario(output)
9+
{
10+
[SkippableFact]
11+
public void Run()
12+
{
13+
Skip.IfNot(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("TEAMCITY_VERSION")));
14+
15+
// $visible=true
16+
// $tag=01 Output, logging and tracing
17+
// $priority=04
18+
// $description=Registering a summary in the build log
19+
// {
20+
Summary("Summary message");
21+
// }
22+
}
23+
}

CSharpInteractive/Core/HostService.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ public void Warning(string? warning)
4545
}
4646
}
4747

48+
public void Summary(string? summary)
49+
{
50+
if (summary != null)
51+
{
52+
log.Summary(summary);
53+
}
54+
}
55+
4856
public void Info(string? text)
4957
{
5058
if (text != null)

CSharpInteractive/Core/ILog.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ internal interface ILog<T>
88

99
void Warning(params Text[] warning);
1010

11+
void Summary(params Text[] summary);
12+
1113
void Info(params Text[] message);
1214

1315
void Trace(Func<Text[]> traceMessagesFactory, string origin = "");

CSharpInteractive/Core/IStatistics.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ internal interface IStatistics
88

99
IReadOnlyCollection<Text[]> Warnings { get; }
1010

11+
IReadOnlyCollection<Text[]> Summary { get; }
12+
1113
TimeSpan TimeElapsed { get; }
1214

1315
IReadOnlyCollection<CommandLineInfo> CommandLines { get; }

CSharpInteractive/Core/IStatisticsRegistry.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ internal interface IStatisticsRegistry
77
void RegisterError(Text[] error);
88

99
void RegisterWarning(Text[] warning);
10+
11+
void RegisterSummary(Text[] summary);
1012
}

CSharpInteractive/Core/Log.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ public void Warning(params Text[] warning)
3434
stdOut.WriteLine(warning);
3535
}
3636

37+
public void Summary(params Text[] summary)
38+
{
39+
if (summary.Length == 0)
40+
{
41+
return;
42+
}
43+
44+
statisticsRegistry.RegisterSummary(summary);
45+
stdOut.WriteLine(GetMessage(summary, Color.Highlighted));
46+
}
47+
3748
public void Info(params Text[] message)
3849
{
3950
if (settings.VerbosityLevel >= VerbosityLevel.Normal)

CSharpInteractive/Core/LogExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,10 @@ public static ILog<T> Warning<T>(this ILog<T> log, params string[] warning)
3131
log.Warning(warning.Select(i => new Text(i, Color.Warning)).ToArray());
3232
return log;
3333
}
34+
35+
public static ILog<T> Summary<T>(this ILog<T> log, params string[] summary)
36+
{
37+
log.Summary(summary.Select(i => new Text(i, Color.Highlighted)).ToArray());
38+
return log;
39+
}
3440
}

CSharpInteractive/Core/ProcessResultHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void Handle<T>(ProcessResult result, Action<T>? handler)
3535

3636
case ProcessState.Finished:
3737
default:
38-
log.Info(description);
38+
log.Summary(description);
3939
break;
4040
}
4141
}

CSharpInteractive/Core/Statistics.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ internal class Statistics : IStatisticsRegistry, IStatistics, ICommandLineStatis
1212
private readonly Stopwatch _stopwatch = new();
1313
private readonly List<Text[]> _errors = [];
1414
private readonly List<Text[]> _warnings = [];
15+
private readonly List<Text[]> _summary = [];
1516
private readonly List<CommandLineInfo> _info = [];
1617

1718
public bool IsEmpty => Errors.Count == 0 && Warnings.Count == 0 && CommandLines.Count == 0;
@@ -22,7 +23,7 @@ public IReadOnlyCollection<Text[]> Errors
2223
{
2324
lock (_lockObject)
2425
{
25-
return new ReadOnlyCollection<Text[]>(_errors);
26+
return _errors.AsReadOnly();
2627
}
2728
}
2829
}
@@ -33,7 +34,18 @@ public IReadOnlyCollection<Text[]> Warnings
3334
{
3435
lock (_lockObject)
3536
{
36-
return new ReadOnlyCollection<Text[]>(_warnings);
37+
return _warnings.AsReadOnly();
38+
}
39+
}
40+
}
41+
42+
public IReadOnlyCollection<Text[]> Summary
43+
{
44+
get
45+
{
46+
lock (_lockObject)
47+
{
48+
return _summary.AsReadOnly();
3749
}
3850
}
3951
}
@@ -70,6 +82,18 @@ public void RegisterWarning(Text[] warning)
7082
}
7183
}
7284

85+
public void RegisterSummary(Text[] summary)
86+
{
87+
summary = summary.Trim();
88+
if (!summary.IsEmptyOrWhiteSpace())
89+
{
90+
lock (_lockObject)
91+
{
92+
_summary.Add(summary);
93+
}
94+
}
95+
}
96+
7397
public IReadOnlyCollection<CommandLineInfo> CommandLines
7498
{
7599
get

CSharpInteractive/Core/StatisticsPresenter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ public void Show(IStatistics statistics)
1818

1919
Show(tests);
2020

21+
foreach (var summary in statistics.Summary)
22+
{
23+
log.Info(summary.AddPrefix(_ => Tab));
24+
}
25+
2126
foreach (var warning in statistics.Warnings)
2227
{
2328
log.Info(warning.AddPrefix(_ => Tab));

CSharpInteractive/Core/SummaryPresenter.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ public void Show(Summary summary)
2323
if (!statistics.IsEmpty)
2424
{
2525
log.Info(new Text("Summary:", Color.Header));
26-
foreach (var commandLineInfo in statistics.CommandLines)
27-
{
28-
log.Info(commandLineInfo.ProcessResult.Description.AddPrefix(_ => Tab));
29-
}
30-
3126
statisticsPresenter.Show(statistics);
3227
}
3328

CSharpInteractive/Core/TeamCityLog.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ public void Warning(params Text[] warning)
2626
teamCityWriter.WriteWarning(message);
2727
}
2828

29+
public void Summary(params Text[] summary)
30+
{
31+
statisticsRegistry.RegisterSummary(summary);
32+
teamCityWriter.WriteMessage(lineFormatter.Format(summary));
33+
}
34+
2935
public void Info(params Text[] message)
3036
{
3137
if (settings.VerbosityLevel >= VerbosityLevel.Normal)

CSharpInteractive/Host.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,17 @@ private static void CurrentDomainOnUnhandledException(object sender, UnhandledEx
162162
/// <param name="warning">Warning message.</param>
163163
public static void Warning(string? warning) => CurHost.Warning(warning);
164164

165+
/// <summary>
166+
/// Writes a summary message to stdOut.
167+
/// <example>
168+
/// <code>
169+
/// Info("Some info");
170+
/// </code>
171+
/// </example>
172+
/// </summary>
173+
/// <param name="summary">Summary message.</param>
174+
public static void Summary(string? summary) => CurHost.Summary(summary);
175+
165176
/// <summary>
166177
/// Writes an information message to stdOut.
167178
/// <example>

Samples/MySampleLib/Build/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// Output, logging and tracing API
99
WriteLine("Hello");
1010
WriteLine("Hello !!!", Color.Highlighted);
11+
Summary("Summary message");
1112
Error("Error details", "ErrorId");
1213
Warning("Warning");
1314
Info("Some info");

0 commit comments

Comments
 (0)