Skip to content

Add wild card support to Get-ScriptAnalyzerRule #70

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 27, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions Engine/ScriptAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// THE SOFTWARE.
//

using System.Text.RegularExpressions;
using Microsoft.Windows.Powershell.ScriptAnalyzer.Commands;
using Microsoft.Windows.Powershell.ScriptAnalyzer.Generic;
using System;
Expand Down Expand Up @@ -192,8 +193,18 @@ public IEnumerable<IRule> GetRule(string[] moduleNames, string[] ruleNames)

if (ruleNames != null)
{
results = rules.Where<IRule>(item =>
ruleNames.Contains(item.GetName(), StringComparer.OrdinalIgnoreCase));
//Check wild card input for -Name parameter and create regex match patterns
List<Regex> regexList = new List<Regex>();
foreach (string ruleName in ruleNames)
{
Regex includeRegex = new Regex(String.Format("^{0}$", Regex.Escape(ruleName).Replace(@"\*", ".*")), RegexOptions.IgnoreCase);
regexList.Add(includeRegex);
}

results = from rule in rules
from regex in regexList
where regex.IsMatch(rule.GetName())
select rule;
}
else
{
Expand Down
52 changes: 32 additions & 20 deletions Tests/Engine/GetScriptAnalyzerRule.tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ $dscIdentical = "PSDSCUseIdenticalParametersForDSC"
Describe "Test available parameters" {
$params = $sa.Parameters
Context "Name parameter" {
It "has a Name parameter" {
$params.ContainsKey("Name") | Should Be $true
It "has a RuleName parameter" {
$params.ContainsKey("RuleName") | Should Be $true
}

It "accepts string" {
$params["Name"].ParameterType.FullName | Should Be "System.String[]"
$params["RuleName"].ParameterType.FullName | Should Be "System.String[]"
}
}

Expand All @@ -32,35 +32,35 @@ Describe "Test available parameters" {
Describe "Test Name parameters" {
Context "When used correctly" {
It "works with 1 name" {
$rule = Get-ScriptAnalyzerRule -Name $singularNouns
$rule = Get-ScriptAnalyzerRule -RuleName $singularNouns
$rule.Count | Should Be 1
$rule[0].Name | Should Be $singularNouns
$rule[0].RuleName | Should Be $singularNouns
}

It "works for DSC Rule" {
$rule = Get-ScriptAnalyzerRule -Name $dscIdentical
$rule = Get-ScriptAnalyzerRule -RuleName $dscIdentical
$rule.Count | Should Be 1
$rule[0].Name | Should Be $dscIdentical
$rule[0].RuleName | Should Be $dscIdentical
}

It "works with 3 names" {
$rules = Get-ScriptAnalyzerRule -Name $approvedVerbs, $singularNouns
$rules = Get-ScriptAnalyzerRule -RuleName $approvedVerbs, $singularNouns
$rules.Count | Should Be 2
($rules | Where-Object {$_.Name -eq $singularNouns}).Count | Should Be 1
($rules | Where-Object {$_.Name -eq $approvedVerbs}).Count | Should Be 1
($rules | Where-Object {$_.RuleName -eq $singularNouns}).Count | Should Be 1
($rules | Where-Object {$_.RuleName -eq $approvedVerbs}).Count | Should Be 1
}
}

Context "When used incorrectly" {
It "1 incorrect name" {
$rule = Get-ScriptAnalyzerRule -Name "This is a wrong name"
$rule = Get-ScriptAnalyzerRule -RuleName "This is a wrong name"
$rule.Count | Should Be 0
}

It "1 incorrect and 1 correct" {
$rule = Get-ScriptAnalyzerRule -Name $singularNouns, "This is a wrong name"
$rule = Get-ScriptAnalyzerRule -RuleName $singularNouns, "This is a wrong name"
$rule.Count | Should Be 1
$rule[0].Name | Should Be $singularNouns
$rule[0].RuleName | Should Be $singularNouns
}
}
}
Expand All @@ -86,25 +86,25 @@ Describe "Test RuleExtension" {
}

It "with Name of a built-in rules" {
$ruleExtension = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\CommunityAnalyzerRules\CommunityAnalyzerRules.psm1 -Name $singularNouns
$ruleExtension = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\CommunityAnalyzerRules\CommunityAnalyzerRules.psm1 -RuleName $singularNouns
$ruleExtension.Count | Should Be 1
$ruleExtension[0].Name | Should Be $singularNouns
$ruleExtension[0].RuleName | Should Be $singularNouns
}

It "with Names of built-in, DSC and non-built-in rules" {
$ruleExtension = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\CommunityAnalyzerRules\CommunityAnalyzerRules.psm1 -Name $singularNouns, $measureRequired, $dscIdentical
$ruleExtension = Get-ScriptAnalyzerRule -CustomizedRulePath $directory\CommunityAnalyzerRules\CommunityAnalyzerRules.psm1 -RuleName $singularNouns, $measureRequired, $dscIdentical
$ruleExtension.Count | Should be 3
($ruleExtension | Where-Object {$_.Name -eq $measureRequired}).Count | Should Be 1
($ruleExtension | Where-Object {$_.Name -eq $singularNouns}).Count | Should Be 1
($ruleExtension | Where-Object {$_.Name -eq $dscIdentical}).Count | Should Be 1
($ruleExtension | Where-Object {$_.RuleName -eq $measureRequired}).Count | Should Be 1
($ruleExtension | Where-Object {$_.RuleName -eq $singularNouns}).Count | Should Be 1
($ruleExtension | Where-Object {$_.RuleName -eq $dscIdentical}).Count | Should Be 1
}
}

Context "When used incorrectly" {
It "file cannot be found" {
$wrongFile = Get-ScriptAnalyzerRule -CustomizedRulePath "This is a wrong rule" 3>&1
($wrongFile | Select-Object -First 1) | Should Match "Cannot find rule extension 'This is a wrong rule'."
($wrongFile | Where-Object {$_.Name -eq $singularNouns}).Count | Should Be 1
($wrongFile | Where-Object {$_.RuleName -eq $singularNouns}).Count | Should Be 1
}

}
Expand All @@ -120,4 +120,16 @@ Describe "TestSeverity" {
$rules = Get-ScriptAnalyzerRule -Severity Error,Information
$rules.Count | Should be 8
}
}

Describe "TestWildCard" {
It "filters rules based on the -RuleName wild card input" {
$rules = Get-ScriptAnalyzerRule -RuleName PSDSC*
$rules.Count | Should be 4
}

It "filters rules based on wild card input and severity"{
$rules = Get-ScriptAnalyzerRule -RuleName PSDSC* -Severity Information
$rules.Count | Should be 2
}
}