Skip to content

Add feature to pass parameters to rules from settings file #611

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 9 commits into from
Sep 7, 2016
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
6 changes: 6 additions & 0 deletions Engine/Commands/InvokeScriptAnalyzerCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,12 @@ public SwitchParameter SaveDscDependency
/// </summary>
protected override void BeginProcessing()
{
// Initialize helper
Helper.Instance = new Helper(
SessionState.InvokeCommand,
this);
Helper.Instance.Initialize();

string[] rulePaths = Helper.ProcessCustomRulePaths(customRulePath,
this.SessionState, recurseCustomRulePath);

Expand Down
103 changes: 79 additions & 24 deletions Engine/Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public class Helper
private IOutputWriter outputWriter;
private Object getCommandLock = new object();
private readonly static Version minSupportedPSVersion = new Version(3, 0);
private Dictionary<string, Dictionary<string, object>> ruleArguments;

#endregion

Expand Down Expand Up @@ -113,14 +114,14 @@ internal set
/// </summary>
private Helper()
{

}

/// <summary>
/// Initializes the Helper class.
/// </summary>
/// <param name="invokeCommand">
/// A CommandInvocationIntrinsics instance for use in gathering
/// A CommandInvocationIntrinsics instance for use in gathering
/// information about available commands and aliases.
/// </param>
/// <param name="outputWriter">
Expand All @@ -145,6 +146,7 @@ public void Initialize()
AliasToCmdletDictionary = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
KeywordBlockDictionary = new Dictionary<String, List<Tuple<int, int>>>(StringComparer.OrdinalIgnoreCase);
VariableAnalysisDictionary = new Dictionary<Ast, VariableAnalysis>();
ruleArguments = new Dictionary<string, Dictionary<string, object>>(StringComparer.OrdinalIgnoreCase);

IEnumerable<CommandInfo> aliases = this.invokeCommand.GetCommands("*", CommandTypes.Alias, true);

Expand All @@ -163,6 +165,59 @@ public void Initialize()
}
}

/// <summary>
/// Returns all the rule arguments
/// </summary>
/// <returns>Dictionary that maps between rule name to their named arguments</returns>
public Dictionary<string, Dictionary<string, object>> GetRuleArguments()
{
return ruleArguments;
}

/// <summary>
/// Get the parameters corresponding to the given rule name
/// </summary>
/// <param name="ruleName"></param>
/// <returns>Dictionary of argument names mapped to values. If ruleName is not a valid key, returns null</returns>
public Dictionary<string, object> GetRuleArguments(string ruleName)
{
if (ruleArguments.ContainsKey(ruleName))
{
return ruleArguments[ruleName];
}
return null;
}

/// <summary>
/// Sets the arguments for consumption by rules
/// </summary>
/// <param name="ruleArgs">A hashtable with rule names as keys</param>
public void SetRuleArguments(Dictionary<string, object> ruleArgs)
{
if (ruleArgs == null)
{
return;
}

if (ruleArgs.Comparer != StringComparer.OrdinalIgnoreCase)
{
throw new ArgumentException(
"Input dictionary should have OrdinalIgnoreCase comparer.",
"ruleArgs");
}
var ruleArgsDict = new Dictionary<string, Dictionary<string, object>>();
foreach (var rule in ruleArgs.Keys)
{
var argsDict = ruleArgs[rule] as Dictionary<string, object>;
if (argsDict == null)
{
return;
}
ruleArgsDict[rule] = argsDict;
}
ruleArguments = ruleArgsDict;
}

/// <summary>
/// Given a cmdlet, return the list of all the aliases.
/// Also include the original name in the list.
Expand Down Expand Up @@ -231,7 +286,7 @@ public bool IsDscResourceModule(string filePath)

return false;
}

/// <summary>
/// Gets the module manifest
/// </summary>
Expand Down Expand Up @@ -471,13 +526,13 @@ private string NameWithoutScope(string name, string[] scopes)
if (String.IsNullOrWhiteSpace(name) || scopes == null)
{
return name;
}
}

