From e16b62e2dbdf3ddf903db3983174005f65ee8243 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Sat, 29 Dec 2018 10:25:28 +0100 Subject: [PATCH 1/8] Fixing strings --- PSFramework/changelog.md | 4 ++++ PSFramework/internal/scripts/strings.ps1 | 7 +++++-- PSFramework/internal/tepp/tepp-assignment.ps1 | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/PSFramework/changelog.md b/PSFramework/changelog.md index 78009a04..741f40cf 100644 --- a/PSFramework/changelog.md +++ b/PSFramework/changelog.md @@ -1,4 +1,8 @@ # CHANGELOG +## + - Fix: Missing localized strings + - Fix: Missing tab completion for modules that register localized strings + ## 0.10.30.165 : 2018-12-01 - New: Command Join-PSFPath performs multi-segment path joins and path normalization - New: Command Remove-PSFAlias deletes global aliases diff --git a/PSFramework/internal/scripts/strings.ps1 b/PSFramework/internal/scripts/strings.ps1 index 36869f41..fe3fd3f2 100644 --- a/PSFramework/internal/scripts/strings.ps1 +++ b/PSFramework/internal/scripts/strings.ps1 @@ -1,4 +1,7 @@ -Import-LocalizedString -Path (Resolve-Path "$script:ModuleRoot\en-us\stringsAssembly.psd1") -Module PSFramework -Language 'en-US' - +# Load English Language Files +foreach ($item in (Resolve-Path "$script:ModuleRoot\en-us\*.psd1")) +{ + Import-LocalizedString -Path $item -Module PSFramework -Language 'en-US' +} $script:strings = Get-PSFLocalizedString -Module PSFramework \ No newline at end of file diff --git a/PSFramework/internal/tepp/tepp-assignment.ps1 b/PSFramework/internal/tepp/tepp-assignment.ps1 index 8db482a9..a7887570 100644 --- a/PSFramework/internal/tepp/tepp-assignment.ps1 +++ b/PSFramework/internal/tepp/tepp-assignment.ps1 @@ -28,6 +28,7 @@ Register-PSFTeppArgumentCompleter -Command Get-PSFLicense -Parameter Filter -Nam #region Localization Register-PSFTeppArgumentCompleter -Command Import-PSFLocalizedString -Parameter Language -Name 'PSFramework-LanguageNames' +Register-PSFTeppArgumentCompleter -Command Get-PSFLocalizedString -Parameter Module -Name 'PSFramework-LocalizedStrings-Modules' Register-PSFTeppArgumentCompleter -Command Get-PSFLocalizedString -Parameter Name -Name 'PSFramework-LocalizedStrings-Names' #endregion Localization From dd58092913043e7baef2bd57dce2022399368d72 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Sat, 29 Dec 2018 10:30:11 +0100 Subject: [PATCH 2/8] Adding tepp for Select-PSFObject --- PSFramework/internal/tepp/scripts/input.ps1 | 160 ++++++++++++++++++ PSFramework/internal/tepp/tepp-assignment.ps1 | 6 + 2 files changed, 166 insertions(+) create mode 100644 PSFramework/internal/tepp/scripts/input.ps1 diff --git a/PSFramework/internal/tepp/scripts/input.ps1 b/PSFramework/internal/tepp/scripts/input.ps1 new file mode 100644 index 00000000..f618db2c --- /dev/null +++ b/PSFramework/internal/tepp/scripts/input.ps1 @@ -0,0 +1,160 @@ +Register-PSFTeppScriptblock -Name PSFramework-Input-Object -ScriptBlock { + [System.Management.Automation.Language.PipelineAst]$pipelineAst = $commandAst.parent + $index = $pipelineAst.PipelineElements.IndexOf($commandAst) + + #region If it's the first command + if ($index -lt 1) + { + return + } + #endregion If it's the first command + + $properties = @() + $constraintsPositive = @() + + #region Process pre-commands + $inputIndex = $index - 1 + :main while ($true) + { + if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) + { + # Resolve command and fail if it breaks + $command = Get-Command $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -ErrorAction Ignore + if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } + if (-not $command) { break } + + switch ($command.Name) + { + 'Where-Object' { $inputIndex = $inputIndex - 1; continue main } + 'Tee-Object' { $inputIndex = $inputIndex - 1; continue main } + #region Select-Object + 'Select-Object' + { + $firstAst = $pipelineAst.PipelineElements[$inputIndex].CommandElements | Where-Object { $_ -is [System.Management.Automation.Language.ArrayLiteralAst] } | Select-Object -First 1 + + foreach ($element in $firstAst.Elements) + { + switch ($element.GetType().FullName) + { + 'System.Management.Automation.Language.StringConstantExpressionAst' + { + $constraintsPositive += $element.Value + if ($element.Value -notmatch "\*") { $properties += $element.Value } + } + 'System.Management.Automation.Language.HashtableAst' + { + $constraintsPositive += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + $properties += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + } + } + } + $inputIndex = $inputIndex - 1; + continue main + } + #endregion Select-Object + #region Select-PSFObject + 'Select-PSFObject' + { + $firstAst = $pipelineAst.PipelineElements[$inputIndex].CommandElements | Where-Object { $_ -is [System.Management.Automation.Language.ArrayLiteralAst] } | Select-Object -First 1 + foreach ($element in $firstAst.Elements) + { + switch ($element.GetType().FullName) + { + "System.Management.Automation.Language.StringConstantExpressionAst" + { + $par = [PSFramework.Parameter.SelectParameter]$element.Value + if ($par.Value -match "\*") { $constraintsPositive += $par.Value } + else + { + if ($par.Value -is [System.String]) + { + $properties += $par.Value + $constraintsPositive += $par.Value + } + else + { + $properties += $par.Value["Name"] + $constraintsPositive += $par.Value["Name"] + } + } + } + "System.Management.Automation.Language.HashtableAst" + { + $properties += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + $constraintsPositive += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + } + } + } + $inputIndex = $inputIndex - 1; + } + #endregion Select-PSFObject + default { break main } + } + } + + else + { + break + } + } + + # Catch moving through _all_ options in the pipeline + if ($inputIndex -lt 0) { return $properties } + #endregion Process pre-commands + + + #region Input from command + if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) + { + if ($command = Get-Command $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -ErrorAction Ignore) + { + switch ($command.Name) + { + #region Default for commands + default + { + foreach ($type in $command.OutputType.Type) + { + switch ($type.FullName) + { + 'System.IO.FileInfo' + { + $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name + $properties += 'PSChildName', 'PSDrive', 'PSIsContainer', 'PSParentPath', 'PSPath', 'PSProvider', 'BaseName' + break + } + 'System.IO.DirectoryInfo' + { + $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name + $properties += 'PSChildName', 'PSDrive', 'PSIsContainer', 'PSParentPath', 'PSPath', 'PSProvider', 'BaseName', 'VersionInfo' + break + } + default { $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name } + } + } + } + #endregion Default for commands + } + } + } + #endregion Input from command + + #region Input from Variable + if ($pipelineAst.PipelineElements[$inputIndex].Expression -and $pipelineAst.PipelineElements[0].Expression[0].VariablePath) + { + $properties += ((Get-Variable -Name $pipelineAst.PipelineElements[0].Expression[0].VariablePath.UserPath -ValueOnly) | Select-Object -First 1 | Get-Member -MemberType Properties).Name + } + #endregion Input from Variable + + $properties | Select-Object -Unique | Sort-Object | ForEach-Object { + if (-not $constraintsPositive) { $_ } + foreach ($constraint in $constraintsPositive) + { + if ($_ -like $constraint) + { + $_ + break + } + } + } +} \ No newline at end of file diff --git a/PSFramework/internal/tepp/tepp-assignment.ps1 b/PSFramework/internal/tepp/tepp-assignment.ps1 index a7887570..50d8f066 100644 --- a/PSFramework/internal/tepp/tepp-assignment.ps1 +++ b/PSFramework/internal/tepp/tepp-assignment.ps1 @@ -66,5 +66,11 @@ Register-PSFTeppArgumentCompleter -Command Set-PSFTeppResult -Parameter TabCompl #endregion Tab Completion #region Utility +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter Property -Name PSFramework-Input-Object +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExpandProperty -Name PSFramework-Input-Object +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExcludeProperty -Name PSFramework-Input-Object +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowProperty -Name PSFramework-Input-Object +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowExcludeProperty -Name PSFramework-Input-Object + Register-PSFTeppArgumentCompleter -Command Resolve-PSFPath -Parameter Provider -Name 'PSFramework-utility-psprovider' #endregion Utility \ No newline at end of file From 4e669762bbb07b01e02584b595361f85d5d8a37e Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Mon, 31 Dec 2018 10:53:46 +0100 Subject: [PATCH 3/8] Adding initialization logic --- PSFramework/internal/scripts/environment.ps1 | 5 +- PSFramework/internal/scripts/removalEvent.ps1 | 1 + PSFramework/internal/tepp/scripts/input.ps1 | 5 +- library/PSFramework/PSFCore/PSFCoreHost.cs | 28 +++++++++ .../Runspace/RunspaceBoundValue.cs | 61 ++++++++++++++++++- library/PSFramework/Runspace/RunspaceHost.cs | 5 ++ library/PSFramework/Utility/UtilityHost.cs | 11 ++++ 7 files changed, 111 insertions(+), 5 deletions(-) diff --git a/PSFramework/internal/scripts/environment.ps1 b/PSFramework/internal/scripts/environment.ps1 index ffaa24e0..796380b9 100644 --- a/PSFramework/internal/scripts/environment.ps1 +++ b/PSFramework/internal/scripts/environment.ps1 @@ -87,4 +87,7 @@ if (($PSVersionTable.PSVersion.Major -ge 6) -and ($PSVersionTable.OS -notlike "* if (-not ([PSFramework.Message.LogHost]::LoggingPath)) { [PSFramework.Message.LogHost]::LoggingPath = $script:path_Logging } -[PSFramework.PSFCore.PSFCoreHost]::ModuleRoot = $script:ModuleRoot \ No newline at end of file +[PSFramework.PSFCore.PSFCoreHost]::ModuleRoot = $script:ModuleRoot +# Run the library initialization logic +# Needed before the configuration system loads +[PSFramework.PSFCore.PSFCoreHost]::Initialize() \ No newline at end of file diff --git a/PSFramework/internal/scripts/removalEvent.ps1 b/PSFramework/internal/scripts/removalEvent.ps1 index 7b0f57c0..8abb4b8f 100644 --- a/PSFramework/internal/scripts/removalEvent.ps1 +++ b/PSFramework/internal/scripts/removalEvent.ps1 @@ -4,6 +4,7 @@ $PSF_OnRemoveScript = { if ([runspace]::DefaultRunspace.Id -eq 1) { Get-PSFRunspace | Stop-PSFRunspace + [PSFramework.PSFCore.PSFCoreHost]::Uninitialize() } # Properly disconnect all remote sessions still held open diff --git a/PSFramework/internal/tepp/scripts/input.ps1 b/PSFramework/internal/tepp/scripts/input.ps1 index f618db2c..38f5cb8a 100644 --- a/PSFramework/internal/tepp/scripts/input.ps1 +++ b/PSFramework/internal/tepp/scripts/input.ps1 @@ -19,7 +19,9 @@ if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) { # Resolve command and fail if it breaks - $command = Get-Command $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -ErrorAction Ignore + $commandString = $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value + if ($commandString -eq "?") { $commandString = (Get-Alias -Name "?").ResolvedCommand.Name } + $command = Get-Command $commandString -ErrorAction Ignore if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } if (-not $command) { break } @@ -27,6 +29,7 @@ { 'Where-Object' { $inputIndex = $inputIndex - 1; continue main } 'Tee-Object' { $inputIndex = $inputIndex - 1; continue main } + 'Sort-Object' { $inputIndex = $inputIndex - 1; continue main } #region Select-Object 'Select-Object' { diff --git a/library/PSFramework/PSFCore/PSFCoreHost.cs b/library/PSFramework/PSFCore/PSFCoreHost.cs index 588db0a6..47e325e5 100644 --- a/library/PSFramework/PSFCore/PSFCoreHost.cs +++ b/library/PSFramework/PSFCore/PSFCoreHost.cs @@ -29,5 +29,33 @@ public static string ModuleRoot } } private static string _ModuleRoot; + + /// + /// Initializes the PSFramework library. + /// Required for some components to work correctly. + /// + public static void Initialize() + { + if (_Initialized) + return; + _Initialized = true; + + // Initialization logic goes here + } + private static bool _Initialized = false; + + /// + /// Reverses the initialization of the PSFramework library. + /// Should be called when destroying the main runspace + /// + public static void Uninitialize() + { + if (!_Initialized) + return; + + // De-Initiialization logic goes here + + _Initialized = false; + } } } diff --git a/library/PSFramework/Runspace/RunspaceBoundValue.cs b/library/PSFramework/Runspace/RunspaceBoundValue.cs index 06fe3847..e3bd1c2c 100644 --- a/library/PSFramework/Runspace/RunspaceBoundValue.cs +++ b/library/PSFramework/Runspace/RunspaceBoundValue.cs @@ -1,4 +1,5 @@ -using System; +using PSFramework.Utility; +using System; using System.Collections.Generic; using System.Linq; using System.Management.Automation.Runspaces; @@ -10,7 +11,7 @@ namespace PSFramework.Runspace /// /// Wrapper class that offers the tools to make Values runspace specific /// - public class RunspaceBoundValue + public class RunspaceBoundValue : IDisposable { /// /// Whether the defautl value should be offered when asking from a runspace without custom settings @@ -49,9 +50,63 @@ public object Value } } + /// + /// Removes all value entries whose corresponding Runspace has been destroyed + /// public void PurgeExpired() { - System.Management.Automation.Runspaces.Runspace.GetRunspaces(null); + // Store IDs first, so parallel access is not an issue and a new value gets accidentally discarded + Guid[] IDs = Values.Keys.ToArray(); + ICollection runspaces = UtilityHost.GetRunspaces(); + ICollection runspaceIDs = (ICollection)runspaces.Select(o => o.InstanceId); + + foreach (Guid ID in IDs) + if (!runspaceIDs.Contains(ID)) + Values.Remove(ID); + } + + /// + /// Destruction logic, eliminating all data stored in the object. + /// Since handles to this object are automatically stored and maintained, it is impossible to otherwise guarantee releasing the object's data for the GC. + /// + public void Dispose() + { + Values = new Dictionary(); + DefaultValue = null; + RunspaceHost._RunspaceBoundValues.Remove(this); + } + + /// + /// Create an empty runspace bound value object + /// + public RunspaceBoundValue() + : this(null, true) + { + + } + + /// + /// Create a runspace bound value object with its initial value + /// + /// The object to set as the initial value + public RunspaceBoundValue(object Value) + : this(Value, true) + { + + } + + /// + /// Create a runspace bound value object with its initial value + /// + /// The object to set as the initial value + /// Whether the initial / default value should be offered when accessed from runspaces that do not have a runspace-local value + public RunspaceBoundValue(object Value, bool OfferDefaultValue) + { + this.Value = Value; + this.OfferDefaultValue = OfferDefaultValue; + + // Add to central list of runspacebound values + RunspaceHost._RunspaceBoundValues.Add(this); } } } diff --git a/library/PSFramework/Runspace/RunspaceHost.cs b/library/PSFramework/Runspace/RunspaceHost.cs index c2725dd2..ddf329f6 100644 --- a/library/PSFramework/Runspace/RunspaceHost.cs +++ b/library/PSFramework/Runspace/RunspaceHost.cs @@ -16,5 +16,10 @@ public static class RunspaceHost /// The dictionary containing the definitive list of unique Runspace /// public static Dictionary Runspaces = new Dictionary(); + + /// + /// List of all runspace bound values in use + /// + internal static List _RunspaceBoundValues = new List(); } } diff --git a/library/PSFramework/Utility/UtilityHost.cs b/library/PSFramework/Utility/UtilityHost.cs index a39c6913..c8ee29ad 100644 --- a/library/PSFramework/Utility/UtilityHost.cs +++ b/library/PSFramework/Utility/UtilityHost.cs @@ -235,6 +235,17 @@ public static object GetExecutionContextFromTLS() return method.Invoke(null, BindingFlags.NonPublic | BindingFlags.Static, null, null, System.Globalization.CultureInfo.CurrentCulture); } + /// + /// Returns the list of runspaces available in the process + /// + /// The lists of currently known runspaces + public static ICollection GetRunspaces() + { + Type runspaceType = typeof(System.Management.Automation.Runspaces.Runspace); + MethodInfo method = runspaceType.GetMethod("get_RunspaceList", BindingFlags.Static | BindingFlags.NonPublic); + return (ICollection < System.Management.Automation.Runspaces.Runspace > )method.Invoke(null, null); + } + /// /// Removes an alias from the global list of aliases /// From fe88ef9a69a3ac8b35765d9c5e365420b02cc7b4 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Thu, 10 Jan 2019 14:01:07 +0100 Subject: [PATCH 4/8] implementing strings into message system help still missing --- PSFramework/bin/PSFramework.dll | Bin 102400 -> 103936 bytes PSFramework/bin/PSFramework.pdb | Bin 261632 -> 265728 bytes PSFramework/bin/PSFramework.xml | 90 +++++- PSFramework/changelog.md | 8 + .../flowcontrol/Stop-PSFFunction.ps1 | 264 ++++++++++-------- .../Import-PSFLocalizedString.ps1 | 11 +- .../internal/configurations/general.ps1 | 3 +- .../localization/Import-LocalizedString.ps1 | 11 +- .../loggingProviders/filesystem.provider.ps1 | 2 +- .../loggingProviders/gelf.provider.ps1 | 4 +- .../loggingProviders/logfile.provider.ps1 | 20 +- PSFramework/internal/scripts/strings.ps1 | 2 +- .../Commands/WritePSFMessageCommand.cs | 42 ++- .../PSFramework/Localization/LocalString.cs | 25 ++ .../Localization/LocalizationHost.cs | 39 ++- library/PSFramework/Message/LogEntry.cs | 50 +++- library/PSFramework/Message/LogHost.cs | 28 +- 17 files changed, 449 insertions(+), 150 deletions(-) diff --git a/PSFramework/bin/PSFramework.dll b/PSFramework/bin/PSFramework.dll index b6a1986970d6e49b792176ac74d09d121c5cfb97..1c57330c85b0bbf4a7b253f88007b9f1d318ce6d 100644 GIT binary patch delta 36588 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 >;}YwI8Jy7- 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 SlSM0U+~vAL{!6YYxBoA|O3*L> delta 35241 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 Ko24DadH(~OG(r#n diff --git a/PSFramework/bin/PSFramework.xml b/PSFramework/bin/PSFramework.xml index 09f7c0dc..6820fa05 100644 --- a/PSFramework/bin/PSFramework.xml +++ b/PSFramework/bin/PSFramework.xml @@ -384,6 +384,17 @@ The message to write/log. The function name and timestamp will automatically be prepended. + + + A stored string to use to write the log. + Used in combination with the localization component. + + + + + Values to format into the localized string referred to in String. + + Tags to add to the message written. @@ -528,6 +539,11 @@ The input message with the error content included if desired + + + Unified representation of the various ways messages can be specified + + The final message to use for internal logging @@ -1223,11 +1239,28 @@ The language to display text with by default. Will use thread information if not set. + + + The default language to log in. + + List of strings registered + + + Mapping module name to the language to use for logging. + + + + + Configure the module specific logging language. + + The module to configure + The language to set. Leave empty to remove entry. + Writes a localized string. If needed creates it, then sets the text of the specified language. @@ -1252,6 +1285,13 @@ The name of the string to request. Include the modulename The localized string requested. Empty string if nothing. + + + Reads a localized string from the list of available strings for the purpose of logging + + The name of the string to request. Include the modulename + The localized string requested. Empty string if nothing. + A string used for localized text @@ -1277,6 +1317,11 @@ The actual string value of the text + + + The string value to use for logging purposes + + Sets the text for a specific language @@ -1734,11 +1779,17 @@ An individual entry for the message log - + The message logged + + + The message to use for logging purposes. + Using the localized string feature, this allows maintaining uniform logging languages while still supporting localized + + What kind of entry was this? @@ -1809,12 +1860,22 @@ An error record associated with the message. + + + The string key to use when retrieving localized strings. + + + + + Values to format into the localized string + + Creates an empty log entry - + Creates a filled out log entry @@ -1833,6 +1894,8 @@ The callstack that triggered the write. The user responsible for running the code that is writing the message. An associated error item. + The string key to use for retrieving localized strings + The values to format into the localized string @@ -1986,6 +2049,29 @@ An associated error record The entry that is being written + + + Write a new entry to the log + + The message to log + The type of the message logged + When was the message generated + What function wrote the message + What module did the function writing this message come from? + The tags that were applied to the message + At what level was the function written + The runspace the message is coming from + The computer the message was generated on + The file from which the message was written + The line on which the message was written + The object associated with a given message. + The callstack at the moment the message was written. + The name of the user under which the code being executed + The string key to use for retrieving localized strings + The values to format into the localized string + An associated error record + The entry that is being written + Condition and logic to be executed on message events diff --git a/PSFramework/changelog.md b/PSFramework/changelog.md index 78009a04..51eca557 100644 --- a/PSFramework/changelog.md +++ b/PSFramework/changelog.md @@ -1,4 +1,12 @@ # CHANGELOG +## ??? + - Upd: Write-PSFMessage supports localized strings through the `-String` and `-StringValues` parameters + - Upd: Stop-PSFFunction supports localized strings through the `-String` and `-StringValues` parameters + - Upd: Message component supports localized strings + - Upd: Logging component logs in separate language than localized messages to screen / userinteraction + - Upd: Import-PSFLocalizedString now accepts wildcard path patterns that resovle to multiple files. + - fix: Missing localization strings + ## 0.10.30.165 : 2018-12-01 - New: Command Join-PSFPath performs multi-segment path joins and path normalization - New: Command Remove-PSFAlias deletes global aliases diff --git a/PSFramework/functions/flowcontrol/Stop-PSFFunction.ps1 b/PSFramework/functions/flowcontrol/Stop-PSFFunction.ps1 index 4812aaaf..13d1d192 100644 --- a/PSFramework/functions/flowcontrol/Stop-PSFFunction.ps1 +++ b/PSFramework/functions/flowcontrol/Stop-PSFFunction.ps1 @@ -1,129 +1,142 @@ function Stop-PSFFunction { - <# - .SYNOPSIS - Function that interrupts a function. - - .DESCRIPTION - Function that interrupts a function. - - This function is a utility function used by other functions to reduce error catching overhead. - It is designed to allow gracefully terminating a function with a warning by default and also allow opt-in into terminating errors. - It also allows simple integration into loops. - - Note: - When calling this function with the intent to terminate the calling function in non-ExceptionEnabled mode too, you need to add a return below the call. - - For a more detailed explanation - including commented full-scale implementation examples - see the associated help article: - Get-Help about_psf_flowcontrol - - .PARAMETER Message - A message to pass along, explaining just what the error was. - - .PARAMETER EnableException - Replaces user friendly yellow warnings with bloody red exceptions of doom! - Use this if you want the function to throw terminating errors you want to catch. - - .PARAMETER Category - What category does this termination belong to? - Is automatically set when passing an error record. Helps with differentiating exceptions without having to resort to text parsing. - - .PARAMETER ErrorRecord - An option to include an inner exception in the error record (and in the exception thrown, if one is thrown). - Use this, whenever you call Stop-PSFFunction in a catch block. - - Note: - Pass the full error record, not just the exception. - - .PARAMETER Tag - Tags to add to the message written. - This allows filtering and grouping by category of message, targeting specific messages. - - .PARAMETER FunctionName - The name of the function to crash. - This parameter is very optional, since it automatically selects the name of the calling function. - The function name is used as part of the errorid. - That in turn allows easily figuring out, which exception belonged to which function when checking out the $error variable. - - .PARAMETER ModuleName - The name of the module, the function to be crashed is part of. - This parameter is very optional, since it automatically selects the name of the calling function. - - .PARAMETER File - The file in which Stop-PSFFunction was called. - Will be automatically set, but can be overridden when necessary. +<# + .SYNOPSIS + Function that interrupts a function. + + .DESCRIPTION + Function that interrupts a function. + + This function is a utility function used by other functions to reduce error catching overhead. + It is designed to allow gracefully terminating a function with a warning by default and also allow opt-in into terminating errors. + It also allows simple integration into loops. + + Note: + When calling this function with the intent to terminate the calling function in non-ExceptionEnabled mode too, you need to add a return below the call. + + For a more detailed explanation - including commented full-scale implementation examples - see the associated help article: + Get-Help about_psf_flowcontrol + + .PARAMETER Message + A message to pass along, explaining just what the error was. + + .PARAMETER String + A stored string to use to write the log. + Used in combination with the localization component. + For more details see the help on Import-PSFLocalizedString and Get-PSFLocalizedString. + + .PARAMETER StringValues + Values to format into the localized string referred to in the -String parameter. + + .PARAMETER EnableException + Replaces user friendly yellow warnings with bloody red exceptions of doom! + Use this if you want the function to throw terminating errors you want to catch. + + .PARAMETER Category + What category does this termination belong to? + Is automatically set when passing an error record. Helps with differentiating exceptions without having to resort to text parsing. + + .PARAMETER ErrorRecord + An option to include an inner exception in the error record (and in the exception thrown, if one is thrown). + Use this, whenever you call Stop-PSFFunction in a catch block. + + Note: + Pass the full error record, not just the exception. + + .PARAMETER Tag + Tags to add to the message written. + This allows filtering and grouping by category of message, targeting specific messages. + + .PARAMETER FunctionName + The name of the function to crash. + This parameter is very optional, since it automatically selects the name of the calling function. + The function name is used as part of the errorid. + That in turn allows easily figuring out, which exception belonged to which function when checking out the $error variable. + + .PARAMETER ModuleName + The name of the module, the function to be crashed is part of. + This parameter is very optional, since it automatically selects the name of the calling function. + + .PARAMETER File + The file in which Stop-PSFFunction was called. + Will be automatically set, but can be overridden when necessary. + + .PARAMETER Line + The line on which Stop-PSFFunction was called. + Will be automatically set, but can be overridden when necessary. + + .PARAMETER Exception + Allows specifying an inner exception as input object. This will be passed on to the logging and used for messages. + When specifying both ErrorRecord AND Exception, Exception wins, but ErrorRecord is still used for record metadata. + + .PARAMETER OverrideExceptionMessage + Disables automatic appending of exception messages. + Use in cases where you already have a speaking message interpretation and do not need the original message. + + .PARAMETER Target + The object that was processed when the error was thrown. + For example, if you were trying to process a Database Server object when the processing failed, add the object here. + This object will be in the error record (which will be written, even in non-silent mode, just won't show it). + If you specify such an object, it becomes simple to actually figure out, just where things failed at. + + .PARAMETER Continue + This will cause the function to call continue while not running with exceptions enabled (-EnableException). + Useful when mass-processing items where an error shouldn't break the loop. + + .PARAMETER SilentlyContinue + This will cause the function to call continue while running with exceptions enabled (-EnableException). + Useful when mass-processing items where an error shouldn't break the loop. + + .PARAMETER ContinueLabel + When specifying a label in combination with "-Continue" or "-SilentlyContinue", this function will call continue with this specified label. + Helpful when trying to continue on an upper level named loop. + + .PARAMETER Cmdlet + The $PSCmdlet object of the calling command. + Used to write exceptions in a more hidden manner, avoiding exposing internal script text in the default message display. + + .PARAMETER StepsUpward + When not throwing an exception and not calling continue, Stop-PSFFunction signals the calling command to stop. + In some cases you may want to signal a step or more further up the chain (notably from helper functions within a function). + This parameter allows you to add additional steps up the callstack that it will notify. + + .EXAMPLE + Stop-PSFFunction -Message "Foo failed bar!" -EnableException $EnableException -ErrorRecord $_ + return + + Depending on whether $EnableException is true or false it will: + - Throw a bloody terminating error. Game over. + - Write a nice warning about how Foo failed bar, then terminate the function. The return on the next line will then end the calling function. + + .EXAMPLE + Stop-PSFFunction -Message "Foo failed bar!" -EnableException $EnableException -Category InvalidOperation -Target $foo -Continue - .PARAMETER Line - The line on which Stop-PSFFunction was called. - Will be automatically set, but can be overridden when necessary. - - .PARAMETER Target - The object that was processed when the error was thrown. - For example, if you were trying to process a Database Server object when the processing failed, add the object here. - This object will be in the error record (which will be written, even in non-silent mode, just won't show it). - If you specify such an object, it becomes simple to actually figure out, just where things failed at. - - .PARAMETER Continue - This will cause the function to call continue while not running with exceptions enabled (-EnableException). - Useful when mass-processing items where an error shouldn't break the loop. - - .PARAMETER SilentlyContinue - This will cause the function to call continue while running with exceptions enabled (-EnableException). - Useful when mass-processing items where an error shouldn't break the loop. - - .PARAMETER ContinueLabel - When specifying a label in combination with "-Continue" or "-SilentlyContinue", this function will call continue with this specified label. - Helpful when trying to continue on an upper level named loop. - - .PARAMETER Exception - Allows specifying an inner exception as input object. This will be passed on to the logging and used for messages. - When specifying both ErrorRecord AND Exception, Exception wins, but ErrorRecord is still used for record metadata. - - .PARAMETER OverrideExceptionMessage - Disables automatic appending of exception messages. - Use in cases where you already have a speaking message interpretation and do not need the original message. - - .PARAMETER Cmdlet - The $PSCmdlet object of the calling command. - Used to write exceptions in a more hidden manner, avoiding exposing internal script text in the default message display. - - .PARAMETER StepsUpward - When not throwing an exception and not calling continue, Stop-PSFFunction signals the calling command to stop. - In some cases you may want to signal a step or more further up the chain (notably from helper functions within a function). - This parameter allows you to add additional steps up the callstack that it will notify. - - .EXAMPLE - Stop-PSFFunction -Message "Foo failed bar!" -EnableException $EnableException -ErrorRecord $_ - return - - Depending on whether $EnableException is true or false it will: - - Throw a bloody terminating error. Game over. - - Write a nice warning about how Foo failed bar, then terminate the function. The return on the next line will then end the calling function. - - .EXAMPLE - Stop-PSFFunction -Message "Foo failed bar!" -EnableException $EnableException -Category InvalidOperation -Target $foo -Continue - - Depending on whether $EnableException is true or false it will: - - Throw a bloody terminating error. Game over. - - Write a nice warning about how Foo failed bar, then call continue to process the next item in the loop. - In both cases, the error record added to $error will have the content of $foo added, the better to figure out what went wrong. - #> + Depending on whether $EnableException is true or false it will: + - Throw a bloody terminating error. Game over. + - Write a nice warning about how Foo failed bar, then call continue to process the next item in the loop. + In both cases, the error record added to $error will have the content of $foo added, the better to figure out what went wrong. +#> [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")] - [CmdletBinding(DefaultParameterSetName = 'Plain', HelpUri = 'https://psframework.org/documentation/commands/PSFramework/Stop-PSFFunction')] + [CmdletBinding(DefaultParameterSetName = 'Message', HelpUri = 'https://psframework.org/documentation/commands/PSFramework/Stop-PSFFunction')] param ( - [Parameter(Mandatory = $true)] + [Parameter(Mandatory = $true, ParameterSetName = 'Message')] [string] $Message, + [Parameter(Mandatory = $true, ParameterSetName = 'String')] + [string] + $String, + + [Parameter(ParameterSetName = 'String')] + [object[]] + $StringValues, + [bool] $EnableException, - [Parameter(ParameterSetName = 'Plain')] - [Parameter(ParameterSetName = 'Exception')] [System.Management.Automation.ErrorCategory] $Category = ([System.Management.Automation.ErrorCategory]::NotSpecified), - [Parameter(ParameterSetName = 'Exception')] [Alias('InnerErrorRecord')] [System.Management.Automation.ErrorRecord[]] $ErrorRecord, @@ -214,6 +227,25 @@ #region Message Handling $records = @() + $paramWritePSFMessage = @{ + Level = 'Warning' + EnableException = $EnableException + FunctionName = $FunctionName + Target = $Target + Tag = $Tag + ModuleName = $ModuleName + OverrideExceptionMessage = $true + File = $File + Line = $Line + } + if ($Message) { $paramWritePSFMessage["Message"] = $Message } + else + { + $paramWritePSFMessage["String"] = $String + $paramWritePSFMessage["StringValues"] = $StringValues + } + + if ($ErrorRecord -or $Exception) { if ($ErrorRecord) @@ -232,8 +264,8 @@ } # Manage Debugging - if ($EnableException) { Write-PSFMessage -Level Warning -Message $Message -EnableException $EnableException -FunctionName $FunctionName -Target $Target -ErrorRecord $records -Tag $Tag -ModuleName $ModuleName -OverrideExceptionMessage:$OverrideExceptionMessage -File $File -Line $Line 3>$null } - else { Write-PSFMessage -Level Warning -Message $Message -EnableException $EnableException -FunctionName $FunctionName -Target $Target -ErrorRecord $records -Tag $Tag -ModuleName $ModuleName -OverrideExceptionMessage:$OverrideExceptionMessage -File $File -Line $Line } + if ($EnableException) { Write-PSFMessage -ErrorRecord $records @paramWritePSFMessage 3>$null } + else { Write-PSFMessage -ErrorRecord $records @paramWritePSFMessage } } else { @@ -241,8 +273,8 @@ $records += New-Object System.Management.Automation.ErrorRecord($Exception, "$($ModuleName)_$FunctionName", $Category, $Target) # Manage Debugging - if ($EnableException) { Write-PSFMessage -Level Warning -Message $Message -EnableException $EnableException -FunctionName $FunctionName -Target $Target -ErrorRecord $records -Tag $Tag -ModuleName $ModuleName -OverrideExceptionMessage:$true -File $File -Line $Line 3>$null } - else { Write-PSFMessage -Level Warning -Message $Message -EnableException $EnableException -FunctionName $FunctionName -Target $Target -ErrorRecord $records -Tag $Tag -ModuleName $ModuleName -OverrideExceptionMessage:$true -File $File -Line $Line } + if ($EnableException) { Write-PSFMessage -ErrorRecord $records @paramWritePSFMessage 3>$null } + else { Write-PSFMessage -ErrorRecord $records @paramWritePSFMessage } } #endregion Message Handling diff --git a/PSFramework/functions/localization/Import-PSFLocalizedString.ps1 b/PSFramework/functions/localization/Import-PSFLocalizedString.ps1 index f9933ee6..5c5309ed 100644 --- a/PSFramework/functions/localization/Import-PSFLocalizedString.ps1 +++ b/PSFramework/functions/localization/Import-PSFLocalizedString.ps1 @@ -43,15 +43,18 @@ begin { - try { $resolvedPath = Resolve-PSFPath -Path $Path -Provider FileSystem -SingleItem } + try { $resolvedPath = Resolve-PSFPath -Path $Path -Provider FileSystem } catch { Stop-PSFFunction -Message "Failed to resolve path: $Path" -EnableException $true -Cmdlet $PSCmdlet -ErrorRecord $_ } } process { - $data = Import-PowerShellDataFile -Path $resolvedPath - foreach ($key in $data.Keys) + foreach ($pathItem in $resolvedPath) { - [PSFramework.Localization.LocalizationHost]::Write($Module, $key, $Language, $data[$key]) + $data = Import-PowerShellDataFile -Path $pathItem + foreach ($key in $data.Keys) + { + [PSFramework.Localization.LocalizationHost]::Write($Module, $key, $Language, $data[$key]) + } } } } \ No newline at end of file diff --git a/PSFramework/internal/configurations/general.ps1 b/PSFramework/internal/configurations/general.ps1 index 7fdb57b7..72553ae2 100644 --- a/PSFramework/internal/configurations/general.ps1 +++ b/PSFramework/internal/configurations/general.ps1 @@ -9,4 +9,5 @@ Set-PSFConfig -Module PSFramework -Name 'Text.Encoding.DefaultWrite' -Value 'utf Set-PSFConfig -Module PSFramework -Name 'Text.Encoding.DefaultRead' -Value 'utf-8' -Initialize -Validation 'string' -Description 'The default encoding to use when reading from file. Only applied by implementing commands.' # Localization Stuff -Set-PSFConfig -Module PSFramework -Name 'Localization.Language' -Value ([System.Globalization.CultureInfo]::CurrentUICulture.Name) -Initialize -Handler { [PSFramework.Localization.LocalizationHost]::Language = $args[0] } -Validation 'languagecode' -Description 'The language the current PowerShell session is operating under' \ No newline at end of file +Set-PSFConfig -Module PSFramework -Name 'Localization.Language' -Value ([System.Globalization.CultureInfo]::CurrentUICulture.Name) -Initialize -Handler { [PSFramework.Localization.LocalizationHost]::Language = $args[0] } -Validation 'languagecode' -Description 'The language the current PowerShell session is operating under' +Set-PSFConfig -Module PSFramework -Name 'Localization.LoggingLanguage' -Value 'en-US' -Initialize -Handler { [PSFramework.Localization.LocalizationHost]::LoggingLanguage = $args[0] } -Validation 'languagecode' -Description 'The language the current PowerShell session is operating under' \ No newline at end of file diff --git a/PSFramework/internal/functions/localization/Import-LocalizedString.ps1 b/PSFramework/internal/functions/localization/Import-LocalizedString.ps1 index d24075e2..1910cbde 100644 --- a/PSFramework/internal/functions/localization/Import-LocalizedString.ps1 +++ b/PSFramework/internal/functions/localization/Import-LocalizedString.ps1 @@ -42,15 +42,18 @@ begin { - try { $resolvedPath = Resolve-PSFPath -Path $Path -Provider FileSystem -SingleItem } + try { $resolvedPath = Resolve-PSFPath -Path $Path -Provider FileSystem } catch { Stop-PSFFunction -Message "Failed to resolve path: $Path" -EnableException $true -Cmdlet $PSCmdlet -ErrorRecord $_ } } process { - $data = Import-PowerShellDataFile -Path $resolvedPath - foreach ($key in $data.Keys) + foreach ($pathItem in $resolvedPath) { - [PSFramework.Localization.LocalizationHost]::Write($Module, $key, $Language, $data[$key]) + $data = Import-PowerShellDataFile -Path $pathItem + foreach ($key in $data.Keys) + { + [PSFramework.Localization.LocalizationHost]::Write($Module, $key, $Language, $data[$key]) + } } } } \ No newline at end of file diff --git a/PSFramework/internal/loggingProviders/filesystem.provider.ps1 b/PSFramework/internal/loggingProviders/filesystem.provider.ps1 index b215a6da..1154372d 100644 --- a/PSFramework/internal/loggingProviders/filesystem.provider.ps1 +++ b/PSFramework/internal/loggingProviders/filesystem.provider.ps1 @@ -116,7 +116,7 @@ $message_Event = { if ($Message) { - Add-Content -Path $filesystem_CurrentFile -Value (ConvertTo-Csv ($Message | Select-Object ComputerName, Timestamp, Level, Message, Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace) -NoTypeInformation)[1] + Add-Content -Path $filesystem_CurrentFile -Value (ConvertTo-Csv ($Message | Select-PSFObject ComputerName, Timestamp, Level, 'LogMessage as Message', Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace) -NoTypeInformation)[1] } } diff --git a/PSFramework/internal/loggingProviders/gelf.provider.ps1 b/PSFramework/internal/loggingProviders/gelf.provider.ps1 index b9b8a9de..369eef46 100644 --- a/PSFramework/internal/loggingProviders/gelf.provider.ps1 +++ b/PSFramework/internal/loggingProviders/gelf.provider.ps1 @@ -31,7 +31,7 @@ $message_Event = { ) $gelf_params = $gelf_paramSendPsgelfTcp.Clone() - $gelf_params['ShortMessage'] = $Message.Message + $gelf_params['ShortMessage'] = $Message.LogMessage $gelf_params['HostName'] = $Message.ComputerName $gelf_params['DateTime'] = $Message.Timestamp @@ -55,7 +55,7 @@ $message_Event = { # build the additional fields $gelf_properties = $Message.PSObject.Properties | Where-Object { - $_.Name -notin @('Message', 'ComputerName', 'Timestamp', 'Level', 'ErrorRecord') + $_.Name -notin @('Message', 'LogMessage', 'ComputerName', 'Timestamp', 'Level', 'ErrorRecord') } $gelf_params['AdditionalField'] = @{} diff --git a/PSFramework/internal/loggingProviders/logfile.provider.ps1 b/PSFramework/internal/loggingProviders/logfile.provider.ps1 index 66ecc976..5b7ff1b5 100644 --- a/PSFramework/internal/loggingProviders/logfile.provider.ps1 +++ b/PSFramework/internal/loggingProviders/logfile.provider.ps1 @@ -120,13 +120,23 @@ $begin_event = { if ($logfile_headers -contains 'Tags') { $logfile_headers = $logfile_headers | ForEach-Object { - if ($_ -ne 'Tags') { $_ } - else + switch ($_) { - @{ - Name = 'Tags' - Expression = { $_.Tags -join "," } + 'Tags' + { + @{ + Name = 'Tags' + Expression = { $_.Tags -join "," } + } + } + 'Message' + { + @{ + Name = 'Message' + Expression = { $_.LogMessage } + } } + default { $_ } } } } diff --git a/PSFramework/internal/scripts/strings.ps1 b/PSFramework/internal/scripts/strings.ps1 index 36869f41..1cfc5b0f 100644 --- a/PSFramework/internal/scripts/strings.ps1 +++ b/PSFramework/internal/scripts/strings.ps1 @@ -1,4 +1,4 @@ -Import-LocalizedString -Path (Resolve-Path "$script:ModuleRoot\en-us\stringsAssembly.psd1") -Module PSFramework -Language 'en-US' +Import-LocalizedString -Path "$script:ModuleRoot\en-us\*.psd1" -Module PSFramework -Language 'en-US' $script:strings = Get-PSFLocalizedString -Module PSFramework \ No newline at end of file diff --git a/library/PSFramework/Commands/WritePSFMessageCommand.cs b/library/PSFramework/Commands/WritePSFMessageCommand.cs index 4df6e9c0..47cb3c13 100644 --- a/library/PSFramework/Commands/WritePSFMessageCommand.cs +++ b/library/PSFramework/Commands/WritePSFMessageCommand.cs @@ -10,7 +10,7 @@ namespace PSFramework.Commands /// /// Cmdlet performing message handling and logging /// - [Cmdlet("Write","PSFMessage")] + [Cmdlet("Write","PSFMessage", DefaultParameterSetName = "Message")] public class WritePSFMessageCommand : PSCmdlet { #region Parameters @@ -34,11 +34,24 @@ public class WritePSFMessageCommand : PSCmdlet /// /// The message to write/log. The function name and timestamp will automatically be prepended. /// - [Parameter(Mandatory = true, Position = 0)] + [Parameter(Mandatory = true, Position = 0, ParameterSetName = "Message")] [AllowEmptyString] [AllowNull] public string Message; + /// + /// A stored string to use to write the log. + /// Used in combination with the localization component. + /// + [Parameter(Mandatory = true, ParameterSetName = "String")] + public string String; + + /// + /// Values to format into the localized string referred to in String. + /// + [Parameter(ParameterSetName = "String")] + public object[] StringValues; + /// /// Tags to add to the message written. /// This allows filtering and grouping by category of message, targeting specific messages. @@ -207,18 +220,31 @@ private string _errorQualifiedMessage get { if (ErrorRecord == null) - return Message; + return _ResolvedMessage; if (ErrorRecord.Length == 0) - return Message; + return _ResolvedMessage; if (OverrideExceptionMessage.ToBool()) - return Message; + return _ResolvedMessage; if (Regex.IsMatch(Message, Regex.Escape(ErrorRecord[0].Exception.Message))) - return Message; + return _ResolvedMessage; + + return String.Format("{0} | {1}", _ResolvedMessage, ErrorRecord[0].Exception.Message); + } + } - return String.Format("{0} | {1}", Message, ErrorRecord[0].Exception.Message); + /// + /// Unified representation of the various ways messages can be specified + /// + private string _ResolvedMessage + { + get + { + if (!String.IsNullOrEmpty(String)) + return String.Format(Localization.LocalizationHost.Read(String.Format("{0}.{1}", ModuleName, String)), StringValues); + return Message; } } @@ -516,7 +542,7 @@ whether this function was called from Stop-PSFFunction. #endregion Message handling #region Logging - LogEntry entry = LogHost.WriteLogEntry(_MessageSystem, channels, _timestamp, FunctionName, ModuleName, _Tags, Level, System.Management.Automation.Runspaces.Runspace.DefaultRunspace.InstanceId, Environment.MachineName, File, Line, _callStack, String.Format("{0}\\{1}",Environment.UserDomainName, Environment.UserName), errorRecord, Target); + LogEntry entry = LogHost.WriteLogEntry(_MessageSystem, channels, _timestamp, FunctionName, ModuleName, _Tags, Level, System.Management.Automation.Runspaces.Runspace.DefaultRunspace.InstanceId, Environment.MachineName, File, Line, _callStack, String.Format("{0}\\{1}",Environment.UserDomainName, Environment.UserName), errorRecord, String, StringValues, Target); #endregion Logging foreach (MessageEventSubscription subscription in MessageHost.Events.Values) diff --git a/library/PSFramework/Localization/LocalString.cs b/library/PSFramework/Localization/LocalString.cs index 89a46530..a70d97bb 100644 --- a/library/PSFramework/Localization/LocalString.cs +++ b/library/PSFramework/Localization/LocalString.cs @@ -51,6 +51,31 @@ public string Value } } + /// + /// The string value to use for logging purposes + /// + public string LogValue + { + get + { + if (_Strings.Keys.Count == 0) + throw new InvalidOperationException("Cannot offer string value without at least ONE string registered"); + + if (LocalizationHost.ModuleLoggingLanguage.ContainsKey(Module) && _Strings.ContainsKey(LocalizationHost.ModuleLoggingLanguage[Module])) + return _Strings[LocalizationHost.ModuleLoggingLanguage[Module]]; + if (_Strings.ContainsKey(LocalizationHost.LoggingLanguage)) + return _Strings[LocalizationHost.LoggingLanguage]; + if (_Strings.ContainsKey(LocalizationHost.Language)) + return _Strings[LocalizationHost.Language]; + if (_Strings.ContainsKey(CultureInfo.CurrentUICulture.Name)) + return _Strings[CultureInfo.CurrentUICulture.Name]; + if (_Strings.ContainsKey("en-US")) + return _Strings["en-US"]; + + return _Strings.Values.First(); + } + } + /// /// Sets the text for a specific language /// diff --git a/library/PSFramework/Localization/LocalizationHost.cs b/library/PSFramework/Localization/LocalizationHost.cs index 24a889e2..efc3b3ff 100644 --- a/library/PSFramework/Localization/LocalizationHost.cs +++ b/library/PSFramework/Localization/LocalizationHost.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace PSFramework.Localization { @@ -12,10 +13,32 @@ public static class LocalizationHost /// public static string Language = ""; + /// + /// The default language to log in. + /// + public static string LoggingLanguage = "en-US"; + /// /// List of strings registered /// - public static Dictionary Strings = new Dictionary(); + public static Dictionary Strings = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + /// + /// Mapping module name to the language to use for logging. + /// + public static Dictionary ModuleLoggingLanguage = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + /// + /// Configure the module specific logging language. + /// + /// The module to configure + /// The language to set. Leave empty to remove entry. + public static void SetLoggingLanguage(string Module, string Language) + { + ModuleLoggingLanguage[Module] = Language; + if (String.IsNullOrEmpty(Language)) + ModuleLoggingLanguage.Remove(Module); + } /// /// Writes a localized string. If needed creates it, then sets the text of the specified language. @@ -56,5 +79,17 @@ public static string Read(string FullName) return ""; return Strings[FullName].Value; } + + /// + /// Reads a localized string from the list of available strings for the purpose of logging + /// + /// The name of the string to request. Include the modulename + /// The localized string requested. Empty string if nothing. + public static string ReadLog(string FullName) + { + if (!Strings.ContainsKey(FullName)) + return String.Format("", FullName); + return Strings[FullName].LogValue; + } } } diff --git a/library/PSFramework/Message/LogEntry.cs b/library/PSFramework/Message/LogEntry.cs index b0f7bd0f..11c57082 100644 --- a/library/PSFramework/Message/LogEntry.cs +++ b/library/PSFramework/Message/LogEntry.cs @@ -1,4 +1,5 @@ -using System; +using PSFramework.Localization; +using System; using System.Collections.Generic; using System.Management.Automation; @@ -13,7 +14,36 @@ public class LogEntry /// /// The message logged /// - public string Message; + public string Message + { + get + { + if (String.IsNullOrEmpty(String)) + return _Message; + if (null == StringValue) + return LocalizationHost.Read(String.Format("{0}.{1}", ModuleName, String)); + return String.Format(LocalizationHost.Read(String.Format("{0}.{1}", ModuleName, String)), StringValue); + } + set { _Message = value; } + } + private string _Message; + + /// + /// The message to use for logging purposes. + /// Using the localized string feature, this allows maintaining uniform logging languages while still supporting localized + /// + public string LogMessage + { + get + { + if (String.IsNullOrEmpty(String)) + return _Message; + if (null == StringValue) + return LocalizationHost.Read(String.Format("{0}.{1}", ModuleName, String)); + return String.Format(LocalizationHost.ReadLog(String.Format("{0}.{1}", ModuleName, String)), StringValue); + } + set { } + } /// /// What kind of entry was this? @@ -85,6 +115,16 @@ public class LogEntry /// public PsfExceptionRecord ErrorRecord; + /// + /// The string key to use when retrieving localized strings. + /// + public string String; + + /// + /// Values to format into the localized string + /// + public object[] StringValue; + /// /// Creates an empty log entry /// @@ -111,7 +151,9 @@ public LogEntry() /// The callstack that triggered the write. /// The user responsible for running the code that is writing the message. /// An associated error item. - public LogEntry(string Message, LogEntryType Type, DateTime Timestamp, string FunctionName, string ModuleName, List Tags, MessageLevel Level, Guid Runspace, string ComputerName, object TargetObject, string File, int Line, CallStack CallStack, string Username, PsfExceptionRecord ErrorRecord) + /// The string key to use for retrieving localized strings + /// The values to format into the localized string + public LogEntry(string Message, LogEntryType Type, DateTime Timestamp, string FunctionName, string ModuleName, List Tags, MessageLevel Level, Guid Runspace, string ComputerName, object TargetObject, string File, int Line, CallStack CallStack, string Username, PsfExceptionRecord ErrorRecord, string String, object[] StringValue) { this.Message = Message; this.Type = Type; @@ -128,6 +170,8 @@ public LogEntry(string Message, LogEntryType Type, DateTime Timestamp, string Fu this.CallStack = CallStack; this.Username = Username; this.ErrorRecord = ErrorRecord; + this.String = String; + this.StringValue = StringValue; } } } \ No newline at end of file diff --git a/library/PSFramework/Message/LogHost.cs b/library/PSFramework/Message/LogHost.cs index ec11f493..24f331fd 100644 --- a/library/PSFramework/Message/LogHost.cs +++ b/library/PSFramework/Message/LogHost.cs @@ -163,7 +163,33 @@ public static PsfExceptionRecord WriteErrorEntry(ErrorRecord[] Record, string Fu /// The entry that is being written public static LogEntry WriteLogEntry(string Message, LogEntryType Type, DateTime Timestamp, string FunctionName, string ModuleName, List Tags, MessageLevel Level, Guid Runspace, string ComputerName, string File, int Line, IEnumerable CallStack, string Username, PsfExceptionRecord ErrorRecord, object TargetObject = null) { - LogEntry temp = new LogEntry(Message, Type, Timestamp, FunctionName, ModuleName, Tags, Level, Runspace, ComputerName, TargetObject, File, Line, new PSFramework.Message.CallStack(CallStack), Username, ErrorRecord); + return WriteLogEntry(Message, Type, Timestamp, FunctionName, ModuleName, Tags, Level, Runspace, ComputerName, File, Line, CallStack, Username, ErrorRecord, "", null, TargetObject); + } + + /// + /// Write a new entry to the log + /// + /// The message to log + /// The type of the message logged + /// When was the message generated + /// What function wrote the message + /// What module did the function writing this message come from? + /// The tags that were applied to the message + /// At what level was the function written + /// The runspace the message is coming from + /// The computer the message was generated on + /// The file from which the message was written + /// The line on which the message was written + /// The object associated with a given message. + /// The callstack at the moment the message was written. + /// The name of the user under which the code being executed + /// The string key to use for retrieving localized strings + /// The values to format into the localized string + /// An associated error record + /// The entry that is being written + public static LogEntry WriteLogEntry(string Message, LogEntryType Type, DateTime Timestamp, string FunctionName, string ModuleName, List Tags, MessageLevel Level, Guid Runspace, string ComputerName, string File, int Line, IEnumerable CallStack, string Username, PsfExceptionRecord ErrorRecord, string String, object[] StringValue, object TargetObject = null) + { + LogEntry temp = new LogEntry(Message, Type, Timestamp, FunctionName, ModuleName, Tags, Level, Runspace, ComputerName, TargetObject, File, Line, new PSFramework.Message.CallStack(CallStack), Username, ErrorRecord, String, StringValue); if (MessageLogFileEnabled) { OutQueueLog.Enqueue(temp); } if (MessageLogEnabled) { LogEntries.Enqueue(temp); } From 9ca09d569976fe4400f55aa328cce11f767df6d3 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Thu, 10 Jan 2019 14:21:02 +0100 Subject: [PATCH 5/8] minor updates --- PSFramework/bin/PSFramework.dll | Bin 103936 -> 103936 bytes PSFramework/bin/PSFramework.pdb | Bin 265728 -> 265728 bytes PSFramework/changelog.md | 3 ++ .../configurationvalidation/credential.ps1 | 30 ++++++++++++++++++ .../tepp/scripts/tepp-scriptblockname.ps1 | 3 -- PSFramework/internal/tepp/scripts/tepp.ps1 | 18 +++++++++++ PSFramework/internal/tepp/tepp-assignment.ps1 | 2 ++ .../Commands/TestPSFShouldProcessCommand.cs | 2 +- 8 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 PSFramework/internal/configurationvalidation/credential.ps1 delete mode 100644 PSFramework/internal/tepp/scripts/tepp-scriptblockname.ps1 create mode 100644 PSFramework/internal/tepp/scripts/tepp.ps1 diff --git a/PSFramework/bin/PSFramework.dll b/PSFramework/bin/PSFramework.dll index 1c57330c85b0bbf4a7b253f88007b9f1d318ce6d..5b6577257f3039631564f8c259a96c476c1156ae 100644 GIT binary patch delta 244 zcmZoz!`85dZ9)gLsGB8dz>}53H9KgiU$@pb+WVfm}GK4UR2A38T|ylkv{x$Zl0{#>JcKuUXCznDY9J*iN(mPLn-;`F#*) z|FQi<9%F|rqtx`k9!3c!28QV^J&ZQG3_uHG7=QpM!XU%Qz;FO)-GLrPhM-`V;F*uE zZWAtHbX`;y;ko(Z6VB~#dKftvd0Ex~)j@&WbjChLX-0wVvVDvn87Dh1N^Iww!1#-q Q$-rj2;1tI9j1vvm0j2Xq8UO$Q diff --git a/PSFramework/bin/PSFramework.pdb b/PSFramework/bin/PSFramework.pdb index e34158d4989a175c2bee2fd91a5b91cb165977f0..e942741f162d3f14c3bfacde464554caab121dfb 100644 GIT binary patch delta 139 zcmZpeBhWBMU;_)6gsQW73?l;r!!gCP?jBL)PBZJ|StI!7KHn_ErPCr(%cOjjVbf#l ze>39m6$;H3lufxSy3uh7$B!L2ioTx XU<6{O?Q;$=XUOBUV!O-(<|n!UJ)AiK diff --git a/PSFramework/changelog.md b/PSFramework/changelog.md index 51eca557..5391f8e5 100644 --- a/PSFramework/changelog.md +++ b/PSFramework/changelog.md @@ -1,10 +1,13 @@ # CHANGELOG ## ??? + - New: Configuration validation: Credential. Validates PSCredential objects. - Upd: Write-PSFMessage supports localized strings through the `-String` and `-StringValues` parameters - Upd: Stop-PSFFunction supports localized strings through the `-String` and `-StringValues` parameters + - Upd: Test-PSFShouldProcess now supports ShouldProcess itself. This should help silence tests on commands reyling on it. - Upd: Message component supports localized strings - Upd: Logging component logs in separate language than localized messages to screen / userinteraction - Upd: Import-PSFLocalizedString now accepts wildcard path patterns that resovle to multiple files. + - Upd: Adding tab completion for `Register-PSFTeppArgumentCompleter` - fix: Missing localization strings ## 0.10.30.165 : 2018-12-01 diff --git a/PSFramework/internal/configurationvalidation/credential.ps1 b/PSFramework/internal/configurationvalidation/credential.ps1 new file mode 100644 index 00000000..ef8131e3 --- /dev/null +++ b/PSFramework/internal/configurationvalidation/credential.ps1 @@ -0,0 +1,30 @@ +Register-PSFConfigValidation -Name "credential" -ScriptBlock { + param ( + $Value + ) + + $Result = New-Object PSObject -Property @{ + Success = $True + Value = $null + Message = "" + } + try + { + if ($Value.GetType().FullName -ne "System.Management.Automation.PSCredential") + { + $Result.Message = "Not a credential: $Value" + $Result.Success = $False + return $Result + } + } + catch + { + $Result.Message = "Not a credential: $Value" + $Result.Success = $False + return $Result + } + + $Result.Value = $Value + + return $Result +} \ No newline at end of file diff --git a/PSFramework/internal/tepp/scripts/tepp-scriptblockname.ps1 b/PSFramework/internal/tepp/scripts/tepp-scriptblockname.ps1 deleted file mode 100644 index 256c99bd..00000000 --- a/PSFramework/internal/tepp/scripts/tepp-scriptblockname.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Register-PSFTeppScriptblock -Name 'PSFramework-tepp-scriptblockname' -ScriptBlock { - [PSFramework.TabExpansion.TabExpansionHost]::Scripts.Keys -} \ No newline at end of file diff --git a/PSFramework/internal/tepp/scripts/tepp.ps1 b/PSFramework/internal/tepp/scripts/tepp.ps1 new file mode 100644 index 00000000..ed7f3a5a --- /dev/null +++ b/PSFramework/internal/tepp/scripts/tepp.ps1 @@ -0,0 +1,18 @@ +Register-PSFTeppScriptblock -Name 'PSFramework-tepp-scriptblockname' -ScriptBlock { + [PSFramework.TabExpansion.TabExpansionHost]::Scripts.Keys +} + +Register-PSFTeppScriptblock -Name 'PSFramework-tepp-parametername' -ScriptBlock { + if ($fakeBoundParameter.Command) + { + $common = 'Verbose', 'Debug', 'ErrorAction', 'WarningAction', 'InformationAction', 'ErrorVariable', 'WarningVariable', 'InformationVariable', 'OutVariable', 'OutBuffer', 'PipelineVariable', 'WhatIf', 'Confirm' + + try + { + $command = Get-Command $fakeBoundParameter.Command + if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } + $command.Parameters.Keys | Where-Object { $_ -notin $common } + } + catch { } + } +} \ No newline at end of file diff --git a/PSFramework/internal/tepp/tepp-assignment.ps1 b/PSFramework/internal/tepp/tepp-assignment.ps1 index 8db482a9..af3929e9 100644 --- a/PSFramework/internal/tepp/tepp-assignment.ps1 +++ b/PSFramework/internal/tepp/tepp-assignment.ps1 @@ -62,6 +62,8 @@ Register-PSFTeppArgumentCompleter -Command Import-PSFClixml -Parameter Encoding #region Tab Completion Register-PSFTeppArgumentCompleter -Command Set-PSFTeppResult -Parameter TabCompletion -Name 'PSFramework-tepp-scriptblockname' +Register-PSFTeppArgumentCompleter -Command Register-PSFTeppArgumentCompleter -Parameter Name -Name 'PSFramework-tepp-scriptblockname' +Register-PSFTeppArgumentCompleter -Command Register-PSFTeppArgumentCompleter -Parameter Parameter -Name 'PSFramework-tepp-parametername' #endregion Tab Completion #region Utility diff --git a/library/PSFramework/Commands/TestPSFShouldProcessCommand.cs b/library/PSFramework/Commands/TestPSFShouldProcessCommand.cs index 4640b93c..c3c30ef5 100644 --- a/library/PSFramework/Commands/TestPSFShouldProcessCommand.cs +++ b/library/PSFramework/Commands/TestPSFShouldProcessCommand.cs @@ -5,7 +5,7 @@ namespace PSFramework.Commands /// /// Implements the Test-PSFShouldProcess command /// - [Cmdlet("Test", "PSFShouldProcess")] + [Cmdlet("Test", "PSFShouldProcess", SupportsShouldProcess = true)] public class TestPSFShouldProcessCommand : Cmdlet { /// From c0c3543be1918e3951239f8f34f6ecd5cd4c97d9 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Sat, 12 Jan 2019 23:13:42 +0100 Subject: [PATCH 6/8] Implementing awesome tab expansion --- PSFramework/bin/PSFramework.dll | Bin 103936 -> 104448 bytes PSFramework/bin/PSFramework.pdb | Bin 265728 -> 269824 bytes PSFramework/bin/PSFramework.xml | 62 ++ PSFramework/internal/scripts/postimport.ps1 | 5 +- .../internal/scripts/teppInputResources.ps1 | 80 ++ PSFramework/internal/tepp/scripts/input.ps1 | 767 +++++++++++++++--- PSFramework/internal/tepp/tepp-assignment.ps1 | 10 +- build/filesAfter.txt | 1 + .../TabExpansion/TabExpansionHost.cs | 22 + 9 files changed, 831 insertions(+), 116 deletions(-) create mode 100644 PSFramework/internal/scripts/teppInputResources.ps1 diff --git a/PSFramework/bin/PSFramework.dll b/PSFramework/bin/PSFramework.dll index 5b6577257f3039631564f8c259a96c476c1156ae..9b1fa0fbada3dbb38a521254c2d41ad4a85bc2be 100644 GIT binary patch literal 104448 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 literal 103936 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 X9N)v2$ApHa3VgkcDygN*SDXI_%gsYE diff --git a/PSFramework/bin/PSFramework.xml b/PSFramework/bin/PSFramework.xml index 6820fa05..8d36d98a 100644 --- a/PSFramework/bin/PSFramework.xml +++ b/PSFramework/bin/PSFramework.xml @@ -3574,6 +3574,18 @@ The path to where the module was imported from

