Clean up profile enrichment

This commit is contained in:
Patrik Svensson
2021-01-29 17:03:04 +01:00
committed by Patrik Svensson
parent 953008b5e3
commit e20f6284f9
24 changed files with 254 additions and 158 deletions

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class AppVeyorEnricher : IProfileEnricher
{
public string Name => "AppVeyor";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("APPVEYOR");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class BambooEnricher : IProfileEnricher
{
public string Name => "Bamboo";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("bamboo_buildNumber");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,21 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class BitbucketEnricher : IProfileEnricher
{
public string Name => "Bitbucket";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("BITBUCKET_REPO_OWNER") ||
environmentVariables.ContainsKey("BITBUCKET_REPO_SLUG") ||
environmentVariables.ContainsKey("BITBUCKET_COMMIT");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class BitriseEnricher : IProfileEnricher
{
public string Name => "Bitrise";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("BITRISE_BUILD_URL");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class ContinuaEnricher : IProfileEnricher
{
public string Name => "ContinuaCI";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("ContinuaCI.Version");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class GitHubEnricher : IProfileEnricher
{
public string Name => "GitHub";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
if (environmentVariables.TryGetValue("GITHUB_ACTIONS", out var value))
{
return value?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false;
}
return false;
}
public void Enrich(Profile profile)
{
profile.Capabilities.Ansi = true;
profile.Capabilities.Legacy = false;
profile.Capabilities.Interactive = false;
profile.Capabilities.Links = false;
}
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class GitLabEnricher : IProfileEnricher
{
public string Name => "GitLab";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
if (environmentVariables.TryGetValue("CI_SERVER", out var value))
{
return value?.Equals("yes", StringComparison.OrdinalIgnoreCase) ?? false;
}
return false;
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class GoCDEnricher : IProfileEnricher
{
public string Name => "GoCD";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("GO_SERVER_URL");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class JenkinsEnricher : IProfileEnricher
{
public string Name => "Jenkins";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("JENKINS_URL");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class MyGetEnricher : IProfileEnricher
{
public string Name => "MyGet";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
if (environmentVariables.TryGetValue("BuildRunner", out var value))
{
return value?.Equals("MyGet", StringComparison.OrdinalIgnoreCase) ?? false;
}
return false;
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class TeamCityEnricher : IProfileEnricher
{
public string Name => "TeamCity";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("TEAMCITY_VERSION");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class TfsEnricher : IProfileEnricher
{
public string Name => "TFS";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("TF_BUILD");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class TravisEnricher : IProfileEnricher
{
public string Name => "Travis";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("TRAVIS");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Interactive = false;
}
}
}

View File

@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Spectre.Console.Enrichment
{
internal static class ProfileEnricher
{
private static readonly List<IProfileEnricher> _defaultEnrichers = new List<IProfileEnricher>
{
new WindowsTerminalEnricher(),
new AppVeyorEnricher(),
new BambooEnricher(),
new BitbucketEnricher(),
new BitriseEnricher(),
new ContinuaEnricher(),
new GitHubEnricher(),
new GitLabEnricher(),
new GoCDEnricher(),
new JenkinsEnricher(),
new MyGetEnricher(),
new TeamCityEnricher(),
new TfsEnricher(),
new TravisEnricher(),
};
public static void Enrich(
Profile profile,
ProfileEnrichment settings,
IDictionary<string, string>? environmentVariables)
{
if (profile is null)
{
throw new ArgumentNullException(nameof(profile));
}
settings ??= new ProfileEnrichment();
var variables = GetEnvironmentVariables(environmentVariables);
foreach (var enricher in GetEnrichers(settings))
{
if (string.IsNullOrWhiteSpace(enricher.Name))
{
throw new InvalidOperationException($"Profile enricher of type '{enricher.GetType().FullName}' does not have a name.");
}
if (enricher.Enabled(variables))
{
enricher.Enrich(profile);
profile.AddEnricher(enricher.Name);
}
}
}
private static List<IProfileEnricher> GetEnrichers(ProfileEnrichment settings)
{
var enrichers = new List<IProfileEnricher>();
if (settings.UseDefaultEnrichers)
{
enrichers.AddRange(_defaultEnrichers);
}
if (settings.Enrichers?.Count > 0)
{
enrichers.AddRange(settings.Enrichers);
}
return enrichers;
}
private static IDictionary<string, string> GetEnvironmentVariables(IDictionary<string, string>? variables)
{
if (variables != null)
{
return new Dictionary<string, string>(variables, StringComparer.OrdinalIgnoreCase);
}
return Environment.GetEnvironmentVariables()
.Cast<System.Collections.DictionaryEntry>()
.Aggregate(
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase),
(dictionary, entry) =>
{
var key = (string)entry.Key;
if (!dictionary.TryGetValue(key, out _))
{
dictionary.Add(key, entry.Value as string ?? string.Empty);
}
return dictionary;
},
dictionary => dictionary);
}
}
}

View File

@ -0,0 +1,22 @@
using System.Collections.Generic;
namespace Spectre.Console
{
/// <summary>
/// Contains settings for profile enrichment.
/// </summary>
public sealed class ProfileEnrichment
{
/// <summary>
/// Gets or sets a value indicating whether or not
/// any default enrichers should be added.
/// </summary>
/// <remarks>Defaults to <c>true</c>.</remarks>
public bool UseDefaultEnrichers { get; set; } = true;
/// <summary>
/// Gets or sets the list of custom enrichers to use.
/// </summary>
public List<IProfileEnricher>? Enrichers { get; set; }
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace Spectre.Console.Enrichment
{
internal sealed class WindowsTerminalEnricher : IProfileEnricher
{
public string Name => "Windows Terminal";
public bool Enabled(IDictionary<string, string> environmentVariables)
{
return environmentVariables.ContainsKey("WT_SESSION");
}
public void Enrich(Profile profile)
{
profile.Capabilities.Links = true;
}
}
}