From 923a2571e1eef4fe52a3630cecde1ff03e2d38c2 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Sun, 11 Mar 2018 11:18:41 +0000 Subject: [PATCH 1/3] fix issue 807 by also trying to resolve the settings preset if the object is not resolved to a string yet. Tidy up existing logic. TODO: add test (we do not have test coverage for setting presets) --- Engine/Settings.cs | 48 ++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/Engine/Settings.cs b/Engine/Settings.cs index 35a941781..40e4043ea 100644 --- a/Engine/Settings.cs +++ b/Engine/Settings.cs @@ -690,40 +690,42 @@ internal static SettingsMode FindSettingsMode(object settings, string path, out } else { - var settingsFilePath = settingsFound as String; - if (settingsFilePath != null) - { - if (IsBuiltinSettingPreset(settingsFilePath)) - { - settingsMode = SettingsMode.Preset; - settingsFound = GetSettingPresetFilePath(settingsFilePath); - } - else - { - settingsMode = SettingsMode.File; - settingsFound = settingsFilePath; - } - } - else + if (!TryResolveSettingForStringType(settingsFound, ref settingsMode, ref settingsFound)) { if (settingsFound is Hashtable) { settingsMode = SettingsMode.Hashtable; } - else // if the provided argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject + // if the provided argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject + else if (settingsFound is PSObject settingsFoundPSObject) { - if (settingsFound is PSObject settingsFoundPSObject) - { - if (settingsFoundPSObject.BaseObject is String) - { - settingsMode = SettingsMode.File; - } - } + TryResolveSettingForStringType(settingsFoundPSObject.BaseObject, ref settingsMode, ref settingsFound); } } } return settingsMode; } + + // If the settings object is a string determine wheter it is one of the settings preset or a file path and resolve the setting in the former case. + private static bool TryResolveSettingForStringType(object settingsObject, ref SettingsMode settingsMode, ref object resolvedSettingValue) + { + if (settingsObject is string settingsString) + { + if (IsBuiltinSettingPreset(settingsString)) + { + settingsMode = SettingsMode.Preset; + resolvedSettingValue = GetSettingPresetFilePath(settingsString); + } + else + { + settingsMode = SettingsMode.File; + resolvedSettingValue = settingsString; + } + return true; + } + + return false; + } } } From 020272186f260bb5170c15b439d4d7652324bb96 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Sun, 11 Mar 2018 19:30:39 +0000 Subject: [PATCH 2/3] add test --- Tests/Engine/InvokeScriptAnalyzer.tests.ps1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 index 414e24ff9..efb9702bc 100644 --- a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 +++ b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 @@ -406,6 +406,13 @@ Describe "Test CustomizedRulePath" { Pop-Location } } + + It "resolves rule preset when passed in via pipeline" { + $warnings = 'CodeFormattingStroustrup' | ForEach-Object { + Invoke-ScriptAnalyzer -ScriptDefinition 'if ($true){}' -Settings $_ + } | Where-Object { $_.RuleName -eq 'PSUseConsistentWhitespace' } + $warnings.Count | Should -Be 1 + } It "Should use the CustomRulePath parameter" { $settings = @{ From 48153513259adff949bde323826402ba7d29b5b8 Mon Sep 17 00:00:00 2001 From: Christoph Bergmeister Date: Fri, 23 Mar 2018 19:25:12 +0000 Subject: [PATCH 3/3] address PR comment about test syntax --- Tests/Engine/InvokeScriptAnalyzer.tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 index cf301e29a..09f39243c 100644 --- a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 +++ b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 @@ -409,9 +409,9 @@ Describe "Test CustomizedRulePath" { It "resolves rule preset when passed in via pipeline" { $warnings = 'CodeFormattingStroustrup' | ForEach-Object { - Invoke-ScriptAnalyzer -ScriptDefinition 'if ($true){}' -Settings $_ - } | Where-Object { $_.RuleName -eq 'PSUseConsistentWhitespace' } + Invoke-ScriptAnalyzer -ScriptDefinition 'if ($true){}' -Settings $_} $warnings.Count | Should -Be 1 + $warnings.RuleName | Should -Be 'PSUseConsistentWhitespace' } It "Should use the CustomRulePath parameter" {