Skip to content

Commit

Permalink
removed FilterDefinition.Name
Browse files Browse the repository at this point in the history
  • Loading branch information
vlada-shubina committed Oct 26, 2021
1 parent 2e77379 commit bcbdeb7
Show file tree
Hide file tree
Showing 13 changed files with 138 additions and 80 deletions.
68 changes: 68 additions & 0 deletions src/Microsoft.TemplateEngine.Cli/Commands/BaseFilterableArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable enable

using System.CommandLine.Parsing;

namespace Microsoft.TemplateEngine.Cli.Commands
{
internal class BaseFilterableArgs : GlobalArgs
{
private IReadOnlyDictionary<FilterOptionDefinition, OptionResult> _filters;

internal BaseFilterableArgs(BaseCommand command, ParseResult parseResult) : base(command, parseResult)
{
if (command is not IFilterableCommand filterableCommand)
{
throw new ArgumentException($"{nameof(command)} should be {nameof(IFilterableCommand)}", nameof(command));
}
_filters = ParseFilters(filterableCommand, parseResult);
}

/// <summary>
/// Gets list of <see cref="FilterOptionDefinition"/> parsed from command.
/// </summary>
internal IEnumerable<FilterOptionDefinition> AppliedFilters => _filters.Keys;

/// <summary>
/// Gets value for filter <paramref name="filter"/>.
/// </summary>
/// <param name="filter"></param>
/// <returns>value of the filter.</returns>
/// <exception cref="ArgumentException">when <paramref name="filter"/> is not among <see cref="AppliedFilters"/>.</exception>
internal string GetFilterValue(FilterOptionDefinition filter)
{
if (!_filters.ContainsKey(filter))
{
throw new ArgumentException($"{nameof(filter)} is not available in parse result.", nameof(filter));
}

return _filters[filter].GetValueOrDefault<string>() ?? string.Empty;
}

/// <summary>
/// Gets token name used for filter <paramref name="filter"/>.
/// </summary>
/// <param name="filter"></param>
/// <returns>Token or null when token cannot be evaluated.</returns>
internal string? GetFilterToken(FilterOptionDefinition filter)
{
return _filters[filter].Token?.Value;
}

private static IReadOnlyDictionary<FilterOptionDefinition, OptionResult> ParseFilters(IFilterableCommand filterableCommand, ParseResult parseResult)
{
Dictionary<FilterOptionDefinition, OptionResult> filterValues = new();
foreach (var filter in filterableCommand.Filters)
{
OptionResult? value = parseResult.FindResultFor(filter.Value);
if (value != null)
{
filterValues[filter.Key] = value;
}
}
return filterValues;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,66 +18,52 @@ namespace Microsoft.TemplateEngine.Cli.Commands
/// </summary>
internal class FilterOptionDefinition
{
internal FilterOptionDefinition(string name, Func<Option> optionFactory)
internal FilterOptionDefinition(Func<Option> optionFactory)
{
Name = string.IsNullOrWhiteSpace(name) ? throw new ArgumentException($"{nameof(name)} should not be null or whitespace", nameof(name)) : name;
OptionFactory = optionFactory ?? throw new ArgumentNullException(nameof(optionFactory));
}

internal static FilterOptionDefinition AuthorFilter { get; } =
new TemplateFilterOptionDefinition(
"author",
optionFactory: () => SharedOptionsFactory.CreateAuthorOption(),
matchFilter: authorArg => WellKnownSearchFilters.AuthorFilter(authorArg),
mismatchCriteria: resolutionResult => resolutionResult.HasAuthorMismatch);

internal static FilterOptionDefinition BaselineFilter { get; } =
new TemplateFilterOptionDefinition(
"baseline",
optionFactory: () => SharedOptionsFactory.CreateBaselineOption(),
matchFilter: baselineArg => WellKnownSearchFilters.BaselineFilter(baselineArg),
mismatchCriteria: resolutionResult => resolutionResult.HasBaselineMismatch);

internal static FilterOptionDefinition LanguageFilter { get; } =
new TemplateFilterOptionDefinition(
"language",
optionFactory: () => SharedOptionsFactory.CreateLanguageOption(),
matchFilter: languageArg => WellKnownSearchFilters.LanguageFilter(languageArg),
mismatchCriteria: resolutionResult => resolutionResult.HasLanguageMismatch);

internal static FilterOptionDefinition TagFilter { get; } =
new TemplateFilterOptionDefinition(
"tag",
optionFactory: () => SharedOptionsFactory.CreateTagOption(),
matchFilter: tagArg => WellKnownSearchFilters.ClassificationFilter(tagArg),
mismatchCriteria: resolutionResult => resolutionResult.HasClassificationMismatch);

internal static FilterOptionDefinition TypeFilter { get; } =
new TemplateFilterOptionDefinition(
"type",
optionFactory: () => SharedOptionsFactory.CreateTypeOption(),
matchFilter: typeArg => WellKnownSearchFilters.TypeFilter(typeArg),
mismatchCriteria: resolutionResult => resolutionResult.HasTypeMismatch);

internal static FilterOptionDefinition PackageFilter { get; } =
new PackageFilterOptionDefinition(
"package",
optionFactory: () => SharedOptionsFactory.CreatePackageOption(),
matchFilter: PackageMatchFilter);

//TODO: check if it's needed

/// <summary>
/// Name of the option, should match option long name.
/// </summary>
internal string Name { get; }

/// <summary>
/// A predicate that creates instance of option.
/// </summary>
internal Func<Option> OptionFactory { get; }

private static Func<ITemplatePackageInfo, bool> PackageMatchFilter(string packageArg)
private static Func<ITemplatePackageInfo, bool> PackageMatchFilter(string? packageArg)
{
return (pack) =>
{
Expand All @@ -96,10 +82,9 @@ private static Func<ITemplatePackageInfo, bool> PackageMatchFilter(string packag
internal class TemplateFilterOptionDefinition : FilterOptionDefinition
{
internal TemplateFilterOptionDefinition(
string name,
Func<Option> optionFactory,
Func<string, Func<ITemplateInfo, MatchInfo?>> matchFilter,
Func<TemplateResolutionResult, bool> mismatchCriteria) : base(name, optionFactory)
Func<string?, Func<ITemplateInfo, MatchInfo?>> matchFilter,
Func<TemplateResolutionResult, bool> mismatchCriteria) : base(optionFactory)
{
TemplateMatchFilter = matchFilter ?? throw new ArgumentNullException(nameof(matchFilter));
MismatchCriteria = mismatchCriteria ?? throw new ArgumentNullException(nameof(mismatchCriteria));
Expand All @@ -112,7 +97,7 @@ internal TemplateFilterOptionDefinition(
/// <remarks>
/// Common template match filters are defined in Microsoft.TemplateEngine.Utils.WellKnonwnSearchFilter class.
/// </remarks>
internal Func<string, Func<ITemplateInfo, MatchInfo?>> TemplateMatchFilter { get; set; }
internal Func<string?, Func<ITemplateInfo, MatchInfo?>> TemplateMatchFilter { get; set; }

/// <summary>
/// A predicate that returns if the filter option caused a mismatch in <see cref="TemplateResolutionResult"/> in case of partial match.
Expand All @@ -126,9 +111,8 @@ internal TemplateFilterOptionDefinition(
internal class PackageFilterOptionDefinition : FilterOptionDefinition
{
internal PackageFilterOptionDefinition(
string name,
Func<Option> optionFactory,
Func<string, Func<ITemplatePackageInfo, bool>> matchFilter) : base(name, optionFactory)
Func<string?, Func<ITemplatePackageInfo, bool>> matchFilter) : base(optionFactory)
{
PackageMatchFilter = matchFilter ?? throw new ArgumentNullException(nameof(matchFilter));
}
Expand All @@ -137,6 +121,6 @@ internal PackageFilterOptionDefinition(
/// A predicate that returns the package match filter for the filter option
/// Package match filter should if package is a match based on filter value.
/// </summary>
internal Func<string, Func<ITemplatePackageInfo, bool>> PackageMatchFilter { get; set; }
internal Func<string?, Func<ITemplatePackageInfo, bool>> PackageMatchFilter { get; set; }
}
}
14 changes: 0 additions & 14 deletions src/Microsoft.TemplateEngine.Cli/Commands/GlobalArgs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,6 @@ public GlobalArgs(BaseCommand command, ParseResult parseResult)

internal string? DebugCustomSettingsLocation { get; private set; }

protected static IReadOnlyDictionary<FilterOptionDefinition, string> ParseFilters(IFilterableCommand filterableCommand, ParseResult parseResult)
{
Dictionary<FilterOptionDefinition, string> filterValues = new Dictionary<FilterOptionDefinition, string>();
foreach (var filter in filterableCommand.Filters)
{
string? value = parseResult.GetValueForOption(filter.Value)?.ToString();
if (!string.IsNullOrWhiteSpace(value))
{
filterValues[filter.Key] = value;
}
}
return filterValues;
}

protected static (bool, IReadOnlyList<string>?) ParseTabularOutputSettings(ITabularOutputCommand command, ParseResult parseResult)
{
return (parseResult.GetValueForOption(command.ColumnsAllOption), parseResult.GetValueForOption(command.ColumnsOption));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,4 @@ internal interface IFilterableCommand
{
IReadOnlyDictionary<FilterOptionDefinition, Option> Filters { get; }
}

internal interface IFilterableArgs
{
IReadOnlyDictionary<FilterOptionDefinition, string> Filters { get; }
}
}
13 changes: 6 additions & 7 deletions src/Microsoft.TemplateEngine.Cli/Commands/SearchCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ protected override SearchCommandArgs ParseContext(ParseResult parseResult)
}
}

internal class SearchCommandArgs : GlobalArgs, IFilterableArgs, ITabularOutputArgs
internal class SearchCommandArgs : BaseFilterableArgs, ITabularOutputArgs
{
internal SearchCommandArgs(BaseSearchCommand command, ParseResult parseResult) : base(command, parseResult)
{
Expand All @@ -141,14 +141,13 @@ internal SearchCommandArgs(BaseSearchCommand command, ParseResult parseResult) :
SearchNameCriteria = newCommandArgument;
}
}

Filters = ParseFilters(command, parseResult);
(DisplayAllColumns, ColumnsToDisplay) = ParseTabularOutputSettings(command, parseResult);
Filters.TryGetValue(FilterOptionDefinition.LanguageFilter, out string? language);
Language = language;
}

public IReadOnlyDictionary<FilterOptionDefinition, string> Filters { get; }
if (AppliedFilters.Contains(FilterOptionDefinition.LanguageFilter))
{
Language = GetFilterValue(FilterOptionDefinition.LanguageFilter);
}
}

public bool DisplayAllColumns { get; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ internal static Func<TemplatePackageSearchData, IReadOnlyList<ITemplateInfo>> Ge
};
IEnumerable<Func<ITemplateInfo, MatchInfo?>> templateFilters =
commandArgs.Filters.Keys
commandArgs.AppliedFilters
.OfType<TemplateFilterOptionDefinition>()
.Select(filter => filter.TemplateMatchFilter(commandArgs.Filters[filter]));
.Select(filter => filter.TemplateMatchFilter(commandArgs.GetFilterValue(filter)));
IEnumerable<TemplateGroupMatchInfo> matchInformation =
templateGroups.Select(
Expand All @@ -87,9 +87,9 @@ internal Func<TemplatePackageSearchData, bool> GetPackFilter(SearchCommandArgs c
return templatePackageSearchData =>
{
return AlreadyInstalledFilter(templatePackageSearchData)
&& commandArgs.Filters.Keys
&& commandArgs.AppliedFilters
.OfType<PackageFilterOptionDefinition>()
.All(packFilter => packFilter.PackageMatchFilter(commandArgs.Filters[packFilter])(templatePackageSearchData));
.All(filter => filter.PackageMatchFilter(commandArgs.GetFilterValue(filter))(templatePackageSearchData));
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,12 @@ private static IReadOnlyCollection<SearchResultTableRow> GetSearchResultsForDisp

private static bool ValidateCommandInput(SearchCommandArgs commandArgs)
{
if (string.IsNullOrWhiteSpace(commandArgs.SearchNameCriteria) && !commandArgs.Filters.Any())
if (string.IsNullOrWhiteSpace(commandArgs.SearchNameCriteria) && !commandArgs.AppliedFilters.Any())
//TODO: implement it for template options matching
// && !commandInput.RemainingParameters.Any())
{
Reporter.Error.WriteLine(LocalizableStrings.CliTemplateSearchCoordinator_Error_NoTemplateName.Red().Bold());
Reporter.Error.WriteLine(string.Format(LocalizableStrings.CliTemplateSearchCoordinator_Info_SearchHelp, string.Join(", ", SearchCommand.SupportedFilters.Select(f => $"'{f.Name}'"))));
Reporter.Error.WriteLine(string.Format(LocalizableStrings.CliTemplateSearchCoordinator_Info_SearchHelp, string.Join(", ", SearchCommand.SupportedFilters.Select(f => $"'{f.OptionFactory().Aliases.First()}'"))));
Reporter.Error.WriteLine(LocalizableStrings.Generic_ExamplesHeader);
Reporter.Error.WriteCommand(CommandExamples.SearchCommandExample(commandArgs.CommandName, usePlaceholder: true));
Reporter.Error.WriteCommand(CommandExamples.SearchCommandExample(commandArgs.CommandName, additionalArgs: new[] { "--author", "Microsoft" }));
Expand All @@ -197,9 +197,8 @@ private static bool ValidateCommandInput(SearchCommandArgs commandArgs)
private static string GetInputParametersString(SearchCommandArgs commandArgs/*, IReadOnlyDictionary<string, string?>? templateParameters = null*/)
{
string separator = ", ";
IEnumerable<string> appliedFilters = commandArgs
.Filters
.Select(filter => $"{filter.Key.Name}='{filter.Value}'");
IEnumerable<string> appliedFilters = commandArgs.AppliedFilters
.Select(filter => $"{commandArgs.GetFilterToken(filter)}='{commandArgs.GetFilterValue(filter)}'");

//TODO: implement it for template options matching
//IEnumerable<string> appliedTemplateParameters = templateParameters?
Expand Down
4 changes: 0 additions & 4 deletions src/Microsoft.TemplateEngine.Utils/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,6 @@ static Microsoft.TemplateEngine.Utils.TemplateMatchInfoExtensions.HasShortNamePa
static Microsoft.TemplateEngine.Utils.TemplateMatchInfoExtensions.HasTypeMatch(this Microsoft.TemplateEngine.Abstractions.TemplateFiltering.ITemplateMatchInfo! templateMatchInfo) -> bool
static Microsoft.TemplateEngine.Utils.TemplateMatchInfoExtensions.HasTypeMismatch(this Microsoft.TemplateEngine.Abstractions.TemplateFiltering.ITemplateMatchInfo! templateMatchInfo) -> bool
static Microsoft.TemplateEngine.Utils.TemplateParameterExtensions.IsChoice(this Microsoft.TemplateEngine.Abstractions.ITemplateParameter! parameter) -> bool
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.AuthorFilter(string! author) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.BaselineFilter(string! baselineName) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.ClassificationFilter(string! classification) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.LanguageFilter(string! language) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.MatchesAllCriteria.get -> System.Func<Microsoft.TemplateEngine.Abstractions.TemplateFiltering.ITemplateMatchInfo!, bool>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.MatchesAtLeastOneCriteria.get -> System.Func<Microsoft.TemplateEngine.Abstractions.TemplateFiltering.ITemplateMatchInfo!, bool>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.NameFilter(string! name) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
Expand Down
4 changes: 4 additions & 0 deletions src/Microsoft.TemplateEngine.Utils/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,7 @@ Microsoft.TemplateEngine.Utils.AsyncMutex.IsLocked.get -> bool
Microsoft.TemplateEngine.Utils.IFileSystemInfoExtensions
static Microsoft.TemplateEngine.Utils.AsyncMutex.WaitAsync(string! mutexName, System.Threading.CancellationToken token) -> System.Threading.Tasks.Task<Microsoft.TemplateEngine.Utils.AsyncMutex!>!
static Microsoft.TemplateEngine.Utils.IFileSystemInfoExtensions.GetDisplayPath(this Microsoft.TemplateEngine.Abstractions.Mount.IFileSystemInfo! fileSystemInfo) -> string!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.AuthorFilter(string? author) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.BaselineFilter(string? baselineName) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.ClassificationFilter(string? classification) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
static Microsoft.TemplateEngine.Utils.WellKnownSearchFilters.LanguageFilter(string? language) -> System.Func<Microsoft.TemplateEngine.Abstractions.ITemplateInfo!, Microsoft.TemplateEngine.Abstractions.TemplateFiltering.MatchInfo?>!
Loading

0 comments on commit bcbdeb7

Please sign in to comment.