// checks whether function name starts with scope
foreach (string scope in scopes)
{
// trim the scope part
if (name.IndexOf(scope, StringComparison.OrdinalIgnoreCase) == 0)
if (name.IndexOf(scope, StringComparison.OrdinalIgnoreCase) == 0)

{
return name.Substring(scope.Length);
Expand Down Expand Up @@ -598,7 +653,7 @@ public bool PositionalParameterUsed(CommandAst cmdAst, bool moreThanThreePositio
{
arguments += 1;
}

}

// if not the first element in a pipeline, increase the number of arguments by 1
Expand Down Expand Up @@ -724,10 +779,10 @@ public IScriptExtent GetScriptExtentForFunctionName(FunctionDefinitionAst functi
if (null == functionDefinitionAst)
{
return null;
}
}
var funcNameTokens = Tokens.Where(
token =>
ContainsExtent(functionDefinitionAst.Extent, token.Extent)
token =>
ContainsExtent(functionDefinitionAst.Extent, token.Extent)
&& token.Text.Equals(functionDefinitionAst.Name));
var funcNameToken = funcNameTokens.FirstOrDefault();
return funcNameToken == null ? null : funcNameToken.Extent;
Expand Down Expand Up @@ -919,7 +974,7 @@ internal VariableAnalysis InitializeVariableAnalysisHelper(Ast ast, VariableAnal
/// <param name="classes"></param>
/// <param name="scriptAst"></param>
/// <returns></returns>

#if PSV3

public string GetTypeFromReturnStatementAst(Ast funcAst, ReturnStatementAst ret)
Expand Down Expand Up @@ -990,7 +1045,7 @@ public string GetTypeFromReturnStatementAst(Ast funcAst, ReturnStatementAst ret,
/// <param name="scopeAst"></param>
/// <param name="classes"></param>
/// <returns></returns>

#if PSV3

public string GetTypeFromMemberExpressionAst(MemberExpressionAst memberAst, Ast scopeAst)
Expand Down Expand Up @@ -1050,9 +1105,9 @@ public string GetTypeFromMemberExpressionAst(MemberExpressionAst memberAst, Ast
/// <param name="psClass"></param>
/// <param name="analysisDetails"></param>
/// <returns></returns>

#if PSV3

internal string GetTypeFromMemberExpressionAstHelper(MemberExpressionAst memberAst, VariableAnalysisDetails analysisDetails)

#else
Expand Down Expand Up @@ -1241,8 +1296,8 @@ internal List<RuleSuppression> GetSuppressionsClass(TypeDefinitionAst typeAst)

if (typeAst.Members == null)
{
return result;
}
return result;
}

foreach (var member in typeAst.Members)
{
Expand Down Expand Up @@ -1469,11 +1524,11 @@ public static string[] ProcessCustomRulePaths(string[] rulePaths, SessionState s
}
outPaths.Add(path);
}

return outPaths.ToArray();

}

/// <summary>
/// Check if the function name starts with one of potentailly state changing verbs
/// </summary>
Expand Down Expand Up @@ -1671,8 +1726,8 @@ public static IEnumerable<string> GetDeprecatedModuleManifestKeys()

/// <summary>
/// Get a mapping between string type keys and StatementAsts from module manifest hashtable ast
///
/// This is a workaround as SafeGetValue is not supported on PS v5 and below.
///
/// This is a workaround as SafeGetValue is not supported on PS v4 and below.
/// </summary>
/// <param name="hast">Hashtable Ast obtained from module manifest</param>
/// <returns>A dictionary that maps string keys to values of StatementAst type</returns>
Expand All @@ -1693,7 +1748,7 @@ private static Dictionary<string, StatementAst> GetMapFromHashtableAst(Hashtable

/// <summary>
/// Checks if the version is supported
///
///
/// PowerShell versions with Major greater than 3 are supported
/// </summary>
/// <param name="version">PowerShell version</param>
Expand Down Expand Up @@ -1910,7 +1965,7 @@ private object VisitStatementHelper(StatementAst statementAst)
#if PSV3

statementAst.Visit(this);

#else

TypeDefinitionAst typeAst = statementAst as TypeDefinitionAst;
Expand Down Expand Up @@ -2664,7 +2719,7 @@ static FindPipelineOutput()
/// Find the pipeline output
/// </summary>
/// <param name="ast"></param>

#if PSV3

public FindPipelineOutput(FunctionDefinitionAst ast)
Expand Down Expand Up @@ -2695,7 +2750,7 @@ public FindPipelineOutput(FunctionDefinitionAst ast, IEnumerable<TypeDefinitionA
/// Get list of outputTypes from functiondefinitionast funcast
/// </summary>
/// <returns></returns>

#if PSV3

public static List<Tuple<string, StatementAst>> OutputTypes(FunctionDefinitionAst funcAst)
Expand Down
Loading