Skip to content

Simple Issue Provider

This tutorial explains how to implement a simple issue provider using the BaseIssueProvider class from the Cake.Issue addin.

Implementing issue provider

A concrete class inheriting from BaseIssueProvider needs to be implemented:

/// <summary>
/// My issue provider.
/// </summary>
/// <param name="log">The Cake log context.</param>
public class MyIssuesProvider(ICakeLog log) : BaseIssueProvider(log)
{
    /// <inheritdoc />
    public override string ProviderName => "MyIssuesProvider";

    /// <inheritdoc />
    protected override IEnumerable<IIssue> InternalReadIssues()
    {
        var result = new List<IIssue>();

        // Implement issue provider logic here.
        result.Add(
            IssueBuilder
                .NewIssue("Some message", this)
                .WithPriority(IssuePriority.Warning)
                .OfRule("My rule")
                .Create());

        return result;
    }
}

Aliases

An alias for reading issues with the provider and a property alias for returning the provider type name should be defined:

/// <summary>
/// Contains functionality related to my issue provider.
/// </summary>
[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]
public static class MyIssueAliases
{
    /// <summary>
    /// Gets an instance of my issues provider using specified settings.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <returns>Instance of my issues provider.</returns>
    /// <example>
    /// <para>Read issues using my issues provider:</para>
    /// <code>
    /// <![CDATA[
    ///     var issues = ReadIssues(MyIssues());
    /// ]]>
    /// </code>
    /// </example>
    [CakeMethodAlias]
    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]
    public static IIssueProvider MyIssues(
        this ICakeContext context)
    {
        context.NotNull();

        return new MyIssuesProvider(context.Log);
    }

    /// <summary>
    /// Gets the name of my issue provider.
    /// This name can be used to identify issues based on the
    /// <see cref="IIssue.ProviderType"/> property.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <returns>Name of my issue provider.</returns>
    [CakePropertyAlias]
    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]
    public static string MyIssuesProviderTypeName(
        this ICakeContext context)
    {
        context.NotNull();

        return typeof(MyIssuesProvider).FullName;
    }
}
/// <summary>
/// Contains functionality related to my issue provider.
/// </summary>
[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]
public static class MyIssueAliases
{
    /// <summary>
    /// Gets an instance of my issues provider using specified settings.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <returns>Instance of my issues provider.</returns>
    /// <example>
    /// <para>Read issues using my issues provider:</para>
    /// <code>
    /// <![CDATA[
    ///     var issues = ReadIssues(MyIssues());
    /// ]]>
    /// </code>
    /// </example>
    [CakeMethodAlias]
    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]
    public static IIssueProvider MyIssues(
        this ICakeContext context)
    {
        context.NotNull();

        return new MyIssuesProvider(context.Log);
    }

    /// <summary>
    /// Gets the name of my issue provider.
    /// This name can be used to identify issues based on the
    /// <see cref="IIssue.ProviderType"/> property.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <returns>Name of my issue provider.</returns>
    [CakePropertyAlias]
    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]
    public static string MyIssuesProviderTypeName(
        this ICakeContext context)
    {
        context.NotNull();

        return typeof(MyIssuesProvider).FullName;
    }
}