From 2213222066f5b877796e8a8b7b1a0bf74a69be62 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Fri, 11 Feb 2022 19:46:35 -0800 Subject: [PATCH 1/5] Add functionality for .psd1 input to -RequiredResourceFile --- src/code/InstallHelper.cs | 2 +- src/code/InstallPSResource.cs | 49 +++++++++++++++++++++++++----- src/code/PublishPSResource.cs | 2 +- src/code/Utils.cs | 2 +- test/InstallPSResource.Tests.ps1 | 21 ++++++++++++- test/TestRequiredResourceFile.psd1 | 15 +++++++++ 6 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 test/TestRequiredResourceFile.psd1 diff --git a/src/code/InstallHelper.cs b/src/code/InstallHelper.cs index 8d75ae518..bade1e8e4 100644 --- a/src/code/InstallHelper.cs +++ b/src/code/InstallHelper.cs @@ -509,7 +509,7 @@ private List InstallPackage( continue; } - if (!Utils.TryParseModuleManifest(moduleManifest, _cmdletPassedIn, out Hashtable parsedMetadataHashtable)) + if (!Utils.TryParsePsd1(moduleManifest, _cmdletPassedIn, out Hashtable parsedMetadataHashtable)) { // Ran into errors parsing the module manifest file which was found in Utils.ParseModuleManifest() and written. continue; diff --git a/src/code/InstallPSResource.cs b/src/code/InstallPSResource.cs index 687d89a7c..78b589c99 100644 --- a/src/code/InstallPSResource.cs +++ b/src/code/InstallPSResource.cs @@ -118,7 +118,7 @@ class InstallPSResource : PSCmdlet public PSResourceInfo InputObject { get; set; } /// - /// Installs resources based on input from a JSON file. + /// Installs resources based on input from a .psd1 (hashtable) or .json file. /// [Parameter(ParameterSetName = RequiredResourceFileParameterSet)] [ValidateNotNullOrEmpty] @@ -138,13 +138,22 @@ public String RequiredResourceFile if (!File.Exists(resolvedPath)) { - var exMessage = String.Format("The RequiredResourceFile does not exist. Please try specifying a path to a valid .json file"); + var exMessage = String.Format("The RequiredResourceFile does not exist. Please try specifying a path to a valid .json or .psd1 file"); var ex = new ArgumentException(exMessage); var RequiredResourceFileDoesNotExist = new ErrorRecord(ex, "RequiredResourceFileDoesNotExist", ErrorCategory.ObjectNotFound, null); ThrowTerminatingError(RequiredResourceFileDoesNotExist); } + if (!resolvedPath.EndsWith(".json") && !resolvedPath.EndsWith(".psd1")) + { + var exMessage = String.Format("The RequiredResourceFile must have either a '.json' or '.psd1' extension. Please try specifying a path to a valid .json or .psd1 file"); + var ex = new ArgumentException(exMessage); + var RequiredResourceFileNotValid = new ErrorRecord(ex, "RequiredResourceFileNotValid", ErrorCategory.ObjectNotFound, null); + + ThrowTerminatingError(RequiredResourceFileNotValid); + } + _requiredResourceFile = resolvedPath; } } @@ -252,7 +261,7 @@ protected override void ProcessRecord() break; case RequiredResourceFileParameterSet: - /* json file contents should look like: + /* .json file contents should look like: { "Pester": { "allowPrerelease": true, @@ -262,28 +271,52 @@ protected override void ProcessRecord() } } */ - + + /* .psd1 file contents should look like: + @{ + "Configuration" = @{ version = "[4.4.2,4.7.0]" } + "Pester" = @{ + version = "[4.4.2,4.7.0]" + repository = PSGallery + credential = $cred + prerelease = $true + } + } + */ + string requiredResourceFileStream = string.Empty; using (StreamReader sr = new StreamReader(_requiredResourceFile)) { requiredResourceFileStream = sr.ReadToEnd(); } - Hashtable pkgsInJsonFile = null; + Hashtable pkgsInFile = null; try { - pkgsInJsonFile = Utils.ConvertJsonToHashtable(this, requiredResourceFileStream); + if (_requiredResourceFile.EndsWith(".json")) + { + pkgsInFile = Utils.ConvertJsonToHashtable(this, requiredResourceFileStream); + } + else + { + // must be a .psd1 file + if (!Utils.TryParsePsd1(_requiredResourceFile, this, out pkgsInFile)) + { + // Ran into errors parsing the .psd1 file which was found in Utils.TryParsePsd1() and written. + return; + } + } } catch (Exception) { - var exMessage = String.Format("Argument for parameter -RequiredResourceFile is not in proper json format. Make sure argument is either a valid json file."); + var exMessage = String.Format("Argument for parameter -RequiredResourceFile is not in proper json or hashtable format. Make sure argument is either a valid .json or .psd1 file."); var ex = new ArgumentException(exMessage); var RequiredResourceFileNotInProperJsonFormat = new ErrorRecord(ex, "RequiredResourceFileNotInProperJsonFormat", ErrorCategory.InvalidData, null); ThrowTerminatingError(RequiredResourceFileNotInProperJsonFormat); } - RequiredResourceHelper(pkgsInJsonFile); + RequiredResourceHelper(pkgsInFile); break; case RequiredResourceParameterSet: diff --git a/src/code/PublishPSResource.cs b/src/code/PublishPSResource.cs index b4acd8455..8db1f5c03 100644 --- a/src/code/PublishPSResource.cs +++ b/src/code/PublishPSResource.cs @@ -470,7 +470,7 @@ private string CreateNuspec( if (!isScript) { // Parse the module manifest and *replace* the passed-in metadata with the module manifest metadata. - if (!Utils.TryParseModuleManifest( + if (!Utils.TryParsePsd1( moduleFileInfo: filePath, cmdletPassedIn: this, parsedMetadataHashtable: out parsedMetadataHash)) diff --git a/src/code/Utils.cs b/src/code/Utils.cs index d11722a1c..43527c85b 100644 --- a/src/code/Utils.cs +++ b/src/code/Utils.cs @@ -728,7 +728,7 @@ private static void GetStandardPlatformPaths( #region Manifest methods - public static bool TryParseModuleManifest( + public static bool TryParsePsd1( string moduleFileInfo, PSCmdlet cmdletPassedIn, out Hashtable parsedMetadataHashtable) diff --git a/test/InstallPSResource.Tests.ps1 b/test/InstallPSResource.Tests.ps1 index bf73e0fb2..b2c32bbd3 100644 --- a/test/InstallPSResource.Tests.ps1 +++ b/test/InstallPSResource.Tests.ps1 @@ -12,6 +12,7 @@ Describe 'Test Install-PSResource for Module' { $NuGetGalleryName = Get-NuGetGalleryName $testModuleName = "TestModule" $RequiredResourceJSONFileName = "TestRequiredResourceFile.json" + $RequiredResourcePSD1FileName = "TestRequiredResourceFile.psd1" Get-NewPSResourceRepositoryFile Register-LocalRepos } @@ -381,10 +382,28 @@ Describe 'Test Install-PSResource for Module' { $res3.Version | Should -Be "0.0.5" } + It "Install modules using -RequiredResourceFile with PSD1 file" { + $rrFilePSD1 = ".\$RequiredResourcePSD1FileName" + + Install-PSResource -RequiredResourceFile $rrFilePSD1 + + $res1 = Get-Module "TestModule" -ListAvailable + $res1.Name | Should -Be "TestModule" + $res1.Version | Should -Be "1.3.0" + + $res2 = Get-Module "TestModulePrerelease" -ListAvailable + $res2.Name | Should -Be "TestModulePrerelease" + $res2.Version | Should -Be "0.0.1" + + $res3 = Get-Module "TestModule99" -ListAvailable + $res3.Name | Should -Be "TestModule99" + $res3.Version | Should -Be "0.0.5" + } + It "Install modules using -RequiredResourceFile with JSON file" { $rrFileJSON = ".\$RequiredResourceJSONFileName" - Install-PSResource -RequiredResourceFile $rrFileJSON -Verbose + Install-PSResource -RequiredResourceFile $rrFileJSON $res1 = Get-Module "TestModule" -ListAvailable $res1.Name | Should -Be "TestModule" diff --git a/test/TestRequiredResourceFile.psd1 b/test/TestRequiredResourceFile.psd1 new file mode 100644 index 000000000..b52765c01 --- /dev/null +++ b/test/TestRequiredResourceFile.psd1 @@ -0,0 +1,15 @@ + @{ + TestModule = @{ + version = "[0.0.1,1.3.0]" + repository = "PoshTestGallery" + } + + TestModulePrerelease = @{ + version = "[0.0.0,0.0.5]" + repository = "PoshTestGallery" + prerelease = "true" + } + + TestModule99 = @{ + } +} \ No newline at end of file From 1f7bcd4964c12a50bc2d4d49f8fc0490a62c5707 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 22 Feb 2022 01:14:30 -0800 Subject: [PATCH 2/5] Incorporate code review suggestions --- src/code/GetHelper.cs | 3 ++- src/code/InstallHelper.cs | 22 ++++++++++++---------- src/code/InstallPSResource.cs | 12 +++++++----- src/code/PublishPSResource.cs | 12 +++++++----- src/code/UninstallPSResource.cs | 3 ++- src/code/Utils.cs | 8 ++++---- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/code/GetHelper.cs b/src/code/GetHelper.cs index 946b270fe..c96586d40 100644 --- a/src/code/GetHelper.cs +++ b/src/code/GetHelper.cs @@ -21,6 +21,7 @@ internal class GetHelper private readonly PSCmdlet _cmdletPassedIn; private readonly Dictionary _scriptDictionary; + public const string PSScriptFileExt = ".ps1"; #endregion @@ -222,7 +223,7 @@ private static string GetResourceNameFromPath(string path) // ./Modules/Microsoft.PowerShell.Test-Module : Microsoft.PowerShell.Test-Module // ./Scripts/Microsoft.PowerShell.Test-Script.ps1 : Microsoft.PowerShell.Test-Script var resourceName = Path.GetFileName(path); - return Path.GetExtension(resourceName).Equals(".ps1", StringComparison.OrdinalIgnoreCase) + return Path.GetExtension(resourceName).Equals(PSScriptFileExt, StringComparison.OrdinalIgnoreCase) ? Path.GetFileNameWithoutExtension(resourceName) : resourceName; } diff --git a/src/code/InstallHelper.cs b/src/code/InstallHelper.cs index bade1e8e4..2d758216a 100644 --- a/src/code/InstallHelper.cs +++ b/src/code/InstallHelper.cs @@ -28,9 +28,11 @@ namespace Microsoft.PowerShell.PowerShellGet.Cmdlets /// Install helper class /// internal class InstallHelper : PSCmdlet - { + { #region Members + public const string PSDataFileExt = ".psd1"; + public const string PSScriptFileExt = ".ps1"; private const string MsgRepositoryNotTrusted = "Untrusted repository"; private const string MsgInstallUntrustedPackage = "You are installing the modules from an untrusted repository. If you trust this repository, change its Trusted value by running the Set-PSResourceRepository cmdlet. Are you sure you want to install the PSresource from '{0}' ?"; @@ -461,8 +463,8 @@ private List InstallPackage( string tempDirNameVersion = isLocalRepo ? tempInstallPath : Path.Combine(tempInstallPath, pkgIdentity.Id.ToLower(), newVersion); var version4digitNoPrerelease = pkgIdentity.Version.Version.ToString(); string moduleManifestVersion = string.Empty; - var scriptPath = Path.Combine(tempDirNameVersion, pkg.Name + ".ps1"); - var modulePath = Path.Combine(tempDirNameVersion, pkg.Name + ".psd1"); + var scriptPath = Path.Combine(tempDirNameVersion, pkg.Name + PSScriptFileExt); + var modulePath = Path.Combine(tempDirNameVersion, pkg.Name + PSDataFileExt); // Check if the package is a module or a script var isModule = File.Exists(modulePath); @@ -497,7 +499,7 @@ private List InstallPackage( if (isModule) { - var moduleManifest = Path.Combine(tempDirNameVersion, pkgIdentity.Id + ".psd1"); + var moduleManifest = Path.Combine(tempDirNameVersion, pkgIdentity.Id + PSDataFileExt); if (!File.Exists(moduleManifest)) { var message = String.Format("{0} package could not be installed with error: Module manifest file: {1} does not exist. This is not a valid PowerShell module.", pkgIdentity.Id, moduleManifest); @@ -509,7 +511,7 @@ private List InstallPackage( continue; } - if (!Utils.TryParsePsd1(moduleManifest, _cmdletPassedIn, out Hashtable parsedMetadataHashtable)) + if (!Utils.TryParsePSDataFile(moduleManifest, _cmdletPassedIn, out Hashtable parsedMetadataHashtable)) { // Ran into errors parsing the module manifest file which was found in Utils.ParseModuleManifest() and written. continue; @@ -878,16 +880,16 @@ private void MoveFilesIntoInstallPath( Utils.MoveFiles(Path.Combine(dirNameVersion, scriptXML), Path.Combine(installPath, "InstalledScriptInfos", scriptXML)); // Need to delete old script file, if that exists - _cmdletPassedIn.WriteVerbose(string.Format("Checking if path '{0}' exists: ", File.Exists(Path.Combine(finalModuleVersionDir, pkgInfo.Name + ".ps1")))); - if (File.Exists(Path.Combine(finalModuleVersionDir, pkgInfo.Name + ".ps1"))) + _cmdletPassedIn.WriteVerbose(string.Format("Checking if path '{0}' exists: ", File.Exists(Path.Combine(finalModuleVersionDir, pkgInfo.Name + PSScriptFileExt)))); + if (File.Exists(Path.Combine(finalModuleVersionDir, pkgInfo.Name + PSScriptFileExt))) { _cmdletPassedIn.WriteVerbose(string.Format("Deleting script file")); - File.Delete(Path.Combine(finalModuleVersionDir, pkgInfo.Name + ".ps1")); + File.Delete(Path.Combine(finalModuleVersionDir, pkgInfo.Name + PSScriptFileExt)); } } - _cmdletPassedIn.WriteVerbose(string.Format("Moving '{0}' to '{1}'", scriptPath, Path.Combine(finalModuleVersionDir, pkgInfo.Name + ".ps1"))); - Utils.MoveFiles(scriptPath, Path.Combine(finalModuleVersionDir, pkgInfo.Name + ".ps1")); + _cmdletPassedIn.WriteVerbose(string.Format("Moving '{0}' to '{1}'", scriptPath, Path.Combine(finalModuleVersionDir, pkgInfo.Name + PSScriptFileExt))); + Utils.MoveFiles(scriptPath, Path.Combine(finalModuleVersionDir, pkgInfo.Name + PSScriptFileExt)); } } diff --git a/src/code/InstallPSResource.cs b/src/code/InstallPSResource.cs index 78b589c99..8f0079f0d 100644 --- a/src/code/InstallPSResource.cs +++ b/src/code/InstallPSResource.cs @@ -145,7 +145,7 @@ public String RequiredResourceFile ThrowTerminatingError(RequiredResourceFileDoesNotExist); } - if (!resolvedPath.EndsWith(".json") && !resolvedPath.EndsWith(".psd1")) + if (!resolvedPath.EndsWith(JsonFileExt, StringComparison.InvariantCultureIgnoreCase) && !resolvedPath.EndsWith(PSDataFileExt, StringComparison.InvariantCultureIgnoreCase)) { var exMessage = String.Format("The RequiredResourceFile must have either a '.json' or '.psd1' extension. Please try specifying a path to a valid .json or .psd1 file"); var ex = new ArgumentException(exMessage); @@ -190,7 +190,9 @@ public String RequiredResourceFile private const string NameParameterSet = "NameParameterSet"; private const string InputObjectParameterSet = "InputObjectParameterSet"; private const string RequiredResourceFileParameterSet = "RequiredResourceFileParameterSet"; - private const string RequiredResourceParameterSet = "RequiredResourceParameterSet"; + private const string RequiredResourceParameterSet = "RequiredResourceParameterSet"; + public const string JsonFileExt = ".json"; + public const string PSDataFileExt = ".psd1"; List _pathsToInstallPkg; private string _requiredResourceFile; private string _requiredResourceJson; @@ -293,16 +295,16 @@ protected override void ProcessRecord() Hashtable pkgsInFile = null; try { - if (_requiredResourceFile.EndsWith(".json")) + if (_requiredResourceFile.EndsWith(JsonFileExt, StringComparison.InvariantCultureIgnoreCase)) { pkgsInFile = Utils.ConvertJsonToHashtable(this, requiredResourceFileStream); } else { // must be a .psd1 file - if (!Utils.TryParsePsd1(_requiredResourceFile, this, out pkgsInFile)) + if (!Utils.TryParsePSDataFile(_requiredResourceFile, this, out pkgsInFile)) { - // Ran into errors parsing the .psd1 file which was found in Utils.TryParsePsd1() and written. + // Ran into errors parsing the .psd1 file which was found in Utils.TryParsePSDataFile() and written. return; } } diff --git a/src/code/PublishPSResource.cs b/src/code/PublishPSResource.cs index 8db1f5c03..bd9f46dd6 100644 --- a/src/code/PublishPSResource.cs +++ b/src/code/PublishPSResource.cs @@ -63,7 +63,7 @@ public string Path { _path = resolvedPath; } - else if (File.Exists(resolvedPath) && resolvedPath.EndsWith(".ps1", StringComparison.OrdinalIgnoreCase)) + else if (File.Exists(resolvedPath) && resolvedPath.EndsWith(PSDataFileExt, StringComparison.OrdinalIgnoreCase)) { _path = resolvedPath; } @@ -163,6 +163,8 @@ public PSCredential ProxyCredential { private NuGetVersion _pkgVersion; private string _pkgName; private static char[] _PathSeparators = new [] { System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar }; + public const string PSDataFileExt = ".psd1"; + public const string PSScriptFileExt = ".ps1"; #endregion @@ -179,7 +181,7 @@ protected override void ProcessRecord() { // Returns the name of the file or the name of the directory, depending on path var pkgFileOrDir = new DirectoryInfo(_path); - bool isScript = _path.EndsWith(".ps1", StringComparison.OrdinalIgnoreCase); + bool isScript = _path.EndsWith(PSScriptFileExt, StringComparison.OrdinalIgnoreCase); if (!ShouldProcess(string.Format("Publish resource '{0}' from the machine", _path))) { @@ -233,7 +235,7 @@ protected override void ProcessRecord() else { _pkgName = pkgFileOrDir.Name; - resourceFilePath = System.IO.Path.Combine(_path, _pkgName + ".psd1"); + resourceFilePath = System.IO.Path.Combine(_path, _pkgName + PSDataFileExt); // Validate that there's a module manifest if (!File.Exists(resourceFilePath)) @@ -332,7 +334,7 @@ protected override void ProcessRecord() if (isScript) { // copy the script file to the temp directory - File.Copy(_path, System.IO.Path.Combine(outputDir, _pkgName + ".ps1"), true); + File.Copy(_path, System.IO.Path.Combine(outputDir, _pkgName + PSDataFileExt), true); } else { @@ -470,7 +472,7 @@ private string CreateNuspec( if (!isScript) { // Parse the module manifest and *replace* the passed-in metadata with the module manifest metadata. - if (!Utils.TryParsePsd1( + if (!Utils.TryParsePSDataFile( moduleFileInfo: filePath, cmdletPassedIn: this, parsedMetadataHashtable: out parsedMetadataHash)) diff --git a/src/code/UninstallPSResource.cs b/src/code/UninstallPSResource.cs index 44afd1670..5dfe13c00 100644 --- a/src/code/UninstallPSResource.cs +++ b/src/code/UninstallPSResource.cs @@ -60,6 +60,7 @@ public sealed class UninstallPSResource : PSCmdlet private const string NameParameterSet = "NameParameterSet"; private const string InputObjectParameterSet = "InputObjectParameterSet"; + public const string PSScriptFileExt = ".ps1"; public static readonly string OsPlatform = System.Runtime.InteropServices.RuntimeInformation.OSDescription; VersionRange _versionRange; List _pathsToSearch = new List(); @@ -180,7 +181,7 @@ private bool UninstallPkgHelper() } ErrorRecord errRecord = null; - if (pkgPath.EndsWith(".ps1")) + if (pkgPath.EndsWith(PSScriptFileExt)) { successfullyUninstalled = UninstallScriptHelper(pkgPath, pkgName, out errRecord); } diff --git a/src/code/Utils.cs b/src/code/Utils.cs index 43527c85b..07c74fc12 100644 --- a/src/code/Utils.cs +++ b/src/code/Utils.cs @@ -23,8 +23,8 @@ internal static class Utils { #region String fields - public static readonly string[] EmptyStrArray = Array.Empty(); - + public static readonly string[] EmptyStrArray = Array.Empty(); + public const string PSDataFileExt = ".psd1"; private const string ConvertJsonToHashtableScript = @" param ( [string] $json @@ -728,7 +728,7 @@ private static void GetStandardPlatformPaths( #region Manifest methods - public static bool TryParsePsd1( + public static bool TryParsePSDataFile( string moduleFileInfo, PSCmdlet cmdletPassedIn, out Hashtable parsedMetadataHashtable) @@ -738,7 +738,7 @@ public static bool TryParsePsd1( // A script will already have the metadata parsed into the parsedMetadatahash, // a module will still need the module manifest to be parsed. - if (moduleFileInfo.EndsWith(".psd1", StringComparison.OrdinalIgnoreCase)) + if (moduleFileInfo.EndsWith(PSDataFileExt, StringComparison.OrdinalIgnoreCase)) { // Parse the module manifest var ast = Parser.ParseFile( From 5f5a3baf76440b0f8d9eb45916fa2fd4e7222f21 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 22 Feb 2022 14:14:47 -0800 Subject: [PATCH 3/5] Add more code review suggestions --- test/InstallPSResource.Tests.ps1 | 4 ++-- test/TestRequiredResourceFile.json | 3 +-- test/TestRequiredResourceFile.psd1 | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/test/InstallPSResource.Tests.ps1 b/test/InstallPSResource.Tests.ps1 index b2c32bbd3..47c7dece5 100644 --- a/test/InstallPSResource.Tests.ps1 +++ b/test/InstallPSResource.Tests.ps1 @@ -383,7 +383,7 @@ Describe 'Test Install-PSResource for Module' { } It "Install modules using -RequiredResourceFile with PSD1 file" { - $rrFilePSD1 = ".\$RequiredResourcePSD1FileName" + $rrFilePSD1 = Join-Path -Path $psscriptroot -ChildPath "test" -AdditionalChildPath $RequiredResourcePSD1FileName Install-PSResource -RequiredResourceFile $rrFilePSD1 @@ -401,7 +401,7 @@ Describe 'Test Install-PSResource for Module' { } It "Install modules using -RequiredResourceFile with JSON file" { - $rrFileJSON = ".\$RequiredResourceJSONFileName" + $rrFileJSON = Join-Path -Path $psscriptroot -ChildPath "test" -AdditionalChildPath $RequiredResourceJSONFileName Install-PSResource -RequiredResourceFile $rrFileJSON diff --git a/test/TestRequiredResourceFile.json b/test/TestRequiredResourceFile.json index 1a790c79b..6d6c04e9f 100644 --- a/test/TestRequiredResourceFile.json +++ b/test/TestRequiredResourceFile.json @@ -8,6 +8,5 @@ "repository": "PoshTestGallery", "prerelease": "true" }, - "TestModule99": { - } + "TestModule99": {} } diff --git a/test/TestRequiredResourceFile.psd1 b/test/TestRequiredResourceFile.psd1 index b52765c01..2c34f5a8d 100644 --- a/test/TestRequiredResourceFile.psd1 +++ b/test/TestRequiredResourceFile.psd1 @@ -10,6 +10,5 @@ prerelease = "true" } - TestModule99 = @{ - } + TestModule99 = @{} } \ No newline at end of file From 494d03b33f11f484697ac09e191a3a4e4c232ab0 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 22 Feb 2022 15:06:41 -0800 Subject: [PATCH 4/5] Add enum and fix test paths --- src/code/InstallPSResource.cs | 28 +++++++++++++++++++++++----- test/InstallPSResource.Tests.ps1 | 4 ++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/code/InstallPSResource.cs b/src/code/InstallPSResource.cs index 8f0079f0d..c121cc68b 100644 --- a/src/code/InstallPSResource.cs +++ b/src/code/InstallPSResource.cs @@ -145,8 +145,17 @@ public String RequiredResourceFile ThrowTerminatingError(RequiredResourceFileDoesNotExist); } - if (!resolvedPath.EndsWith(JsonFileExt, StringComparison.InvariantCultureIgnoreCase) && !resolvedPath.EndsWith(PSDataFileExt, StringComparison.InvariantCultureIgnoreCase)) + if (resolvedPath.EndsWith(".json", StringComparison.InvariantCultureIgnoreCase)) { + _resourceFileType = ResourceFileType.JsonFile; + } + else if (resolvedPath.EndsWith(".psd1", StringComparison.InvariantCultureIgnoreCase)) + { + _resourceFileType = ResourceFileType.PSDataFile; + } + else + { + // Throw here because no further processing can be done. var exMessage = String.Format("The RequiredResourceFile must have either a '.json' or '.psd1' extension. Please try specifying a path to a valid .json or .psd1 file"); var ex = new ArgumentException(exMessage); var RequiredResourceFileNotValid = new ErrorRecord(ex, "RequiredResourceFileNotValid", ErrorCategory.ObjectNotFound, null); @@ -185,20 +194,29 @@ public String RequiredResourceFile #endregion + #region Enums + public enum ResourceFileType + { + UnknownFile, + JsonFile, + PSDataFile + } + + #endregion + #region Members private const string NameParameterSet = "NameParameterSet"; private const string InputObjectParameterSet = "InputObjectParameterSet"; private const string RequiredResourceFileParameterSet = "RequiredResourceFileParameterSet"; - private const string RequiredResourceParameterSet = "RequiredResourceParameterSet"; - public const string JsonFileExt = ".json"; - public const string PSDataFileExt = ".psd1"; + private const string RequiredResourceParameterSet = "RequiredResourceParameterSet"; List _pathsToInstallPkg; private string _requiredResourceFile; private string _requiredResourceJson; private Hashtable _requiredResourceHash; VersionRange _versionRange; InstallHelper _installHelper; + ResourceFileType _resourceFileType; #endregion @@ -295,7 +313,7 @@ protected override void ProcessRecord() Hashtable pkgsInFile = null; try { - if (_requiredResourceFile.EndsWith(JsonFileExt, StringComparison.InvariantCultureIgnoreCase)) + if (_resourceFileType.Equals(ResourceFileType.JsonFile)) { pkgsInFile = Utils.ConvertJsonToHashtable(this, requiredResourceFileStream); } diff --git a/test/InstallPSResource.Tests.ps1 b/test/InstallPSResource.Tests.ps1 index 47c7dece5..fae7b83bf 100644 --- a/test/InstallPSResource.Tests.ps1 +++ b/test/InstallPSResource.Tests.ps1 @@ -383,7 +383,7 @@ Describe 'Test Install-PSResource for Module' { } It "Install modules using -RequiredResourceFile with PSD1 file" { - $rrFilePSD1 = Join-Path -Path $psscriptroot -ChildPath "test" -AdditionalChildPath $RequiredResourcePSD1FileName + $rrFilePSD1 = Join-Path -Path $psscriptroot -ChildPath $RequiredResourcePSD1FileName Install-PSResource -RequiredResourceFile $rrFilePSD1 @@ -401,7 +401,7 @@ Describe 'Test Install-PSResource for Module' { } It "Install modules using -RequiredResourceFile with JSON file" { - $rrFileJSON = Join-Path -Path $psscriptroot -ChildPath "test" -AdditionalChildPath $RequiredResourceJSONFileName + $rrFileJSON = Join-Path -Path $psscriptroot -ChildPath $RequiredResourceJSONFileName Install-PSResource -RequiredResourceFile $rrFileJSON From 0e34dfa2a0c4791486e246e29524568a6d146fc2 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 22 Feb 2022 16:49:21 -0800 Subject: [PATCH 5/5] Add whitespace and change enum scope to private --- src/code/InstallPSResource.cs | 3 ++- test/TestRequiredResourceFile.psd1 | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/code/InstallPSResource.cs b/src/code/InstallPSResource.cs index c121cc68b..c08987d26 100644 --- a/src/code/InstallPSResource.cs +++ b/src/code/InstallPSResource.cs @@ -195,7 +195,8 @@ public String RequiredResourceFile #endregion #region Enums - public enum ResourceFileType + + private enum ResourceFileType { UnknownFile, JsonFile, diff --git a/test/TestRequiredResourceFile.psd1 b/test/TestRequiredResourceFile.psd1 index 2c34f5a8d..767e404bf 100644 --- a/test/TestRequiredResourceFile.psd1 +++ b/test/TestRequiredResourceFile.psd1 @@ -11,4 +11,4 @@ } TestModule99 = @{} -} \ No newline at end of file +}