+ + + Initializes the PSFramework library. + Required for some components to work correctly. + + + + + Reverses the initialization of the PSFramework library. + Should be called when destroying the main runspace + + Attribute designating something as reserved as PSFramework-internal. @@ -3653,6 +3665,35 @@ The value to offer or set, specific per runspace from which it is called + + + Removes all value entries whose corresponding Runspace has been destroyed + + + + + Destruction logic, eliminating all data stored in the object. + Since handles to this object are automatically stored and maintained, it is impossible to otherwise guarantee releasing the object's data for the GC. + + + + + Create an empty runspace bound value object + + + + + Create a runspace bound value object with its initial value + + The object to set as the initial value + + + + Create a runspace bound value object with its initial value + + The object to set as the initial value + Whether the initial / default value should be offered when accessed from runspaces that do not have a runspace-local value + Class that contains the logic necessary to manage a unique runspace @@ -3727,6 +3768,11 @@ The dictionary containing the definitive list of unique Runspace + + + List of all runspace bound values in use + + Contains the state a managed, unique runspace can be in. @@ -4000,6 +4046,16 @@ The cache used by scripts utilizing TabExpansionPlusPlus for PSFramework + + + Dictionary containing a list of hashtables to explicitly add properties when completing for specific output types + + + + + Dictionary containing a list of hashtables to explicitly add properties when completing for specific commands + + Whether the user wants to use simple tepp, full tepp or auto-detect @@ -4679,6 +4735,12 @@ The current execution context + + + Returns the list of runspaces available in the process + + The lists of currently known runspaces + Removes an alias from the global list of aliases diff --git a/PSFramework/internal/scripts/postimport.ps1 b/PSFramework/internal/scripts/postimport.ps1 index 61cab441..5da6e783 100644 --- a/PSFramework/internal/scripts/postimport.ps1 +++ b/PSFramework/internal/scripts/postimport.ps1 @@ -48,8 +48,11 @@ foreach ($file in (Get-ChildItem -Path "$($script:ModuleRoot)\internal\parameter # Register the unimport reaction . Import-ModuleFile -Path "$($script:ModuleRoot)\internal\scripts\removalEvent.ps1" -# Load specialvariables +# Load special variables . Import-ModuleFile -Path "$($script:ModuleRoot)\internal\scripts\variables.ps1" +# Load resources for TEPP input completion +. Import-ModuleFile -Path "$($script:ModuleRoot)\internal\scripts\teppInputResources.ps1" + # Finally register the license . Import-ModuleFile -Path "$($script:ModuleRoot)\internal\scripts\license.ps1" \ No newline at end of file diff --git a/PSFramework/internal/scripts/teppInputResources.ps1 b/PSFramework/internal/scripts/teppInputResources.ps1 new file mode 100644 index 00000000..30c1c129 --- /dev/null +++ b/PSFramework/internal/scripts/teppInputResources.ps1 @@ -0,0 +1,80 @@ +[PSFramework.TabExpansion.TabExpansionHost]::InputCompletionTypeData['System.IO.FileInfo'] = @( + [PSCustomObject]@{ + Name = 'PSChildName' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSDrive' + Type = ([type]'System.Management.Automation.PSDriveInfo') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSIsContainer' + Type = ([type]'System.Boolean') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSParentPath' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSPath' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSProvider' + Type = ([type]'System.Management.Automation.ProviderInfo') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'BaseName' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'VersionInfo' + Type = ([type]'System.Diagnostics.FileVersionInfo') + TypeKnown = $true + } +) + +[PSFramework.TabExpansion.TabExpansionHost]::InputCompletionTypeData['System.IO.DirectoryInfo'] = @( + [PSCustomObject]@{ + Name = 'PSChildName' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSDrive' + Type = ([type]'System.Management.Automation.PSDriveInfo') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSIsContainer' + Type = ([type]'System.Boolean') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSParentPath' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSPath' + Type = ([type]'System.String') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'PSProvider' + Type = ([type]'System.Management.Automation.ProviderInfo') + TypeKnown = $true + }, + [PSCustomObject]@{ + Name = 'BaseName' + Type = ([type]'System.String') + TypeKnown = $true + } +) \ No newline at end of file diff --git a/PSFramework/internal/tepp/scripts/input.ps1 b/PSFramework/internal/tepp/scripts/input.ps1 index 38f5cb8a..55acbefa 100644 --- a/PSFramework/internal/tepp/scripts/input.ps1 +++ b/PSFramework/internal/tepp/scripts/input.ps1 @@ -1,163 +1,710 @@ -Register-PSFTeppScriptblock -Name PSFramework-Input-Object -ScriptBlock { - [System.Management.Automation.Language.PipelineAst]$pipelineAst = $commandAst.parent - $index = $pipelineAst.PipelineElements.IndexOf($commandAst) - - #region If it's the first command - if ($index -lt 1) +Register-PSFTeppScriptblock -Name PSFramework-Input-ObjectProperty -ScriptBlock { + #region Utility Functions + function Get-Property { - return + [CmdletBinding()] + param ( + $InputObject + ) + + if (-not $InputObject) { return @{ } } + $properties = @{ } + + switch ($InputObject.GetType().FullName) + { + #region Variables or static input + 'System.Management.Automation.Language.CommandExpressionAst' + { + switch ($InputObject.Expression.GetType().Name) + { + 'BinaryExpressionAst' + { + # Return an empty array. A binary expression ast means pure numbers as input, no properties + return @{ } + } + 'VariableExpressionAst' + { + $members = Get-Variable -Name $InputObject.Expression.VariablePath.UserPath -ValueOnly -ErrorAction Ignore | Select-Object -First 1 | Get-Member -MemberType Properties + foreach ($member in $members) + { + try + { + $typeString = $member.Definition.Split(" ")[0] + $memberType = [type]$typeString + $typeKnown = $true + } + catch + { + $memberType = $null + $typeKnown = $false + } + + $properties[$member.Name] = [pscustomobject]@{ + Name = $member.Name + Type = $memberType + TypeKnown = $typeKnown + } + } + return $properties + } + 'MemberExpressionAst' + { + try { $members = Get-Variable -Name $InputObject.Expression.Expression.VariablePath.UserPath -ValueOnly -ErrorAction Ignore | Where-Object $InputObject.Expression.Member.Value -ne $null | Select-Object -First 1 -ExpandProperty $InputObject.Expression.Member.Value -ErrorAction Ignore | Get-Member -MemberType Properties } + catch { return $properties } + foreach ($member in $members) + { + try + { + $typeString = $member.Definition.Split(" ")[0] + $memberType = [type]$typeString + $typeKnown = $true + } + catch + { + $memberType = $null + $typeKnown = $false + } + + $properties[$member.Name] = [pscustomobject]@{ + Name = $member.Name + Type = $memberType + TypeKnown = $typeKnown + } + } + return $properties + } + 'ArrayLiteralAst' + { + # Not yet supported + return @{ } + } + } + #region Input from Variable + if ($pipelineAst.PipelineElements[$inputIndex].Expression -and $pipelineAst.PipelineElements[0].Expression[0].VariablePath) + { + $properties += ((Get-Variable -Name $pipelineAst.PipelineElements[0].Expression[0].VariablePath.UserPath -ValueOnly) | Select-Object -First 1 | Get-Member -MemberType Properties).Name + } + #endregion Input from Variable + } + #endregion Variables or static input + + #region Input from Command + 'System.Management.Automation.Language.CommandAst' + { + $command = Get-Command $InputObject.CommandElements[0].Value -ErrorAction Ignore + if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } + if (-not $command) { return $properties } + + foreach ($type in $command.OutputType.Type) + { + foreach ($member in $type.GetMembers("Instance, Public")) + { + # Skip all members except Fields (4) or Properties (16) + if (-not ($member.MemberType -band 20)) { continue } + + $properties[$member.Name] = [pscustomobject]@{ + Name = $member.Name + Type = $null + TypeKnown = $true + } + if ($member.PropertyType) { $properties[$member.Name].Type = $member.PropertyType } + else { $properties[$member.Name].Type = $member.FieldType } + } + + foreach ($propertyExtensionItem in ([PSFramework.TabExpansion.TabExpansionHost]::InputCompletionTypeData[$type.FullName])) + { + $properties[$propertyExtensionItem.Name] = $propertyExtensionItem + } + } + + #region Command Specific Inserts + foreach ($propertyExtensionItem in ([PSFramework.TabExpansion.TabExpansionHost]::InputCompletionCommandData[$command.Name])) + { + $properties[$propertyExtensionItem.Name] = $propertyExtensionItem + } + #endregion Command Specific Inserts + + return $properties + } + #endregion Input from Command + + # Unknown / Unexpected input + default { return @{ } } + } } - #endregion If it's the first command - - $properties = @() - $constraintsPositive = @() - #region Process pre-commands - $inputIndex = $index - 1 - :main while ($true) + function Update-Property { - if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) + [CmdletBinding()] + param ( + [Hashtable] + $Property, + + $Step + ) + + $properties = @{ } + #region Expand Property + if ($Step.ExpandProperty) { - # Resolve command and fail if it breaks - $commandString = $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value - if ($commandString -eq "?") { $commandString = (Get-Alias -Name "?").ResolvedCommand.Name } - $command = Get-Command $commandString -ErrorAction Ignore - if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } - if (-not $command) { break } + if (-not ($Property[$Step.ExpandProperty])) { return $properties } - switch ($command.Name) + $expanded = $Property[$Step.ExpandProperty] + if (-not $expanded.TypeKnown) { return $properties } + + foreach ($member in $expanded.Type.GetMembers("Instance, Public")) { - 'Where-Object' { $inputIndex = $inputIndex - 1; continue main } - 'Tee-Object' { $inputIndex = $inputIndex - 1; continue main } - 'Sort-Object' { $inputIndex = $inputIndex - 1; continue main } - #region Select-Object - 'Select-Object' + # Skip all members except Fields (4) or Properties (16) + if (-not ($member.MemberType -band 20)) { continue } + + $properties[$member.Name] = [pscustomobject]@{ + Name = $member.Name + Type = $null + TypeKnown = $true + } + if ($member.PropertyType) { $properties[$member.Name].Type = $member.PropertyType } + else { $properties[$member.Name].Type = $member.FieldType } + } + + foreach ($propertyExtensionItem in ([PSFramework.TabExpansion.TabExpansionHost]::InputCompletionTypeData[$expanded.Type.FullName])) + { + $properties[$propertyExtensionItem.Name] = $propertyExtensionItem + } + + return $properties + } + #endregion Expand Property + + # In keep input mode, the original properties will not be affected in any way + if ($Step.KeepInputObject) { $properties = $Property.Clone() } + $filterProperties = $Step.Properties | Where-Object Kind -eq "Property" + + #region Select What to keep + if (-not $Step.KeepInputObject) + { + :main foreach ($propertyItem in $Property.Values) + { + #region Excluded Properties + foreach ($exclusion in $Step.Excluded) + { + if ($propertyItem.Name -like $exclusion) { continue main } + } + #endregion Excluded Properties + + foreach ($stepProperty in $filterProperties) + { + if ($propertyItem.Name -like $stepProperty.Name) + { + $properties[$propertyItem.Name] = $propertyItem + continue main + } + } + } + } + #endregion Select What to keep + + #region Adding Content + :main foreach ($stepProperty in $Step.Properties) + { + switch ($stepProperty.Kind) + { + 'Property' { - $firstAst = $pipelineAst.PipelineElements[$inputIndex].CommandElements | Where-Object { $_ -is [System.Management.Automation.Language.ArrayLiteralAst] } | Select-Object -First 1 + if ($stepProperty.Filter) { continue main } + if ($properties[$stepProperty.Name]) { continue main } - foreach ($element in $firstAst.Elements) + foreach ($exclusion in $Step.Excluded) { - switch ($element.GetType().FullName) + if ($stepProperty.Name -like $exclusion) { continue main } + } + + $properties[$stepProperty.Name] = [PSCustomObject]@{ + Name = $stepProperty.Name + Type = $null + TypeKnown = $false + } + continue main + } + 'CalculatedProperty' + { + if ($properties[$stepProperty.Name]) { continue main } + + $properties[$stepProperty.Name] = [PSCustomObject]@{ + Name = $stepProperty.Name + Type = $null + TypeKnown = $false + } + continue main + } + 'ScriptProperty' + { + if ($properties[$stepProperty.Name]) { continue main } + + $properties[$stepProperty.Name] = [PSCustomObject]@{ + Name = $stepProperty.Name + Type = $null + TypeKnown = $false + } + continue main + } + 'AliasProperty' + { + if ($properties[$stepProperty.Name]) { continue main } + + $properties[$stepProperty.Name] = [PSCustomObject]@{ + Name = $stepProperty.Name + Type = $null + TypeKnown = $false + } + if ($properties[$stepProperty.Target].TypeKnown) + { + $properties[$stepProperty.Name].Type = $properties[$stepProperty.Target].Type + $properties[$stepProperty.Name].TypeKnown = $properties[$stepProperty.Target].TypeKnown + } + + continue main + } + } + } + #endregion Adding Content + $properties + } + + function Read-SelectObject + { + [CmdletBinding()] + param ( + [System.Management.Automation.Language.CommandAst] + $Ast, + + [string] + $CommandName = 'Select-Object' + ) + + $results = [pscustomobject]@{ + Ast = $Ast + BoundParameters = @() + Property = @() + ExcludeProperty = @() + ExpandProperty = '' + ScriptProperty = @() + AliasProperty = @() + KeepInputObject = $false + } + + #region Process Ast + if ($Ast.CommandElements.Count -gt 1) + { + $index = 1 + $parameterName = '' + $position = 0 + while ($index -lt $Ast.CommandElements.Count) + { + $element = $Ast.CommandElements[$index] + switch ($element.GetType().FullName) + { + 'System.Management.Automation.Language.CommandParameterAst' + { + $parameterName = $element.ParameterName + if ($parameterName -like "k*") { $results.KeepInputObject = $true } + $results.BoundParameters += $element.ParameterName + break + } + 'System.Management.Automation.Language.StringConstantExpressionAst' + { + if (-not $parameterName) { - 'System.Management.Automation.Language.StringConstantExpressionAst' + switch ($position) { - $constraintsPositive += $element.Value - if ($element.Value -notmatch "\*") { $properties += $element.Value } + 0 { $results.Property = $element } + 1 { $results.AliasProperty = $element } + 2 { $results.ScriptProperty = $element } } - 'System.Management.Automation.Language.HashtableAst' + $position = $position + 1 + } + + if ($parameterName -like "pr*") { $results.Property = $element } + if ($parameterName -like "exp*") { $results.ExpandProperty = $element.Value } + if ($parameterName -like "exc*") { $results.ExcludeProperty = $element.Value } + if ($parameterName -like "a*") { $results.AliasProperty = $element } + if ($parameterName -like "scriptp*") { $results.ScriptProperty = $element } + $parameterName = '' + break + } + 'System.Management.Automation.Language.ArrayLiteralAst' + { + if (-not $parameterName) + { + switch ($position) { - $constraintsPositive += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') - $properties += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + 0 { $results.Property = $element.Elements } + 1 { $results.AliasProperty = $element.Elements } + 2 { $results.ScriptProperty = $element.Elements } } + $position = $position + 1 } + + if ($parameterName -like "pr*") { $results.Property = $element.Elements } + if ($parameterName -like "exp*") { $results.ExpandProperty = $element.Elements.Value } + if ($parameterName -like "exc*") { $results.ExcludeProperty = $element.Elements.Value } + if ($parameterName -like "a*") { $results.AliasProperty = $element.Elements } + if ($parameterName -like "scriptp*") { $results.ScriptProperty = $element.Elements } + + $parameterName = '' + break } - $inputIndex = $inputIndex - 1; - continue main - } - #endregion Select-Object - #region Select-PSFObject - 'Select-PSFObject' - { - $firstAst = $pipelineAst.PipelineElements[$inputIndex].CommandElements | Where-Object { $_ -is [System.Management.Automation.Language.ArrayLiteralAst] } | Select-Object -First 1 - foreach ($element in $firstAst.Elements) + 'System.Management.Automation.Language.ConstantExpressionAst' { - switch ($element.GetType().FullName) + if (-not $parameterName) { - "System.Management.Automation.Language.StringConstantExpressionAst" + switch ($position) { - $par = [PSFramework.Parameter.SelectParameter]$element.Value - if ($par.Value -match "\*") { $constraintsPositive += $par.Value } - else - { - if ($par.Value -is [System.String]) - { - $properties += $par.Value - $constraintsPositive += $par.Value - } - else - { - $properties += $par.Value["Name"] - $constraintsPositive += $par.Value["Name"] - } - } + 0 { $results.Property = $element } + 1 { $results.AliasProperty = $element } + 2 { $results.ScriptProperty = $element } } - "System.Management.Automation.Language.HashtableAst" + $position = $position + 1 + } + + if ($parameterName -like "pr*") { $results.Property = $element } + if ($parameterName -like "exp*") { $results.ExpandProperty = $element.Value.ToString() } + if ($parameterName -like "exc*") { $results.ExcludeProperty = $element.Value.ToString() } + if ($parameterName -like "a*") { $results.AliasProperty = $element } + if ($parameterName -like "scriptp*") { $results.ScriptProperty = $element } + $parameterName = '' + break + } + 'System.Management.Automation.Language.HashtableAst' + { + if (-not $parameterName) + { + switch ($position) { - $properties += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') - $constraintsPositive += ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$' | Select-Object -First 1).Item2.ToString().Trim('"') + 0 { $results.Property = $element } + 1 { $results.AliasProperty = $element } + 2 { $results.ScriptProperty = $element } } + $position = $position + 1 } + + if ($parameterName -like "pr*") { $results.Property = $element } + if ($parameterName -like "a*") { $results.AliasProperty = $element } + if ($parameterName -like "scriptp*") { $results.ScriptProperty = $element } + $parameterName = '' + break + } + default + { + $parameterName = '' } - $inputIndex = $inputIndex - 1; } - #endregion Select-PSFObject - default { break main } + $index = $index + 1 } } + #endregion Process Ast - else - { - break + #region Convert Results + $resultsProcessed = [pscustomobject]@{ + HasIncludeFilter = $false + RawResult = $results + Properties = @() + Excluded = $results.ExcludeProperty + ExpandProperty = $results.ExpandProperty + KeepInputObject = $results.KeepInputObject } - } - - # Catch moving through _all_ options in the pipeline - if ($inputIndex -lt 0) { return $properties } - #endregion Process pre-commands - - - #region Input from command - if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) - { - if ($command = Get-Command $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -ErrorAction Ignore) + + switch ($CommandName) { - switch ($command.Name) + #region Select-Object + 'Select-Object' { - #region Default for commands - default + #region Properties + foreach ($element in $results.Property) { - foreach ($type in $command.OutputType.Type) + switch ($element.GetType().FullName) { - switch ($type.FullName) + 'System.Management.Automation.Language.HashtableAst' { - 'System.IO.FileInfo' + try { - $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name - $properties += 'PSChildName', 'PSDrive', 'PSIsContainer', 'PSParentPath', 'PSPath', 'PSProvider', 'BaseName' - break + $resultsProcessed.Properties += [pscustomobject]@{ + Name = ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$|^L$|^Label$' | Select-Object -First 1).Item2.PipelineElements[0].Expression.Value + Kind = "CalculatedProperty" + Type = "Unknown" + Filter = $false + } } - 'System.IO.DirectoryInfo' + catch { } + } + default + { + if ($element.Value -match "\*") { $resultsProcessed.HasIncludeFilter = $true } + + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $element.Value.ToString() + Kind = "Property" + Type = "Inherited" + Filter = $element.Value -match "\*" + } + } + } + } + #endregion Properties + } + #endregion Select-Object + + #region Select-PSFObject + 'Select-PSFObject' + { + #region Properties + foreach ($element in $results.Property) + { + switch ($element.GetType().FullName) + { + 'System.Management.Automation.Language.HashtableAst' + { + try + { + $resultsProcessed.Properties += [pscustomobject]@{ + Name = ($element.KeyValuePairs | Where-Object Item1 -Match '^N$|^Name$|^L$|^Label$' | Select-Object -First 1).Item2.PipelineElements[0].Expression.Value + Kind = "CalculatedProperty" + Type = "Unknown" + Filter = $false + } + } + catch { } + } + default + { + try { $parameterItem = ([PSFramework.Parameter.SelectParameter]$element.Value).Value } + catch { continue } + + if ($parameterItem -is [System.String]) + { + if ($parameterItem -match "\*") { $resultsProcessed.HasIncludeFilter = $true } + + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $parameterItem + Kind = "Property" + Type = "Inherited" + Filter = $parameterItem -match "\*" + } + } + else + { + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $parameterItem + Kind = "CalculatedProperty" + Type = "Unknown" + Filter = $false + } + } + } + } + } + #endregion Properties + + #region Script Properties + foreach ($scriptProperty in $results.ScriptProperty) + { + switch ($scriptProperty.GetType().FullName) + { + 'System.Management.Automation.Language.HashtableAst' + { + foreach ($name in $scriptProperty.KeyValuePairs.Item1.Value) + { + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $name + Kind = "ScriptProperty" + Type = "Unknown" + Filter = $false + } + } + } + default + { + try { $propertyValue = [PSFramework.Parameter.SelectScriptPropertyParameter]$scriptProperty.Value } + catch { continue } + + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $propertyValue.Value.Name + Kind = "ScriptProperty" + Type = "Unknown" + Filter = $false + } + } + } + } + #endregion Script Properties + + #region Alias Properties + foreach ($scriptProperty in $results.AliasProperty) + { + switch ($scriptProperty.GetType().FullName) + { + 'System.Management.Automation.Language.HashtableAst' + { + foreach ($aliasPair in $scriptProperty.KeyValuePairs) { - $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name - $properties += 'PSChildName', 'PSDrive', 'PSIsContainer', 'PSParentPath', 'PSPath', 'PSProvider', 'BaseName', 'VersionInfo' - break + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $aliasPair.Item1.Value + Kind = "AliasProperty" + Type = "Alias" + Filter = $false + Target = $aliasPair.Item2.PipelineElements.Expression.Value + } + } + } + default + { + try { $propertyValue = [PSFramework.Parameter.SelectAliasParameter]$scriptProperty.Value } + catch { continue } + + $resultsProcessed.Properties += [pscustomobject]@{ + Name = $propertyValue.Aliases[0].Name + Kind = "AliasProperty" + Type = "Alias" + Filter = $false + Target = $propertyValue.Aliases[0].ReferencedMemberName } - default { $properties += ($type.GetMembers("Instance, Public") | Where-Object MemberType -match "Field|Property").Name } } } } - #endregion Default for commands + #endregion Alias Properties } + #endregion Select-PSFObject } + #endregion Convert Results + + $resultsProcessed } - #endregion Input from command + #endregion Utility Functions - #region Input from Variable - if ($pipelineAst.PipelineElements[$inputIndex].Expression -and $pipelineAst.PipelineElements[0].Expression[0].VariablePath) - { - $properties += ((Get-Variable -Name $pipelineAst.PipelineElements[0].Expression[0].VariablePath.UserPath -ValueOnly) | Select-Object -First 1 | Get-Member -MemberType Properties).Name - } - #endregion Input from Variable + # Grab Pipeline and find starting index + [System.Management.Automation.Language.PipelineAst]$pipelineAst = $commandAst.parent + $index = $pipelineAst.PipelineElements.IndexOf($commandAst) + + # If it's the first item: Skip, no input to parse + if ($index -lt 1) { return } - $properties | Select-Object -Unique | Sort-Object | ForEach-Object { - if (-not $constraintsPositive) { $_ } - foreach ($constraint in $constraintsPositive) + $inputIndex = $index - 1 + $steps = @{ } + + #region Step backwards through the pipeline until the definitive object giver is found + :outmain while ($true) + { + if ($pipelineAst.PipelineElements[$inputIndex].CommandElements) { - if ($_ -like $constraint) + # Resolve command and fail if it breaks + $command = $null + # Work around the ? alias for Where-Object being a wildcard + if ($pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -eq "?") { $command = Get-Alias -Name "?" | Where-Object Name -eq "?" } + else { $command = Get-Command $pipelineAst.PipelineElements[$inputIndex].CommandElements[0].Value -ErrorAction Ignore } + if ($command -is [System.Management.Automation.AliasInfo]) { $command = $command.ResolvedCommand } + if (-not $command) { return } + + switch ($command.Name) { - $_ - break + 'Where-Object' + { + $steps[$inputIndex] = [pscustomobject]@{ + Index = $inputIndex + Skip = $true + Type = 'Where' + } + $inputIndex = $inputIndex - 1 + continue outmain + } + 'Tee-Object' + { + $steps[$inputIndex] = [pscustomobject]@{ + Index = $inputIndex + Skip = $true + Type = 'Tee' + } + $inputIndex = $inputIndex - 1 + continue outmain + } + 'Sort-Object' + { + $steps[$inputIndex] = [pscustomobject]@{ + Index = $inputIndex + Skip = $true + Type = 'Sort' + } + $inputIndex = $inputIndex - 1 + continue outmain + } + #region Select-Object + 'Select-Object' + { + $selectObject = Read-SelectObject -Ast $pipelineAst.PipelineElements[$inputIndex] -CommandName 'Select-Object' + + $steps[$inputIndex] = [pscustomobject]@{ + Index = $inputIndex + Skip = $false + Type = 'Select' + Data = $selectObject + } + + if ($selectObject.HasIncludeFilter -or ($selectObject.Properties.Type -eq "Inherited") -or $selectObject.ExpandProperty) + { + $inputIndex = $inputIndex - 1 + continue outmain + } + break outmain + } + #endregion Select-Object + #region Select-PSFObject + 'Select-PSFObject' + { + $selectObject = Read-SelectObject -Ast $pipelineAst.PipelineElements[$inputIndex] -CommandName 'Select-PSFObject' + + $steps[$inputIndex] = [pscustomobject]@{ + Index = $inputIndex + Skip = $false + Type = 'PSFSelect' + Data = $selectObject + } + + if ($selectObject.HasIncludeFilter -or ($selectObject.Properties.Type -eq "Inherited") -or $selectObject.ExpandProperty) + { + $inputIndex = $inputIndex - 1 + continue outmain + } + break outmain + } + #endregion Select-PSFObject + default { break outmain } } } + + else + { + break + } } + #endregion Step backwards through the pipeline until the definitive object giver is found + + # Catch moving through _all_ options in the pipeline + if ($inputIndex -lt 0) { return } + + #region Process resulting / reaching properties + $properties = Get-Property -InputObject $pipelineAst.PipelineElements[$inputIndex] + $inputIndex = $inputIndex + 1 + + while ($inputIndex -lt $index) + { + # Eliminate preliminary follies + if (-not $steps[$inputIndex]) { $inputIndex = $inputIndex + 1; continue } + if ($steps[$inputIndex].Skip) { $inputIndex = $inputIndex + 1; continue } + + # Process the current step, then move on unless done + $properties = Update-Property -Property $properties -Step $steps[$inputIndex].Data + + $inputIndex = $inputIndex + 1 + } + #endregion Process resulting / reaching properties + + $properties.Keys | Sort-Object } \ No newline at end of file diff --git a/PSFramework/internal/tepp/tepp-assignment.ps1 b/PSFramework/internal/tepp/tepp-assignment.ps1 index 543fb496..ba350bde 100644 --- a/PSFramework/internal/tepp/tepp-assignment.ps1 +++ b/PSFramework/internal/tepp/tepp-assignment.ps1 @@ -68,11 +68,11 @@ Register-PSFTeppArgumentCompleter -Command Register-PSFTeppArgumentCompleter -Pa #endregion Tab Completion #region Utility -Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter Property -Name PSFramework-Input-Object -Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExpandProperty -Name PSFramework-Input-Object -Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExcludeProperty -Name PSFramework-Input-Object -Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowProperty -Name PSFramework-Input-Object -Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowExcludeProperty -Name PSFramework-Input-Object +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter Property -Name PSFramework-Input-ObjectProperty +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExpandProperty -Name PSFramework-Input-ObjectProperty +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ExcludeProperty -Name PSFramework-Input-ObjectProperty +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowProperty -Name PSFramework-Input-ObjectProperty +Register-PSFTeppArgumentCompleter -Command Select-PSFObject -Parameter ShowExcludeProperty -Name PSFramework-Input-ObjectProperty Register-PSFTeppArgumentCompleter -Command Resolve-PSFPath -Parameter Provider -Name 'PSFramework-utility-psprovider' #endregion Utility \ No newline at end of file diff --git a/build/filesAfter.txt b/build/filesAfter.txt index 1cc2ae9a..a9f0f065 100644 --- a/build/filesAfter.txt +++ b/build/filesAfter.txt @@ -15,4 +15,5 @@ bin\type-aliases.ps1 internal\scripts\taskEngine.ps1 internal\scripts\removalEvent.ps1 internal\scripts\variables.ps1 +internal\scripts\teppInputResources.ps1 internal\scripts\license.ps1 \ No newline at end of file diff --git a/library/PSFramework/TabExpansion/TabExpansionHost.cs b/library/PSFramework/TabExpansion/TabExpansionHost.cs index 3d2d2755..3ba524e8 100644 --- a/library/PSFramework/TabExpansion/TabExpansionHost.cs +++ b/library/PSFramework/TabExpansion/TabExpansionHost.cs @@ -21,5 +21,27 @@ public static class TabExpansionHost /// public static Hashtable Cache = new Hashtable(); #endregion State information + + #region Resources for individual tab completions + /// + /// Dictionary containing a list of hashtables to explicitly add properties when completing for specific output types. + /// Entries must have three properties: + /// - Name (Name of Property) + /// - Type (Type, not Typename, of the property. May be empty) + /// - TypeKnown (Boolean, whether the type is known) + /// Used by the Tab Completion: PSFramework-Input-ObjectProperty + /// + public static ConcurrentDictionary InputCompletionTypeData = new ConcurrentDictionary(); + + /// + /// Dictionary containing a list of hashtables to explicitly add properties when completing for specific commands + /// Entries must have three properties: + /// - Name (Name of Property) + /// - Type (Type, not Typename, of the property. May be empty) + /// - TypeKnown (Boolean, whether the type is known) + /// Used by the Tab Completion: PSFramework-Input-ObjectProperty + /// + public static ConcurrentDictionary InputCompletionCommandData = new ConcurrentDictionary(); + #endregion Resources for individual tab completions } } From f2c630df967d6a34b806af804c685cce1b29d8a6 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Sat, 12 Jan 2019 23:39:53 +0100 Subject: [PATCH 7/8] modern logging --- PSFramework/bin/PSFramework.dll | Bin 104448 -> 104448 bytes PSFramework/bin/PSFramework.pdb | Bin 269824 -> 269824 bytes PSFramework/bin/PSFramework.xml | 17 ++++++++++++++++- PSFramework/changelog.md | 2 ++ .../internal/configurations/logging.ps1 | 6 ++---- .../loggingProviders/filesystem.provider.ps1 | 11 ++++++++++- library/PSFramework/Message/LogHost.cs | 5 +++++ 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/PSFramework/bin/PSFramework.dll b/PSFramework/bin/PSFramework.dll index 9b1fa0fbada3dbb38a521254c2d41ad4a85bc2be..6f1712d4a29fdaa3fcfe4490d9f8004c7582be2b 100644 GIT binary patch delta 26756 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 lw}AM>B}w6O=JEkce*o7>v!?(6 delta 26554 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 delta 8271 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 X|NFlOI75E6Muo{FXOgGezLx(BGz=Ec diff --git a/PSFramework/bin/PSFramework.xml b/PSFramework/bin/PSFramework.xml index 8d36d98a..a0750440 100644 --- a/PSFramework/bin/PSFramework.xml +++ b/PSFramework/bin/PSFramework.xml @@ -1992,6 +1992,11 @@ Governs, whether a log of recent errors is kept in memory
+ + + Whether the filesystem logging provider uses the modern logging style with CSV headers and extra columns + + The outbound queue for errors. These will be processed and written to xml @@ -4048,12 +4053,22 @@ - Dictionary containing a list of hashtables to explicitly add properties when completing for specific output types + Dictionary containing a list of hashtables to explicitly add properties when completing for specific output types. + Entries must have three properties: + - Name (Name of Property) + - Type (Type, not Typename, of the property. May be empty) + - TypeKnown (Boolean, whether the type is known) + Used by the Tab Completion: PSFramework-Input-ObjectProperty Dictionary containing a list of hashtables to explicitly add properties when completing for specific commands + Entries must have three properties: + - Name (Name of Property) + - Type (Type, not Typename, of the property. May be empty) + - TypeKnown (Boolean, whether the type is known) + Used by the Tab Completion: PSFramework-Input-ObjectProperty diff --git a/PSFramework/changelog.md b/PSFramework/changelog.md index 1e6440d1..51fd9847 100644 --- a/PSFramework/changelog.md +++ b/PSFramework/changelog.md @@ -1,11 +1,13 @@ # CHANGELOG ## ??? - New: Configuration validation: Credential. Validates PSCredential objects. + - New: The most awesome Tab Completion for input properties _ever_ . - Upd: Write-PSFMessage supports localized strings through the `-String` and `-StringValues` parameters - Upd: Stop-PSFFunction supports localized strings through the `-String` and `-StringValues` parameters - Upd: Test-PSFShouldProcess now supports ShouldProcess itself. This should help silence tests on commands reyling on it. - Upd: Message component supports localized strings - Upd: Logging component logs in separate language than localized messages to screen / userinteraction + - Upd: Logging - filesystem provider now has a configuration to enable better output information: `psframework.logging.filesystem.modernlog` - Upd: Import-PSFLocalizedString now accepts wildcard path patterns that resovle to multiple files. - Upd: Adding tab completion for `Register-PSFTeppArgumentCompleter` - fix: Missing localization strings - Fix: Missing tab completion for modules that register localized strings diff --git a/PSFramework/internal/configurations/logging.ps1 b/PSFramework/internal/configurations/logging.ps1 index 7f54c7b5..562354ad 100644 --- a/PSFramework/internal/configurations/logging.ps1 +++ b/PSFramework/internal/configurations/logging.ps1 @@ -1,7 +1,5 @@ -#region Setting the configuration -Set-PSFConfig -Module PSFramework -Name 'Logging.MaxErrorCount' -Value 128 -Initialize -Validation "integerpositive" -Handler { [PSFramework.Message.LogHost]::MaxErrorCount = $args[0] } -Description "The maximum number of error records maintained in-memory. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." +Set-PSFConfig -Module PSFramework -Name 'Logging.MaxErrorCount' -Value 128 -Initialize -Validation "integerpositive" -Handler { [PSFramework.Message.LogHost]::MaxErrorCount = $args[0] } -Description "The maximum number of error records maintained in-memory. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." Set-PSFConfig -Module PSFramework -Name 'Logging.MaxMessageCount' -Value 1024 -Initialize -Validation "integerpositive" -Handler { [PSFramework.Message.LogHost]::MaxMessageCount = $args[0] } -Description "The maximum number of messages that can be maintained in the in-memory message queue. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." Set-PSFConfig -Module PSFramework -Name 'Logging.MessageLogEnabled' -Value $true -Initialize -Validation "bool" -Handler { [PSFramework.Message.LogHost]::MessageLogEnabled = $args[0] } -Description "Governs, whether a log of recent messages is kept in memory. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." Set-PSFConfig -Module PSFramework -Name 'Logging.ErrorLogEnabled' -Value $true -Initialize -Validation "bool" -Handler { [PSFramework.Message.LogHost]::ErrorLogEnabled = $args[0] } -Description "Governs, whether a log of recent errors is kept in memory. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." -Set-PSFConfig -Module PSFramework -Name 'Logging.DisableLogFlush' -Value $false -Initialize -Validation "bool" -Handler { } -Description "When shutting down the process, PSFramework will by default flush the log. This ensures that all events are properly logged. If this is not desired, it can be turned off with this setting." -#endregion Setting the configuration \ No newline at end of file +Set-PSFConfig -Module PSFramework -Name 'Logging.DisableLogFlush' -Value $false -Initialize -Validation "bool" -Handler { } -Description "When shutting down the process, PSFramework will by default flush the log. This ensures that all events are properly logged. If this is not desired, it can be turned off with this setting." \ No newline at end of file diff --git a/PSFramework/internal/loggingProviders/filesystem.provider.ps1 b/PSFramework/internal/loggingProviders/filesystem.provider.ps1 index 1154372d..7b6ab35a 100644 --- a/PSFramework/internal/loggingProviders/filesystem.provider.ps1 +++ b/PSFramework/internal/loggingProviders/filesystem.provider.ps1 @@ -116,7 +116,15 @@ $message_Event = { if ($Message) { - Add-Content -Path $filesystem_CurrentFile -Value (ConvertTo-Csv ($Message | Select-PSFObject ComputerName, Timestamp, Level, 'LogMessage as Message', Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace) -NoTypeInformation)[1] + if ([PSFramework.Message.LogHost]::FileSystemModernLog) + { + if (-not (Test-Path $filesystem_CurrentFile)) + { + $Message | Select-PSFObject ComputerName, Username, Timestamp, Level, 'LogMessage as Message', Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace, @{ n = "Callstack"; e = { $_.CallStack.ToString().Split("`n") -join " þ "} } | Export-Csv -Path $filesystem_CurrentFile -NoTypeInformation + } + else { Add-Content -Path $filesystem_CurrentFile -Value (ConvertTo-Csv ($Message | Select-PSFObject ComputerName, Username, Timestamp, Level, 'LogMessage as Message', Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace, @{ n = "Callstack"; e = { $_.CallStack.ToString().Split("`n") -join " þ " } }) -NoTypeInformation)[1] } + } + else { Add-Content -Path $filesystem_CurrentFile -Value (ConvertTo-Csv ($Message | Select-PSFObject ComputerName, Timestamp, Level, 'LogMessage as Message', Type, FunctionName, ModuleName, File, Line, @{ n = "Tags"; e = { $_.Tags -join "," } }, TargetObject, Runspace) -NoTypeInformation)[1] } } } @@ -209,6 +217,7 @@ $configuration_Settings = { Set-PSFConfig -Module PSFramework -Name 'Logging.FileSystem.MaxLogFileAge' -Value (New-TimeSpan -Days 7) -Initialize -Validation "timespan" -Handler { [PSFramework.Message.LogHost]::MaxLogFileAge = $args[0] } -Description "Any logfile older than this will automatically be cleansed. This setting is global." Set-PSFConfig -Module PSFramework -Name 'Logging.FileSystem.MessageLogFileEnabled' -Value $true -Initialize -Validation "bool" -Handler { [PSFramework.Message.LogHost]::MessageLogFileEnabled = $args[0] } -Description "Governs, whether a log file for the system messages is written. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." Set-PSFConfig -Module PSFramework -Name 'Logging.FileSystem.ErrorLogFileEnabled' -Value $true -Initialize -Validation "bool" -Handler { [PSFramework.Message.LogHost]::ErrorLogFileEnabled = $args[0] } -Description "Governs, whether log files for errors are written. This setting is on a per-Process basis. Runspaces share, jobs or other consoles counted separately." + Set-PSFConfig -Module PSFramework -Name 'Logging.FileSystem.ModernLog' -Value $false -Initialize -Validation "bool" -Handler { [PSFramework.Message.LogHost]::FileSystemModernLog = $args[0] } -Description "Enables the modern, more powereful version of the filesystem log, including headers and extra columns" Set-PSFConfig -Module PSFramework -Name 'Logging.FileSystem.LogPath' -Value $script:path_Logging -Initialize -Validation "string" -Handler { [PSFramework.Message.LogHost]::LoggingPath = $args[0] } -Description "The path where the PSFramework writes all its logs and debugging information." Set-PSFConfig -Module LoggingProvider -Name 'FileSystem.Enabled' -Value $true -Initialize -Validation "bool" -Handler { if ([PSFramework.Logging.ProviderHost]::Providers['filesystem']) { [PSFramework.Logging.ProviderHost]::Providers['filesystem'].Enabled = $args[0] } } -Description "Whether the logging provider should be enabled on registration" diff --git a/library/PSFramework/Message/LogHost.cs b/library/PSFramework/Message/LogHost.cs index 24f331fd..18c8353a 100644 --- a/library/PSFramework/Message/LogHost.cs +++ b/library/PSFramework/Message/LogHost.cs @@ -70,6 +70,11 @@ public static class LogHost /// Governs, whether a log of recent errors is kept in memory /// public static bool ErrorLogEnabled = true; + + /// + /// Whether the filesystem logging provider uses the modern logging style with CSV headers and extra columns + /// + public static bool FileSystemModernLog = false; #endregion Defines #region Queues From 4edea27f6d4295ccb13f84618afff67517c17296 Mon Sep 17 00:00:00 2001 From: Friedrich Weinmann Date: Sat, 12 Jan 2019 23:52:48 +0100 Subject: [PATCH 8/8] Updated version --- PSFramework/PSFramework.psd1 | 2 +- PSFramework/changelog.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PSFramework/PSFramework.psd1 b/PSFramework/PSFramework.psd1 index 97f194b5..92b175b2 100644 --- a/PSFramework/PSFramework.psd1 +++ b/PSFramework/PSFramework.psd1 @@ -5,7 +5,7 @@ RootModule = 'PSFramework.psm1' # Version number of this module. - ModuleVersion = '0.10.30.165' + ModuleVersion = '0.10.31.176' # ID used to uniquely identify this module GUID = '8028b914-132b-431f-baa9-94a6952f21ff' diff --git a/PSFramework/changelog.md b/PSFramework/changelog.md index 51fd9847..ec366c19 100644 --- a/PSFramework/changelog.md +++ b/PSFramework/changelog.md @@ -1,5 +1,5 @@ # CHANGELOG -## ??? +## 0.10.31.176 : 2019-01-13 - New: Configuration validation: Credential. Validates PSCredential objects. - New: The most awesome Tab Completion for input properties _ever_ . - Upd: Write-PSFMessage supports localized strings through the `-String` and `-StringValues` parameters