From 4dd38fe3221d1a22f2b1338cd002a6986e671a77 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 10 Feb 2025 22:55:03 +0100 Subject: [PATCH 01/17] Colocate EVERYTHING :) --- .github/actions/Build/.github/CODEOWNERS | 50 ++ .github/actions/Build/.github/dependabot.yml | 11 + .../Build/.github/linters/.markdown-lint.yml | 25 + .../linters/.powershell-psscriptanalyzer.psd1 | 18 + .github/actions/Build/.github/release.yml | 18 + .../Build/.github/workflows/Action-Test.yml | 57 +++ .../Build/.github/workflows/Auto-Release.yml | 36 ++ .../Build/.github/workflows/Linter.yml | 32 ++ .github/actions/Build/README.md | 182 +++++++ .github/actions/Build/action.yml | 81 +++ .../Build/scripts/helpers/Build-PSModule.ps1 | 61 +++ .../helpers/Build/Add-ContentFromItem.ps1 | 66 +++ .../helpers/Build/Build-PSModuleBase.ps1 | 43 ++ .../Build/Build-PSModuleDocumentation.ps1 | 110 +++++ .../helpers/Build/Build-PSModuleManifest.ps1 | 462 ++++++++++++++++++ .../Build/Build-PSModuleRootModule.ps1 | 267 ++++++++++ .../helpers/Build/ConvertTo-Hashtable.ps1 | 32 ++ .../Build/Get-PSModuleAliasesToExport.ps1 | 36 ++ .../Build/Get-PSModuleClassesToExport.ps1 | 40 ++ .../Build/Get-PSModuleCmdletsToExport.ps1 | 36 ++ .../Build/Get-PSModuleFunctionsToExport.ps1 | 44 ++ .../Build/Get-PSModuleVariablesToExport.ps1 | 45 ++ .../helpers/Build/Get-RootLevelVariables.ps1 | 22 + .../scripts/helpers/Build/Import-PSModule.ps1 | 50 ++ .../helpers/Build/PSScriptAnalyzer.Tests.psd1 | 56 +++ .../Build/Resolve-PSModuleDependency.ps1 | 64 +++ ...Update-PSModuleManifestAliasesToExport.ps1 | 40 ++ .github/actions/Build/scripts/main.ps1 | 53 ++ .../Build/tests/src/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../src/classes/private/SecretWriter.ps1 | 15 + .../Build/tests/src/classes/public/Book.ps1 | 147 ++++++ .../actions/Build/tests/src/data/Config.psd1 | 3 + .../Build/tests/src/data/Settings.psd1 | 3 + .github/actions/Build/tests/src/finally.ps1 | 3 + .../src/formats/CultureInfo.Format.ps1xml | 37 ++ .../tests/src/formats/Mygciview.Format.ps1xml | 65 +++ .../private/Get-InternalPSModule.ps1 | 18 + .../private/Set-InternalPSModule.ps1 | 22 + .../public/PSModule/Get-PSModuleTest.ps1 | 22 + .../public/PSModule/New-PSModuleTest.ps1 | 37 ++ .../src/functions/public/PSModule/PSModule.md | 1 + .../public/SomethingElse/Set-PSModuleTest.ps1 | 22 + .../public/SomethingElse/SomethingElse.md | 1 + .../functions/public/Test-PSModuleTest.ps1 | 18 + .github/actions/Build/tests/src/header.ps1 | 3 + .../Build/tests/src/init/initializer.ps1 | 3 + .../tests/src/modules/OtherPSModule.psm1 | 19 + .../Build/tests/src/scripts/loader.ps1 | 3 + .../src/types/DirectoryInfo.Types.ps1xml | 21 + .../tests/src/types/FileInfo.Types.ps1xml | 14 + .../variables/private/PrivateVariables.ps1 | 47 ++ .../tests/src/variables/public/Moons.ps1 | 6 + .../tests/src/variables/public/Planets.ps1 | 20 + .../src/variables/public/SolarSystems.ps1 | 17 + .../srcWithManifest/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../tests/srcWithManifest/data/Config.psd1 | 3 + .../tests/srcWithManifest/data/Settings.psd1 | 3 + .../Build/tests/srcWithManifest/finally.ps1 | 3 + .../formats/CultureInfo.Format.ps1xml | 37 ++ .../formats/Mygciview.Format.ps1xml | 65 +++ .../private/Get-InternalPSModule.ps1 | 18 + .../private/Set-InternalPSModule.ps1 | 22 + .../public/PSModule/Get-PSModuleTest.ps1 | 22 + .../public/PSModule/New-PSModuleTest.ps1 | 37 ++ .../functions/public/PSModule/PSModule.md | 1 + .../public/SomethingElse/Set-PSModuleTest.ps1 | 22 + .../public/SomethingElse/SomethingElse.md | 1 + .../functions/public/Test-PSModuleTest.ps1 | 18 + .../Build/tests/srcWithManifest/header.ps1 | 3 + .../srcWithManifest/init/initializer.ps1 | 3 + .../Build/tests/srcWithManifest/manifest.psd1 | 6 + .../modules/OtherPSModule.psm1 | 19 + .../tests/srcWithManifest/scripts/loader.ps1 | 3 + .../types/DirectoryInfo.Types.ps1xml | 21 + .../types/FileInfo.Types.ps1xml | 14 + .../variables/private/PrivateVariables.ps1 | 47 ++ .../variables/public/Moons.ps1 | 6 + .../variables/public/Planets.ps1 | 20 + .../variables/public/SolarSystems.ps1 | 17 + .github/actions/Build/tests/tools/1-build.ps1 | 1 + .github/actions/Build/tests/tools/2-build.ps1 | 1 + .../.github/workflows/Action-Test.yml | 32 ++ .github/actions/Document/README.md | 17 + .github/actions/Document/action.yml | 27 + .github/actions/Document/scripts/main.ps1 | 40 ++ .github/actions/Document/tests/README.md | 3 + .../.github/linters/.markdown-lint.yml | 25 + .../linters/.powershell-psscriptanalyzer.psd1 | 17 + .../.github/workflows/Action-Test.yml | 45 ++ .../.github/workflows/Auto-Release.yml | 36 ++ .../Initialize/.github/workflows/Linter.yml | 32 ++ .github/actions/Initialize/README.md | 77 +++ .github/actions/Initialize/action.yml | 37 ++ .github/actions/Initialize/scripts/main.ps1 | 46 ++ .../.github/linters/.markdown-lint.yml | 25 + .../linters/.powershell-psscriptanalyzer.psd1 | 17 + .../Publish/.github/workflows/Action-Test.yml | 40 ++ .../.github/workflows/Auto-Release.yml | 36 ++ .../Publish/.github/workflows/Linter.yml | 31 ++ .github/actions/Publish/README.md | 119 +++++ .github/actions/Publish/action.yml | 106 ++++ .../scripts/helpers/Publish-PSModule.ps1 | 415 ++++++++++++++++ .../helpers/Resolve-PSModuleDependency.ps1 | 64 +++ .github/actions/Publish/scripts/main.ps1 | 34 ++ .../modules/PSModuleTest/PSModuleTest.psd1 | 75 +++ .../modules/PSModuleTest/PSModuleTest.psm1 | 382 +++++++++++++++ .../PSModuleTest/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../modules/PSModuleTest/data/Config.psd1 | 3 + .../modules/PSModuleTest/data/Settings.psd1 | 3 + .../formats/CultureInfo.Format.ps1xml | 37 ++ .../formats/Mygciview.Format.ps1xml | 65 +++ .../PSModuleTest/modules/OtherPSModule.psm1 | 19 + .../modules/PSModuleTest/scripts/loader.ps1 | 3 + .../types/DirectoryInfo.Types.ps1xml | 21 + .../PSModuleTest/types/FileInfo.Types.ps1xml | 14 + .../Test/.github/linters/.markdown-lint.yml | 25 + .../linters/.powershell-psscriptanalyzer.psd1 | 18 + .../workflows/Action-Test-Src-Default.yml | 50 ++ .../Action-Test-Src-WithManifest.yml | 50 ++ .../.github/workflows/Action-Test-outputs.yml | 50 ++ .../Test/.github/workflows/Auto-Release.yml | 36 ++ .../actions/Test/.github/workflows/Linter.yml | 32 ++ .github/actions/Test/README.md | 129 +++++ .github/actions/Test/action.yml | 86 ++++ .../helpers/Resolve-PSModuleDependency.ps1 | 64 +++ .../Test/scripts/helpers/Test-PSModule.ps1 | 177 +++++++ .github/actions/Test/scripts/main.ps1 | 62 +++ .../scripts/tests/PSModule/Common.Tests.ps1 | 42 ++ .../scripts/tests/PSModule/Module.Tests.ps1 | 50 ++ .../tests/PSModule/SourceCode.Tests.ps1 | 385 +++++++++++++++ .../PSScriptAnalyzer.Tests.ps1 | 55 +++ .../PSScriptAnalyzer/Settings.Module.psd1 | 47 ++ .../PSScriptAnalyzer/Settings.SourceCode.psd1 | 57 +++ .../docs/PSModuleTest/Get-PSModuleTest.md | 72 +++ .../docs/PSModuleTest/New-PSModuleTest.md | 72 +++ .../docs/PSModuleTest/Set-PSModuleTest.md | 72 +++ .../docs/PSModuleTest/Test-PSModuleTest.md | 72 +++ .../modules/PSModuleTest/PSModuleTest.psd1 | 75 +++ .../modules/PSModuleTest/PSModuleTest.psm1 | 392 +++++++++++++++ .../PSModuleTest/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../modules/PSModuleTest/data/Config.psd1 | 3 + .../modules/PSModuleTest/data/Settings.psd1 | 3 + .../formats/CultureInfo.Format.ps1xml | 37 ++ .../formats/Mygciview.Format.ps1xml | 65 +++ .../PSModuleTest/modules/OtherPSModule.psm1 | 19 + .../modules/PSModuleTest/scripts/loader.ps1 | 3 + .../types/DirectoryInfo.Types.ps1xml | 21 + .../PSModuleTest/types/FileInfo.Types.ps1xml | 14 + .../Test/tests/src/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../src/classes/private/SecretWriter.ps1 | 15 + .../Test/tests/src/classes/public/Book.ps1 | 147 ++++++ .../actions/Test/tests/src/data/Config.psd1 | 3 + .../actions/Test/tests/src/data/Settings.psd1 | 3 + .github/actions/Test/tests/src/finally.ps1 | 3 + .../src/formats/CultureInfo.Format.ps1xml | 37 ++ .../tests/src/formats/Mygciview.Format.ps1xml | 65 +++ .../private/Get-InternalPSModule.ps1 | 18 + .../private/Set-InternalPSModule.ps1 | 22 + .../src/functions/public/Get-PSModuleTest.ps1 | 20 + .../src/functions/public/New-PSModuleTest.ps1 | 38 ++ .../src/functions/public/Set-PSModuleTest.ps1 | 22 + .../functions/public/Test-PSModuleTest.ps1 | 20 + .../tests/src/functions/public/completers.ps1 | 8 + .github/actions/Test/tests/src/header.ps1 | 3 + .../Test/tests/src/init/initializer.ps1 | 3 + .../Test/tests/src/modules/OtherPSModule.psm1 | 19 + .../actions/Test/tests/src/scripts/loader.ps1 | 3 + .../src/types/DirectoryInfo.Types.ps1xml | 21 + .../tests/src/types/FileInfo.Types.ps1xml | 14 + .../variables/private/PrivateVariables.ps1 | 47 ++ .../Test/tests/src/variables/public/Moons.ps1 | 6 + .../tests/src/variables/public/Planets.ps1 | 20 + .../src/variables/public/SolarSystems.ps1 | 17 + .../srcWithManifest/assemblies/LsonLib.dll | Bin 0 -> 43520 bytes .../classes/private/SecretWriter.ps1 | 15 + .../srcWithManifest/classes/public/Book.ps1 | 147 ++++++ .../tests/srcWithManifest/data/Config.psd1 | 3 + .../tests/srcWithManifest/data/Settings.psd1 | 3 + .../Test/tests/srcWithManifest/finally.ps1 | 3 + .../formats/CultureInfo.Format.ps1xml | 37 ++ .../formats/Mygciview.Format.ps1xml | 65 +++ .../private/Get-InternalPSModule.ps1 | 18 + .../private/Set-InternalPSModule.ps1 | 22 + .../functions/public/Get-PSModuleTest.ps1 | 20 + .../functions/public/New-PSModuleTest.ps1 | 38 ++ .../functions/public/Set-PSModuleTest.ps1 | 22 + .../functions/public/Test-PSModuleTest.ps1 | 20 + .../Test/tests/srcWithManifest/header.ps1 | 3 + .../srcWithManifest/init/initializer.ps1 | 3 + .../Test/tests/srcWithManifest/manifest.psd1 | 3 + .../modules/OtherPSModule.psm1 | 19 + .../tests/srcWithManifest/scripts/loader.ps1 | 3 + .../types/DirectoryInfo.Types.ps1xml | 21 + .../types/FileInfo.Types.ps1xml | 14 + .../variables/private/PrivateVariables.ps1 | 47 ++ .../variables/public/Moons.ps1 | 6 + .../variables/public/Planets.ps1 | 20 + .../variables/public/SolarSystems.ps1 | 17 + .../Test/tests/tests/PSModuleTest.Tests.ps1 | 11 + .github/workflows/CI.yml | 32 +- .github/workflows/workflow.yml | 38 +- 201 files changed, 8484 insertions(+), 35 deletions(-) create mode 100644 .github/actions/Build/.github/CODEOWNERS create mode 100644 .github/actions/Build/.github/dependabot.yml create mode 100644 .github/actions/Build/.github/linters/.markdown-lint.yml create mode 100644 .github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 create mode 100644 .github/actions/Build/.github/release.yml create mode 100644 .github/actions/Build/.github/workflows/Action-Test.yml create mode 100644 .github/actions/Build/.github/workflows/Auto-Release.yml create mode 100644 .github/actions/Build/.github/workflows/Linter.yml create mode 100644 .github/actions/Build/README.md create mode 100644 .github/actions/Build/action.yml create mode 100644 .github/actions/Build/scripts/helpers/Build-PSModule.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Add-ContentFromItem.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Build-PSModuleBase.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Build-PSModuleDocumentation.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Build-PSModuleManifest.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Build-PSModuleRootModule.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/ConvertTo-Hashtable.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-PSModuleAliasesToExport.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-PSModuleClassesToExport.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-PSModuleCmdletsToExport.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-PSModuleFunctionsToExport.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-PSModuleVariablesToExport.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Get-RootLevelVariables.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Import-PSModule.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/PSScriptAnalyzer.Tests.psd1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Resolve-PSModuleDependency.ps1 create mode 100644 .github/actions/Build/scripts/helpers/Build/Update-PSModuleManifestAliasesToExport.ps1 create mode 100644 .github/actions/Build/scripts/main.ps1 create mode 100644 .github/actions/Build/tests/src/assemblies/LsonLib.dll create mode 100644 .github/actions/Build/tests/src/classes/private/SecretWriter.ps1 create mode 100644 .github/actions/Build/tests/src/classes/public/Book.ps1 create mode 100644 .github/actions/Build/tests/src/data/Config.psd1 create mode 100644 .github/actions/Build/tests/src/data/Settings.psd1 create mode 100644 .github/actions/Build/tests/src/finally.ps1 create mode 100644 .github/actions/Build/tests/src/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 create mode 100644 .github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 create mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/PSModule.md create mode 100644 .github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md create mode 100644 .github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/src/header.ps1 create mode 100644 .github/actions/Build/tests/src/init/initializer.ps1 create mode 100644 .github/actions/Build/tests/src/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Build/tests/src/scripts/loader.ps1 create mode 100644 .github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Build/tests/src/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 create mode 100644 .github/actions/Build/tests/src/variables/public/Moons.ps1 create mode 100644 .github/actions/Build/tests/src/variables/public/Planets.ps1 create mode 100644 .github/actions/Build/tests/src/variables/public/SolarSystems.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll create mode 100644 .github/actions/Build/tests/srcWithManifest/data/Config.psd1 create mode 100644 .github/actions/Build/tests/srcWithManifest/data/Settings.psd1 create mode 100644 .github/actions/Build/tests/srcWithManifest/finally.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md create mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/header.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/init/initializer.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/manifest.psd1 create mode 100644 .github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 create mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 create mode 100644 .github/actions/Build/tests/tools/1-build.ps1 create mode 100644 .github/actions/Build/tests/tools/2-build.ps1 create mode 100644 .github/actions/Document/.github/workflows/Action-Test.yml create mode 100644 .github/actions/Document/README.md create mode 100644 .github/actions/Document/action.yml create mode 100644 .github/actions/Document/scripts/main.ps1 create mode 100644 .github/actions/Document/tests/README.md create mode 100644 .github/actions/Initialize/.github/linters/.markdown-lint.yml create mode 100644 .github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 create mode 100644 .github/actions/Initialize/.github/workflows/Action-Test.yml create mode 100644 .github/actions/Initialize/.github/workflows/Auto-Release.yml create mode 100644 .github/actions/Initialize/.github/workflows/Linter.yml create mode 100644 .github/actions/Initialize/README.md create mode 100644 .github/actions/Initialize/action.yml create mode 100644 .github/actions/Initialize/scripts/main.ps1 create mode 100644 .github/actions/Publish/.github/linters/.markdown-lint.yml create mode 100644 .github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 create mode 100644 .github/actions/Publish/.github/workflows/Action-Test.yml create mode 100644 .github/actions/Publish/.github/workflows/Auto-Release.yml create mode 100644 .github/actions/Publish/.github/workflows/Linter.yml create mode 100644 .github/actions/Publish/README.md create mode 100644 .github/actions/Publish/action.yml create mode 100644 .github/actions/Publish/scripts/helpers/Publish-PSModule.ps1 create mode 100644 .github/actions/Publish/scripts/helpers/Resolve-PSModuleDependency.ps1 create mode 100644 .github/actions/Publish/scripts/main.ps1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/data/Config.psd1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/data/Settings.psd1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Test/.github/linters/.markdown-lint.yml create mode 100644 .github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 create mode 100644 .github/actions/Test/.github/workflows/Action-Test-Src-Default.yml create mode 100644 .github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml create mode 100644 .github/actions/Test/.github/workflows/Action-Test-outputs.yml create mode 100644 .github/actions/Test/.github/workflows/Auto-Release.yml create mode 100644 .github/actions/Test/.github/workflows/Linter.yml create mode 100644 .github/actions/Test/README.md create mode 100644 .github/actions/Test/action.yml create mode 100644 .github/actions/Test/scripts/helpers/Resolve-PSModuleDependency.ps1 create mode 100644 .github/actions/Test/scripts/helpers/Test-PSModule.ps1 create mode 100644 .github/actions/Test/scripts/main.ps1 create mode 100644 .github/actions/Test/scripts/tests/PSModule/Common.Tests.ps1 create mode 100644 .github/actions/Test/scripts/tests/PSModule/Module.Tests.ps1 create mode 100644 .github/actions/Test/scripts/tests/PSModule/SourceCode.Tests.ps1 create mode 100644 .github/actions/Test/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 create mode 100644 .github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 create mode 100644 .github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 create mode 100644 .github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md create mode 100644 .github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md create mode 100644 .github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md create mode 100644 .github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/data/Config.psd1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/data/Settings.psd1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/src/assemblies/LsonLib.dll create mode 100644 .github/actions/Test/tests/src/classes/private/SecretWriter.ps1 create mode 100644 .github/actions/Test/tests/src/classes/public/Book.ps1 create mode 100644 .github/actions/Test/tests/src/data/Config.psd1 create mode 100644 .github/actions/Test/tests/src/data/Settings.psd1 create mode 100644 .github/actions/Test/tests/src/finally.ps1 create mode 100644 .github/actions/Test/tests/src/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 create mode 100644 .github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 create mode 100644 .github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/src/functions/public/completers.ps1 create mode 100644 .github/actions/Test/tests/src/header.ps1 create mode 100644 .github/actions/Test/tests/src/init/initializer.ps1 create mode 100644 .github/actions/Test/tests/src/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Test/tests/src/scripts/loader.ps1 create mode 100644 .github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/src/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 create mode 100644 .github/actions/Test/tests/src/variables/public/Moons.ps1 create mode 100644 .github/actions/Test/tests/src/variables/public/Planets.ps1 create mode 100644 .github/actions/Test/tests/src/variables/public/SolarSystems.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll create mode 100644 .github/actions/Test/tests/srcWithManifest/classes/private/SecretWriter.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/classes/public/Book.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/data/Config.psd1 create mode 100644 .github/actions/Test/tests/srcWithManifest/data/Settings.psd1 create mode 100644 .github/actions/Test/tests/srcWithManifest/finally.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml create mode 100644 .github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/header.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/init/initializer.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/manifest.psd1 create mode 100644 .github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 create mode 100644 .github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml create mode 100644 .github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 create mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 create mode 100644 .github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 diff --git a/.github/actions/Build/.github/CODEOWNERS b/.github/actions/Build/.github/CODEOWNERS new file mode 100644 index 00000000..beae856d --- /dev/null +++ b/.github/actions/Build/.github/CODEOWNERS @@ -0,0 +1,50 @@ +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @global-owner1 and @global-owner2 will be requested for +# review when someone opens a pull request. +* @PSModule/framework-maintainers + +# Order is important; the last matching pattern takes the most +# precedence. When someone opens a pull request that only +# modifies JS files, only @js-owner and not the global +# owner(s) will be requested for a review. +# *.js @js-owner + +# You can also use email addresses if you prefer. They'll be +# used to look up users just like we do for commit author +# emails. +# *.go docs@example.com + +# Teams can be specified as code owners as well. Teams should +# be identified in the format @org/team-name. Teams must have +# explicit write access to the repository. In this example, +# the octocats team in the octo-org organization owns all .txt files. +# *.txt @octo-org/octocats + +# In this example, @doctocat owns any files in the build/logs +# directory at the root of the repository and any of its +# subdirectories. +# /build/logs/ @doctocat + +# The `docs/*` pattern will match files like +# `docs/getting-started.md` but not further nested files like +# `docs/build-app/troubleshooting.md`. +# docs/* docs@example.com + +# In this example, @octocat owns any file in an apps directory +# anywhere in your repository. +# apps/ @octocat + +# In this example, @doctocat owns any file in the `/docs` +# directory in the root of your repository and any of its +# subdirectories. +# /docs/ @doctocat + +# In this example, @octocat owns any file in the `/apps` +# directory in the root of your repository except for the `/apps/github` +# subdirectory, as its owners are left empty. +# /apps/ @octocat +# /apps/github diff --git a/.github/actions/Build/.github/dependabot.yml b/.github/actions/Build/.github/dependabot.yml new file mode 100644 index 00000000..f57e1e95 --- /dev/null +++ b/.github/actions/Build/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: github-actions # See documentation for possible values + directory: / # Location of package manifests + schedule: + interval: weekly diff --git a/.github/actions/Build/.github/linters/.markdown-lint.yml b/.github/actions/Build/.github/linters/.markdown-lint.yml new file mode 100644 index 00000000..b9ecdfa9 --- /dev/null +++ b/.github/actions/Build/.github/linters/.markdown-lint.yml @@ -0,0 +1,25 @@ +########################### +## Markdown Linter rules ## +########################### + +# Linter rules doc: +# - https://github.com/DavidAnson/markdownlint + +############### +# Rules by id # +############### +MD004: false # Unordered list style +MD007: + indent: 2 # Unordered list indentation +MD013: + line_length: 808 # Line length +MD026: + punctuation: ".,;:!。,;:" # List of not allowed +MD029: false # Ordered list item prefix +MD033: false # Allow inline HTML +MD036: false # Emphasis used instead of a heading + +################# +# Rules by tags # +################# +blank_lines: false # Error on blank lines diff --git a/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 new file mode 100644 index 00000000..40d11d60 --- /dev/null +++ b/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -0,0 +1,18 @@ +#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings +@{ + #CustomRulePath='path\to\CustomRuleModule.psm1' + #RecurseCustomRulePath='path\of\customrules' + #Severity = @( + # 'Error' + # 'Warning' + #) + #IncludeDefaultRules=${true} + ExcludeRules = @( + 'PSMissingModuleManifestField' + 'PSAvoidUsingWriteHost' + ) + #IncludeRules = @( + # 'PSAvoidUsingWriteHost', + # 'MyCustomRuleName' + #) +} diff --git a/.github/actions/Build/.github/release.yml b/.github/actions/Build/.github/release.yml new file mode 100644 index 00000000..35c6ae86 --- /dev/null +++ b/.github/actions/Build/.github/release.yml @@ -0,0 +1,18 @@ +# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes + +changelog: + exclude: + labels: + - NoRelease + categories: + - title: 🌟 Breaking Changes + labels: + - Major + - Breaking + - title: 🚀 New Features + labels: + - Minor + - Feature + - title: Other Changes + labels: + - '*' diff --git a/.github/actions/Build/.github/workflows/Action-Test.yml b/.github/actions/Build/.github/workflows/Action-Test.yml new file mode 100644 index 00000000..cd9ca95f --- /dev/null +++ b/.github/actions/Build/.github/workflows/Action-Test.yml @@ -0,0 +1,57 @@ +name: Action-Test + +run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +env: + GH_TOKEN: ${{ github.token }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + ActionTestDefault: + name: Action-Test - [Default] + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + with: + Name: PSModuleTest + Path: tests/src + ModulesOutputPath: tests/outputs/modules + DocsOutputPath: tests/outputs/docs + + ActionTestWithManifest: + name: Action-Test - [DefaultWithManifest] + runs-on: ubuntu-24.04 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + with: + Name: PSModuleTest + Path: tests/srcWithManifest + ModulesOutputPath: tests/outputs/modules + DocsOutputPath: tests/outputs/docs + ModuleArtifactName: moduleWithManifest + DocsArtifactName: docsWithManifest diff --git a/.github/actions/Build/.github/workflows/Auto-Release.yml b/.github/actions/Build/.github/workflows/Auto-Release.yml new file mode 100644 index 00000000..ec157c9d --- /dev/null +++ b/.github/actions/Build/.github/workflows/Auto-Release.yml @@ -0,0 +1,36 @@ +name: Auto-Release + +run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + pull_request_target: + branches: + - main + types: + - closed + - opened + - reopened + - synchronize + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write + +jobs: + Auto-Release: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Auto-Release + uses: PSModule/Auto-Release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication + with: + IncrementalPrerelease: false diff --git a/.github/actions/Build/.github/workflows/Linter.yml b/.github/actions/Build/.github/workflows/Linter.yml new file mode 100644 index 00000000..f6f58f0a --- /dev/null +++ b/.github/actions/Build/.github/workflows/Linter.yml @@ -0,0 +1,32 @@ +name: Linter + +run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + packages: read + statuses: write + +jobs: + Lint: + name: Lint code base + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Lint code base + uses: super-linter/super-linter@latest + env: + GITHUB_TOKEN: ${{ github.token }} + VALIDATE_JSCPD: false + VALIDATE_MARKDOWN_PRETTIER: false + VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Build/README.md b/.github/actions/Build/README.md new file mode 100644 index 00000000..54a1e6b9 --- /dev/null +++ b/.github/actions/Build/README.md @@ -0,0 +1,182 @@ +# Build-PSModule + +This action "compiles" the module source code into an efficient PowerShell module that is ready to be published to the PowerShell Gallery. + +This GitHub Action is a part of the [PSModule framework](https://github.com/PSModule). It is recommended to use the [Process-PSModule workflow](https://github.com/PSModule/Process-PSModule) to automate the whole process of managing the PowerShell module. + +## Supported module types + +- Script module type +- Manifest module type + +## Supported practices and principles + +- [PowerShellGallery Publishing Guidelines and Best Practices](https://learn.microsoft.com/powershell/gallery/concepts/publishing-guidelines) are followed as much as possible. + +## How it works + +During the build process the following steps are performed: + +1. **Runs local build scripts:** Searches for any `*build.ps1` files anywhere in the repository. These scripts are executed in **alphabetical order by filename** (irrespective of their path). +This step lets you add custom build logic to process or modify the module contents before further build steps are performed. +1. **Copies the source code** of the module to an output folder. +1. **Builds the module manifest file** based on information from the GitHub repository and the source code. For more information, please read the [Module Manifest](#module-manifest) section. +1. **Builds the root module (.psm1) file** by combining source code and adding automation into the root module file. For more information, please read the [Root module](#root-module) section. +1. **Builds the module documentation** using platyPS and comment-based help in the source code. For more information, please read the [Module documentation](#module-documentation) section. + +## Usage + +| Name | Description | Required | Default | +| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ----------------- | +| `Name` | Name of the module to process. | `false` | | +| `Path` | Path to the folder where the modules are located. | `false` | `src` | +| `ModulesOutputPath` | Path to the folder where the built modules are outputted. | `false` | `outputs/modules` | +| `DocsOutputPath` | Path to the folder where the built docs are outputted. | `false` | `outputs/docs` | +| `ModuleArtifactName` | Name of the module artifact to upload. | `false` | `module` | +| `DocsArtifactName` | Name of the docs artifact to upload. | `false` | `docs` | +| `Debug` | Enable debug output. | `false` | `'false'` | +| `Verbose` | Enable verbose output. | `false` | `'false'` | +| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | | +| `Prerelease` | Allow prerelease versions if available. | `false` | `'false'` | + +## Root module + +The `src` folder may contain a 'root module' file. If present, the build function will disregard this file and build a new root module file based on the source code in the module folder. + +The root module file is the main file that is loaded when the module is imported. It is built from the source code files in the module folder in the following order: + +1. Adds a module header from `header.ps1` if it exists and removes the file from the module folder. +1. Adds a data loader that loads files from the `data` folder as variables in the module scope, if the folder exists. The variables are available using the `$script:` syntax. +1. Adds content from the following folders into the root module file. The files on the root of a folder are added before recursively processing subfolders (folders are processed in alphabetical order). Once a file is processed, it is removed from the module folder. + 1. `init` + 1. `classes/private` + 1. `classes/public` + 1. `functions/private` + 1. `functions/public` + 1. `variables/private` + 1. `variables/public` + 1. `*.ps1` on module root +1. Adds a `class` and `enum` exporter that exports the ones from the `classes/public` folder to the caller session, using [TypeAccelerators](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes?view=powershell-7.4#exporting-classes-with-type-accelerators). +1. Adds the `Export-ModuleMember` function to the end of the file, to ensure that only the functions, cmdlets, variables and aliases defined in the `public` folders are exported. + +## Module manifest + +The module manifest file describes the module and its contents. PowerShell uses it to load the module and its prerequisites. It also contains important metadata used by the PowerShell Gallery. If a file exists in the source code folder (`src`), it will be used as the base for the module manifest file. While most values in the module manifest are calculated during the build process, some values are preserved if specified in the source manifest file. + +During the module manifest build process the following steps are performed: + +1. Get the manifest file from the source code. If it does not exist, a new manifest file is created. +1. Generate and set the `RootModule` based on the module name. +1. Set a temporary `ModuleVersion` (this is updated during the release process by [Publish-PSModule](https://github.com/PSModule/Publish-PSModule)). +1. Set the `Author` and `CompanyName` based on the GitHub Owner. If a value exists in the source manifest file, that value is used. +1. Set the `Copyright` information based on a default text (`(c) 2024 >>OwnerName<<. All rights reserved.`) and includes the `Author`, `CompanyName` or both when applicable. If a value exists in the source manifest file, that value is used. +1. Set the `Description` based on the GitHub repository description. If a value exists in the source manifest file, that value is used. +1. Set various properties such as `PowerShellHostName`, `PowerShellHostVersion`, `DotNetFrameworkVersion`, `ClrVersion`, and `ProcessorArchitecture`. If values exist in the source manifest file, those values are used. +1. Get the list of files in the module source folder and set the `FileList` property in the manifest. +1. Get the list of required assemblies (`*.dll` files) from the `assemblies` and `modules` (depth = 1) folder and set the `RequiredAssemblies` property. +1. Get the list of nested modules (`*.psm1`, `*.ps1` and `*.dll` files one level down) from the `modules` folder and set the `NestedModules` property. +1. Get the list of scripts to process (`*.ps1` files) from the `scripts` folder and set the `ScriptsToProcess` property. This ensures that the scripts are loaded into the caller session. +1. Get the list of types to process by searching for `*.Types.ps1xml` files in the entire module source folder and set the `TypesToProcess` property. +1. Get the list of formats to process by searching for `*.Format.ps1xml` files in the entire module source folder and set the `FormatsToProcess` property. +1. Get the list of DSC resources to export by searching for `*.psm1` files in the `resources` folder and set the `DscResourcesToExport` property. +1. Get the list of functions, cmdlets, aliases, and variables from the respective `\public` folders and set the respective properties in the manifest. +1. Get the list of modules by searching for all `*.psm1` files in the entire module source folder (excluding the root module) and set the `ModuleList` property. +1. Gather information from source files to update `RequiredModules`, `PowerShellVersion`, and `CompatiblePSEditions` properties. +1. Gather additional information from the GitHub repository: + - `Tags` are generated from repository topics plus compatibility tags from the source files. + - `LicenseUri` is generated assuming there is a `LICENSE` file at the repository root. If a value exists in the source manifest file, that value is used. + - `ProjectUri` is set to the GitHub repository URL. If a value exists in the source manifest file, that value is used. + - `IconUri` is generated assuming there is an `icon.png` file in the `icon` folder at the repository root. If a value exists in the source manifest file, that value is used. +1. `ReleaseNotes` are not automated (could be set via PR or release description). +1. `PreRelease` is managed externally by [Publish-PSModule](https://github.com/PSModule/Publish-PSModule). +1. `RequireLicenseAcceptance` defaults to `false` unless specified in the source manifest. +1. `ExternalModuleDependencies` is not automated. If specified in the source manifest, that value is used. +1. `HelpInfoURI` is not automated. If specified in the source manifest, that value is used. +1. Create a new manifest file in the output folder with the gathered information, which also generates a new `GUID` for the module. +1. Format the manifest file using the `Set-ModuleManifest` function from the [Utilities](https://github.com/PSModule/Utilities) module. + +Linking the description to the module manifest file might show more how this works: + +```powershell +@{ + RootModule = 'Utilities.psm1' # Generated from the module name, .psm1 + ModuleVersion = '0.0.1' # Set during release using Publish-PSModule. + CompatiblePSEditions = @() # Get from source files, requires -PSEdition , null if not provided. + GUID = '' # Generated when saving the manifest using New-ModuleManifest. + Author = 'PSModule' # Derived from the GitHub Owner, unless specified in the source manifest. + CompanyName = 'PSModule' # Derived from the GitHub Owner, unless specified in the source manifest. + Copyright = '(c) 2024 PSModule. All rights reserved.' + Description = 'This is a module.' # Taken from the repository description or the source manifest. + PowerShellVersion = '' # Derived from source files, requires -Version [.], null if not provided. + PowerShellHostName = '' # Taken from the manifest file, null if not provided. + PowerShellHostVersion = '' # Taken from the manifest file, null if not provided. + DotNetFrameworkVersion = '' # Taken from the manifest file, null if not provided. + ClrVersion = '' # Taken from the manifest file, null if not provided. + ProcessorArchitecture = '' # Taken from the manifest file, null if not provided. + RequiredModules = @() # Derived from source files, ensuring required modules are installed. + RequiredAssemblies = @() # Collected from assemblies\*.dll and modules\*.dll. + ScriptsToProcess = @() # Collected from scripts\*.ps1 and classes\*.ps1 ordered by name. + TypesToProcess = @() # Collected from *.Types.ps1xml files in the source folder. + FormatsToProcess = @() # Collected from *.Format.ps1xml files in the source folder. + NestedModules = @() # Collected from modules\*.psm1, modules\*.ps1, and modules\*.dll. + FunctionsToExport = @() # Collected from public\*.ps1 files. + CmdletsToExport = @() # Taken from the manifest file, or empty if not provided. + VariablesToExport = @() # Collected from variables\public\*.ps1. + AliasesToExport = '*' # Derived from functions\public\*.ps1. + DscResourcesToExport = @() # Collected from resources\*.psm1. + ModuleList = @() # A listing of all .\*.psm1 files (informational only). + FileList = @() # A listing of all .\* files (informational only). + PrivateData = @{ + PSData = @{ + Tags = @() # Derived from repository topics and compatibility tags. + LicenseUri = '' # Generated public link to .\LICENSE. + ProjectUri = '' # Generated public link to the GitHub Repository. + IconUri = '' # Derived from .\icon\icon.png. + ReleaseNotes = '' # To be updated during release. + Prerelease = '' # Normalized version of the branch name, updated during release. + RequireLicenseAcceptance = $false + ExternalModuleDependencies = @() + ExperimentalFeatures = @( + @{ + Name = "SomeExperimentalFeature" + Description = "This is an experimental feature." + } + ) + } + OtherKeys = @{} + } + HelpInfoURI = '' # Taken from the source manifest if provided. + DefaultCommandPrefix = '' # Taken from the source manifest if provided. +} +``` + +## Module documentation + +The module documentation is built using `platyPS` and comment-based help in the source code. The documentation is currently not published anywhere but is expected to be published to GitHub Pages in a future release. + +## Permissions + +This action does not require any special permissions. + +## Sources + +**Module manifest:** + +- [about_Module_Manifests](https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_module_manifests) +- [How to write a PowerShell module manifest](https://learn.microsoft.com/powershell/scripting/developer/module/how-to-write-a-powershell-module-manifest) +- [New-ModuleManifest](https://learn.microsoft.com/powershell/module/microsoft.powershell.core/new-modulemanifest) +- [Update-ModuleManifest](https://learn.microsoft.com/powershell/module/powershellget/update-modulemanifest) +- [Package metadata values that impact the PowerShell Gallery UI](https://learn.microsoft.com/powershell/gallery/concepts/package-manifest-affecting-ui#powershell-gallery-feature-elements-controlled-by-the-module-manifest) +- [PowerShellGallery Publishing Guidelines and Best Practices](https://learn.microsoft.com/en-us/powershell/gallery/concepts/publishing-guidelines#tag-your-package-with-the-compatible-pseditions-and-platforms) + +**Modules:** + +- [PowerShell scripting performance considerations](https://learn.microsoft.com/powershell/scripting/dev-cross-plat/performance/script-authoring-considerations) +- [PowerShell module authoring considerations](https://learn.microsoft.com/powershell/scripting/dev-cross-plat/performance/module-authoring-considerations) + +**Documentation:** + +- [platyPS reference](https://learn.microsoft.com/powershell/module/platyps/?source=recommendations) +- [PlatyPS overview](https://learn.microsoft.com/powershell/utility-modules/platyps/overview?view=ps-modules) +- [about_Comment_Based_Help](https://go.microsoft.com/fwlink/?LinkID=123415) +- [Supporting Updatable Help](https://learn.microsoft.com/powershell/scripting/developer/help/supporting-updatable-help) diff --git a/.github/actions/Build/action.yml b/.github/actions/Build/action.yml new file mode 100644 index 00000000..84a99f04 --- /dev/null +++ b/.github/actions/Build/action.yml @@ -0,0 +1,81 @@ +name: Build-PSModule (by PSModule) +description: Build a PowerShell module to the PowerShell Gallery. +author: PSModule +branding: + icon: package + color: gray-dark + +inputs: + Name: + description: Name of the module to process. + required: false + Path: + description: Path to the folder where the modules are located. + required: false + default: src + ModulesOutputPath: + description: Path to the folder where the built modules are outputted. + required: false + default: outputs/modules + DocsOutputPath: + description: Path to the folder where the built docs are outputted. + required: false + default: outputs/docs + ModuleArtifactName: + description: Name of the module artifact to upload. + required: false + default: module + DocsArtifactName: + description: Name of the docs artifact to upload. + required: false + default: docs + Debug: + description: Enable debug output. + required: false + default: 'false' + Verbose: + description: Enable verbose output. + required: false + default: 'false' + Version: + description: Specifies the version of the GitHub module to be installed. The value must be an exact version. + required: false + Prerelease: + description: Allow prerelease versions if available. + required: false + default: 'false' + +runs: + using: composite + steps: + - name: Run Build-PSModule + uses: PSModule/GitHub-Script@v1 + env: + GITHUB_ACTION_INPUT_Name: ${{ inputs.Name }} + GITHUB_ACTION_INPUT_Path: ${{ inputs.Path }} + GITHUB_ACTION_INPUT_ModulesOutputPath: ${{ inputs.ModulesOutputPath }} + GITHUB_ACTION_INPUT_DocsOutputPath: ${{ inputs.DocsOutputPath }} + with: + Debug: ${{ inputs.Debug }} + Prerelease: ${{ inputs.Prerelease }} + Verbose: ${{ inputs.Verbose }} + Version: ${{ inputs.Version }} + Script: | + # Build-PSModule + . "${{ github.action_path }}\scripts\main.ps1" + + - name: Upload module artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.ModuleArtifactName }} + path: ${{ inputs.ModulesOutputPath }} + if-no-files-found: error + retention-days: 1 + + - name: Upload docs artifact + uses: actions/upload-artifact@v4 + with: + name: ${{ inputs.DocsArtifactName }} + path: ${{ inputs.DocsOutputPath }} + if-no-files-found: error + retention-days: 1 diff --git a/.github/actions/Build/scripts/helpers/Build-PSModule.ps1 b/.github/actions/Build/scripts/helpers/Build-PSModule.ps1 new file mode 100644 index 00000000..aa63bf3c --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build-PSModule.ps1 @@ -0,0 +1,61 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Build-PSModule { + <# + .SYNOPSIS + Builds a module. + + .DESCRIPTION + Builds a module. + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Path to the folder where the modules are located. + [Parameter(Mandatory)] + [string] $ModuleSourceFolderPath, + + # Path to the folder where the built modules are outputted. + [Parameter(Mandatory)] + [string] $ModulesOutputFolderPath, + + # Path to the folder where the documentation is outputted. + [Parameter(Mandatory)] + [string] $DocsOutputFolderPath + ) + + LogGroup "Building module [$ModuleName]" { + Write-Host "Source path: [$ModuleSourceFolderPath]" + if (-not (Test-Path -Path $ModuleSourceFolderPath)) { + Write-Error "Source folder not found at [$ModuleSourceFolderPath]" + exit 1 + } + $moduleSourceFolder = Get-Item -Path $ModuleSourceFolderPath + Write-Host "Module source folder: [$moduleSourceFolder]" + + $moduleOutputFolder = New-Item -Path $ModulesOutputFolderPath -Name $ModuleName -ItemType Directory -Force + Write-Host "Module output folder: [$moduleOutputFolder]" + + $docsOutputFolder = New-Item -Path $DocsOutputFolderPath -ItemType Directory -Force + Write-Host "Docs output folder: [$docsOutputFolder]" + } + + Build-PSModuleBase -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -ModuleOutputFolder $moduleOutputFolder + Build-PSModuleManifest -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder + Build-PSModuleRootModule -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder + Update-PSModuleManifestAliasesToExport -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder + Build-PSModuleDocumentation -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -DocsOutputFolder $docsOutputFolder + + LogGroup 'Build manifest file - Final Result' { + $outputManifestPath = Join-Path -Path $ModuleOutputFolder -ChildPath "$ModuleName.psd1" + Show-FileContent -Path $outputManifestPath + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Add-ContentFromItem.ps1 b/.github/actions/Build/scripts/helpers/Build/Add-ContentFromItem.ps1 new file mode 100644 index 00000000..f8f2fa77 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Add-ContentFromItem.ps1 @@ -0,0 +1,66 @@ +function Add-ContentFromItem { + <# + .SYNOPSIS + Add the content of a folder or file to the root module file. + + .DESCRIPTION + This function will add the content of a folder or file to the root module file. + + .EXAMPLE + Add-ContentFromItem -Path 'C:\MyModule\src\MyModule' -RootModuleFilePath 'C:\MyModule\src\MyModule.psm1' -RootPath 'C:\MyModule\src' + #> + param( + # The path to the folder or file to process. + [Parameter(Mandatory)] + [string] $Path, + + # The path to the root module file. + [Parameter(Mandatory)] + [string] $RootModuleFilePath, + + # The root path of the module. + [Parameter(Mandatory)] + [string] $RootPath + ) + # Get the path separator for the current OS + $pathSeparator = [System.IO.Path]::DirectorySeparatorChar + + $relativeFolderPath = $Path -Replace $RootPath, '' + $relativeFolderPath = $relativeFolderPath -Replace $file.Extension, '' + $relativeFolderPath = $relativeFolderPath.TrimStart($pathSeparator) + $relativeFolderPath = $relativeFolderPath -Split $pathSeparator | ForEach-Object { "[$_]" } + $relativeFolderPath = $relativeFolderPath -Join ' - ' + + Add-Content -Path $RootModuleFilePath -Force -Value @" +#region $relativeFolderPath +Write-Debug "[`$scriptName] - $relativeFolderPath - Processing folder" +"@ + + $files = $Path | Get-ChildItem -File -Force -Filter '*.ps1' | Sort-Object -Property FullName + foreach ($file in $files) { + $relativeFilePath = $file.FullName -Replace $RootPath, '' + $relativeFilePath = $relativeFilePath -Replace $file.Extension, '' + $relativeFilePath = $relativeFilePath.TrimStart($pathSeparator) + $relativeFilePath = $relativeFilePath -Split $pathSeparator | ForEach-Object { "[$_]" } + $relativeFilePath = $relativeFilePath -Join ' - ' + + Add-Content -Path $RootModuleFilePath -Force -Value @" +#region $relativeFilePath +Write-Debug "[`$scriptName] - $relativeFilePath - Importing" +"@ + Get-Content -Path $file.FullName | Add-Content -Path $RootModuleFilePath -Force + Add-Content -Path $RootModuleFilePath -Value @" +Write-Debug "[`$scriptName] - $relativeFilePath - Done" +#endregion $relativeFilePath +"@ + } + + $subFolders = $Path | Get-ChildItem -Directory -Force | Sort-Object -Property Name + foreach ($subFolder in $subFolders) { + Add-ContentFromItem -Path $subFolder.FullName -RootModuleFilePath $RootModuleFilePath -RootPath $RootPath + } + Add-Content -Path $RootModuleFilePath -Force -Value @" +Write-Debug "[`$scriptName] - $relativeFolderPath - Done" +#endregion $relativeFolderPath +"@ +} diff --git a/.github/actions/Build/scripts/helpers/Build/Build-PSModuleBase.ps1 b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleBase.ps1 new file mode 100644 index 00000000..d8c49a87 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleBase.ps1 @@ -0,0 +1,43 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } + +function Build-PSModuleBase { + <# + .SYNOPSIS + Compiles the base module files. + + .DESCRIPTION + This function will compile the base module files. + It will copy the source files to the output folder and remove the files that are not needed. + + .EXAMPLE + Build-PSModuleBase -SourceFolderPath 'C:\MyModule\src\MyModule' -OutputFolderPath 'C:\MyModule\build\MyModule' + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleSourceFolder, + + # Path to the folder where the built modules are outputted. + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleOutputFolder + ) + + LogGroup 'Build base' { + Write-Host "Copying files from [$ModuleSourceFolder] to [$ModuleOutputFolder]" + Copy-Item -Path "$ModuleSourceFolder\*" -Destination $ModuleOutputFolder -Recurse -Force -Verbose -Exclude "$ModuleName.psm1" + New-Item -Path $ModuleOutputFolder -Name "$ModuleName.psm1" -ItemType File -Force -Verbose + } + + LogGroup 'Build base - Result' { + (Get-ChildItem -Path $ModuleOutputFolder -Recurse -Force).FullName | Sort-Object + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Build-PSModuleDocumentation.ps1 b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleDocumentation.ps1 new file mode 100644 index 00000000..b390ebe3 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleDocumentation.ps1 @@ -0,0 +1,110 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } +#Requires -Modules @{ ModuleName = 'platyPS'; ModuleVersion = '0.14.2' } +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Build-PSModuleDocumentation { + <# + .SYNOPSIS + Compiles the module documentation. + + .DESCRIPTION + This function will compile the module documentation. + It will generate the markdown files for the module help and copy them to the output folder. + + .EXAMPLE + Build-PSModuleDocumentation -ModuleOutputFolder 'C:\MyModule\src\MyModule' -DocsOutputFolder 'C:\MyModule\build\MyModule' + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleSourceFolder, + + # Folder where the documentation for the modules should be outputted. 'outputs/docs/MyModule' + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $DocsOutputFolder + ) + + LogGroup 'Build docs - Generate markdown help' { + $ModuleName | Remove-Module -Force + Import-Module -Name $ModuleName -Force -RequiredVersion '999.0.0' + Write-Host ($ModuleName | Get-Module) + $null = New-MarkdownHelp -Module $ModuleName -OutputFolder $DocsOutputFolder -Force -Verbose + } + + LogGroup 'Build docs - Fix markdown code blocks' { + Get-ChildItem -Path $DocsOutputFolder -Recurse -Force -Include '*.md' | ForEach-Object { + $content = Get-Content -Path $_.FullName + $fixedOpening = $false + $newContent = @() + foreach ($line in $content) { + if ($line -match '^```$' -and -not $fixedOpening) { + $line = $line -replace '^```$', '```powershell' + $fixedOpening = $true + } elseif ($line -match '^```.+$') { + $fixedOpening = $true + } elseif ($line -match '^```$') { + $fixedOpening = $false + } + $newContent += $line + } + $newContent | Set-Content -Path $_.FullName + } + } + + LogGroup 'Build docs - Fix markdown escape characters' { + Get-ChildItem -Path $DocsOutputFolder -Recurse -Force -Include '*.md' | ForEach-Object { + $content = Get-Content -Path $_.FullName -Raw + $content = $content -replace '\\`', '`' + $content = $content -replace '\\\[', '[' + $content = $content -replace '\\\]', ']' + $content = $content -replace '\\\<', '<' + $content = $content -replace '\\\>', '>' + $content = $content -replace '\\\\', '\' + $content | Set-Content -Path $_.FullName + } + } + + LogGroup 'Build docs - Structure markdown files to match source files' { + $PublicFunctionsFolder = Join-Path $ModuleSourceFolder.FullName 'functions\public' | Get-Item + Get-ChildItem -Path $DocsOutputFolder -Recurse -Force -Include '*.md' | ForEach-Object { + $file = $_ + Write-Host "Processing: $file" + + # find the source code file that matches the markdown file + $scriptPath = Get-ChildItem -Path $PublicFunctionsFolder -Recurse -Force | Where-Object { $_.Name -eq ($file.BaseName + '.ps1') } + Write-Host "Found script path: $scriptPath" + $docsFilePath = ($scriptPath.FullName).Replace($PublicFunctionsFolder.FullName, $DocsOutputFolder.FullName).Replace('.ps1', '.md') + Write-Host "Doc file path: $docsFilePath" + $docsFolderPath = Split-Path -Path $docsFilePath -Parent + New-Item -Path $docsFolderPath -ItemType Directory -Force + Move-Item -Path $file.FullName -Destination $docsFilePath -Force + } + # Get the MD files that are in the public functions folder and move them to the same place in the docs folder + Get-ChildItem -Path $PublicFunctionsFolder -Recurse -Force -Include '*.md' | ForEach-Object { + $file = $_ + Write-Host "Processing: $file" + $docsFilePath = ($file.FullName).Replace($PublicFunctionsFolder.FullName, $DocsOutputFolder.FullName) + Write-Host "Doc file path: $docsFilePath" + $docsFolderPath = Split-Path -Path $docsFilePath -Parent + New-Item -Path $docsFolderPath -ItemType Directory -Force + Move-Item -Path $file.FullName -Destination $docsFilePath -Force + } + } + + Get-ChildItem -Path $DocsOutputFolder -Recurse -Force -Include '*.md' | ForEach-Object { + $fileName = $_.Name + $hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash + LogGroup " - [$fileName] - [$hash]" { + Show-FileContent -Path $_ + } + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Build-PSModuleManifest.ps1 b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleManifest.ps1 new file mode 100644 index 00000000..002232ad --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleManifest.ps1 @@ -0,0 +1,462 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Build-PSModuleManifest { + <# + .SYNOPSIS + Compiles the module manifest. + + .DESCRIPTION + This function will compile the module manifest. + It will generate the module manifest file and copy it to the output folder. + + .EXAMPLE + Build-PSModuleManifest -SourceFolderPath 'C:\MyModule\src\MyModule' -OutputFolderPath 'C:\MyModule\build\MyModule' + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidLongLines', '', Scope = 'Function', + Justification = 'Easier to read the multi ternery operators in a single line.' + )] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Folder where the built modules are outputted. 'outputs/modules/MyModule' + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleOutputFolder + ) + + LogGroup 'Build manifest file' { + $sourceManifestFilePath = Join-Path -Path $ModuleOutputFolder -ChildPath "$ModuleName.psd1" + Write-Host "[SourceManifestFilePath] - [$sourceManifestFilePath]" + if (-not (Test-Path -Path $sourceManifestFilePath)) { + Write-Host "[SourceManifestFilePath] - [$sourceManifestFilePath] - Not found" + $sourceManifestFilePath = Join-Path -Path $ModuleOutputFolder -ChildPath 'manifest.psd1' + } + if (-not (Test-Path -Path $sourceManifestFilePath)) { + Write-Host "[SourceManifestFilePath] - [$sourceManifestFilePath] - Not found" + $manifest = @{} + Write-Host '[Manifest] - Loading empty manifest' + } else { + Write-Host "[SourceManifestFilePath] - [$sourceManifestFilePath] - Found" + $manifest = Get-ModuleManifest -Path $sourceManifestFilePath -Verbose:$false + Write-Host '[Manifest] - Loading from file' + Remove-Item -Path $sourceManifestFilePath -Force -Verbose:$false + } + + $rootModule = "$ModuleName.psm1" + $manifest.RootModule = $rootModule + Write-Host "[RootModule] - [$($manifest.RootModule)]" + + $manifest.ModuleVersion = '999.0.0' + Write-Host "[ModuleVersion] - [$($manifest.ModuleVersion)]" + + $manifest.Author = $manifest.Keys -contains 'Author' ? ($manifest.Author | IsNotNullOrEmpty) ? $manifest.Author : $env:GITHUB_REPOSITORY_OWNER : $env:GITHUB_REPOSITORY_OWNER + Write-Host "[Author] - [$($manifest.Author)]" + + $manifest.CompanyName = $manifest.Keys -contains 'CompanyName' ? ($manifest.CompanyName | IsNotNullOrEmpty) ? $manifest.CompanyName : $env:GITHUB_REPOSITORY_OWNER : $env:GITHUB_REPOSITORY_OWNER + Write-Host "[CompanyName] - [$($manifest.CompanyName)]" + + $year = Get-Date -Format 'yyyy' + $copyrightOwner = $manifest.CompanyName -eq $manifest.Author ? $manifest.Author : "$($manifest.Author) | $($manifest.CompanyName)" + $copyright = "(c) $year $copyrightOwner. All rights reserved." + $manifest.Copyright = $manifest.Keys -contains 'Copyright' ? -not [string]::IsNullOrEmpty($manifest.Copyright) ? $manifest.Copyright : $copyright : $copyright + Write-Host "[Copyright] - [$($manifest.Copyright)]" + + $repoDescription = gh repo view --json description | ConvertFrom-Json | Select-Object -ExpandProperty description + $manifest.Description = $manifest.Keys -contains 'Description' ? ($manifest.Description | IsNotNullOrEmpty) ? $manifest.Description : $repoDescription : $repoDescription + Write-Host "[Description] - [$($manifest.Description)]" + + $manifest.PowerShellHostName = $manifest.Keys -contains 'PowerShellHostName' ? -not [string]::IsNullOrEmpty($manifest.PowerShellHostName) ? $manifest.PowerShellHostName : $null : $null + Write-Host "[PowerShellHostName] - [$($manifest.PowerShellHostName)]" + + $manifest.PowerShellHostVersion = $manifest.Keys -contains 'PowerShellHostVersion' ? -not [string]::IsNullOrEmpty($manifest.PowerShellHostVersion) ? $manifest.PowerShellHostVersion : $null : $null + Write-Host "[PowerShellHostVersion] - [$($manifest.PowerShellHostVersion)]" + + $manifest.DotNetFrameworkVersion = $manifest.Keys -contains 'DotNetFrameworkVersion' ? -not [string]::IsNullOrEmpty($manifest.DotNetFrameworkVersion) ? $manifest.DotNetFrameworkVersion : $null : $null + Write-Host "[DotNetFrameworkVersion] - [$($manifest.DotNetFrameworkVersion)]" + + $manifest.ClrVersion = $manifest.Keys -contains 'ClrVersion' ? -not [string]::IsNullOrEmpty($manifest.ClrVersion) ? $manifest.ClrVersion : $null : $null + Write-Host "[ClrVersion] - [$($manifest.ClrVersion)]" + + $manifest.ProcessorArchitecture = $manifest.Keys -contains 'ProcessorArchitecture' ? -not [string]::IsNullOrEmpty($manifest.ProcessorArchitecture) ? $manifest.ProcessorArchitecture : 'None' : 'None' + Write-Host "[ProcessorArchitecture] - [$($manifest.ProcessorArchitecture)]" + + # Get the path separator for the current OS + $pathSeparator = [System.IO.Path]::DirectorySeparatorChar + + Write-Host '[FileList]' + $files = [System.Collections.Generic.List[System.IO.FileInfo]]::new() + + # Get files on module root + $ModuleOutputFolder | Get-ChildItem -File -ErrorAction SilentlyContinue | Where-Object -Property Name -NotLike '*.ps1' | + ForEach-Object { $files.Add($_) } + + # Get files on module subfolders, excluding the following folders 'init', 'classes', 'public', 'private' + $skipList = @('init', 'classes', 'functions', 'variables') + $ModuleOutputFolder | Get-ChildItem -Directory | Where-Object { $_.Name -NotIn $skipList } | + Get-ChildItem -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object { $files.Add($_) } + + # Get the relative file path and store it in the manifest + $files = $files | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) } + $manifest.FileList = $files.count -eq 0 ? @() : @($files) + $manifest.FileList | ForEach-Object { Write-Host "[FileList] - [$_]" } + + $requiredAssembliesFolderPath = Join-Path $ModuleOutputFolder 'assemblies' + $nestedModulesFolderPath = Join-Path $ModuleOutputFolder 'modules' + + Write-Host '[RequiredAssemblies]' + $existingRequiredAssemblies = $manifest.RequiredAssemblies + $requiredAssemblies = Get-ChildItem -Path $requiredAssembliesFolderPath -Recurse -File -ErrorAction SilentlyContinue -Filter '*.dll' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart([System.IO.Path]::DirectorySeparatorChar) } + $requiredAssemblies += Get-ChildItem -Path $nestedModulesFolderPath -Recurse -Depth 1 -File -ErrorAction SilentlyContinue -Filter '*.dll' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart([System.IO.Path]::DirectorySeparatorChar) } + $manifest.RequiredAssemblies = if ($existingRequiredAssemblies) { $existingRequiredAssemblies } elseif ($requiredAssemblies.Count -gt 0) { @($requiredAssemblies) } else { @() } + $manifest.RequiredAssemblies | ForEach-Object { Write-Host "[RequiredAssemblies] - [$_]" } + + Write-Host '[NestedModules]' + $existingNestedModules = $manifest.NestedModules + $nestedModules = Get-ChildItem -Path $nestedModulesFolderPath -Recurse -Depth 1 -File -ErrorAction SilentlyContinue -Include '*.psm1', '*.ps1', '*.dll' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart([System.IO.Path]::DirectorySeparatorChar) } + $manifest.NestedModules = if ($existingNestedModules) { $existingNestedModules } elseif ($nestedModules.Count -gt 0) { @($nestedModules) } else { @() } + $manifest.NestedModules | ForEach-Object { Write-Host "[NestedModules] - [$_]" } + + Write-Host '[ScriptsToProcess]' + $existingScriptsToProcess = $manifest.ScriptsToProcess + $allScriptsToProcess = @('scripts') | ForEach-Object { + Write-Host "[ScriptsToProcess] - Processing [$_]" + $scriptsFolderPath = Join-Path $ModuleOutputFolder $_ + Get-ChildItem -Path $scriptsFolderPath -Recurse -File -ErrorAction SilentlyContinue -Include '*.ps1' | Select-Object -ExpandProperty FullName | ForEach-Object { + $_.Replace($ModuleOutputFolder, '').TrimStart([System.IO.Path]::DirectorySeparatorChar) } + } + $manifest.ScriptsToProcess = if ($existingScriptsToProcess) { $existingScriptsToProcess } elseif ($allScriptsToProcess.Count -gt 0) { @($allScriptsToProcess) } else { @() } + $manifest.ScriptsToProcess | ForEach-Object { Write-Host "[ScriptsToProcess] - [$_]" } + + Write-Host '[TypesToProcess]' + $typesToProcess = Get-ChildItem -Path $ModuleOutputFolder -Recurse -File -ErrorAction SilentlyContinue -Include '*.Types.ps1xml' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) } + $manifest.TypesToProcess = $typesToProcess.count -eq 0 ? @() : @($typesToProcess) + $manifest.TypesToProcess | ForEach-Object { Write-Host "[TypesToProcess] - [$_]" } + + Write-Host '[FormatsToProcess]' + $formatsToProcess = Get-ChildItem -Path $ModuleOutputFolder -Recurse -File -ErrorAction SilentlyContinue -Include '*.Format.ps1xml' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) } + $manifest.FormatsToProcess = $formatsToProcess.count -eq 0 ? @() : @($formatsToProcess) + $manifest.FormatsToProcess | ForEach-Object { Write-Host "[FormatsToProcess] - [$_]" } + + Write-Host '[DscResourcesToExport]' + $dscResourcesToExportFolderPath = Join-Path $ModuleOutputFolder 'resources' + $dscResourcesToExport = Get-ChildItem -Path $dscResourcesToExportFolderPath -Recurse -File -ErrorAction SilentlyContinue -Include '*.psm1' | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) } + $manifest.DscResourcesToExport = $dscResourcesToExport.count -eq 0 ? @() : @($dscResourcesToExport) + $manifest.DscResourcesToExport | ForEach-Object { Write-Host "[DscResourcesToExport] - [$_]" } + + $manifest.FunctionsToExport = Get-PSModuleFunctionsToExport -SourceFolderPath $ModuleOutputFolder + $manifest.CmdletsToExport = Get-PSModuleCmdletsToExport -SourceFolderPath $ModuleOutputFolder + $manifest.AliasesToExport = Get-PSModuleAliasesToExport -SourceFolderPath $ModuleOutputFolder + $manifest.VariablesToExport = Get-PSModuleVariablesToExport -SourceFolderPath $ModuleOutputFolder + + Write-Host '[ModuleList]' + $moduleList = Get-ChildItem -Path $ModuleOutputFolder -Recurse -File -ErrorAction SilentlyContinue -Include '*.psm1' | Where-Object -Property Name -NE $rootModule | + Select-Object -ExpandProperty FullName | + ForEach-Object { $_.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) } + $manifest.ModuleList = $moduleList.count -eq 0 ? @() : @($moduleList) + $manifest.ModuleList | ForEach-Object { Write-Host "[ModuleList] - [$_]" } + + Write-Host '[Gather]' + $capturedModules = [System.Collections.Generic.List[System.Object]]::new() + $capturedVersions = [System.Collections.Generic.List[string]]::new() + $capturedPSEdition = [System.Collections.Generic.List[string]]::new() + + $files = $ModuleOutputFolder | Get-ChildItem -Recurse -File -ErrorAction SilentlyContinue + Write-Host "[Gather] - Processing [$($files.Count)] files" + foreach ($file in $files) { + $relativePath = $file.FullName.Replace($ModuleOutputFolder, '').TrimStart($pathSeparator) + Write-Host "[Gather] - [$relativePath]" + + if ($file.extension -in '.psm1', '.ps1') { + $fileContent = Get-Content -Path $file + + switch -Regex ($fileContent) { + # RequiredModules -> REQUIRES -Modules | , @() if not provided + '^\s*#Requires -Modules (.+)$' { + # Add captured module name to array + $capturedMatches = $matches[1].Split(',').trim() + $capturedMatches | ForEach-Object { + $hashtable = '@\{[^}]*\}' + if ($_ -match $hashtable) { + Write-Host " - [#Requires -Modules] - [$_] - Hashtable" + } else { + Write-Host " - [#Requires -Modules] - [$_] - String" + } + $capturedModules.Add($_) + } + } + # PowerShellVersion -> REQUIRES -Version [.], $null if not provided + '^\s*#Requires -Version (.+)$' { + Write-Host " - [#Requires -Version] - [$($matches[1])]" + $capturedVersions.Add($matches[1]) + } + #CompatiblePSEditions -> REQUIRES -PSEdition , $null if not provided + '^\s*#Requires -PSEdition (.+)$' { + Write-Host " - [#Requires -PSEdition] - [$($matches[1])]" + $capturedPSEdition.Add($matches[1]) + } + } + } + } + + <# + $test = [Microsoft.PowerShell.Commands.ModuleSpecification]::new() + [Microsoft.PowerShell.Commands.ModuleSpecification]::TryParse("@{ModuleName = 'Az'; RequiredVersion = '5.0.0' }", [ref]$test) + $test + + $test.ToString() + + $required = [Microsoft.PowerShell.Commands.ModuleSpecification]::new(@{ModuleName = 'Az'; RequiredVersion = '5.0.0' }) + $required.ToString() + #> + + Write-Host '[RequiredModules] - Gathered' + # Group the module specifications by ModuleName + $capturedModules = $capturedModules | ForEach-Object { + $test = [Microsoft.PowerShell.Commands.ModuleSpecification]::new() + if ([Microsoft.PowerShell.Commands.ModuleSpecification]::TryParse($_, [ref]$test)) { + $test + } else { + [Microsoft.PowerShell.Commands.ModuleSpecification]::new($_) + } + } + + $groupedModules = $capturedModules | Group-Object -Property Name + + # Initialize a list to store unique module specifications + $uniqueModules = [System.Collections.Generic.List[System.Object]]::new() + + # Iterate through each group + foreach ($group in $groupedModules) { + $requiredModuleName = $group.Name + Write-Host "Processing required module [$requiredModuleName]" + $requiredVersion = $group.Group.RequiredVersion | ForEach-Object { [Version]$_ } | Sort-Object -Unique + $minimumVersion = $group.Group.Version | ForEach-Object { [Version]$_ } | Sort-Object -Unique | Select-Object -Last 1 + $maximumVersion = $group.Group.MaximumVersion | ForEach-Object { [Version]$_ } | Sort-Object -Unique | Select-Object -First 1 + Write-Host "RequiredVersion: [$($requiredVersion -join ', ')]" + Write-Host "ModuleVersion: [$minimumVersion]" + Write-Host "MaximumVersion: [$maximumVersion]" + + if ($requiredVersion.Count -gt 1) { + throw 'Multiple RequiredVersions specified.' + } + + if (-not $minimumVersion) { + $minimumVersion = [Version]'0.0.0' + } + + if (-not $maximumVersion) { + $maximumVersion = [Version]'9999.9999.9999' + } + + if ($requiredVersion -and ($minimumVersion -gt $requiredVersion)) { + throw 'ModuleVersion is higher than RequiredVersion.' + } + + if ($minimumVersion -gt $maximumVersion) { + throw 'ModuleVersion is higher than MaximumVersion.' + } + if ($requiredVersion -and ($requiredVersion -gt $maximumVersion)) { + throw 'RequiredVersion is higher than MaximumVersion.' + } + + if ($requiredVersion) { + Write-Host '[RequiredModules] - RequiredVersion' + $uniqueModule = @{ + ModuleName = $requiredModuleName + RequiredVersion = $requiredVersion + } + } elseif (($minimumVersion -ne [Version]'0.0.0') -or ($maximumVersion -ne [Version]'9999.9999.9999')) { + Write-Host '[RequiredModules] - ModuleVersion/MaximumVersion' + $uniqueModule = @{ + ModuleName = $requiredModuleName + } + if ($minimumVersion -ne [Version]'0.0.0') { + $uniqueModule['ModuleVersion'] = $minimumVersion + } + if ($maximumVersion -ne [Version]'9999.9999.9999') { + $uniqueModule['MaximumVersion'] = $maximumVersion + } + } else { + Write-Host '[RequiredModules] - Simple string' + $uniqueModule = $requiredModuleName + } + $uniqueModules.Add([Microsoft.PowerShell.Commands.ModuleSpecification]::new($uniqueModule)) + } + + Write-Host '[RequiredModules] - Result' + $manifest.RequiredModules = $uniqueModules + $manifest.RequiredModules | ForEach-Object { Write-Host " - [$($_ | Out-String)]" } + + Write-Host '[PowerShellVersion]' + $capturedVersions = $capturedVersions | Sort-Object -Unique -Descending + $capturedVersions | ForEach-Object { Write-Host "[PowerShellVersion] - [$_]" } + $manifest.PowerShellVersion = $capturedVersions.count -eq 0 ? [version]'5.1' : [version]($capturedVersions | Select-Object -First 1) + Write-Host '[PowerShellVersion] - Selecting version' + Write-Host "[PowerShellVersion] - [$($manifest.PowerShellVersion)]" + + Write-Host '[CompatiblePSEditions]' + $capturedPSEdition = $capturedPSEdition | Sort-Object -Unique + if ($capturedPSEdition.count -eq 2) { + throw "Conflict detected: The module requires both 'Desktop' and 'Core' editions." + + "'Desktop' and 'Core' editions cannot be required at the same time." + } + if ($capturedPSEdition.count -eq 0 -and $manifest.PowerShellVersion -gt '5.1') { + Write-Host "[CompatiblePSEditions] - Defaulting to 'Core', as no PSEdition was specified and PowerShellVersion > 5.1" + $capturedPSEdition = @('Core') + } + $manifest.CompatiblePSEditions = $capturedPSEdition.count -eq 0 ? @('Core', 'Desktop') : @($capturedPSEdition) + $manifest.CompatiblePSEditions | ForEach-Object { Write-Host "[CompatiblePSEditions] - [$_]" } + + if ($manifest.PowerShellVersion -gt '5.1' -and $manifest.CompatiblePSEditions -contains 'Desktop') { + throw "Conflict detected: The module requires PowerShellVersion > 5.1 while CompatiblePSEditions = 'Desktop'" + + "'Desktop' edition is not supported for PowerShellVersion > 5.1" + } + + Write-Host '[PrivateData]' + $privateData = $manifest.Keys -contains 'PrivateData' ? $null -ne $manifest.PrivateData ? $manifest.PrivateData : @{} : @{} + if ($manifest.Keys -contains 'PrivateData') { + $manifest.Remove('PrivateData') + } + + Write-Host '[HelpInfoURI]' + $manifest.HelpInfoURI = $privateData.Keys -contains 'HelpInfoURI' ? $null -ne $privateData.HelpInfoURI ? $privateData.HelpInfoURI : '' : '' + Write-Host "[HelpInfoURI] - [$($manifest.HelpInfoURI)]" + if ([string]::IsNullOrEmpty($manifest.HelpInfoURI)) { + $manifest.Remove('HelpInfoURI') + } + + Write-Host '[DefaultCommandPrefix]' + $manifest.DefaultCommandPrefix = $privateData.Keys -contains 'DefaultCommandPrefix' ? $null -ne $privateData.DefaultCommandPrefix ? $privateData.DefaultCommandPrefix : '' : '' + Write-Host "[DefaultCommandPrefix] - [$($manifest.DefaultCommandPrefix)]" + + $PSData = $privateData.Keys -contains 'PSData' ? $null -ne $privateData.PSData ? $privateData.PSData : @{} : @{} + + Write-Host '[Tags]' + try { + $repoLabels = gh repo view --json repositoryTopics | ConvertFrom-Json | Select-Object -ExpandProperty repositoryTopics | Select-Object -ExpandProperty name + } catch { + $repoLabels = @() + } + $manifestTags = [System.Collections.Generic.List[string]]::new() + $tags = $PSData.Keys -contains 'Tags' ? ($PSData.Tags).Count -gt 0 ? $PSData.Tags : $repoLabels : $repoLabels + $tags | ForEach-Object { $manifestTags.Add($_) } + # Add tags for compatability mode. https://docs.microsoft.com/en-us/powershell/scripting/developer/module/how-to-write-a-powershell-module-manifest?view=powershell-7.1#compatibility-tags + if ($manifest.CompatiblePSEditions -contains 'Desktop') { + if ($manifestTags -notcontains 'PSEdition_Desktop') { + $manifestTags.Add('PSEdition_Desktop') + } + } + if ($manifest.CompatiblePSEditions -contains 'Core') { + if ($manifestTags -notcontains 'PSEdition_Core') { + $manifestTags.Add('PSEdition_Core') + } + } + $manifestTags | ForEach-Object { Write-Host "[Tags] - [$_]" } + $manifest.Tags = $manifestTags + + if ($PSData.Tags -contains 'PSEdition_Core' -and $manifest.PowerShellVersion -lt '6.0') { + throw "[Tags] - Cannot be PSEdition = 'Core' and PowerShellVersion < 6.0" + } + <# + Windows: Packages that are compatible with the Windows Operating System + Linux: Packages that are compatible with Linux Operating Systems + MacOS: Packages that are compatible with the Mac Operating System + https://learn.microsoft.com/en-us/powershell/gallery/concepts/package-manifest-affecting-ui?view=powershellget-2.x#tag-details + #> + + Write-Host '[LicenseUri]' + $licenseUri = "https://github.com/$env:GITHUB_REPOSITORY_OWNER/$env:GITHUB_REPOSITORY_NAME/blob/main/LICENSE" + $manifest.LicenseUri = $PSData.Keys -contains 'LicenseUri' ? $null -ne $PSData.LicenseUri ? $PSData.LicenseUri : $licenseUri : $licenseUri + Write-Host "[LicenseUri] - [$($manifest.LicenseUri)]" + if ([string]::IsNullOrEmpty($manifest.LicenseUri)) { + $manifest.Remove('LicenseUri') + } + + Write-Host '[ProjectUri]' + $projectUri = gh repo view --json url | ConvertFrom-Json | Select-Object -ExpandProperty url + $manifest.ProjectUri = $PSData.Keys -contains 'ProjectUri' ? $null -ne $PSData.ProjectUri ? $PSData.ProjectUri : $projectUri : $projectUri + Write-Host "[ProjectUri] - [$($manifest.ProjectUri)]" + if ([string]::IsNullOrEmpty($manifest.ProjectUri)) { + $manifest.Remove('ProjectUri') + } + + Write-Host '[IconUri]' + $iconUri = "https://raw.githubusercontent.com/$env:GITHUB_REPOSITORY_OWNER/$env:GITHUB_REPOSITORY_NAME/main/icon/icon.png" + $manifest.IconUri = $PSData.Keys -contains 'IconUri' ? $null -ne $PSData.IconUri ? $PSData.IconUri : $iconUri : $iconUri + Write-Host "[IconUri] - [$($manifest.IconUri)]" + if ([string]::IsNullOrEmpty($manifest.IconUri)) { + $manifest.Remove('IconUri') + } + + Write-Host '[ReleaseNotes]' + $manifest.ReleaseNotes = $PSData.Keys -contains 'ReleaseNotes' ? $null -ne $PSData.ReleaseNotes ? $PSData.ReleaseNotes : '' : '' + Write-Host "[ReleaseNotes] - [$($manifest.ReleaseNotes)]" + if ([string]::IsNullOrEmpty($manifest.ReleaseNotes)) { + $manifest.Remove('ReleaseNotes') + } + + Write-Host '[PreRelease]' + # $manifest.PreRelease = "" + # Is managed by the publish action + + Write-Host '[RequireLicenseAcceptance]' + $manifest.RequireLicenseAcceptance = $PSData.Keys -contains 'RequireLicenseAcceptance' ? $null -ne $PSData.RequireLicenseAcceptance ? $PSData.RequireLicenseAcceptance : $false : $false + Write-Host "[RequireLicenseAcceptance] - [$($manifest.RequireLicenseAcceptance)]" + if ($manifest.RequireLicenseAcceptance -eq $false) { + $manifest.Remove('RequireLicenseAcceptance') + } + + Write-Host '[ExternalModuleDependencies]' + $manifest.ExternalModuleDependencies = $PSData.Keys -contains 'ExternalModuleDependencies' ? $null -ne $PSData.ExternalModuleDependencies ? $PSData.ExternalModuleDependencies : @() : @() + if (($manifest.ExternalModuleDependencies).count -eq 0) { + $manifest.Remove('ExternalModuleDependencies') + } else { + $manifest.ExternalModuleDependencies | ForEach-Object { Write-Host "[ExternalModuleDependencies] - [$_]" } + } + + Write-Host 'Creating new manifest file in outputs folder' + $outputManifestPath = Join-Path -Path $ModuleOutputFolder -ChildPath "$ModuleName.psd1" + Write-Host "OutputManifestPath - [$outputManifestPath]" + New-ModuleManifest -Path $outputManifestPath @manifest + } + + LogGroup 'Build manifest file - Result - Before format' { + Show-FileContent -Path $outputManifestPath + } + + LogGroup 'Build manifest file - Format' { + Set-ModuleManifest -Path $outputManifestPath -Verbose + } + + LogGroup 'Build manifest file - Result - After format' { + Show-FileContent -Path $outputManifestPath + } + + LogGroup 'Build manifest file - Validate - Install module dependencies' { + Resolve-PSModuleDependency -ManifestFilePath $outputManifestPath + } + + LogGroup 'Build manifest file - Validate - Test manifest file' { + Test-ModuleManifest -Path $outputManifestPath + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Build-PSModuleRootModule.ps1 b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleRootModule.ps1 new file mode 100644 index 00000000..c342b213 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Build-PSModuleRootModule.ps1 @@ -0,0 +1,267 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Build-PSModuleRootModule { + <# + .SYNOPSIS + Compiles the module root module files. + + .DESCRIPTION + This function will compile the modules root module from source files. + It will copy the source files to the output folder and start compiling the module. + During compilation, the source files are added to the root module file in the following order: + + 1. Module header from header.ps1 file. Usually to suppress code analysis warnings/errors and to add [CmdletBinding()] to the module. + 2. Data loader is added if data files are available. + 3. Combines *.ps1 files from the following folders in alphabetical order from each folder: + 1. init + 2. classes/private + 3. classes/public + 4. functions/private + 5. functions/public + 6. variables/private + 7. variables/public + 8. Any remaining *.ps1 on module root. + 4. Adds a class loader for classes found in the classes/public folder. + 5. Export-ModuleMember by using the functions, cmdlets, variables and aliases found in the source files. + - `Functions` will only contain functions that are from the `functions/public` folder. + - `Cmdlets` will only contain cmdlets that are from the `cmdlets/public` folder. + - `Variables` will only contain variables that are from the `variables/public` folder. + - `Aliases` will only contain aliases that are from the functions from the `functions/public` folder. + + .EXAMPLE + Build-PSModuleRootModule -SourceFolderPath 'C:\MyModule\src\MyModule' -OutputFolderPath 'C:\MyModule\build\MyModule' + #> + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidUsingWriteHost', '', Scope = 'Function', + Justification = 'Want to just write to the console, not the pipeline.' + )] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Folder where the built modules are outputted. 'outputs/modules/MyModule' + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleOutputFolder + ) + + # Get the path separator for the current OS + $pathSeparator = [System.IO.Path]::DirectorySeparatorChar + + LogGroup 'Build root module' { + $rootModuleFile = New-Item -Path $ModuleOutputFolder -Name "$ModuleName.psm1" -Force + + #region - Analyze source files + + #region - Export-Classes + $classesFolder = Join-Path -Path $ModuleOutputFolder -ChildPath 'classes/public' + $classExports = '' + if (Test-Path -Path $classesFolder) { + $classes = Get-PSModuleClassesToExport -SourceFolderPath $classesFolder + if ($classes.count -gt 0) { + $classExports += @' +#region Class exporter +# Get the internal TypeAccelerators class to use its static methods. +$TypeAcceleratorsClass = [psobject].Assembly.GetType( + 'System.Management.Automation.TypeAccelerators' +) +# Ensure none of the types would clobber an existing type accelerator. +# If a type accelerator with the same name exists, throw an exception. +$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get +# Define the types to export with type accelerators. +$ExportableEnums = @( + +'@ + $classes | Where-Object Type -EQ 'enum' | ForEach-Object { + $classExports += " [$($_.Name)]`n" + } + + $classExports += @' +) +$ExportableEnums | Foreach-Object { Write-Verbose "Exporting enum '$($_.FullName)'." } +foreach ($Type in $ExportableEnums) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Enum already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing enum '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} +$ExportableClasses = @( + +'@ + $classes | Where-Object Type -EQ 'class' | ForEach-Object { + $classExports += " [$($_.Name)]`n" + } + + $classExports += @' +) +$ExportableClasses | Foreach-Object { Write-Verbose "Exporting class '$($_.FullName)'." } +foreach ($Type in $ExportableClasses) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Class already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing class '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} + +# Remove type accelerators when the module is removed. +$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { + foreach ($Type in ($ExportableEnums + $ExportableClasses)) { + $TypeAcceleratorsClass::Remove($Type.FullName) + } +}.GetNewClosure() +#endregion Class exporter +'@ + } + } + #endregion - Export-Classes + + $exports = [System.Collections.Specialized.OrderedDictionary]::new() + $exports.Add('Alias', (Get-PSModuleAliasesToExport -SourceFolderPath $ModuleOutputFolder)) + $exports.Add('Cmdlet', (Get-PSModuleCmdletsToExport -SourceFolderPath $ModuleOutputFolder)) + $exports.Add('Function', (Get-PSModuleFunctionsToExport -SourceFolderPath $ModuleOutputFolder)) + $exports.Add('Variable', (Get-PSModuleVariablesToExport -SourceFolderPath $ModuleOutputFolder)) + + Write-Host ($exports | Out-String) + #endregion - Analyze source files + + #region - Module header + $headerFilePath = Join-Path -Path $ModuleOutputFolder -ChildPath 'header.ps1' + if (Test-Path -Path $headerFilePath) { + Get-Content -Path $headerFilePath -Raw | Add-Content -Path $rootModuleFile -Force + $headerFilePath | Remove-Item -Force + } else { + Add-Content -Path $rootModuleFile -Force -Value @' +[CmdletBinding()] +param() +'@ + } + #endregion - Module header + + #region - Module post-header + Add-Content -Path $rootModuleFile -Force -Value @' +$baseName = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath) +$script:PSModuleInfo = Test-ModuleManifest -Path "$PSScriptRoot\$baseName.psd1" +$script:PSModuleInfo | Format-List | Out-String -Stream | ForEach-Object { Write-Debug $_ } +$scriptName = $script:PSModuleInfo.Name +Write-Debug "[$scriptName] - Importing module" +'@ + #endregion - Module post-header + + #region - Data loader + if (Test-Path -Path (Join-Path -Path $ModuleOutputFolder -ChildPath 'data')) { + + Add-Content -Path $rootModuleFile.FullName -Force -Value @' +#region Data importer +Write-Debug "[$scriptName] - [data] - Processing folder" +$dataFolder = (Join-Path $PSScriptRoot 'data') +Write-Debug "[$scriptName] - [data] - [$dataFolder]" +Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { + Write-Debug "[$scriptName] - [data] - [$($_.BaseName)] - Importing" + New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force + Write-Debug "[$scriptName] - [data] - [$($_.BaseName)] - Done" +} +Write-Debug "[$scriptName] - [data] - Done" +#endregion Data importer +'@ + } + #endregion - Data loader + + #region - Add content from subfolders + $scriptFoldersToProcess = @( + 'init', + 'classes/private', + 'classes/public', + 'functions/private', + 'functions/public', + 'variables/private', + 'variables/public' + ) + + foreach ($scriptFolder in $scriptFoldersToProcess) { + $scriptFolder = Join-Path -Path $ModuleOutputFolder -ChildPath $scriptFolder + if (-not (Test-Path -Path $scriptFolder)) { + continue + } + Add-ContentFromItem -Path $scriptFolder -RootModuleFilePath $rootModuleFile -RootPath $ModuleOutputFolder + Remove-Item -Path $scriptFolder -Force -Recurse + } + #endregion - Add content from subfolders + + #region - Add content from *.ps1 files on module root + $files = $ModuleOutputFolder | Get-ChildItem -File -Force -Filter '*.ps1' | Sort-Object -Property FullName + foreach ($file in $files) { + $relativePath = $file.FullName -Replace $ModuleOutputFolder, '' + $relativePath = $relativePath -Replace $file.Extension, '' + $relativePath = $relativePath.TrimStart($pathSeparator) + $relativePath = $relativePath -Split $pathSeparator | ForEach-Object { "[$_]" } + $relativePath = $relativePath -Join ' - ' + + Add-Content -Path $rootModuleFile -Force -Value @" +#region $relativePath +Write-Debug "[`$scriptName] - $relativePath - Importing" +"@ + Get-Content -Path $file.FullName | Add-Content -Path $rootModuleFile -Force + + Add-Content -Path $rootModuleFile -Force -Value @" +Write-Debug "[`$scriptName] - $relativePath - Done" +#endregion $relativePath +"@ + $file | Remove-Item -Force + } + #endregion - Add content from *.ps1 files on module root + + #region - Export-ModuleMember + Add-Content -Path $rootModuleFile -Force -Value $classExports + + $exportsString = Convert-HashtableToString -Hashtable $exports + + Write-Host ($exportsString | Out-String) + + $params = @{ + Path = $rootModuleFile + Force = $true + Value = @" +#region Member exporter +`$exports = $exportsString +Export-ModuleMember @exports +#endregion Member exporter +"@ + } + Add-Content @params + #endregion - Export-ModuleMember + + } + + LogGroup 'Build root module - Result - Before format' { + Write-Host (Show-FileContent -Path $rootModuleFile) + } + + LogGroup 'Build root module - Format' { + $AllContent = Get-Content -Path $rootModuleFile -Raw + $settings = Join-Path -Path $PSScriptRoot 'PSScriptAnalyzer.Tests.psd1' + Invoke-Formatter -ScriptDefinition $AllContent -Settings $settings | + Out-File -FilePath $rootModuleFile -Encoding utf8BOM -Force + } + + LogGroup 'Build root module - Result - After format' { + Write-Host (Show-FileContent -Path $rootModuleFile) + } + + LogGroup 'Build root module - Validate - Import' { + Add-PSModulePath -Path (Split-Path -Path $ModuleOutputFolder -Parent) + Import-PSModule -Path $ModuleOutputFolder -ModuleName $ModuleName + } + + LogGroup 'Build root module - Validate - File list' { + (Get-ChildItem -Path $ModuleOutputFolder -Recurse -Force).FullName | Sort-Object + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/ConvertTo-Hashtable.ps1 b/.github/actions/Build/scripts/helpers/Build/ConvertTo-Hashtable.ps1 new file mode 100644 index 00000000..33568902 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/ConvertTo-Hashtable.ps1 @@ -0,0 +1,32 @@ +function ConvertTo-Hashtable { + <# + .SYNOPSIS + Converts a string to a hashtable. + + .DESCRIPTION + Converts a string to a hashtable. + + .EXAMPLE + ConvertTo-Hashtable -InputString "@{Key1 = 'Value1'; Key2 = 'Value2'}" + + Key Value + --- ----- + Key1 Value1 + Key2 Value2 + + Converts the string to a hashtable. + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidUsingInvokeExpression', '', Scope = 'Function', + Justification = 'Converting a string based hashtable to a hashtable.' + )] + [CmdletBinding()] + param ( + # The string to convert to a hashtable. + [Parameter(Mandatory = $true)] + [string]$InputString + ) + + Invoke-Expression $InputString + +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-PSModuleAliasesToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleAliasesToExport.ps1 new file mode 100644 index 00000000..036ae80d --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleAliasesToExport.ps1 @@ -0,0 +1,36 @@ +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Get-PSModuleAliasesToExport { + <# + .SYNOPSIS + Gets the aliases to export from the module manifest. + + .DESCRIPTION + This function will get the aliases to export from the module manifest. + + .EXAMPLE + Get-PSModuleAliasesToExport -SourceFolderPath 'C:\MyModule\src\MyModule' + #> + [CmdletBinding()] + param( + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [string] $SourceFolderPath + ) + + $manifestPropertyName = 'AliasesToExport' + + $moduleName = Split-Path -Path $SourceFolderPath -Leaf + $manifestFileName = "$moduleName.psd1" + $manifestFilePath = Join-Path -Path $SourceFolderPath $manifestFileName + + $manifest = Get-ModuleManifest -Path $manifestFilePath -Verbose:$false + + Write-Host "[$manifestPropertyName]" + $aliasesToExport = (($manifest.AliasesToExport).count -eq 0) -or ($manifest.AliasesToExport | IsNullOrEmpty) ? '*' : $manifest.AliasesToExport + $aliasesToExport | ForEach-Object { + Write-Host "[$manifestPropertyName] - [$_]" + } + + $aliasesToExport +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-PSModuleClassesToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleClassesToExport.ps1 new file mode 100644 index 00000000..b01219a6 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleClassesToExport.ps1 @@ -0,0 +1,40 @@ +function Get-PSModuleClassesToExport { + <# + .SYNOPSIS + Gets the classes to export from the module source code. + + .DESCRIPTION + This function will get the classes to export from the module source code. + + .EXAMPLE + Get-PSModuleClassesToExport -SourceFolderPath 'C:\MyModule\src\MyModule' + + Book + BookList + + This will return the classes to export from the module source code. + + .NOTES + Inspired by [about_Classes | Exporting classes with type accelerators](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes?view=powershell-7.4#exporting-classes-with-type-accelerators) + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] + [CmdletBinding()] + param ( + # The path to the module root folder. + [Parameter(Mandatory)] + [string] $SourceFolderPath + ) + + $files = Get-ChildItem -Path $SourceFolderPath -Recurse -Include '*.ps1' | Sort-Object -Property FullName + + foreach ($file in $files) { + $content = Get-Content -Path $file.FullName -Raw + $stringMatches = [Regex]::Matches($content, '(?i)^(class|enum)\s+([^\s{]+)', 'Multiline') + foreach ($match in $stringMatches) { + [pscustomobject]@{ + Type = $match.Groups[1].Value + Name = $match.Groups[2].Value + } + } + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-PSModuleCmdletsToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleCmdletsToExport.ps1 new file mode 100644 index 00000000..850c10c2 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleCmdletsToExport.ps1 @@ -0,0 +1,36 @@ +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Get-PSModuleCmdletsToExport { + <# + .SYNOPSIS + Gets the cmdlets to export from the module manifest. + + .DESCRIPTION + This function will get the cmdlets to export from the module manifest. + + .EXAMPLE + Get-PSModuleCmdletsToExport -SourceFolderPath 'C:\MyModule\src\MyModule' + #> + [CmdletBinding()] + param( + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [string] $SourceFolderPath + ) + + $manifestPropertyName = 'CmdletsToExport' + + $moduleName = Split-Path -Path $SourceFolderPath -Leaf + $manifestFileName = "$moduleName.psd1" + $manifestFilePath = Join-Path -Path $SourceFolderPath $manifestFileName + + $manifest = Get-ModuleManifest -Path $manifestFilePath -Verbose:$false + + Write-Host "[$manifestPropertyName]" + $cmdletsToExport = (($manifest.CmdletsToExport).count -eq 0) -or ($manifest.CmdletsToExport | IsNullOrEmpty) ? '' : $manifest.CmdletsToExport + $cmdletsToExport | ForEach-Object { + Write-Host "[$manifestPropertyName] - [$_]" + } + + $cmdletsToExport +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-PSModuleFunctionsToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleFunctionsToExport.ps1 new file mode 100644 index 00000000..99f34967 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleFunctionsToExport.ps1 @@ -0,0 +1,44 @@ +function Get-PSModuleFunctionsToExport { + <# + .SYNOPSIS + Gets the functions to export from the module manifest. + + .DESCRIPTION + This function will get the functions to export from the module manifest. + + .EXAMPLE + Get-PSModuleFunctionsToExport -SourceFolderPath 'C:\MyModule\src\MyModule' + #> + [CmdletBinding()] + [OutputType([array])] + param( + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [string] $SourceFolderPath + ) + + $manifestPropertyName = 'FunctionsToExport' + + Write-Host "[$manifestPropertyName]" + Write-Host "[$manifestPropertyName] - Checking path for functions and filters" + + $publicFolderPath = Join-Path -Path $SourceFolderPath -ChildPath 'functions/public' + if (-not (Test-Path -Path $publicFolderPath -PathType Container)) { + Write-Host "[$manifestPropertyName] - [Folder not found] - [$publicFolderPath]" + return $functionsToExport + } + Write-Host "[$manifestPropertyName] - [$publicFolderPath]" + $functionsToExport = [Collections.Generic.List[string]]::new() + $scriptFiles = Get-ChildItem -Path $publicFolderPath -Recurse -File -ErrorAction SilentlyContinue -Include '*.ps1' + Write-Host "[$manifestPropertyName] - [$($scriptFiles.Count)]" + foreach ($file in $scriptFiles) { + $fileContent = Get-Content -Path $file.FullName -Raw + $containsFunction = ($fileContent -match 'function ') -or ($fileContent -match 'filter ') + Write-Host "[$manifestPropertyName] - [$($file.BaseName)] - [$containsFunction]" + if ($containsFunction) { + $functionsToExport.Add($file.BaseName) + } + } + + [array]$functionsToExport +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-PSModuleVariablesToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleVariablesToExport.ps1 new file mode 100644 index 00000000..c842a30d --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-PSModuleVariablesToExport.ps1 @@ -0,0 +1,45 @@ +function Get-PSModuleVariablesToExport { + <# + .SYNOPSIS + Gets the variables to export from the module manifest. + + .DESCRIPTION + This function will get the variables to export from the module manifest. + + .EXAMPLE + Get-PSModuleVariablesToExport -SourceFolderPath 'C:\MyModule\src\MyModule' + #> + [OutputType([Collections.Generic.List[string]])] + [CmdletBinding()] + param( + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [string] $SourceFolderPath + ) + + $manifestPropertyName = 'VariablesToExport' + + Write-Host "[$manifestPropertyName]" + + $variableFolderPath = Join-Path -Path $SourceFolderPath -ChildPath 'variables/public' + if (-not (Test-Path -Path $variableFolderPath -PathType Container)) { + Write-Host "[$manifestPropertyName] - [Folder not found] - [$variableFolderPath]" + return $variablesToExport + } + $scriptFilePaths = Get-ChildItem -Path $variableFolderPath -Recurse -File -Filter *.ps1 | Select-Object -ExpandProperty FullName + + $variablesToExport = [Collections.Generic.List[string]]::new() + $scriptFilePaths | ForEach-Object { + $ast = [System.Management.Automation.Language.Parser]::ParseFile($_, [ref]$null, [ref]$null) + $variables = Get-RootLevelVariable -Ast $ast + $variables | ForEach-Object { + $variablesToExport.Add($_) + } + } + + $variablesToExport | ForEach-Object { + Write-Host "[$manifestPropertyName] - [$_]" + } + + $variablesToExport +} diff --git a/.github/actions/Build/scripts/helpers/Build/Get-RootLevelVariables.ps1 b/.github/actions/Build/scripts/helpers/Build/Get-RootLevelVariables.ps1 new file mode 100644 index 00000000..20daece6 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Get-RootLevelVariables.ps1 @@ -0,0 +1,22 @@ +function Get-RootLevelVariable { + <# + .SYNOPSIS + Get the root-level variables in a ast. + + .EXAMPLE + Get-RootLevelVariable -Ast $ast + #> + [CmdletBinding()] + param ( + # The Abstract Syntax Tree (AST) to analyze + [System.Management.Automation.Language.ScriptBlockAst]$Ast + ) + # Iterate over the top-level statements in the AST + foreach ($statement in $Ast.EndBlock.Statements) { + # Check if the statement is an assignment statement + if ($statement -is [System.Management.Automation.Language.AssignmentStatementAst]) { + # Get the variable name, removing the scope prefix + $statement.Left.VariablePath.UserPath -replace '.*:' + } + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/Import-PSModule.ps1 b/.github/actions/Build/scripts/helpers/Build/Import-PSModule.ps1 new file mode 100644 index 00000000..2797069d --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Import-PSModule.ps1 @@ -0,0 +1,50 @@ +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Import-PSModule { + <# + .SYNOPSIS + Imports a build PS module. + + .DESCRIPTION + Imports a build PS module. + + .EXAMPLE + Import-PSModule -SourceFolderPath $ModuleFolderPath -ModuleName $ModuleName + + Imports a module located at $ModuleFolderPath with the name $ModuleName. + #> + [CmdletBinding()] + param( + # Path to the folder where the module source code is located. + [Parameter(Mandatory)] + [string] $Path, + + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName + ) + + $moduleName = Split-Path -Path $Path -Leaf + $manifestFileName = "$moduleName.psd1" + $manifestFilePath = Join-Path -Path $Path $manifestFileName + $manifestFile = Get-ModuleManifest -Path $manifestFilePath -As FileInfo -Verbose + + Write-Host "Manifest file path: [$($manifestFile.FullName)]" -Verbose + $existingModule = Get-Module -Name $ModuleName -ListAvailable + $existingModule | Remove-Module -Force -Verbose + $existingModule.RequiredModules | ForEach-Object { $_ | Remove-Module -Force -Verbose -ErrorAction SilentlyContinue } + $existingModule.NestedModules | ForEach-Object { $_ | Remove-Module -Force -Verbose -ErrorAction SilentlyContinue } + # Get-InstalledPSResource | Where-Object Name -EQ $ModuleName | Uninstall-PSResource -SkipDependencyCheck -Verbose:$false + Resolve-PSModuleDependency -ManifestFilePath $manifestFile + Import-Module -Name $ModuleName -RequiredVersion '999.0.0' + + Write-Host 'List loaded modules' + $availableModules = Get-Module -ListAvailable -Refresh -Verbose:$false + $availableModules | Select-Object Name, Version, Path | Sort-Object Name | Format-Table -AutoSize + Write-Host 'List commands' + Write-Host (Get-Command -Module $moduleName | Format-Table -AutoSize | Out-String) + + if ($ModuleName -notin $availableModules.Name) { + throw 'Module not found' + } +} diff --git a/.github/actions/Build/scripts/helpers/Build/PSScriptAnalyzer.Tests.psd1 b/.github/actions/Build/scripts/helpers/Build/PSScriptAnalyzer.Tests.psd1 new file mode 100644 index 00000000..bd8fb923 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/PSScriptAnalyzer.Tests.psd1 @@ -0,0 +1,56 @@ +@{ + Rules = @{ + PSAlignAssignmentStatement = @{ + Enable = $true + CheckHashtable = $true + } + PSAvoidLongLines = @{ + Enable = $true + MaximumLineLength = 150 + } + PSAvoidSemicolonsAsLineTerminators = @{ + Enable = $true + } + PSPlaceCloseBrace = @{ + Enable = $true + NewLineAfter = $false + IgnoreOneLineBlock = $true + NoEmptyLineBefore = $false + } + PSPlaceOpenBrace = @{ + Enable = $true + OnSameLine = $true + NewLineAfter = $true + IgnoreOneLineBlock = $true + } + PSProvideCommentHelp = @{ + Enable = $true + ExportedOnly = $false + BlockComment = $true + VSCodeSnippetCorrection = $false + Placement = 'begin' + } + PSUseConsistentIndentation = @{ + Enable = $true + IndentationSize = 4 + PipelineIndentation = 'IncreaseIndentationForFirstPipeline' + Kind = 'space' + } + PSUseConsistentWhitespace = @{ + Enable = $true + CheckInnerBrace = $true + CheckOpenBrace = $true + CheckOpenParen = $true + CheckOperator = $true + CheckPipe = $true + CheckPipeForRedundantWhitespace = $true + CheckSeparator = $true + CheckParameter = $true + IgnoreAssignmentOperatorInsideHashTable = $true + } + } + ExcludeRules = @( + 'PSAvoidUsingCmdletAliases', + 'PSUseToExportFieldsInManifest' + ) +} diff --git a/.github/actions/Build/scripts/helpers/Build/Resolve-PSModuleDependency.ps1 b/.github/actions/Build/scripts/helpers/Build/Resolve-PSModuleDependency.ps1 new file mode 100644 index 00000000..4924d3e7 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Resolve-PSModuleDependency.ps1 @@ -0,0 +1,64 @@ +#Requires -Modules @{ ModuleName = 'Retry'; ModuleVersion = '0.1.3' } + +function Resolve-PSModuleDependency { + <# + .SYNOPSIS + Resolve dependencies for a module based on the manifest file. + + .DESCRIPTION + Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure + + .EXAMPLE + Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1' + + Installs all modules defined in the manifest file, following PSModuleInfo structure. + + .NOTES + Should later be adapted to support both pre-reqs, and dependencies. + Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion, + and latest version within a range MinimumVersion - MaximumVersion. + #> + [Alias('Resolve-PSModuleDependencies')] + [CmdletBinding()] + param( + # The path to the manifest file. + [Parameter(Mandatory)] + [string] $ManifestFilePath + ) + + Write-Host 'Resolving dependencies' + + $manifest = Import-PowerShellDataFile -Path $ManifestFilePath + Write-Host "Reading [$ManifestFilePath]" + Write-Host "Found [$($manifest.RequiredModules.Count)] modules to install" + + foreach ($requiredModule in $manifest.RequiredModules) { + $installParams = @{} + + if ($requiredModule -is [string]) { + $installParams.Name = $requiredModule + } else { + $installParams.Name = $requiredModule.ModuleName + $installParams.MinimumVersion = $requiredModule.ModuleVersion + $installParams.RequiredVersion = $requiredModule.RequiredVersion + $installParams.MaximumVersion = $requiredModule.MaximumVersion + } + $installParams.Force = $true + $installParams.Verbose = $false + + Write-Host "[$($installParams.Name)] - Installing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Retry -Count 5 -Delay 10 { + Install-Module @installParams -AllowPrerelease:$false + } + $VerbosePreference = $VerbosePreferenceOriginal + Write-Host "[$($installParams.Name)] - Importing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Import-Module @installParams + $VerbosePreference = $VerbosePreferenceOriginal + Write-Host "[$($installParams.Name)] - Done" + } + Write-Host 'Resolving dependencies - Done' +} diff --git a/.github/actions/Build/scripts/helpers/Build/Update-PSModuleManifestAliasesToExport.ps1 b/.github/actions/Build/scripts/helpers/Build/Update-PSModuleManifestAliasesToExport.ps1 new file mode 100644 index 00000000..eccabdb5 --- /dev/null +++ b/.github/actions/Build/scripts/helpers/Build/Update-PSModuleManifestAliasesToExport.ps1 @@ -0,0 +1,40 @@ +#Requires -Modules @{ ModuleName = 'GitHub'; ModuleVersion = '0.13.2' } +#Requires -Modules @{ ModuleName = 'Utilities'; ModuleVersion = '0.3.0' } + +function Update-PSModuleManifestAliasesToExport { + <# + .SYNOPSIS + Updates the aliases to export in the module manifest. + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Updates a file that is being built.' + )] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + [CmdletBinding()] + param( + # Name of the module. + [Parameter(Mandatory)] + [string] $ModuleName, + + # Folder where the module is outputted. + [Parameter(Mandatory)] + [System.IO.DirectoryInfo] $ModuleOutputFolder + ) + LogGroup 'Updating aliases to export in module manifest' { + Write-Host "Module name: [$ModuleName]" + Write-Host "Module output folder: [$ModuleOutputFolder]" + $aliases = Get-Command -Module $ModuleName -CommandType Alias + Write-Host "Found aliases: [$($aliases.Count)]" + foreach ($alias in $aliases) { + Write-Host "Alias: [$($alias.Name)]" + } + $outputManifestPath = Join-Path -Path $ModuleOutputFolder -ChildPath "$ModuleName.psd1" + Write-Host "Output manifest path: [$outputManifestPath]" + Write-Host 'Setting module manifest with AliasesToExport' + Set-ModuleManifest -Path $outputManifestPath -AliasesToExport $aliases.Name -Verbose + } +} diff --git a/.github/actions/Build/scripts/main.ps1 b/.github/actions/Build/scripts/main.ps1 new file mode 100644 index 00000000..f1ac4532 --- /dev/null +++ b/.github/actions/Build/scripts/main.ps1 @@ -0,0 +1,53 @@ +#Requires -Modules Utilities + +[CmdletBinding()] +param() + +$path = (Join-Path -Path $PSScriptRoot -ChildPath 'helpers') | Get-Item | Resolve-Path -Relative +LogGroup "Loading helper scripts from [$path]" { + Get-ChildItem -Path $path -Filter '*.ps1' -Recurse | Resolve-Path -Relative | ForEach-Object { + Write-Host "$_" + . $_ + } +} + +LogGroup 'Loading inputs' { + $moduleName = ($env:GITHUB_ACTION_INPUT_Name | IsNullOrEmpty) ? $env:GITHUB_REPOSITORY_NAME : $env:GITHUB_ACTION_INPUT_Name + Write-Host "Module name: [$moduleName]" + + $moduleSourceFolderPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path/$moduleName + if (-not (Test-Path -Path $moduleSourceFolderPath)) { + $moduleSourceFolderPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path + } + Write-Host "Source module path: [$moduleSourceFolderPath]" + if (-not (Test-Path -Path $moduleSourceFolderPath)) { + throw "Module path [$moduleSourceFolderPath] does not exist." + } + + $modulesOutputFolderPath = Join-Path $env:GITHUB_WORKSPACE $env:GITHUB_ACTION_INPUT_ModulesOutputPath + Write-Host "Modules output path: [$modulesOutputFolderPath]" + $docsOutputFolderPath = Join-Path $env:GITHUB_WORKSPACE $env:GITHUB_ACTION_INPUT_DocsOutputPath + Write-Host "Docs output path: [$docsOutputFolderPath]" +} + +LogGroup 'Build local scripts' { + Write-Host 'Execution order:' + $scripts = Get-ChildItem -Filter '*build.ps1' -Recurse | Sort-Object -Property Name | Resolve-Path -Relative + $scripts | ForEach-Object { + Write-Host " - $_" + } + $scripts | ForEach-Object { + LogGroup "Build local scripts - [$_]" { + . $_ + } + } +} + +$params = @{ + ModuleName = $moduleName + ModuleSourceFolderPath = $moduleSourceFolderPath + ModulesOutputFolderPath = $modulesOutputFolderPath + DocsOutputFolderPath = $docsOutputFolderPath +} + +Build-PSModule @params diff --git a/.github/actions/Build/tests/src/assemblies/LsonLib.dll b/.github/actions/Build/tests/src/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml b/.github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 new file mode 100644 index 00000000..89f053cb --- /dev/null +++ b/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 @@ -0,0 +1,18 @@ +function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 new file mode 100644 index 00000000..cf870ba6 --- /dev/null +++ b/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 @@ -0,0 +1,22 @@ +function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 new file mode 100644 index 00000000..86beb12d --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +#Requires -Modules Store +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 new file mode 100644 index 00000000..d4e6e266 --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 @@ -0,0 +1,37 @@ +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} + +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + + .NOTES + Testing if a module can have a [Markdown based link](https://example.com). + !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," + \[This is a test\] + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [Alias('New-PSModuleTestAlias1')] + [Alias('New-PSModuleTestAlias2')] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +New-Alias New-PSModuleTestAlias3 New-PSModuleTest +New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + +Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md b/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/.github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 new file mode 100644 index 00000000..a87ac117 --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md b/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 new file mode 100644 index 00000000..26be2b9b --- /dev/null +++ b/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 @@ -0,0 +1,18 @@ +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/header.ps1 b/.github/actions/Build/tests/src/header.ps1 new file mode 100644 index 00000000..cc1fde9a --- /dev/null +++ b/.github/actions/Build/tests/src/header.ps1 @@ -0,0 +1,3 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() diff --git a/.github/actions/Build/tests/src/init/initializer.ps1 b/.github/actions/Build/tests/src/init/initializer.ps1 new file mode 100644 index 00000000..28396fb0 --- /dev/null +++ b/.github/actions/Build/tests/src/init/initializer.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------------' +Write-Verbose '--- THIS IS AN INITIALIZER ---' +Write-Verbose '-------------------------------' diff --git a/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 b/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..5d6af8ea --- /dev/null +++ b/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/src/scripts/loader.ps1 b/.github/actions/Build/tests/src/scripts/loader.ps1 new file mode 100644 index 00000000..973735ad --- /dev/null +++ b/.github/actions/Build/tests/src/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' +Write-Verbose '--- THIS IS A LOADER ---' +Write-Verbose '-------------------------' diff --git a/.github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml b/.github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Build/tests/src/types/FileInfo.Types.ps1xml b/.github/actions/Build/tests/src/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Build/tests/src/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 b/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 new file mode 100644 index 00000000..f1fc2c3b --- /dev/null +++ b/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 @@ -0,0 +1,47 @@ +$script:HabitablePlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + }, + @{ + Name = 'Proxima Centauri b' + Mass = 1.17 + Diameter = 11449 + DayLength = 5.15 + }, + @{ + Name = 'Kepler-442b' + Mass = 2.34 + Diameter = 11349 + DayLength = 5.7 + }, + @{ + Name = 'Kepler-452b' + Mass = 5.0 + Diameter = 17340 + DayLength = 20.0 + } +) + +$script:InhabitedPlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + } +) diff --git a/.github/actions/Build/tests/src/variables/public/Moons.ps1 b/.github/actions/Build/tests/src/variables/public/Moons.ps1 new file mode 100644 index 00000000..dd0f33ca --- /dev/null +++ b/.github/actions/Build/tests/src/variables/public/Moons.ps1 @@ -0,0 +1,6 @@ +$script:Moons = @( + @{ + Planet = 'Earth' + Name = 'Moon' + } +) diff --git a/.github/actions/Build/tests/src/variables/public/Planets.ps1 b/.github/actions/Build/tests/src/variables/public/Planets.ps1 new file mode 100644 index 00000000..736584b9 --- /dev/null +++ b/.github/actions/Build/tests/src/variables/public/Planets.ps1 @@ -0,0 +1,20 @@ +$script:Planets = @( + @{ + Name = 'Mercury' + Mass = 0.330 + Diameter = 4879 + DayLength = 4222.6 + }, + @{ + Name = 'Venus' + Mass = 4.87 + Diameter = 12104 + DayLength = 2802.0 + }, + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + } +) diff --git a/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 b/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 new file mode 100644 index 00000000..acbcedfd --- /dev/null +++ b/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 @@ -0,0 +1,17 @@ +$script:SolarSystems = @( + @{ + Name = 'Solar System' + Planets = $script:Planets + Moons = $script:Moons + }, + @{ + Name = 'Alpha Centauri' + Planets = @() + Moons = @() + }, + @{ + Name = 'Sirius' + Planets = @() + Moons = @() + } +) diff --git a/.github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll b/.github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 new file mode 100644 index 00000000..89f053cb --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 @@ -0,0 +1,18 @@ +function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 new file mode 100644 index 00000000..cf870ba6 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 @@ -0,0 +1,22 @@ +function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 new file mode 100644 index 00000000..86beb12d --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +#Requires -Modules Store +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 new file mode 100644 index 00000000..d4e6e266 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 @@ -0,0 +1,37 @@ +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} + +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + + .NOTES + Testing if a module can have a [Markdown based link](https://example.com). + !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," + \[This is a test\] + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [Alias('New-PSModuleTestAlias1')] + [Alias('New-PSModuleTestAlias2')] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +New-Alias New-PSModuleTestAlias3 New-PSModuleTest +New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + +Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 new file mode 100644 index 00000000..a87ac117 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md b/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 new file mode 100644 index 00000000..26be2b9b --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 @@ -0,0 +1,18 @@ +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/header.ps1 b/.github/actions/Build/tests/srcWithManifest/header.ps1 new file mode 100644 index 00000000..cc1fde9a --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/header.ps1 @@ -0,0 +1,3 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() diff --git a/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 b/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 new file mode 100644 index 00000000..f4121d25 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------------' -Verbose +Write-Verbose '--- THIS IS AN INITIALIZER ---' -Verbose +Write-Verbose '-------------------------------' -Verbose diff --git a/.github/actions/Build/tests/srcWithManifest/manifest.psd1 b/.github/actions/Build/tests/srcWithManifest/manifest.psd1 new file mode 100644 index 00000000..9466cb8e --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/manifest.psd1 @@ -0,0 +1,6 @@ +@{ + ModuleVersion = '0.0.0' + RootModule = 'PSModuleTest.psm1' + Copyright = 'Test' + Description = 'This is a test module.' +} diff --git a/.github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 b/.github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..9e4353ba --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +Function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 b/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 new file mode 100644 index 00000000..973735ad --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' +Write-Verbose '--- THIS IS A LOADER ---' +Write-Verbose '-------------------------' diff --git a/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 new file mode 100644 index 00000000..f1fc2c3b --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 @@ -0,0 +1,47 @@ +$script:HabitablePlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + }, + @{ + Name = 'Proxima Centauri b' + Mass = 1.17 + Diameter = 11449 + DayLength = 5.15 + }, + @{ + Name = 'Kepler-442b' + Mass = 2.34 + Diameter = 11349 + DayLength = 5.7 + }, + @{ + Name = 'Kepler-452b' + Mass = 5.0 + Diameter = 17340 + DayLength = 20.0 + } +) + +$script:InhabitedPlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + } +) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 new file mode 100644 index 00000000..dd0f33ca --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 @@ -0,0 +1,6 @@ +$script:Moons = @( + @{ + Planet = 'Earth' + Name = 'Moon' + } +) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 new file mode 100644 index 00000000..736584b9 --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 @@ -0,0 +1,20 @@ +$script:Planets = @( + @{ + Name = 'Mercury' + Mass = 0.330 + Diameter = 4879 + DayLength = 4222.6 + }, + @{ + Name = 'Venus' + Mass = 4.87 + Diameter = 12104 + DayLength = 2802.0 + }, + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + } +) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 new file mode 100644 index 00000000..acbcedfd --- /dev/null +++ b/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 @@ -0,0 +1,17 @@ +$script:SolarSystems = @( + @{ + Name = 'Solar System' + Planets = $script:Planets + Moons = $script:Moons + }, + @{ + Name = 'Alpha Centauri' + Planets = @() + Moons = @() + }, + @{ + Name = 'Sirius' + Planets = @() + Moons = @() + } +) diff --git a/.github/actions/Build/tests/tools/1-build.ps1 b/.github/actions/Build/tests/tools/1-build.ps1 new file mode 100644 index 00000000..f3a17f23 --- /dev/null +++ b/.github/actions/Build/tests/tools/1-build.ps1 @@ -0,0 +1 @@ +Write-Host "1 - Build script executed." diff --git a/.github/actions/Build/tests/tools/2-build.ps1 b/.github/actions/Build/tests/tools/2-build.ps1 new file mode 100644 index 00000000..d839b516 --- /dev/null +++ b/.github/actions/Build/tests/tools/2-build.ps1 @@ -0,0 +1 @@ +Write-Host "2 - Build script executed." diff --git a/.github/actions/Document/.github/workflows/Action-Test.yml b/.github/actions/Document/.github/workflows/Action-Test.yml new file mode 100644 index 00000000..405a7239 --- /dev/null +++ b/.github/actions/Document/.github/workflows/Action-Test.yml @@ -0,0 +1,32 @@ +name: Action-Test + +run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: read + +jobs: + ActionTestBasic: + name: Action-Test - [Basic] + runs-on: ubuntu-latest + steps: + # Need to check out as part of the test, as its a local action + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Action-Test + uses: ./ + with: + working-directory: ./tests + subject: PSModule diff --git a/.github/actions/Document/README.md b/.github/actions/Document/README.md new file mode 100644 index 00000000..d560186e --- /dev/null +++ b/.github/actions/Document/README.md @@ -0,0 +1,17 @@ +# Template-Action + +A template repository for GitHub Actions + +## Usage + +### Inputs + +### Secrets + +### Outputs + +### Example + +```yaml +Example here +``` diff --git a/.github/actions/Document/action.yml b/.github/actions/Document/action.yml new file mode 100644 index 00000000..90768f12 --- /dev/null +++ b/.github/actions/Document/action.yml @@ -0,0 +1,27 @@ +name: '{{ NAME }}' +description: '{{ DESCRIPTION }}' +author: PSModule +branding: + icon: upload-cloud + color: white + +inputs: + working-directory: + description: The working directory where Terraform will be executed + required: false + subject: + description: The subject to greet + required: false + default: World + +runs: + using: composite + steps: + - name: '{{ NAME }}' + uses: PSModule/GitHub-Script@v1 + env: + GITHUB_ACTION_INPUT_subject: ${{ inputs.subject }} + with: + Script: | + # '{{ NAME }}' + ${{ github.action_path }}\scripts\main.ps1 diff --git a/.github/actions/Document/scripts/main.ps1 b/.github/actions/Document/scripts/main.ps1 new file mode 100644 index 00000000..4f36aec4 --- /dev/null +++ b/.github/actions/Document/scripts/main.ps1 @@ -0,0 +1,40 @@ +#Requires -Modules Utilities + +[CmdletBinding()] +param() + +$path = (Join-Path -Path $PSScriptRoot -ChildPath 'helpers') +LogGroup "Loading helper scripts from [$path]" { + Get-ChildItem -Path $path -Filter '*.ps1' -Recurse | ForEach-Object { + Write-Host "[$($_.FullName)]" + . $_.FullName + } +} + +LogGroup 'Loading inputs' { + $moduleName = ($env:GITHUB_ACTION_INPUT_Name | IsNullOrEmpty) ? $env:GITHUB_REPOSITORY_NAME : $env:GITHUB_ACTION_INPUT_Name + Write-Host "Module name: [$moduleName]" + + $moduleSourceFolderPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path $moduleName + if (-not (Test-Path -Path $moduleSourceFolderPath)) { + $moduleSourceFolderPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path + } + Write-Host "Source module path: [$moduleSourceFolderPath]" + if (-not (Test-Path -Path $moduleSourceFolderPath)) { + throw "Module path [$moduleSourceFolderPath] does not exist." + } + + $modulesOutputFolderPath = Join-Path $env:GITHUB_WORKSPACE $env:GITHUB_ACTION_INPUT_ModulesOutputPath + Write-Host "Modules output path: [$modulesOutputFolderPath]" + $docsOutputFolderPath = Join-Path $env:GITHUB_WORKSPACE $env:GITHUB_ACTION_INPUT_DocsOutputPath + Write-Host "Docs output path: [$docsOutputFolderPath]" +} + +$params = @{ + ModuleName = $moduleName + ModuleSourceFolderPath = $moduleSourceFolderPath + ModulesOutputFolderPath = $modulesOutputFolderPath + DocsOutputFolderPath = $docsOutputFolderPath +} + +Build-PSModule @params diff --git a/.github/actions/Document/tests/README.md b/.github/actions/Document/tests/README.md new file mode 100644 index 00000000..43816d34 --- /dev/null +++ b/.github/actions/Document/tests/README.md @@ -0,0 +1,3 @@ +# Placeholder for tests + +Location for tests of the action. diff --git a/.github/actions/Initialize/.github/linters/.markdown-lint.yml b/.github/actions/Initialize/.github/linters/.markdown-lint.yml new file mode 100644 index 00000000..b9ecdfa9 --- /dev/null +++ b/.github/actions/Initialize/.github/linters/.markdown-lint.yml @@ -0,0 +1,25 @@ +########################### +## Markdown Linter rules ## +########################### + +# Linter rules doc: +# - https://github.com/DavidAnson/markdownlint + +############### +# Rules by id # +############### +MD004: false # Unordered list style +MD007: + indent: 2 # Unordered list indentation +MD013: + line_length: 808 # Line length +MD026: + punctuation: ".,;:!。,;:" # List of not allowed +MD029: false # Ordered list item prefix +MD033: false # Allow inline HTML +MD036: false # Emphasis used instead of a heading + +################# +# Rules by tags # +################# +blank_lines: false # Error on blank lines diff --git a/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 new file mode 100644 index 00000000..6779d06f --- /dev/null +++ b/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -0,0 +1,17 @@ +#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings +@{ + #CustomRulePath='path\to\CustomRuleModule.psm1' + #RecurseCustomRulePath='path\of\customrules' + #Severity = @( + # 'Error' + # 'Warning' + #) + #IncludeDefaultRules=${true} + ExcludeRules = @( + 'PSAvoidUsingWriteHost' + ) + #IncludeRules = @( + # 'PSAvoidUsingWriteHost', + # 'MyCustomRuleName' + #) +} diff --git a/.github/actions/Initialize/.github/workflows/Action-Test.yml b/.github/actions/Initialize/.github/workflows/Action-Test.yml new file mode 100644 index 00000000..bc42ee46 --- /dev/null +++ b/.github/actions/Initialize/.github/workflows/Action-Test.yml @@ -0,0 +1,45 @@ +name: Action-Test + +run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + ActionTestBasic: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + name: Action-Test - [Basic] - [${{ matrix.os }}] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Action-Test + uses: ./ + + - name: Run GitHub-script + uses: PSModule/GitHub-script@v1 + with: + Script: | + LogGroup "Run custom script" { + Write-Host "Hello, World!" + } + + - name: Run custom script + shell: pwsh + run: | + LogGroup "Run custom script" { + Write-Host "Hello, World!" + } diff --git a/.github/actions/Initialize/.github/workflows/Auto-Release.yml b/.github/actions/Initialize/.github/workflows/Auto-Release.yml new file mode 100644 index 00000000..ec157c9d --- /dev/null +++ b/.github/actions/Initialize/.github/workflows/Auto-Release.yml @@ -0,0 +1,36 @@ +name: Auto-Release + +run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + pull_request_target: + branches: + - main + types: + - closed + - opened + - reopened + - synchronize + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write + +jobs: + Auto-Release: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Auto-Release + uses: PSModule/Auto-Release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication + with: + IncrementalPrerelease: false diff --git a/.github/actions/Initialize/.github/workflows/Linter.yml b/.github/actions/Initialize/.github/workflows/Linter.yml new file mode 100644 index 00000000..f6f58f0a --- /dev/null +++ b/.github/actions/Initialize/.github/workflows/Linter.yml @@ -0,0 +1,32 @@ +name: Linter + +run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + packages: read + statuses: write + +jobs: + Lint: + name: Lint code base + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Lint code base + uses: super-linter/super-linter@latest + env: + GITHUB_TOKEN: ${{ github.token }} + VALIDATE_JSCPD: false + VALIDATE_MARKDOWN_PRETTIER: false + VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Initialize/README.md b/.github/actions/Initialize/README.md new file mode 100644 index 00000000..ec0f2b98 --- /dev/null +++ b/.github/actions/Initialize/README.md @@ -0,0 +1,77 @@ +# Initialize-PSModule + +An action that is used to prepare the runner for PSModule framework. + +This GitHub Action is a part of the [PSModule framework](https://github.com/PSModule). It is recommended to use the [Process-PSModule workflow](https://github.com/PSModule/Process-PSModule) to automate the whole process of managing the PowerShell module. + +## Specifications and practices + +Initiate-PSModule follows: + +- [SemVer 2.0.0 specifications](https://semver.org) +- [GitHub Flow specifications](https://docs.github.com/en/get-started/using-github/github-flow) +- [Continiuous Delivery practices](https://en.wikipedia.org/wiki/Continuous_delivery) + +... and supports the following practices in the PSModule framework: + +- [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) + +## How it works + +The Initialize-PSModule action will prepare the runner for the PSModule framework by installing the following dependencies: + +| Module | Description | +| --- | --- | +| GitHub | Used to interact with the GitHub API and GitHub Action workflow commands. | +| PSScriptAnalyzer | Used to lint and format PowerShell code. | +| PSSemVer | Used to create an object for the semantic version numbers. Has functionality to compare, and bump versions. | +| Pester | Used for testing PowerShell code. | +| Utilities | Used by all actions, contains common function and classes. | +| platyPS | Used to generate Markdown documentation from PowerShell code. | +| powershell-yaml | Used to parse and serialize YAML files, typically for reading configuration files. | + +## Usage + +### Inputs + +| Name | Description | Required | Default | +| - | - | - | - | +| `Debug` | Enable debug output. | `false` | `'false'` | +| `Verbose` | Enable verbose output. | `false` | `'false'` | +| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | | +| `Prerelease` | Allow prerelease versions if available. | `false` | `'false'` | + +## Example + +The action can be used in a workflow to prepare the runner for the PSModule framework by adding it at the start of the workflow. + +```yaml +name: Process-PSModule + +on: [push] + +jobs: + Process-PSModule: + name: Process module + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main +``` + +## Permissions + +The action does not require any permissions. + +## Compatibility + +The action is compatible with the following configurations: + +| OS | Shell | +| --- | --- | +| windows-latest | pwsh | +| macos-latest | pwsh | +| ubuntu-latest | pwsh | diff --git a/.github/actions/Initialize/action.yml b/.github/actions/Initialize/action.yml new file mode 100644 index 00000000..7441d6f6 --- /dev/null +++ b/.github/actions/Initialize/action.yml @@ -0,0 +1,37 @@ +name: Initialize-PSModule (by PSModule) +description: Prepare runner for the PSModule framework. +author: PSModule +branding: + icon: loader + color: gray-dark + +inputs: + Debug: + description: Enable debug output. + required: false + default: 'false' + Verbose: + description: Enable verbose output. + required: false + default: 'false' + Version: + description: Specifies the version of the GitHub module to be installed. The value must be an exact version. + required: false + Prerelease: + description: Allow prerelease versions if available. + required: false + default: 'false' + +runs: + using: composite + steps: + - name: Initialize-PSModule + uses: PSModule/GitHub-Script@v1 + with: + Debug: ${{ inputs.Debug }} + Prerelease: ${{ inputs.Prerelease }} + Verbose: ${{ inputs.Verbose }} + Version: ${{ inputs.Version }} + Script: | + # Initialize-PSModule + . "${{ github.action_path }}\scripts\main.ps1" diff --git a/.github/actions/Initialize/scripts/main.ps1 b/.github/actions/Initialize/scripts/main.ps1 new file mode 100644 index 00000000..3a496a9b --- /dev/null +++ b/.github/actions/Initialize/scripts/main.ps1 @@ -0,0 +1,46 @@ +#Requires -Modules GitHub + +[CmdletBinding()] +param() + +$requiredModules = @{ + Utilities = @{} + Retry = @{} + 'powershell-yaml' = @{} + PSSemVer = @{} + Pester = @{} + PSScriptAnalyzer = @{} + PlatyPS = @{} + MarkdownPS = @{} + # 'Microsoft.PowerShell.PlatyPS' = @{ + # Prerelease = $true + # } +} + +$requiredModules.GetEnumerator() | Sort-Object | ForEach-Object { + $name = $_.Key + $settings = $_.Value + LogGroup "Installing prerequisite: [$name]" { + $Count = 5 + $Delay = 10 + for ($i = 1; $i -le $Count; $i++) { + try { + Install-PSResource -Name $name -TrustRepository -Repository PSGallery @settings + break + } catch { + if ($i -eq $Count) { + throw $_ + } + Start-Sleep -Seconds $Delay + } + } + Write-Host "Installed module: [$name]" + Write-Host (Get-PSResource -Name $name | Select-Object * | Out-String) + + Write-Host 'Module commands:' + Write-Host (Get-Command -Module $name | Out-String) + } +} + +$requiredModules.Keys | Get-InstalledPSResource -Verbose:$false | Sort-Object -Property Name | + Format-Table -Property Name, Version, Prerelease, Repository -AutoSize -Wrap diff --git a/.github/actions/Publish/.github/linters/.markdown-lint.yml b/.github/actions/Publish/.github/linters/.markdown-lint.yml new file mode 100644 index 00000000..b9ecdfa9 --- /dev/null +++ b/.github/actions/Publish/.github/linters/.markdown-lint.yml @@ -0,0 +1,25 @@ +########################### +## Markdown Linter rules ## +########################### + +# Linter rules doc: +# - https://github.com/DavidAnson/markdownlint + +############### +# Rules by id # +############### +MD004: false # Unordered list style +MD007: + indent: 2 # Unordered list indentation +MD013: + line_length: 808 # Line length +MD026: + punctuation: ".,;:!。,;:" # List of not allowed +MD029: false # Ordered list item prefix +MD033: false # Allow inline HTML +MD036: false # Emphasis used instead of a heading + +################# +# Rules by tags # +################# +blank_lines: false # Error on blank lines diff --git a/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 new file mode 100644 index 00000000..6779d06f --- /dev/null +++ b/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -0,0 +1,17 @@ +#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings +@{ + #CustomRulePath='path\to\CustomRuleModule.psm1' + #RecurseCustomRulePath='path\of\customrules' + #Severity = @( + # 'Error' + # 'Warning' + #) + #IncludeDefaultRules=${true} + ExcludeRules = @( + 'PSAvoidUsingWriteHost' + ) + #IncludeRules = @( + # 'PSAvoidUsingWriteHost', + # 'MyCustomRuleName' + #) +} diff --git a/.github/actions/Publish/.github/workflows/Action-Test.yml b/.github/actions/Publish/.github/workflows/Action-Test.yml new file mode 100644 index 00000000..35bb52d7 --- /dev/null +++ b/.github/actions/Publish/.github/workflows/Action-Test.yml @@ -0,0 +1,40 @@ +name: Action-Test + +run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + pull-requests: read + +jobs: + ActionTestDefault: + name: Action-Test - [Default] + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + env: + GITHUB_TOKEN: ${{ github.token }} + with: + Verbose: true + Debug: true + Name: PSModuleTest + ModulePath: tests/outputs/modules + APIKey: ${{ secrets.APIKEY }} + WhatIf: true diff --git a/.github/actions/Publish/.github/workflows/Auto-Release.yml b/.github/actions/Publish/.github/workflows/Auto-Release.yml new file mode 100644 index 00000000..ec157c9d --- /dev/null +++ b/.github/actions/Publish/.github/workflows/Auto-Release.yml @@ -0,0 +1,36 @@ +name: Auto-Release + +run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + pull_request_target: + branches: + - main + types: + - closed + - opened + - reopened + - synchronize + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write + +jobs: + Auto-Release: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Auto-Release + uses: PSModule/Auto-Release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication + with: + IncrementalPrerelease: false diff --git a/.github/actions/Publish/.github/workflows/Linter.yml b/.github/actions/Publish/.github/workflows/Linter.yml new file mode 100644 index 00000000..d7650ae5 --- /dev/null +++ b/.github/actions/Publish/.github/workflows/Linter.yml @@ -0,0 +1,31 @@ +name: Linter + +run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + packages: read + statuses: write + +jobs: + Lint: + name: Lint code base + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Lint code base + uses: super-linter/super-linter@latest + env: + GITHUB_TOKEN: ${{ github.token }} + VALIDATE_MARKDOWN_PRETTIER: false + VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Publish/README.md b/.github/actions/Publish/README.md new file mode 100644 index 00000000..547ed2ed --- /dev/null +++ b/.github/actions/Publish/README.md @@ -0,0 +1,119 @@ +# Publish-PSModule + +Creates a GitHub release and publishes the PowerShell module to the PowerShell Gallery. + +This GitHub Action is a part of the [PSModule framework](https://github.com/PSModule). It is recommended to use the [Process-PSModule workflow](https://github.com/PSModule/Process-PSModule) to automate the whole process of managing the PowerShell module. + +## Specifications and practices + +Publish-PSModule follows: + +- [SemVer 2.0.0 specifications](https://semver.org) +- [GitHub Flow specifications](https://docs.github.com/en/get-started/using-github/github-flow) +- [Continiuous Delivery practices](https://en.wikipedia.org/wiki/Continuous_delivery) + +... and supports the following practices in the PSModule framework: + +- [PowerShell publishing guidelines](https://learn.microsoft.com/en-us/powershell/gallery/concepts/publishing-guidelines?view=powershellget-3.x) + +## How it works + +The workflow will trigger on pull requests to the repositorys default branch. +When the pull request is opened, the action will decide what to do based on labels on the pull request. + +It will get the latest release version by looking up the versions in GitHub releases, PowerShell Gallery and the module manifest. +The next version is then determined by the labels on the pull request. If a prerelease label is found, the action will create a +prerelease with the branch name (in normalized form) as the prerelease name. By defualt, the following labels are used: + +- For a major release, and increasing the first number in the version use: + - `major` + - `breaking` +- For a minor release, and increasing the second number in the version. + - `minor` + - `feature` +- For a patch release, and increases the third number in the version. + - `patch` + - `fix` + +The types of labels used for the types of prereleases can be configured using the `MajorLabels`, `MinorLabels` and `PatchLabels` +parameters/settings in the configuration file. See the [Usage](#usage) section for more information. + +When a pull request is merged into the default branch, the action will create a release based on the labels and clean up any previous +prereleases that was created. + +## Usage + +The action can be configured using the following settings: + +| Name | Description | Required | Default | +| --- | --- | --- | --- | +| `APIKey` | PowerShell Gallery API Key. | `true` | | +| `AutoCleanup`| Control wether to automatically cleanup prereleases. If disabled, the action will not remove any prereleases. | `false` | `true` | +| `AutoPatching` | Control wether to automatically handle patches. If disabled, the action will only create a patch release if the pull request has a 'patch' label. | `false` | `true` | +| `ConfigurationFile` | The path to the configuration file. Settings in the configuration file take precedence over the action inputs. | `false` | `.github\auto-release.yml` | +| `DatePrereleaseFormat` | The format to use for the prerelease number using [.NET DateTime format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings). | `false` | `''` | +| `IgnoreLabels` | A comma separated list of labels that do not trigger a release. | `false` | `NoRelease` | +| `IncrementalPrerelease` | Control wether to automatically increment the prerelease number. If disabled, the action will ensure only one prerelease exists for a given branch. | `false` | `true` | +| `MajorLabels` | A comma separated list of labels that trigger a major release. | `false` | `major, breaking` | +| `MinorLabels` | A comma separated list of labels that trigger a minor release. | `false` | `minor, feature` | +| `ModulePath` | Path to the folder where the module to publish is located. | `false` | `outputs/modules` | +| `Name` | Name of the module to publish. Defaults to the repository name. | `false` | | +| `PatchLabels` | A comma separated list of labels that trigger a patch release. | `false` | `patch, fix` | +| `VersionPrefix` | The prefix to use for the version number. | `false` | `v` | +| `WhatIf` | Control wether to simulate the action. If enabled, the action will not create any releases. Used for testing. | `false` | `false` | +| `Debug` | Enable debug output. | `'false'` | `false` | +| `Verbose` | Enable verbose output. | `'false'` | `false` | +| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | | `false` | +| `Prerelease` | Allow prerelease versions if available. | `'false'` | `false` | + +### Configuration file + +The configuration file is a YAML file that can be used to configure the action. +By default, the configuration file is expected at `.github\auto-release.yml`, which can be changed using the `ConfigurationFile` setting. +The actions configuration can be change by altering the settings in the configuration file. + +```yaml +DatePrereleaseFormat: 'yyyyMMddHHmm' +IncrementalPrerelease: false +VersionPrefix: '' +``` + +This example uses the date format for the prerelease, disables the incremental prerelease and removes the version prefix. + +## Example + +```yaml +name: Publish-PSModule + +on: [pull_request] + +jobs: + Publish-PSModule: + name: Publish-PSModule + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Publish-PSModule + uses: PSModule/Publish-PSModule@main + env: + GITHUB_TOKEN: ${{ github.token }} + with: + APIKey: ${{ secrets.APIKEY }} +``` + +## Permissions + +The action requires the following permissions: + +If running the action in a restrictive mode, the following permissions needs to be granted to the action: + +```yaml +permissions: + contents: write # Required to create releases + pull-requests: write # Required to create comments on the PRs +``` diff --git a/.github/actions/Publish/action.yml b/.github/actions/Publish/action.yml new file mode 100644 index 00000000..1f4bb6c2 --- /dev/null +++ b/.github/actions/Publish/action.yml @@ -0,0 +1,106 @@ +name: Publish-PSModule (by PSModule) +description: Publish a PowerShell module to the PowerShell Gallery. +author: PSModule +branding: + icon: upload-cloud + color: gray-dark + +inputs: + Name: + description: Name of the module to publish. + required: false + ModulePath: + description: Path to the module to publish. + required: false + default: outputs/modules + APIKey: + description: PowerShell Gallery API Key. + required: true + AutoCleanup: + description: Control wether to automatically delete the prerelease tags after the stable release is created. + required: false + default: 'true' + AutoPatching: + description: Control wether to automatically handle patches. If disabled, the action will only create a patch release if the pull request has a 'patch' label. + required: false + default: 'true' + ConfigurationFile: + description: The path to the configuration file. Settings in the configuration file take precedence over the action inputs. + required: false + default: .github\auto-release.yml + DatePrereleaseFormat: + description: If specified, uses a date based prerelease scheme. The format should be a valid .NET format string like 'yyyyMMddHHmm'. + required: false + default: '' + IgnoreLabels: + description: A comma separated list of labels that do not trigger a release. + required: false + default: NoRelease + IncrementalPrerelease: + description: Control wether to automatically increment the prerelease number. If disabled, the action will ensure only one prerelease exists for a given branch. + required: false + default: 'true' + MajorLabels: + description: A comma separated list of labels that trigger a major release. + required: false + default: major, breaking + MinorLabels: + description: A comma separated list of labels that trigger a minor release. + required: false + default: minor, feature + PatchLabels: + description: A comma separated list of labels that trigger a patch release. + required: false + default: patch, fix + VersionPrefix: + description: The prefix to use for the version number. + required: false + default: v + WhatIf: + description: If specified, the action will only log the changes it would make, but will not actually create or delete any releases or tags. + required: false + default: 'false' + Debug: + description: Enable debug output. + required: false + default: 'false' + Verbose: + description: Enable verbose output. + required: false + default: 'false' + Version: + description: Specifies the version of the GitHub module to be installed. The value must be an exact version. + required: false + Prerelease: + description: Allow prerelease versions if available. + required: false + default: 'false' + +runs: + using: composite + steps: + - name: Run Publish-PSModule + uses: PSModule/GitHub-Script@v1 + env: + GITHUB_ACTION_INPUT_Name: ${{ inputs.Name }} + GITHUB_ACTION_INPUT_ModulePath: ${{ inputs.ModulePath }} + GITHUB_ACTION_INPUT_APIKey: ${{ inputs.APIKey }} + GITHUB_ACTION_INPUT_AutoCleanup: ${{ inputs.AutoCleanup }} + GITHUB_ACTION_INPUT_AutoPatching: ${{ inputs.AutoPatching }} + GITHUB_ACTION_INPUT_ConfigurationFile: ${{ inputs.ConfigurationFile }} + GITHUB_ACTION_INPUT_DatePrereleaseFormat: ${{ inputs.DatePrereleaseFormat }} + GITHUB_ACTION_INPUT_IgnoreLabels: ${{ inputs.IgnoreLabels }} + GITHUB_ACTION_INPUT_IncrementalPrerelease: ${{ inputs.IncrementalPrerelease }} + GITHUB_ACTION_INPUT_MajorLabels: ${{ inputs.MajorLabels }} + GITHUB_ACTION_INPUT_MinorLabels: ${{ inputs.MinorLabels }} + GITHUB_ACTION_INPUT_PatchLabels: ${{ inputs.PatchLabels }} + GITHUB_ACTION_INPUT_VersionPrefix: ${{ inputs.VersionPrefix }} + GITHUB_ACTION_INPUT_WhatIf: ${{ inputs.WhatIf }} + with: + Debug: ${{ inputs.Debug }} + Prerelease: ${{ inputs.Prerelease }} + Verbose: ${{ inputs.Verbose }} + Version: ${{ inputs.Version }} + Script: | + # Publish-PSModule + ${{ github.action_path }}\scripts\main.ps1 diff --git a/.github/actions/Publish/scripts/helpers/Publish-PSModule.ps1 b/.github/actions/Publish/scripts/helpers/Publish-PSModule.ps1 new file mode 100644 index 00000000..c0c1b5f8 --- /dev/null +++ b/.github/actions/Publish/scripts/helpers/Publish-PSModule.ps1 @@ -0,0 +1,415 @@ +#Requires -Modules Utilities, PowerShellGet, Microsoft.PowerShell.PSResourceGet, Retry, GitHub, PSSemVer + +function Publish-PSModule { + <# + .SYNOPSIS + Publishes a module to the PowerShell Gallery and GitHub Pages. + + .DESCRIPTION + Publishes a module to the PowerShell Gallery and GitHub Pages. + + .EXAMPLE + Publish-PSModule -Name 'PSModule.FX' -APIKey $env:PSGALLERY_API_KEY + #> + [OutputType([void])] + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'LogGroup - Scoping affects the variables line of sight.' + )] + param( + # Name of the module to process. + [Parameter()] + [string] $Name, + + # The path to the module to process. + [Parameter(Mandatory)] + [string] $ModulePath, + + # The API key for the destination repository. + [Parameter(Mandatory)] + [string] $APIKey + ) + + LogGroup 'Set configuration' { + if (-not (Test-Path -Path $env:GITHUB_ACTION_INPUT_ConfigurationFile -PathType Leaf)) { + Write-Output "Configuration file not found at [$env:GITHUB_ACTION_INPUT_ConfigurationFile]" + } else { + Write-Output "Reading from configuration file [$env:GITHUB_ACTION_INPUT_ConfigurationFile]" + $configuration = ConvertFrom-Yaml -Yaml (Get-Content $env:GITHUB_ACTION_INPUT_ConfigurationFile -Raw) + } + + $autoCleanup = ($configuration.AutoCleanup | IsNotNullOrEmpty) ? $configuration.AutoCleanup -eq 'true' : $env:GITHUB_ACTION_INPUT_AutoCleanup -eq 'true' + $autoPatching = ($configuration.AutoPatching | IsNotNullOrEmpty) ? $configuration.AutoPatching -eq 'true' : $env:GITHUB_ACTION_INPUT_AutoPatching -eq 'true' + $datePrereleaseFormat = ($configuration.DatePrereleaseFormat | IsNotNullOrEmpty) ? $configuration.DatePrereleaseFormat : $env:GITHUB_ACTION_INPUT_DatePrereleaseFormat + $incrementalPrerelease = ($configuration.IncrementalPrerelease | IsNotNullOrEmpty) ? $configuration.IncrementalPrerelease -eq 'true' : $env:GITHUB_ACTION_INPUT_IncrementalPrerelease -eq 'true' + $versionPrefix = ($configuration.VersionPrefix | IsNotNullOrEmpty) ? $configuration.VersionPrefix : $env:GITHUB_ACTION_INPUT_VersionPrefix + $whatIf = ($configuration.WhatIf | IsNotNullOrEmpty) ? $configuration.WhatIf -eq 'true' : $env:GITHUB_ACTION_INPUT_WhatIf -eq 'true' + + $ignoreLabels = (($configuration.IgnoreLabels | IsNotNullOrEmpty) ? $configuration.IgnoreLabels : $env:GITHUB_ACTION_INPUT_IgnoreLabels) -split ',' | ForEach-Object { $_.Trim() } + $majorLabels = (($configuration.MajorLabels | IsNotNullOrEmpty) ? $configuration.MajorLabels : $env:GITHUB_ACTION_INPUT_MajorLabels) -split ',' | ForEach-Object { $_.Trim() } + $minorLabels = (($configuration.MinorLabels | IsNotNullOrEmpty) ? $configuration.MinorLabels : $env:GITHUB_ACTION_INPUT_MinorLabels) -split ',' | ForEach-Object { $_.Trim() } + $patchLabels = (($configuration.PatchLabels | IsNotNullOrEmpty) ? $configuration.PatchLabels : $env:GITHUB_ACTION_INPUT_PatchLabels) -split ',' | ForEach-Object { $_.Trim() } + + Write-Output '-------------------------------------------------' + Write-Output "Auto cleanup enabled: [$autoCleanup]" + Write-Output "Auto patching enabled: [$autoPatching]" + Write-Output "Date-based prerelease format: [$datePrereleaseFormat]" + Write-Output "Incremental prerelease enabled: [$incrementalPrerelease]" + Write-Output "Version prefix: [$versionPrefix]" + Write-Output "What if mode: [$whatIf]" + Write-Output '' + Write-Output "Ignore labels: [$($ignoreLabels -join ', ')]" + Write-Output "Major labels: [$($majorLabels -join ', ')]" + Write-Output "Minor labels: [$($minorLabels -join ', ')]" + Write-Output "Patch labels: [$($patchLabels -join ', ')]" + Write-Output '-------------------------------------------------' + } + + LogGroup 'Event information - JSON' { + $githubEventJson = Get-Content $env:GITHUB_EVENT_PATH + $githubEventJson | Format-List + } + + LogGroup 'Event information - Object' { + $githubEvent = $githubEventJson | ConvertFrom-Json + $pull_request = $githubEvent.pull_request + $githubEvent | Format-List + } + + LogGroup 'Event information - Details' { + $defaultBranchName = (gh repo view --json defaultBranchRef | ConvertFrom-Json | Select-Object -ExpandProperty defaultBranchRef).name + $isPullRequest = $githubEvent.PSObject.Properties.Name -Contains 'pull_request' + if (-not ($isPullRequest -or $whatIf)) { + Write-Warning '⚠️ A release should not be created in this context. Exiting.' + exit + } + $actionType = $githubEvent.action + $isMerged = $pull_request.merged -eq 'True' + $prIsClosed = $pull_request.state -eq 'closed' + $prBaseRef = $pull_request.base.ref + $prHeadRef = $pull_request.head.ref + $targetIsDefaultBranch = $pull_request.base.ref -eq $defaultBranchName + + Write-Output '-------------------------------------------------' + Write-Output "Default branch: [$defaultBranchName]" + Write-Output "Is a pull request event: [$isPullRequest]" + Write-Output "Action type: [$actionType]" + Write-Output "PR Merged: [$isMerged]" + Write-Output "PR Closed: [$prIsClosed]" + Write-Output "PR Base Ref: [$prBaseRef]" + Write-Output "PR Head Ref: [$prHeadRef]" + Write-Output "Target is default branch: [$targetIsDefaultBranch]" + Write-Output '-------------------------------------------------' + } + + LogGroup 'Pull request - details' { + $pull_request | Format-List + } + + LogGroup 'Pull request - Labels' { + $labels = @() + $labels += $pull_request.labels.name + $labels | Format-List + } + + LogGroup 'Calculate release type' { + $createRelease = $isMerged -and $targetIsDefaultBranch + $closedPullRequest = $prIsClosed -and -not $isMerged + $createPrerelease = $labels -Contains 'prerelease' -and -not $createRelease -and -not $closedPullRequest + $prereleaseName = $prHeadRef -replace '[^a-zA-Z0-9]' + + $ignoreRelease = ($labels | Where-Object { $ignoreLabels -contains $_ }).Count -gt 0 + if ($ignoreRelease) { + Write-Output 'Ignoring release creation.' + return + } + + $majorRelease = ($labels | Where-Object { $majorLabels -contains $_ }).Count -gt 0 + $minorRelease = ($labels | Where-Object { $minorLabels -contains $_ }).Count -gt 0 -and -not $majorRelease + $patchRelease = (($labels | Where-Object { $patchLabels -contains $_ }).Count -gt 0 -or $autoPatching) -and -not $majorRelease -and -not $minorRelease + + Write-Output '-------------------------------------------------' + Write-Output "Create a release: [$createRelease]" + Write-Output "Create a prerelease: [$createPrerelease]" + Write-Output "Create a major release: [$majorRelease]" + Write-Output "Create a minor release: [$minorRelease]" + Write-Output "Create a patch release: [$patchRelease]" + Write-Output "Closed pull request: [$closedPullRequest]" + Write-Output '-------------------------------------------------' + } + + LogGroup 'Get latest version - GitHub' { + $releases = gh release list --json 'createdAt,isDraft,isLatest,isPrerelease,name,publishedAt,tagName' | ConvertFrom-Json + if ($LASTEXITCODE -ne 0) { + Write-Error 'Failed to list all releases for the repo.' + exit $LASTEXITCODE + } + $releases | Select-Object -Property name, isPrerelease, isLatest, publishedAt | Format-Table + + $latestRelease = $releases | Where-Object { $_.isLatest -eq $true } + $latestRelease | Format-List + $ghReleaseVersionString = $latestRelease.tagName + if ($ghReleaseVersionString | IsNotNullOrEmpty) { + $ghReleaseVersion = New-PSSemVer -Version $ghReleaseVersionString + } else { + Write-Warning 'Could not find the latest release version. Using ''0.0.0'' as the version.' + $ghReleaseVersion = New-PSSemVer -Version '0.0.0' + } + Write-Output '-------------------------------------------------' + Write-Output 'GitHub version:' + Write-Output ($ghReleaseVersion | Format-Table | Out-String) + Write-Output $ghReleaseVersion.ToString() + Write-Output '-------------------------------------------------' + } + + LogGroup 'Get latest version - PSGallery' { + try { + Retry -Count 5 -Delay 10 { + Write-Output "Finding module [$Name] in the PowerShell Gallery." + $latest = Find-PSResource -Name $Name -Repository PSGallery -Verbose:$false + Write-Output ($latest | Format-Table | Out-String) + } -Catch { + throw $_ + } + $psGalleryVersion = New-PSSemVer -Version $latest.Version + } catch { + Write-Warning 'Could not find module online. Using ''0.0.0'' as the version.' + $psGalleryVersion = New-PSSemVer -Version '0.0.0' + } + Write-Output '-------------------------------------------------' + Write-Output 'PSGallery version:' + Write-Output ($psGalleryVersion | Format-Table | Out-String) + Write-Output $psGalleryVersion.ToString() + Write-Output '-------------------------------------------------' + } + + LogGroup 'Get latest version - Manifest' { + Add-PSModulePath -Path (Split-Path -Path $ModulePath -Parent) + $manifestFilePath = Join-Path $ModulePath "$Name.psd1" + Write-Output "Module manifest file path: [$manifestFilePath]" + if (-not (Test-Path -Path $manifestFilePath)) { + Write-Error "Module manifest file not found at [$manifestFilePath]" + return + } + try { + $manifestVersion = New-PSSemVer -Version (Test-ModuleManifest $manifestFilePath -Verbose:$false).Version + } catch { + if ($manifestVersion | IsNullOrEmpty) { + Write-Warning 'Could not find the module version in the manifest. Using ''0.0.0'' as the version.' + $manifestVersion = New-PSSemVer -Version '0.0.0' + } + } + Write-Output '-------------------------------------------------' + Write-Output 'Manifest version:' + Write-Output ($manifestVersion | Format-Table | Out-String) + Write-Output $manifestVersion.ToString() + Write-Output '-------------------------------------------------' + } + + LogGroup 'Get latest version' { + Write-Output "GitHub: [$($ghReleaseVersion.ToString())]" + Write-Output "PSGallery: [$($psGalleryVersion.ToString())]" + Write-Output "Manifest: [$($manifestVersion.ToString())] (ignored)" + $latestVersion = New-PSSemVer -Version ($psGalleryVersion, $ghReleaseVersion | Sort-Object -Descending | Select-Object -First 1) + Write-Output '-------------------------------------------------' + Write-Output 'Latest version:' + Write-Output ($latestVersion | Format-Table | Out-String) + Write-Output $latestVersion.ToString() + Write-Output '-------------------------------------------------' + } + + LogGroup 'Calculate new version' { + # - Increment based on label on PR + $newVersion = New-PSSemVer -Version $latestVersion + $newVersion.Prefix = $versionPrefix + if ($majorRelease) { + Write-Output 'Incrementing major version.' + $newVersion.BumpMajor() + } elseif ($minorRelease) { + Write-Output 'Incrementing minor version.' + $newVersion.BumpMinor() + } elseif ($patchRelease) { + Write-Output 'Incrementing patch version.' + $newVersion.BumpPatch() + } else { + Write-Output 'Skipping release creation, exiting.' + return + } + + Write-Output "Partial new version: [$newVersion]" + + if ($createPrerelease) { + Write-Output "Adding a prerelease tag to the version using the branch name [$prereleaseName]." + Write-Output ($releases | Where-Object { $_.tagName -like "*$prereleaseName*" } | + Select-Object -Property name, isPrerelease, isLatest, publishedAt | Format-Table -AutoSize | Out-String) + + $newVersion.Prerelease = $prereleaseName + Write-Output "Partial new version: [$newVersion]" + + if ($datePrereleaseFormat | IsNotNullOrEmpty) { + Write-Output "Using date-based prerelease: [$datePrereleaseFormat]." + $newVersion.Prerelease += "$(Get-Date -Format $datePrereleaseFormat)" + Write-Output "Partial new version: [$newVersion]" + } + + if ($incrementalPrerelease) { + # Find the latest prerelease version + $newVersionString = "$($newVersion.Major).$($newVersion.Minor).$($newVersion.Patch)" + + # PowerShell Gallery + $params = @{ + Name = $Name + Version = '*' + Prerelease = $true + Repository = 'PSGallery' + Verbose = $false + ErrorAction = 'SilentlyContinue' + } + Write-Output 'Finding the latest prerelease version in the PowerShell Gallery.' + Write-Output ($params | Format-Table | Out-String) + $psGalleryPrereleases = Find-PSResource @params + $psGalleryPrereleases = $psGalleryPrereleases | Where-Object { $_.Version -like "$newVersionString" } + $psGalleryPrereleases = $psGalleryPrereleases | Where-Object { $_.Prerelease -like "$prereleaseName*" } + $latestPSGalleryPrerelease = $psGalleryPrereleases.Prerelease | ForEach-Object { + [int]($_ -replace $prereleaseName) + } | Sort-Object | Select-Object -Last 1 + Write-Output "PSGallery prerelease: [$latestPSGalleryPrerelease]" + + # GitHub + $ghPrereleases = $releases | Where-Object { $_.tagName -like "*$newVersionString*" } + $ghPrereleases = $ghPrereleases | Where-Object { $_.tagName -like "*$prereleaseName*" } + $latestGHPrereleases = $ghPrereleases.tagName | ForEach-Object { + $number = $_ + $number = $number -replace '\.' + $number = ($number -split $prereleaseName, 2)[-1] + [int]$number + } | Sort-Object | Select-Object -Last 1 + Write-Output "GitHub prerelease: [$latestGHPrereleases]" + + $latestPrereleaseNumber = [Math]::Max($latestPSGalleryPrerelease, $latestGHPrereleases) + $latestPrereleaseNumber++ + $latestPrereleaseNumber = ([string]$latestPrereleaseNumber).PadLeft(3, '0') + $newVersion.Prerelease += $latestPrereleaseNumber + } + } + Write-Output '-------------------------------------------------' + Write-Output 'New version:' + Write-Output ($newVersion | Format-Table | Out-String) + Write-Output $newVersion.ToString() + Write-Output '-------------------------------------------------' + } + Write-Output "New version is [$($newVersion.ToString())]" + + LogGroup 'Update module manifest' { + Write-Output 'Bump module version -> module metadata: Update-ModuleMetadata' + $manifestNewVersion = "$($newVersion.Major).$($newVersion.Minor).$($newVersion.Patch)" + Set-ModuleManifest -Path $manifestFilePath -ModuleVersion $manifestNewVersion -Verbose:$false + if ($createPrerelease) { + Write-Output "Prerelease is: [$($newVersion.Prerelease)]" + Set-ModuleManifest -Path $manifestFilePath -Prerelease $($newVersion.Prerelease) -Verbose:$false + } + + Show-FileContent -Path $manifestFilePath + } + + LogGroup 'Install module dependencies' { + Resolve-PSModuleDependency -ManifestFilePath $manifestFilePath + } + + if ($createPrerelease -or $createRelease -or $whatIf) { + LogGroup 'Publish-ToPSGallery' { + if ($createPrerelease) { + $publishPSVersion = "$($newVersion.Major).$($newVersion.Minor).$($newVersion.Patch)-$($newVersion.Prerelease)" + $psGalleryReleaseLink = "https://www.powershellgallery.com/packages/$Name/$publishPSVersion" + } else { + $publishPSVersion = $newVersion.ToString() + $psGalleryReleaseLink = "https://www.powershellgallery.com/packages/$Name/$($newVersion.ToString())" + } + Write-Output "Publish module to PowerShell Gallery using [$APIKey]" + if ($whatIf) { + Write-Output "Publish-PSResource -Path $ModulePath -Repository PSGallery -ApiKey $APIKey" + } else { + try { + Publish-PSResource -Path $ModulePath -Repository PSGallery -ApiKey $APIKey + } catch { + Write-Error $_.Exception.Message + exit $LASTEXITCODE + } + } + if ($whatIf) { + Write-Output "gh pr comment $($pull_request.number) -b 'Published to the PowerShell Gallery [$publishPSVersion]($psGalleryReleaseLink) has been created.'" + } else { + Write-GitHubNotice "Module [$Name - $publishPSVersion] published to the PowerShell Gallery." + gh pr comment $pull_request.number -b "Module [$Name - $publishPSVersion]($psGalleryReleaseLink) published to the PowerShell Gallery." + if ($LASTEXITCODE -ne 0) { + Write-Error 'Failed to comment on the pull request.' + exit $LASTEXITCODE + } + } + } + + LogGroup 'New-GitHubRelease' { + Write-Output 'Create new GitHub release' + if ($createPrerelease) { + if ($whatIf) { + Write-Output "WhatIf: gh release create $newVersion --title $newVersion --target $prHeadRef --generate-notes --prerelease" + } else { + $releaseURL = gh release create $newVersion --title $newVersion --target $prHeadRef --generate-notes --prerelease + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to create the release [$newVersion]." + exit $LASTEXITCODE + } + } + } else { + if ($whatIf) { + Write-Output "WhatIf: gh release create $newVersion --title $newVersion --generate-notes" + } else { + $releaseURL = gh release create $newVersion --title $newVersion --generate-notes + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to create the release [$newVersion]." + exit $LASTEXITCODE + } + } + } + if ($whatIf) { + Write-Output 'WhatIf: gh pr comment $pull_request.number -b "The release [$newVersion] has been created."' + } else { + gh pr comment $pull_request.number -b "GitHub release for $Name [$newVersion]($releaseURL) has been created." + if ($LASTEXITCODE -ne 0) { + Write-Error 'Failed to comment on the pull request.' + exit $LASTEXITCODE + } + } + Write-GitHubNotice "Release created: [$newVersion]" + } + } + + LogGroup 'List prereleases using the same name' { + $prereleasesToCleanup = $releases | Where-Object { $_.tagName -like "*$prereleaseName*" } + $prereleasesToCleanup | Select-Object -Property name, publishedAt, isPrerelease, isLatest | Format-Table + } + + if ((($closedPullRequest -or $createRelease) -and $autoCleanup) -or $whatIf) { + LogGroup "Cleanup prereleases for [$prereleaseName]" { + foreach ($rel in $prereleasesToCleanup) { + $relTagName = $rel.tagName + Write-Output "Deleting prerelease: [$relTagName]." + if ($whatIf) { + Write-Output "WhatIf: gh release delete $($rel.tagName) --cleanup-tag --yes" + } else { + gh release delete $rel.tagName --cleanup-tag --yes + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to delete release [$relTagName]." + exit $LASTEXITCODE + } + } + } + } + } + +} diff --git a/.github/actions/Publish/scripts/helpers/Resolve-PSModuleDependency.ps1 b/.github/actions/Publish/scripts/helpers/Resolve-PSModuleDependency.ps1 new file mode 100644 index 00000000..7d8d0675 --- /dev/null +++ b/.github/actions/Publish/scripts/helpers/Resolve-PSModuleDependency.ps1 @@ -0,0 +1,64 @@ +#Requires -Modules Retry + +function Resolve-PSModuleDependency { + <# + .SYNOPSIS + Resolve dependencies for a module based on the manifest file. + + .DESCRIPTION + Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure + + .EXAMPLE + Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1' + + Installs all modules defined in the manifest file, following PSModuleInfo structure. + + .NOTES + Should later be adapted to support both pre-reqs, and dependencies. + Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion, + and latest version within a range MinimumVersion - MaximumVersion. + #> + [Alias('Resolve-PSModuleDependencies')] + [CmdletBinding()] + param( + # The path to the manifest file. + [Parameter(Mandatory)] + [string] $ManifestFilePath + ) + + Write-Verbose 'Resolving dependencies' + + $manifest = Import-PowerShellDataFile -Path $ManifestFilePath + Write-Verbose "Reading [$ManifestFilePath]" + Write-Verbose "Found [$($manifest.RequiredModules.Count)] modules to install" + + foreach ($requiredModule in $manifest.RequiredModules) { + $installParams = @{} + + if ($requiredModule -is [string]) { + $installParams.Name = $requiredModule + } else { + $installParams.Name = $requiredModule.ModuleName + $installParams.MinimumVersion = $requiredModule.ModuleVersion + $installParams.RequiredVersion = $requiredModule.RequiredVersion + $installParams.MaximumVersion = $requiredModule.MaximumVersion + } + $installParams.Force = $true + $installParams.Verbose = $false + + Write-Verbose "[$($installParams.Name)] - Installing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Retry -Count 5 -Delay 10 { + Install-Module @installParams -AllowPrerelease:$false + } + $VerbosePreference = $VerbosePreferenceOriginal + Write-Verbose "[$($installParams.Name)] - Importing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Import-Module @installParams + $VerbosePreference = $VerbosePreferenceOriginal + Write-Verbose "[$($installParams.Name)] - Done" + } + Write-Verbose 'Resolving dependencies - Done' +} diff --git a/.github/actions/Publish/scripts/main.ps1 b/.github/actions/Publish/scripts/main.ps1 new file mode 100644 index 00000000..f6f0c4e2 --- /dev/null +++ b/.github/actions/Publish/scripts/main.ps1 @@ -0,0 +1,34 @@ +[CmdletBinding()] +param() + +$path = (Join-Path -Path $PSScriptRoot -ChildPath 'helpers') +LogGroup "Loading helper scripts from [$path]" { + Get-ChildItem -Path $path -Filter '*.ps1' -Recurse | ForEach-Object { + Write-Verbose "[$($_.FullName)]" + . $_.FullName + } +} + +LogGroup 'Loading inputs' { + Write-Verbose "Name: [$env:GITHUB_ACTION_INPUT_Name]" + Write-Verbose "GITHUB_REPOSITORY: [$env:GITHUB_REPOSITORY]" + Write-Verbose "GITHUB_WORKSPACE: [$env:GITHUB_WORKSPACE]" + + $name = ($env:GITHUB_ACTION_INPUT_Name | IsNullOrEmpty) ? $env:GITHUB_REPOSITORY_NAME : $env:GITHUB_ACTION_INPUT_Name + Write-Verbose "Module name: [$name]" + Write-Verbose "Module path: [$env:GITHUB_ACTION_INPUT_ModulePath]" + Write-Verbose "Doc path: [$env:GITHUB_ACTION_INPUT_DocsPath]" + + $modulePath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_ModulePath $name + Write-Verbose "Module path: [$modulePath]" + if (-not (Test-Path -Path $modulePath)) { + throw "Module path [$modulePath] does not exist." + } +} + +$params = @{ + Name = $name + ModulePath = $modulePath + APIKey = $env:GITHUB_ACTION_INPUT_APIKey +} +Publish-PSModule @params diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 new file mode 100644 index 00000000..ebe988d3 --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 @@ -0,0 +1,75 @@ +@{ + RootModule = 'PSModuleTest.psm1' + ModuleVersion = '999.0.0' + CompatiblePSEditions = @( + 'Core' + 'Desktop' + ) + GUID = '20b37221-db1c-43db-9cca-f22b33123548' + Author = 'PSModule' + CompanyName = 'PSModule' + Copyright = '(c) 2024 PSModule. All rights reserved.' + Description = 'Process a module from source code to published module.' + PowerShellVersion = '5.1' + ProcessorArchitecture = 'None' + RequiredModules = @( + @{ + ModuleVersion = '1.0' + ModuleName = 'PSSemVer' + } + 'Utilities' + ) + RequiredAssemblies = 'assemblies/LsonLib.dll' + ScriptsToProcess = 'scripts/loader.ps1' + TypesToProcess = @( + 'types/DirectoryInfo.Types.ps1xml' + 'types/FileInfo.Types.ps1xml' + ) + FormatsToProcess = @( + 'formats/CultureInfo.Format.ps1xml' + 'formats/Mygciview.Format.ps1xml' + ) + NestedModules = @( + 'modules/OtherPSModule.psm1' + ) + FunctionsToExport = @( + 'Get-PSModuleTest' + 'New-PSModuleTest' + 'Set-PSModuleTest' + 'Test-PSModuleTest' + ) + CmdletsToExport = @() + VariablesToExport = @() + AliasesToExport = '*' + ModuleList = @( + 'modules/OtherPSModule.psm1' + ) + FileList = @( + 'PSModuleTest.psd1' + 'PSModuleTest.psm1' + 'assemblies/LsonLib.dll' + 'data/Config.psd1' + 'data/Settings.psd1' + 'formats/CultureInfo.Format.ps1xml' + 'formats/Mygciview.Format.ps1xml' + 'modules/OtherPSModule.psm1' + 'scripts/loader.ps1' + 'types/DirectoryInfo.Types.ps1xml' + 'types/FileInfo.Types.ps1xml' + ) + PrivateData = @{ + PSData = @{ + Tags = @( + 'workflow' + 'powershell' + 'powershell-module' + 'PSEdition_Desktop' + 'PSEdition_Core' + ) + LicenseUri = 'https://github.com/PSModule/Process-PSModule/blob/main/LICENSE' + ProjectUri = 'https://github.com/PSModule/Process-PSModule' + IconUri = 'https://raw.githubusercontent.com/PSModule/Process-PSModule/main/icon/icon.png' + } + } +} + diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 new file mode 100644 index 00000000..143fe324 --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 @@ -0,0 +1,382 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() + +$scriptName = $MyInvocation.MyCommand.Name +Write-Verbose "[$scriptName] Importing module" + +#region - Data import +Write-Verbose "[$scriptName] - [data] - Processing folder" +$dataFolder = (Join-Path $PSScriptRoot 'data') +Write-Verbose "[$scriptName] - [data] - [$dataFolder]" +Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { + Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing" + New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force + Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done" +} + +Write-Verbose "[$scriptName] - [data] - Done" +#endregion - Data import + +#region - From /init +Write-Verbose "[$scriptName] - [/init] - Processing folder" + +#region - From /init/initializer.ps1 +Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Importing" + +Write-Verbose '-------------------------------' -Verbose +Write-Verbose '--- THIS IS AN INITIALIZER ---' -Verbose +Write-Verbose '-------------------------------' -Verbose + +Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Done" +#endregion - From /init/initializer.ps1 + +Write-Verbose "[$scriptName] - [/init] - Done" +#endregion - From /init + +#region - From /classes +Write-Verbose "[$scriptName] - [/classes] - Processing folder" + +#region - From /classes/Book.ps1 +Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Importing" + +class Book { + # Class properties + [string] $Title + [string] $Author + [string] $Synopsis + [string] $Publisher + [datetime] $PublishDate + [int] $PageCount + [string[]] $Tags + # Default constructor + Book() { $this.Init(@{}) } + # Convenience constructor from hashtable + Book([hashtable]$Properties) { $this.Init($Properties) } + # Common constructor for title and author + Book([string]$Title, [string]$Author) { + $this.Init(@{Title = $Title; Author = $Author }) + } + # Shared initializer method + [void] Init([hashtable]$Properties) { + foreach ($Property in $Properties.Keys) { + $this.$Property = $Properties.$Property + } + } + # Method to calculate reading time as 2 minutes per page + [timespan] GetReadingTime() { + if ($this.PageCount -le 0) { + throw 'Unable to determine reading time from page count.' + } + $Minutes = $this.PageCount * 2 + return [timespan]::new(0, $Minutes, 0) + } + # Method to calculate how long ago a book was published + [timespan] GetPublishedAge() { + if ( + $null -eq $this.PublishDate -or + $this.PublishDate -eq [datetime]::MinValue + ) { throw 'PublishDate not defined' } + + return (Get-Date) - $this.PublishDate + } + # Method to return a string representation of the book + [string] ToString() { + return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))" + } +} + +Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Done" +#endregion - From /classes/Book.ps1 +#region - From /classes/BookList.ps1 +Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Importing" + +class BookList { + # Static property to hold the list of books + static [System.Collections.Generic.List[Book]] $Books + # Static method to initialize the list of books. Called in the other + # static methods to avoid needing to explicit initialize the value. + static [void] Initialize() { [BookList]::Initialize($false) } + static [bool] Initialize([bool]$force) { + if ([BookList]::Books.Count -gt 0 -and -not $force) { + return $false + } + + [BookList]::Books = [System.Collections.Generic.List[Book]]::new() + + return $true + } + # Ensure a book is valid for the list. + static [void] Validate([book]$Book) { + $Prefix = @( + 'Book validation failed: Book must be defined with the Title,' + 'Author, and PublishDate properties, but' + ) -join ' ' + if ($null -eq $Book) { throw "$Prefix was null" } + if ([string]::IsNullOrEmpty($Book.Title)) { + throw "$Prefix Title wasn't defined" + } + if ([string]::IsNullOrEmpty($Book.Author)) { + throw "$Prefix Author wasn't defined" + } + if ([datetime]::MinValue -eq $Book.PublishDate) { + throw "$Prefix PublishDate wasn't defined" + } + } + # Static methods to manage the list of books. + # Add a book if it's not already in the list. + static [void] Add([Book]$Book) { + [BookList]::Initialize() + [BookList]::Validate($Book) + if ([BookList]::Books.Contains($Book)) { + throw "Book '$Book' already in list" + } + + $FindPredicate = { + param([Book]$b) + + $b.Title -eq $Book.Title -and + $b.Author -eq $Book.Author -and + $b.PublishDate -eq $Book.PublishDate + }.GetNewClosure() + if ([BookList]::Books.Find($FindPredicate)) { + throw "Book '$Book' already in list" + } + + [BookList]::Books.Add($Book) + } + # Clear the list of books. + static [void] Clear() { + [BookList]::Initialize() + [BookList]::Books.Clear() + } + # Find a specific book using a filtering scriptblock. + static [Book] Find([scriptblock]$Predicate) { + [BookList]::Initialize() + return [BookList]::Books.Find($Predicate) + } + # Find every book matching the filtering scriptblock. + static [Book[]] FindAll([scriptblock]$Predicate) { + [BookList]::Initialize() + return [BookList]::Books.FindAll($Predicate) + } + # Remove a specific book. + static [void] Remove([Book]$Book) { + [BookList]::Initialize() + [BookList]::Books.Remove($Book) + } + # Remove a book by property value. + static [void] RemoveBy([string]$Property, [string]$Value) { + [BookList]::Initialize() + $Index = [BookList]::Books.FindIndex({ + param($b) + $b.$Property -eq $Value + }.GetNewClosure()) + if ($Index -ge 0) { + [BookList]::Books.RemoveAt($Index) + } + } +} + +Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Done" +#endregion - From /classes/BookList.ps1 + +Write-Verbose "[$scriptName] - [/classes] - Done" +#endregion - From /classes + +#region - From /private +Write-Verbose "[$scriptName] - [/private] - Processing folder" + +#region - From /private/Get-InternalPSModule.ps1 +Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" + +Function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" +#endregion - From /private/Get-InternalPSModule.ps1 +#region - From /private/Set-InternalPSModule.ps1 +Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" + +Function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" +#endregion - From /private/Set-InternalPSModule.ps1 + +Write-Verbose "[$scriptName] - [/private] - Done" +#endregion - From /private + +#region - From /public +Write-Verbose "[$scriptName] - [/public] - Processing folder" + +#region - From /public/Get-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" + +#Requires -Modules Utilities + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" +#endregion - From /public/Get-PSModuleTest.ps1 +#region - From /public/New-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" + +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} + +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" +#endregion - From /public/New-PSModuleTest.ps1 +#region - From /public/Set-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" + +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" +#endregion - From /public/Set-PSModuleTest.ps1 +#region - From /public/Test-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" + +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" +#endregion - From /public/Test-PSModuleTest.ps1 + +Write-Verbose "[$scriptName] - [/public] - Done" +#endregion - From /public + +#region - From /finally.ps1 +Write-Verbose "[$scriptName] - [/finally.ps1] - Importing" + +Write-Verbose '------------------------------' -Verbose +Write-Verbose '--- THIS IS A LAST LOADER ---' -Verbose +Write-Verbose '------------------------------' -Verbose +Write-Verbose "[$scriptName] - [/finally.ps1] - Done" +#endregion - From /finally.ps1 + +$exports = @{ + Cmdlet = '' + Alias = '*' + Variable = '' + Function = @( + 'Get-PSModuleTest' + 'New-PSModuleTest' + 'Set-PSModuleTest' + 'Test-PSModuleTest' + ) +} +Export-ModuleMember @exports + diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..9e4353ba --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +Function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 new file mode 100644 index 00000000..29ad42f6 --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' -Verbose +Write-Verbose '--- THIS IS A LOADER ---' -Verbose +Write-Verbose '-------------------------' -Verbose diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Test/.github/linters/.markdown-lint.yml b/.github/actions/Test/.github/linters/.markdown-lint.yml new file mode 100644 index 00000000..b9ecdfa9 --- /dev/null +++ b/.github/actions/Test/.github/linters/.markdown-lint.yml @@ -0,0 +1,25 @@ +########################### +## Markdown Linter rules ## +########################### + +# Linter rules doc: +# - https://github.com/DavidAnson/markdownlint + +############### +# Rules by id # +############### +MD004: false # Unordered list style +MD007: + indent: 2 # Unordered list indentation +MD013: + line_length: 808 # Line length +MD026: + punctuation: ".,;:!。,;:" # List of not allowed +MD029: false # Ordered list item prefix +MD033: false # Allow inline HTML +MD036: false # Emphasis used instead of a heading + +################# +# Rules by tags # +################# +blank_lines: false # Error on blank lines diff --git a/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 new file mode 100644 index 00000000..40d11d60 --- /dev/null +++ b/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 @@ -0,0 +1,18 @@ +#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings +@{ + #CustomRulePath='path\to\CustomRuleModule.psm1' + #RecurseCustomRulePath='path\of\customrules' + #Severity = @( + # 'Error' + # 'Warning' + #) + #IncludeDefaultRules=${true} + ExcludeRules = @( + 'PSMissingModuleManifestField' + 'PSAvoidUsingWriteHost' + ) + #IncludeRules = @( + # 'PSAvoidUsingWriteHost', + # 'MyCustomRuleName' + #) +} diff --git a/.github/actions/Test/.github/workflows/Action-Test-Src-Default.yml b/.github/actions/Test/.github/workflows/Action-Test-Src-Default.yml new file mode 100644 index 00000000..0fa6911e --- /dev/null +++ b/.github/actions/Test/.github/workflows/Action-Test-Src-Default.yml @@ -0,0 +1,50 @@ +name: Action-Test [Src-Default] + +run-name: "Action-Test [Src-Default] - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + ActionTest: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + name: Action-Test [Src-Default] - [${{ matrix.os }}] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + id: action-test + env: + GITHUB_TOKEN: ${{ github.token }} + with: + Name: PSModuleTest + Path: tests/src + TestType: SourceCode + + - name: Status + shell: pwsh + env: + PASSED: ${{ steps.action-test.outputs.passed }} + run: | + Write-Host "Passed: [$env:PASSED]" + if ($env:PASSED -ne 'true') { + exit 1 + } diff --git a/.github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml b/.github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml new file mode 100644 index 00000000..b14f85b8 --- /dev/null +++ b/.github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml @@ -0,0 +1,50 @@ +name: Action-Test [Src-WithManifest] + +run-name: "Action-Test [Src-WithManifest] - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + ActionTest: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + name: Action-Test [Src-WithManifest] - [${{ matrix.os }}] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + id: action-test + env: + GITHUB_TOKEN: ${{ github.token }} + with: + Name: PSModuleTest + Path: tests/srcWithManifest + TestType: SourceCode + + - name: Status + shell: pwsh + env: + PASSED: ${{ steps.action-test.outputs.passed }} + run: | + Write-Host "Passed: [$env:PASSED]" + if ($env:PASSED -ne 'true') { + exit 1 + } diff --git a/.github/actions/Test/.github/workflows/Action-Test-outputs.yml b/.github/actions/Test/.github/workflows/Action-Test-outputs.yml new file mode 100644 index 00000000..84749eca --- /dev/null +++ b/.github/actions/Test/.github/workflows/Action-Test-outputs.yml @@ -0,0 +1,50 @@ +name: Action-Test [outputs] + +run-name: "Action-Test [outputs] - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + workflow_dispatch: + pull_request: + schedule: + - cron: '0 0 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + ActionTest: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + name: Action-Test [outputs] - [${{ matrix.os }}] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Action-Test + uses: ./ + id: action-test + env: + GITHUB_TOKEN: ${{ github.token }} + with: + Name: PSModuleTest + Path: tests/outputs/modules + TestType: Module + + - name: Status + shell: pwsh + env: + PASSED: ${{ steps.action-test.outputs.passed }} + run: | + Write-Host "Passed: [$env:PASSED]" + if ($env:PASSED -ne 'true') { + exit 1 + } diff --git a/.github/actions/Test/.github/workflows/Auto-Release.yml b/.github/actions/Test/.github/workflows/Auto-Release.yml new file mode 100644 index 00000000..ec157c9d --- /dev/null +++ b/.github/actions/Test/.github/workflows/Auto-Release.yml @@ -0,0 +1,36 @@ +name: Auto-Release + +run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: + pull_request_target: + branches: + - main + types: + - closed + - opened + - reopened + - synchronize + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write + +jobs: + Auto-Release: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Auto-Release + uses: PSModule/Auto-Release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication + with: + IncrementalPrerelease: false diff --git a/.github/actions/Test/.github/workflows/Linter.yml b/.github/actions/Test/.github/workflows/Linter.yml new file mode 100644 index 00000000..f6f58f0a --- /dev/null +++ b/.github/actions/Test/.github/workflows/Linter.yml @@ -0,0 +1,32 @@ +name: Linter + +run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" + +on: [pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + packages: read + statuses: write + +jobs: + Lint: + name: Lint code base + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Lint code base + uses: super-linter/super-linter@latest + env: + GITHUB_TOKEN: ${{ github.token }} + VALIDATE_JSCPD: false + VALIDATE_MARKDOWN_PRETTIER: false + VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Test/README.md b/.github/actions/Test/README.md new file mode 100644 index 00000000..2461ad07 --- /dev/null +++ b/.github/actions/Test/README.md @@ -0,0 +1,129 @@ +# Test-PSModule + +Test PowerShell modules with Pester and PSScriptAnalyzer. + +This GitHub Action is a part of the [PSModule framework](https://github.com/PSModule). It is recommended to use the [Process-PSModule workflow](https://github.com/PSModule/Process-PSModule) to automate the whole process of managing the PowerShell module. + +## Specifications and practices + +Test-PSModule enables: + +- [Test-Driven Development](https://testdriven.io/test-driven-development/) using [Pester](https://pester.dev) and [PSScriptAnalyzer](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) + +## How it works + +The action runs the following the Pester test framework: +- [PSScriptAnalyzer tests](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/rules/readme?view=ps-modules) +- [PSModule framework tests](#psmodule-tests) +- If `TestType` is set to `Module`: + - The module manifest is tested using [Test-ModuleManifest](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/test-modulemanifest). + - The module is imported. + - Custom module tests from the `tests` directory in the module repository are run. + - CodeCoverage is calculated. +- If `TestType` is set to `SourceCode`: + - The source code is tested with: + - `PSScriptAnalyzer` for best practices, using custom settings. + - `PSModule.SourceCode` for other PSModule standards. +- The action returns a `passed` output that is `true` if all tests pass, else `false`. +- The following reports are calculated and uploaded as artifacts: + - Test suite results. + - Code coverage results. + +The action fails if any of the tests fail or it fails to run the tests. +This is mitigated by the `continue-on-error` option in the workflow. + +## How to use it + +To use the action, create a new file in the `.github/workflows` directory of the module repository and add the following content. +

+Workflow suggestion - before module is built + +```yaml +name: Test-PSModule + +on: [push] + +jobs: + Test-PSModule: + name: Test-PSModule + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Test-PSModule + uses: PSModule/Test-PSModule@main + with: + Path: src + TestType: SourceCode + +``` +
+ +
+Workflow suggestion - after module is built + +```yaml +name: Test-PSModule + +on: [push] + +jobs: + Test-PSModule: + name: Test-PSModule + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Initialize environment + uses: PSModule/Initialize-PSModule@main + + - name: Test-PSModule + uses: PSModule/Test-PSModule@main + with: + Path: outputs/modules + TestType: Module + +``` +
+ +## Usage + +### Inputs + +| Name | Description | Required | Default | +| ---- | ----------- | -------- | ------- | +| `Path` | The path to the code to test. | `true` | | +| `TestType` | The type of tests to run. Can be either `Module` or `SourceCode`. | `true` | | +| `Name` | The name of the module to test. The name of the repository is used if not specified. | `false` | | +| `TestsPath` | The path to the tests to run. | `false` | `tests` | +| `StackTraceVerbosity` | Verbosity level of the stack trace. Allowed values: `None`, `FirstLine`, `Filtered`, `Full`. | `false` | `Filtered` | +| `Verbosity` | Verbosity level of the test output. Allowed values: `None`, `Normal`, `Detailed`, `Diagnostic`. | `false` | `Detailed` | +| `Debug` | Enable debug output. | `'false'` | `false` | +| `Verbose` | Enable verbose output. | `'false'` | `false` | +| `Version` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | | `false` | +| `Prerelease` | Allow prerelease versions if available. | `'false'` | `false` | + +### Outputs + +| Name | Description | Possible values | +| ---- | ----------- | --------------- | +| `passed` | If the tests passed. | `true`, `false` | + +## PSModule tests + +The [PSModule framework tests](https://github.com/PSModule/Test-PSModule/blob/main/scripts/tests/PSModule/PSModule.Tests.ps1) verifies the following coding practices that the framework enforces: + +- Script filename and function/filter name should match. + +## Tools + +- Pester | [Docs](https://www.pester.dev) | [GitHub](https://github.com/Pester/Pester) | [PS Gallery](https://www.powershellgallery.com/packages/Pester/) +- PSScriptAnalyzer [Docs](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) | [GitHub](https://github.com/PowerShell/PSScriptAnalyzer) | [PS Gallery](https://www.powershellgallery.com/packages/PSScriptAnalyzer/) +- PSResourceGet | [Docs](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.psresourceget/?view=powershellget-3.x) | [GitHub](https://github.com/PowerShell/PSResourceGet) | [PS Gallery](https://www.powershellgallery.com/packages/Microsoft.PowerShell.PSResourceGet/) +- [Test-ModuleManifest | Microsoft Learn](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/test-modulemanifest) +- [PowerShellGet | Microsoft Learn](https://learn.microsoft.com/en-us/powershell/module/PowerShellGet/test-scriptfileinfo) diff --git a/.github/actions/Test/action.yml b/.github/actions/Test/action.yml new file mode 100644 index 00000000..03e4bdd5 --- /dev/null +++ b/.github/actions/Test/action.yml @@ -0,0 +1,86 @@ +name: Test-PSModule (by PSModule) +description: Test a PowerShell module before publishing the module to the PowerShell Gallery. +author: PSModule +branding: + icon: check-square + color: gray-dark + +inputs: + Name: + description: The name of the module to test. The name of the repository is used if not specified. + required: false + Path: + description: The path to the code to test. + required: true + TestType: + description: The type of tests to run. Can be either 'Module' or 'SourceCode'. + required: true + TestsPath: + description: The path to the tests to run. + required: false + default: tests + StackTraceVerbosity: + description: "Verbosity level of the stack trace. Allowed values: 'None', 'FirstLine', 'Filtered', 'Full'." + required: false + default: 'Filtered' + Verbosity: + description: "Verbosity level of the test output. Allowed values: 'None', 'Normal', 'Detailed', 'Diagnostic'." + required: false + default: 'Detailed' + Debug: + description: Enable debug output. + required: false + default: 'false' + Verbose: + description: Enable verbose output. + required: false + default: 'false' + Version: + description: Specifies the version of the GitHub module to be installed. The value must be an exact version. + required: false + Prerelease: + description: Allow prerelease versions if available. + required: false + default: 'false' + +outputs: + passed: + description: If the tests passed. + value: ${{ fromJSON(steps.test.outputs.result).passed }} + +runs: + using: composite + steps: + - name: Run Test-PSModule + uses: PSModule/GitHub-Script@v1 + id: test + env: + GITHUB_ACTION_INPUT_Name: ${{ inputs.Name }} + GITHUB_ACTION_INPUT_Path: ${{ inputs.Path }} + GITHUB_ACTION_INPUT_TestType: ${{ inputs.TestType }} + GITHUB_ACTION_INPUT_TestsPath: ${{ inputs.TestsPath }} + GITHUB_ACTION_INPUT_StackTraceVerbosity: ${{ inputs.StackTraceVerbosity }} + GITHUB_ACTION_INPUT_Verbosity: ${{ inputs.Verbosity }} + with: + Debug: ${{ inputs.Debug }} + Prerelease: ${{ inputs.Prerelease }} + Verbose: ${{ inputs.Verbose }} + Version: ${{ inputs.Version }} + ShowOutput: true + Script: | + # Test-PSModule + ${{ github.action_path }}/scripts/main.ps1 + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: ${{ inputs.TestType == 'Module' && (success() || failure()) }} + with: + name: ${{ runner.os }}-Test-Report + path: ${{ github.workspace }}/outputs/Test-Report.xml + + - name: Upload code coverage report + uses: actions/upload-artifact@v4 + if: ${{ inputs.TestType == 'Module' && (success() || failure()) }} + with: + name: ${{ runner.os }}-CodeCoverage-Report + path: ${{ github.workspace }}/outputs/CodeCoverage-Report.xml diff --git a/.github/actions/Test/scripts/helpers/Resolve-PSModuleDependency.ps1 b/.github/actions/Test/scripts/helpers/Resolve-PSModuleDependency.ps1 new file mode 100644 index 00000000..8a6ddca8 --- /dev/null +++ b/.github/actions/Test/scripts/helpers/Resolve-PSModuleDependency.ps1 @@ -0,0 +1,64 @@ +#Requires -Modules Retry + +function Resolve-PSModuleDependency { + <# + .SYNOPSIS + Resolve dependencies for a module based on the manifest file. + + .DESCRIPTION + Resolve dependencies for a module based on the manifest file, following PSModuleInfo structure + + .EXAMPLE + Resolve-PSModuleDependency -Path 'C:\MyModule\MyModule.psd1' + + Installs all modules defined in the manifest file, following PSModuleInfo structure. + + .NOTES + Should later be adapted to support both pre-reqs, and dependencies. + Should later be adapted to take 4 parameters sets: specific version ("requiredVersion" | "GUID"), latest version ModuleVersion, + and latest version within a range MinimumVersion - MaximumVersion. + #> + [Alias('Resolve-PSModuleDependencies')] + [CmdletBinding()] + param( + # The path to the manifest file. + [Parameter(Mandatory)] + [string] $ManifestFilePath + ) + + Write-Host 'Resolving dependencies' + + $manifest = Import-PowerShellDataFile -Path $ManifestFilePath + Write-Host "Reading [$ManifestFilePath]" + Write-Host "Found [$($manifest.RequiredModules.Count)] modules to install" + + foreach ($requiredModule in $manifest.RequiredModules) { + $installParams = @{} + + if ($requiredModule -is [string]) { + $installParams.Name = $requiredModule + } else { + $installParams.Name = $requiredModule.ModuleName + $installParams.MinimumVersion = $requiredModule.ModuleVersion + $installParams.RequiredVersion = $requiredModule.RequiredVersion + $installParams.MaximumVersion = $requiredModule.MaximumVersion + } + $installParams.Force = $true + $installParams.Verbose = $false + + Write-Host "[$($installParams.Name)] - Installing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Retry -Count 5 -Delay 10 { + Install-Module @installParams -AllowPrerelease:$false + } + $VerbosePreference = $VerbosePreferenceOriginal + Write-Host "[$($installParams.Name)] - Importing module" + $VerbosePreferenceOriginal = $VerbosePreference + $VerbosePreference = 'SilentlyContinue' + Import-Module @installParams + $VerbosePreference = $VerbosePreferenceOriginal + Write-Host "[$($installParams.Name)] - Done" + } + Write-Host 'Resolving dependencies - Done' +} diff --git a/.github/actions/Test/scripts/helpers/Test-PSModule.ps1 b/.github/actions/Test/scripts/helpers/Test-PSModule.ps1 new file mode 100644 index 00000000..27d0e094 --- /dev/null +++ b/.github/actions/Test/scripts/helpers/Test-PSModule.ps1 @@ -0,0 +1,177 @@ +function Test-PSModule { + <# + .SYNOPSIS + Performs tests on a module. + #> + [OutputType([int])] + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', Scope = 'Function', + Justification = 'Parameters are used in nested ScriptBlocks' + )] + param( + # Path to the folder where the code to test is located. + [Parameter(Mandatory)] + [string] $Path, + + # Run module tests. + [Parameter()] + [ValidateSet('SourceCode', 'Module')] + [string] $TestType = 'SourceCode', + + # Path to the folder where the tests are located. + [Parameter()] + [string] $TestsPath = 'tests', + + # Verbosity level of the stack trace. + [Parameter()] + [ValidateSet('None', 'FirstLine', 'Filtered', 'Full')] + [string] $StackTraceVerbosity = 'Filtered', + + # Verbosity level of the test output. + [Parameter()] + [ValidateSet('None', 'Normal', 'Detailed', 'Diagnostic')] + [string] $Verbosity = 'Detailed' + ) + + $moduleName = Split-Path -Path $Path -Leaf + $testSourceCode = $TestType -eq 'SourceCode' + $testModule = $TestType -eq 'Module' + $moduleTestsPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $TestsPath + + LogGroup 'Get test kit versions' { + $PSSAModule = Get-PSResource -Name PSScriptAnalyzer -Verbose:$false | Sort-Object Version -Descending | Select-Object -First 1 + $pesterModule = Get-PSResource -Name Pester -Verbose:$false | Sort-Object Version -Descending | Select-Object -First 1 + + [PSCustomObject]@{ + PowerShell = $PSVersionTable.PSVersion.ToString() + Pester = $pesterModule.version + PSScriptAnalyzer = $PSSAModule.version + } | Format-List + } + + LogGroup 'Add test - Common - PSScriptAnalyzer' { + $containers = @() + $PSSATestsPath = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSScriptAnalyzer' + $settingsFileName = if ($testModule) { 'Settings.Module.psd1' } else { 'Settings.SourceCode.psd1' } + $settingsFilePath = Join-Path -Path $PSSATestsPath -ChildPath $settingsFileName + $containerParams = @{ + Path = Join-Path $PSSATestsPath 'PSScriptAnalyzer.Tests.ps1' + Data = @{ + Path = $Path + SettingsFilePath = $settingsFilePath + Debug = $false + Verbose = $false + } + } + Write-Host ($containerParams | ConvertTo-Json) + $containers += New-PesterContainer @containerParams + } + + LogGroup 'Add test - Common - PSModule' { + $containerParams = @{ + Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\Common.Tests.ps1' + Data = @{ + Path = $Path + Debug = $false + Verbose = $false + } + } + Write-Host ($containerParams | ConvertTo-Json) + $containers += New-PesterContainer @containerParams + } + + if ($testModule) { + LogGroup 'Add test - Module - PSModule' { + $containerParams = @{ + Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\Module.Tests.ps1' + Data = @{ + Path = $Path + Debug = $false + Verbose = $false + } + } + Write-Host ($containerParams | ConvertTo-Json) + $containers += New-PesterContainer @containerParams + } + } + + if ($testSourceCode) { + LogGroup 'Add test - SourceCode - PSModule' { + $containerParams = @{ + Path = Join-Path -Path $PSScriptRoot -ChildPath '..\tests\PSModule\SourceCode.Tests.ps1' + Data = @{ + Path = $Path + TestsPath = $moduleTestsPath + Debug = $false + Verbose = $false + } + } + Write-Host ($containerParams | ConvertTo-Json) + $containers += New-PesterContainer @containerParams + } + } + + if ($testModule) { + if (Test-Path -Path $moduleTestsPath) { + LogGroup "Add test - Module - $moduleName" { + $containerParams = @{ + Path = $moduleTestsPath + } + Write-Host ($containerParams | ConvertTo-Json) + $containers += New-PesterContainer @containerParams + } + } else { + Write-GitHubWarning "⚠️ No tests found - [$moduleTestsPath]" + } + } + + if ((Test-Path -Path $moduleTestsPath) -and $testModule) { + LogGroup 'Install module dependencies' { + $moduleManifestPath = Join-Path -Path $Path -ChildPath "$moduleName.psd1" + Resolve-PSModuleDependency -ManifestFilePath $moduleManifestPath + } + + LogGroup "Importing module: $moduleName" { + Add-PSModulePath -Path (Split-Path $Path -Parent) + $existingModule = Get-Module -Name $ModuleName -ListAvailable + $existingModule | Remove-Module -Force + $existingModule.RequiredModules | ForEach-Object { $_ | Remove-Module -Force -ErrorAction SilentlyContinue } + $existingModule.NestedModules | ForEach-Object { $_ | Remove-Module -Force -ErrorAction SilentlyContinue } + Import-Module -Name $moduleName -Force -RequiredVersion '999.0.0' -Global + } + } + + LogGroup 'Pester config' { + $pesterParams = @{ + Configuration = @{ + Run = @{ + Path = $Path + Container = $containers + PassThru = $true + } + TestResult = @{ + Enabled = $testModule + OutputFormat = 'NUnitXml' + OutputPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath 'outputs\Test-Report.xml' + TestSuiteName = 'Unit tests' + } + CodeCoverage = @{ + Enabled = $testModule + OutputPath = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath 'outputs\CodeCoverage-Report.xml' + OutputFormat = 'JaCoCo' + OutputEncoding = 'UTF8' + CoveragePercentTarget = 75 + } + Output = @{ + CIFormat = 'Auto' + StackTraceVerbosity = $StackTraceVerbosity + Verbosity = $Verbosity + } + } + } + Write-Host ($pesterParams | ConvertTo-Json -Depth 5 -WarningAction SilentlyContinue) + } + + Invoke-Pester @pesterParams +} diff --git a/.github/actions/Test/scripts/main.ps1 b/.github/actions/Test/scripts/main.ps1 new file mode 100644 index 00000000..39d0bfda --- /dev/null +++ b/.github/actions/Test/scripts/main.ps1 @@ -0,0 +1,62 @@ +[CmdletBinding()] +param() + +$path = (Join-Path -Path $PSScriptRoot -ChildPath 'helpers') +LogGroup "Loading helper scripts from [$path]" { + Get-ChildItem -Path $path -Filter '*.ps1' -Recurse | ForEach-Object { + Write-Host " - $($_.FullName)" + . $_.FullName + } +} + +LogGroup 'Loading inputs' { + $moduleName = ($env:GITHUB_ACTION_INPUT_Name | IsNullOrEmpty) ? $env:GITHUB_REPOSITORY_NAME : $env:GITHUB_ACTION_INPUT_Name + $codeToTest = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "$env:GITHUB_ACTION_INPUT_Path\$moduleName" + if (-not (Test-Path -Path $codeToTest)) { + $codeToTest = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath $env:GITHUB_ACTION_INPUT_Path + } + if (-not (Test-Path -Path $codeToTest)) { + throw "Path [$codeToTest] does not exist." + } + + if (-not (Test-Path -Path $env:GITHUB_ACTION_INPUT_TestsPath)) { + throw "Path [$env:GITHUB_ACTION_INPUT_TestsPath] does not exist." + } + + [pscustomobject]@{ + ModuleName = $moduleName + CodeToTest = $codeToTest + TestType = $env:GITHUB_ACTION_INPUT_TestType + TestsPath = $env:GITHUB_ACTION_INPUT_TestsPath + StackTraceVerbosity = $env:GITHUB_ACTION_INPUT_StackTraceVerbosity + Verbosity = $env:GITHUB_ACTION_INPUT_Verbosity + } | Format-List +} + +$params = @{ + Path = $codeToTest + TestType = $env:GITHUB_ACTION_INPUT_TestType + TestsPath = $env:GITHUB_ACTION_INPUT_TestsPath + StackTraceVerbosity = $env:GITHUB_ACTION_INPUT_StackTraceVerbosity + Verbosity = $env:GITHUB_ACTION_INPUT_Verbosity +} +$testResults = Test-PSModule @params + +LogGroup 'Test results' { + $testResults | Format-List +} + +$failedTests = [int]$testResults.FailedCount + +if (($failedTests -gt 0) -or ($testResults.Result -ne 'Passed')) { + Write-GitHubError "❌ Some [$failedTests] tests failed." + Set-GitHubOutput -Name 'passed' -Value $false + $return = 1 +} elseif ($failedTests -eq 0) { + Write-GitHubNotice '✅ All tests passed.' + Set-GitHubOutput -Name 'passed' -Value $true + $return = 0 +} + +Write-Host '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━' +exit $return diff --git a/.github/actions/Test/scripts/tests/PSModule/Common.Tests.ps1 b/.github/actions/Test/scripts/tests/PSModule/Common.Tests.ps1 new file mode 100644 index 00000000..843e8b17 --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSModule/Common.Tests.ps1 @@ -0,0 +1,42 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', 'Path', + Justification = 'Path is used to specify the path to the module to test.' +)] +[CmdLetBinding()] +Param( + [Parameter(Mandatory)] + [string] $Path +) + +# These tests are for the whole module and its parts. The scope of these tests are on the src folder and the specific module folder within it. +Describe 'Script files' { + Context 'Module design tests' { + # It 'Script file should only contain one function or filter' {} + # It 'All script files have tests' {} # Look for the folder name in tests called the same as section/folder name of functions + } + + Describe 'Function/filter design' { + # It 'comment based doc block start is indented with 4 spaces' {} + # It 'comment based doc is indented with 8 spaces' {} + # It 'has synopsis for all functions' {} + # It 'has description for all functions' {} + # It 'has examples for all functions' {} + # It 'has output documentation for all functions' {} + # It 'has [CmdletBinding()] attribute' {} + # It 'boolean parameters in CmdletBinding() attribute are written without assignments' {} + # I.e. [CmdletBinding(ShouldProcess)] instead of [CmdletBinding(ShouldProcess = $true)] + # It 'has [OutputType()] attribute' {} + # It 'has verb 'New','Set','Disable','Enable' etc. and uses "ShoudProcess" in the [CmdletBinding()] attribute' {} + } + + Describe 'Parameter design' { + # It 'has parameter description for all functions' {} + # It 'has parameter validation for all functions' {} + # It 'parameters have [Parameters()] attribute' {} + # It 'boolean parameters to the [Parameter()] attribute are written without assignments' {} + # I.e. [Parameter(Mandatory)] instead of [Parameter(Mandatory = $true)] + # It 'datatype for parameters are written on the same line as the parameter name' {} + # It 'datatype for parameters and parameter name are separated by a single space' {} + # It 'parameters are separated by a blank line' {} + } +} diff --git a/.github/actions/Test/scripts/tests/PSModule/Module.Tests.ps1 b/.github/actions/Test/scripts/tests/PSModule/Module.Tests.ps1 new file mode 100644 index 00000000..772f2a5b --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSModule/Module.Tests.ps1 @@ -0,0 +1,50 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', 'Path', + Justification = 'Path is used to specify the path to the module to test.' +)] +[CmdLetBinding()] +Param( + [Parameter(Mandatory)] + [string] $Path +) + +BeforeAll { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', 'moduleName', + Justification = 'moduleName is used in the test.' + )] + $moduleName = Split-Path -Path $Path -Leaf +} + +Describe 'PSModule - Module tests' { + Context 'Module' { + It 'The module should be available' { + Get-Module -Name $moduleName -ListAvailable | Should -Not -BeNullOrEmpty + Write-Verbose (Get-Module -Name $moduleName -ListAvailable | Out-String) + } + It 'The module should be importable' { + { Import-Module -Name $moduleName -RequiredVersion 999.0.0 -Force } | Should -Not -Throw + } + } + + Context "Module Manifest" { + BeforeAll { + $moduleManifestPath = Join-Path -Path $Path -ChildPath "$moduleName.psd1" + Write-Verbose "Module Manifest Path: [$moduleManifestPath]" + } + It 'Module Manifest exists' { + $result = Test-Path -Path $moduleManifestPath + $result | Should -Be $true + Write-Verbose $result + } + It 'Module Manifest is valid' { + $result = Test-ModuleManifest -Path $moduleManifestPath + $result | Should -Not -Be $null + Write-Verbose $result + } + # It 'has a valid license URL' {} + # It 'has a valid project URL' {} + # It 'has a valid icon URL' {} + # It 'has a valid help URL' {} + } +} diff --git a/.github/actions/Test/scripts/tests/PSModule/SourceCode.Tests.ps1 b/.github/actions/Test/scripts/tests/PSModule/SourceCode.Tests.ps1 new file mode 100644 index 00000000..bbed2449 --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSModule/SourceCode.Tests.ps1 @@ -0,0 +1,385 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', '', + Justification = 'Parameters are used in the test.' +)] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', 'functionBearingPublicFiles', + Justification = 'Variables are used in the test.' +)] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', 'functionBearingFiles', + Justification = 'Variables are used in the test.' +)] +[CmdLetBinding()] +Param( + # The path to the 'src' folder of the repo. + [Parameter(Mandatory)] + [string] $Path, + + # The path to the 'tests' folder of the repo. + [Parameter(Mandatory)] + [string] $TestsPath +) + +BeforeAll { + $scriptFiles = Get-ChildItem -Path $Path -Include *.psm1, *.ps1 -Recurse -File + LogGroup "Found $($scriptFiles.Count) script files in [$Path]" { + $scriptFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $functionsPath = Join-Path -Path $Path -ChildPath 'functions' + $functionFiles = (Test-Path -Path $functionsPath) ? (Get-ChildItem -Path $functionsPath -File -Filter '*.ps1' -Recurse) : $null + + LogGroup "Found $($functionFiles.Count) function files in [$functionsPath]" { + $functionFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $privateFunctionsPath = Join-Path -Path $functionsPath -ChildPath 'private' + $privateFunctionFiles = (Test-Path -Path $privateFunctionsPath) ? + (Get-ChildItem -Path $privateFunctionsPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($privateFunctionFiles.Count) private function files in [$privateFunctionsPath]" { + $privateFunctionFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $publicFunctionsPath = Join-Path -Path $functionsPath -ChildPath 'public' + $publicFunctionFiles = (Test-Path -Path $publicFunctionsPath) ? (Get-ChildItem -Path $publicFunctionsPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($publicFunctionFiles.Count) public function files in [$publicFunctionsPath]" { + $publicFunctionFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $variablesPath = Join-Path -Path $Path -ChildPath 'variables' + $variableFiles = (Test-Path -Path $variablesPath) ? (Get-ChildItem -Path $variablesPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($variableFiles.Count) variable files in [$variablesPath]" { + $variableFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $privateVariablesPath = Join-Path -Path $variablesPath -ChildPath 'private' + $privateVariableFiles = (Test-Path -Path $privateVariablesPath) ? + (Get-ChildItem -Path $privateVariablesPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($privateVariableFiles.Count) private variable files in [$privateVariablesPath]" { + $privateVariableFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $publicVariablesPath = Join-Path -Path $variablesPath -ChildPath 'public' + $publicVariableFiles = (Test-Path -Path $publicVariablesPath) ? + (Get-ChildItem -Path $publicVariablesPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($publicVariableFiles.Count) public variable files in [$publicVariablesPath]" { + $publicVariableFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $classPath = Join-Path -Path $Path -ChildPath 'classes' + $classFiles = (Test-Path -Path $classPath) ? (Get-ChildItem -Path $classPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($classFiles.Count) class files in [$classPath]" { + $classFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $privateClassPath = Join-Path -Path $classPath -ChildPath 'private' + $privateClassFiles = (Test-Path -Path $privateClassPath) ? + (Get-ChildItem -Path $privateClassPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($privateClassFiles.Count) private class files in [$privateClassPath]" { + $privateClassFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } + $publicClassPath = Join-Path -Path $classPath -ChildPath 'public' + $publicClassFiles = (Test-Path -Path $publicClassPath) ? + (Get-ChildItem -Path $publicClassPath -File -Filter '*.ps1' -Recurse) : $null + LogGroup "Found $($publicClassFiles.Count) public class files in [$publicClassPath]" { + $publicClassFiles | ForEach-Object { + Write-Verbose " - $($_.FullName)" -Verbose + } + } +} + +Describe 'PSModule - SourceCode tests' { + Context 'General tests' { + It "Should use '[System.Environment]::ProcessorCount' instead of '`$env:NUMBER_OF_PROCESSORS' (ID: NumberOfProcessors)" { + $issues = @('') + $scriptFiles | ForEach-Object { + Select-String -Path $_.FullName -Pattern '\$env:NUMBER_OF_PROCESSORS' -AllMatches | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:NumberOfProcessors:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping NumberOfProcessors test' + } else { + $issues += " - $($_.Path):L$($_.LineNumber)" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'the script should use [System.Environment]::ProcessorCount instead of $env:NUMBER_OF_PROCESSORS' + } + It "Should not contain '-Verbose' unless it is disabled using ':`$false' qualifier after it (ID: Verbose)" { + $issues = @('') + $scriptFiles | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:Verbose:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping Verbose test' + } else { + Select-String -Path $filePath -Pattern '\s(-Verbose(?::\$true)?)\b(?!:\$false)' -AllMatches | ForEach-Object { + $issues += " - $relativePath`:L$($_.LineNumber) - $($_.Line)" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because "the script should not contain '-Verbose' unless it is disabled using ':`$false' qualifier after it." + } + It "Should use '`$null = ...' instead of '... | Out-Null' (ID: OutNull)" { + $issues = @('') + $scriptFiles | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:OutNull:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping OutNull test' + } else { + Select-String -Path $filePath -Pattern 'Out-Null' -AllMatches | ForEach-Object { + $issues += " - $relativePath`:L$($_.LineNumber) - $($_.Line)" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because "the script should use '`$null = ...' instead of '... | Out-Null'" + } + It 'Should not use ternary operations for compatability reasons (ID: NoTernary)' -Skip { + $issues = @('') + $scriptFiles | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:NoTernary:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping NoTernary test' + } else { + Select-String -Path $filePath -Pattern '(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping LowercaseKeywords test' + } else { + $errors = $null + $tokens = $null + [System.Management.Automation.Language.Parser]::ParseFile($FilePath, [ref]$tokens, [ref]$errors) + + foreach ($token in $tokens) { + $keyword = $token.Text + $lineNumber = $token.Extent.StartLineNumber + $columnNumber = $token.Extent.StartColumnNumber + if (($token.TokenFlags -match 'Keyword') -and ($keyword -cne $keyword.ToLower())) { + $issues += " - $relativePath`:L$lineNumber`:C$columnNumber - $keyword" + } + } + } + } + $issues -join [Environment]::NewLine | Should -BeNullOrEmpty -Because 'all powershell keywords should be lowercase' + } + } + + Context 'classes' { + } + + Context 'functions' { + Context 'Generic' { + BeforeAll { + $functionBearingFiles = $functionFiles | Where-Object { + $Ast = [System.Management.Automation.Language.Parser]::ParseFile($_.FullName, [ref]$null, [ref]$null) + $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) + $tokens.count -ne 0 + } + } + # It 'has synopsis for all functions' {} + # It 'has description for all functions' {} + # It 'has examples for all functions' {} + # It 'comment based doc is indented with 8 spaces' {} + # It 'boolean parameters in CmdletBinding() attribute are written without assignments' {} + # I.e. [CmdletBinding(ShouldProcess)] instead of [CmdletBinding(ShouldProcess = $true)] + # It 'has [OutputType()] attribute' {} + # Parameters + # It 'comment based doc block start is indented with 4 spaces' {} + # It 'has parameter description for all functions' {} + # It 'parameters have [Parameter()] attribute' {} + # It 'boolean parameters to the [Parameter()] attribute are written without assignments' {} + # I.e. [Parameter(Mandatory)] instead of [Parameter(Mandatory = $true)] + # It 'datatype for parameters are written on the same line as the parameter name' {} + # It 'datatype for parameters and parameter name are separated by a single space' {} + # It 'parameters are separated by a blank line' {} + It 'Should contain one function or filter (ID: FunctionCount)' { + $issues = @('') + $functionBearingFiles | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionCount:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionCount test' + } else { + $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) + $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) + if ($tokens.count -ne 1) { + $issues += " - $relativePath - $($tokens.Name)" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'the script should contain one function or filter' + } + It 'Should have matching filename and function/filter name (ID: FunctionName)' { + $issues = @('') + $functionBearingFiles | ForEach-Object { + $filePath = $_.FullName + $fileName = $_.BaseName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionName:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionName test' + } else { + $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) + $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) + if ($tokens.Name -ne $fileName) { + $issues += " - $relativePath - $($tokens.Name)" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'the script files should be called the same as the function they contain' + } + It 'Should have [CmdletBinding()] attribute (ID: CmdletBinding)' { + $issues = @('') + $functionBearingFiles | ForEach-Object { + $found = $false + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:CmdletBinding:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping CmdletBinding test' + } else { + $scriptAst = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) + $tokens = $scriptAst.FindAll({ $true }, $true) + foreach ($token in $tokens) { + if ($token.TypeName.Name -eq 'CmdletBinding') { + $found = $true + } + } + if (-not $found) { + $issues += " - $relativePath" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'the script should have [CmdletBinding()] attribute' + } + It 'Should have a param() block (ID: ParamBlock)' { + $issues = @('') + $functionBearingFiles | ForEach-Object { + $found = $false + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:ParamBlock:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping ParamBlock test' + } else { + $scriptAst = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) + $tokens = $scriptAst.FindAll({ $args[0] -is [System.Management.Automation.Language.ParamBlockAst] }, $true) + foreach ($token in $tokens) { + if ($token.count -eq 1) { + $found = $true + } + } + if (-not $found) { + $issues += " - $relativePath" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'the script should have a param() block' + } + } + Context 'public functions' { + BeforeAll { + $functionBearingPublicFiles = $publicFunctionFiles | Where-Object { + $Ast = [System.Management.Automation.Language.Parser]::ParseFile($_.FullName, [ref]$null, [ref]$null) + $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) + $tokens.count -ne 0 + } + } + It 'All public functions/filters have tests (ID: FunctionTest)' { + $issues = @('') + + # Get commands used in tests from the files in 'tests' folder. + $testFiles = Get-ChildItem -Path $TestsPath -Recurse -File -Filter '*.ps1' + $functionsInTestFiles = $testFiles | ForEach-Object { + $ast = [System.Management.Automation.Language.Parser]::ParseFile($_.FullName, [ref]$null, [ref]$null) + $ast.FindAll( + { + param($node) + $node -is [System.Management.Automation.Language.CommandAst] -and + $node.GetCommandName() -ne $null + }, + $true + ) | ForEach-Object { + $_.GetCommandName() + } | Sort-Object -Unique + } + + # Get all the functions in the public function files and check if they have a test. + $functionBearingPublicFiles | ForEach-Object { + $filePath = $_.FullName + $relativePath = $filePath.Replace($Path, '').Trim('\').Trim('/') + $skipTest = Select-String -Path $filePath -Pattern '#SkipTest:FunctionTest:(?.+)' -AllMatches + if ($skipTest.Matches.Count -gt 0) { + $skipReason = $skipTest.Matches.Groups | Where-Object { $_.Name -eq 'Reason' } | Select-Object -ExpandProperty Value + Write-GitHubWarning -Message " - $relativePath - $skipReason" -Title 'Skipping FunctionTest test' + } else { + $Ast = [System.Management.Automation.Language.Parser]::ParseFile($filePath, [ref]$null, [ref]$null) + $tokens = $Ast.FindAll( { $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] } , $true ) + $functionName = $tokens.Name + # If the file contains a function and the function name is not in the test files, add it as an issue. + if ($functionName.count -eq 1 -and $functionsInTestFiles -notcontains $functionName) { + $issues += " - $relativePath - $functionName" + } + } + } + $issues -join [Environment]::NewLine | + Should -BeNullOrEmpty -Because 'a test should exist for each of the functions in the module' + } + } + Context 'private functions' {} + } + + Context 'variables' { + } + + Context 'Module manifest' { + # It 'Module Manifest exists (maifest.psd1 or modulename.psd1)' {} + # It 'Module Manifest is valid' {} + } +} diff --git a/.github/actions/Test/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 new file mode 100644 index 00000000..2a6039b8 --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/PSScriptAnalyzer.Tests.ps1 @@ -0,0 +1,55 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', 'Path', + Justification = 'Path is being used.' +)] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSReviewUnusedParameter', 'SettingsFilePath', + Justification = 'SettingsFilePath is being used.' +)] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', 'relativeSettingsFilePath', + Justification = 'relativeSettingsFilePath is being used.' +)] +[CmdLetBinding()] +Param( + [Parameter(Mandatory)] + [string] $Path, + + [Parameter(Mandatory)] + [string] $SettingsFilePath +) + +BeforeDiscovery { + $rules = [Collections.Generic.List[System.Collections.Specialized.OrderedDictionary]]::new() + $ruleObjects = Get-ScriptAnalyzerRule -Verbose:$false | Sort-Object -Property Severity, CommonName + foreach ($ruleObject in $ruleObjects) { + $rules.Add( + [ordered]@{ + RuleName = $ruleObject.RuleName + CommonName = $ruleObject.CommonName + Severity = $ruleObject.Severity + Description = $ruleObject.Description + } + ) + } + Write-Warning "Discovered [$($rules.Count)] rules" + $relativeSettingsFilePath = $SettingsFilePath.Replace($PSScriptRoot, '').Trim('\').Trim('/') +} + +Describe "PSScriptAnalyzer tests using settings file [$relativeSettingsFilePath]" { + BeforeAll { + $testResults = Invoke-ScriptAnalyzer -Path $Path -Settings $SettingsFilePath -Recurse -Verbose:$false + Write-Warning "Found [$($testResults.Count)] issues" + } + + Context 'Severity: <_>' -ForEach 'Error', 'Warning', 'Information' { + It ' ()' -ForEach ($rules | Where-Object -Property Severity -EQ $_) { + $issues = [Collections.Generic.List[string]]::new() + $testResults | Where-Object -Property RuleName -EQ $RuleName | ForEach-Object { + $relativePath = $_.ScriptPath.Replace($Path, '').Trim('\').Trim('/') + $issues.Add(([Environment]::NewLine + " - $relativePath`:L$($_.Line):C$($_.Column)")) + } + $issues -join '' | Should -BeNullOrEmpty -Because $Description + } + } +} diff --git a/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 new file mode 100644 index 00000000..7c3a739c --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.Module.psd1 @@ -0,0 +1,47 @@ +@{ + Rules = @{ + PSAlignAssignmentStatement = @{ + Enable = $true + CheckHashtable = $true + } + PSAvoidLongLines = @{ + Enable = $true + MaximumLineLength = 150 + } + PSAvoidSemicolonsAsLineTerminators = @{ + Enable = $true + } + PSPlaceCloseBrace = @{ + Enable = $true + NewLineAfter = $false + IgnoreOneLineBlock = $true + NoEmptyLineBefore = $false + } + PSPlaceOpenBrace = @{ + Enable = $true + OnSameLine = $true + NewLineAfter = $true + IgnoreOneLineBlock = $true + } + PSProvideCommentHelp = @{ + Enable = $true + ExportedOnly = $false + BlockComment = $true + VSCodeSnippetCorrection = $false + Placement = 'begin' + } + PSUseConsistentIndentation = @{ + Enable = $true + IndentationSize = 4 + PipelineIndentation = 'IncreaseIndentationForFirstPipeline' + Kind = 'space' + } + PSUseConsistentWhitespace = @{ + Enable = $false + } + } + ExcludeRules = @( + 'PSAvoidUsingCmdletAliases', + 'PSUseToExportFieldsInManifest' + ) +} diff --git a/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 new file mode 100644 index 00000000..e9081f9a --- /dev/null +++ b/.github/actions/Test/scripts/tests/PSScriptAnalyzer/Settings.SourceCode.psd1 @@ -0,0 +1,57 @@ +@{ + Rules = @{ + PSAlignAssignmentStatement = @{ + Enable = $true + CheckHashtable = $true + } + PSAvoidLongLines = @{ + Enable = $true + MaximumLineLength = 150 + } + PSAvoidSemicolonsAsLineTerminators = @{ + Enable = $true + } + PSPlaceCloseBrace = @{ + Enable = $true + NewLineAfter = $false + IgnoreOneLineBlock = $true + NoEmptyLineBefore = $false + } + PSPlaceOpenBrace = @{ + Enable = $true + OnSameLine = $true + NewLineAfter = $true + IgnoreOneLineBlock = $true + } + PSProvideCommentHelp = @{ + Enable = $true + ExportedOnly = $false + BlockComment = $true + VSCodeSnippetCorrection = $false + Placement = 'begin' + } + PSUseConsistentIndentation = @{ + Enable = $true + IndentationSize = 4 + PipelineIndentation = 'IncreaseIndentationForFirstPipeline' + Kind = 'space' + } + PSUseConsistentWhitespace = @{ + Enable = $true + CheckInnerBrace = $true + CheckOpenBrace = $true + CheckOpenParen = $true + CheckOperator = $true + CheckPipe = $true + CheckPipeForRedundantWhitespace = $true + CheckSeparator = $true + CheckParameter = $true + IgnoreAssignmentOperatorInsideHashTable = $true + } + } + ExcludeRules = @( + 'PSMissingModuleManifestField', # This rule is not applicable until the module is built. + 'PSAvoidUsingCmdletAliases', + 'PSUseToExportFieldsInManifest' + ) +} diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md new file mode 100644 index 00000000..346f9b93 --- /dev/null +++ b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md @@ -0,0 +1,72 @@ +--- +external help file: PSModuleTest-help.xml +Module Name: PSModuleTest +online version: +schema: 2.0.0 +--- + +# Get-PSModuleTest + +## SYNOPSIS +Performs tests on a module. + +## SYNTAX + +```powershell +Get-PSModuleTest [-Name] [-ProgressAction ] [] +``` + +## DESCRIPTION +{{ Fill in the Description }} + +## EXAMPLES + +### EXAMPLE 1 +```powershell +Test-PSModule -Name 'World' +``` + +"Hello, World!" + +## PARAMETERS + +### -Name +Name of the person to greet. + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md b/.github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md new file mode 100644 index 00000000..e3ce5e7e --- /dev/null +++ b/.github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md @@ -0,0 +1,72 @@ +--- +external help file: PSModuleTest-help.xml +Module Name: PSModuleTest +online version: +schema: 2.0.0 +--- + +# New-PSModuleTest + +## SYNOPSIS +Performs tests on a module. + +## SYNTAX + +```powershell +New-PSModuleTest [-Name] [-ProgressAction ] [] +``` + +## DESCRIPTION +{{ Fill in the Description }} + +## EXAMPLES + +### EXAMPLE 1 +```powershell +Test-PSModule -Name 'World' +``` + +"Hello, World!" + +## PARAMETERS + +### -Name +Name of the person to greet. + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md new file mode 100644 index 00000000..6504d6f4 --- /dev/null +++ b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md @@ -0,0 +1,72 @@ +--- +external help file: PSModuleTest-help.xml +Module Name: PSModuleTest +online version: +schema: 2.0.0 +--- + +# Set-PSModuleTest + +## SYNOPSIS +Performs tests on a module. + +## SYNTAX + +```powershell +Set-PSModuleTest [-Name] [-ProgressAction ] [] +``` + +## DESCRIPTION +{{ Fill in the Description }} + +## EXAMPLES + +### EXAMPLE 1 +```powershell +Test-PSModule -Name 'World' +``` + +"Hello, World!" + +## PARAMETERS + +### -Name +Name of the person to greet. + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md new file mode 100644 index 00000000..59fc9f86 --- /dev/null +++ b/.github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md @@ -0,0 +1,72 @@ +--- +external help file: PSModuleTest-help.xml +Module Name: PSModuleTest +online version: +schema: 2.0.0 +--- + +# Test-PSModuleTest + +## SYNOPSIS +Performs tests on a module. + +## SYNTAX + +```powershell +Test-PSModuleTest [-Name] [-ProgressAction ] [] +``` + +## DESCRIPTION +{{ Fill in the Description }} + +## EXAMPLES + +### EXAMPLE 1 +```powershell +Test-PSModule -Name 'World' +``` + +"Hello, World!" + +## PARAMETERS + +### -Name +Name of the person to greet. + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 new file mode 100644 index 00000000..ebe988d3 --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 @@ -0,0 +1,75 @@ +@{ + RootModule = 'PSModuleTest.psm1' + ModuleVersion = '999.0.0' + CompatiblePSEditions = @( + 'Core' + 'Desktop' + ) + GUID = '20b37221-db1c-43db-9cca-f22b33123548' + Author = 'PSModule' + CompanyName = 'PSModule' + Copyright = '(c) 2024 PSModule. All rights reserved.' + Description = 'Process a module from source code to published module.' + PowerShellVersion = '5.1' + ProcessorArchitecture = 'None' + RequiredModules = @( + @{ + ModuleVersion = '1.0' + ModuleName = 'PSSemVer' + } + 'Utilities' + ) + RequiredAssemblies = 'assemblies/LsonLib.dll' + ScriptsToProcess = 'scripts/loader.ps1' + TypesToProcess = @( + 'types/DirectoryInfo.Types.ps1xml' + 'types/FileInfo.Types.ps1xml' + ) + FormatsToProcess = @( + 'formats/CultureInfo.Format.ps1xml' + 'formats/Mygciview.Format.ps1xml' + ) + NestedModules = @( + 'modules/OtherPSModule.psm1' + ) + FunctionsToExport = @( + 'Get-PSModuleTest' + 'New-PSModuleTest' + 'Set-PSModuleTest' + 'Test-PSModuleTest' + ) + CmdletsToExport = @() + VariablesToExport = @() + AliasesToExport = '*' + ModuleList = @( + 'modules/OtherPSModule.psm1' + ) + FileList = @( + 'PSModuleTest.psd1' + 'PSModuleTest.psm1' + 'assemblies/LsonLib.dll' + 'data/Config.psd1' + 'data/Settings.psd1' + 'formats/CultureInfo.Format.ps1xml' + 'formats/Mygciview.Format.ps1xml' + 'modules/OtherPSModule.psm1' + 'scripts/loader.ps1' + 'types/DirectoryInfo.Types.ps1xml' + 'types/FileInfo.Types.ps1xml' + ) + PrivateData = @{ + PSData = @{ + Tags = @( + 'workflow' + 'powershell' + 'powershell-module' + 'PSEdition_Desktop' + 'PSEdition_Core' + ) + LicenseUri = 'https://github.com/PSModule/Process-PSModule/blob/main/LICENSE' + ProjectUri = 'https://github.com/PSModule/Process-PSModule' + IconUri = 'https://raw.githubusercontent.com/PSModule/Process-PSModule/main/icon/icon.png' + } + } +} + diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 new file mode 100644 index 00000000..3553dd95 --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 @@ -0,0 +1,392 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() + +$scriptName = $MyInvocation.MyCommand.Name +Write-Verbose "[$scriptName] Importing module" + +#region - Data import +Write-Verbose "[$scriptName] - [data] - Processing folder" +$dataFolder = (Join-Path $PSScriptRoot 'data') +Write-Verbose "[$scriptName] - [data] - [$dataFolder]" +Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { + Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing" + New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force + Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done" +} + +Write-Verbose "[$scriptName] - [data] - Done" +#endregion - Data import + +#region - From /init +Write-Verbose "[$scriptName] - [/init] - Processing folder" + +#region - From /init/initializer.ps1 +Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Importing" + +Write-Verbose '-------------------------------' +Write-Verbose '--- THIS IS AN INITIALIZER ---' +Write-Verbose '-------------------------------' + +Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Done" +#endregion - From /init/initializer.ps1 + +Write-Verbose "[$scriptName] - [/init] - Done" +#endregion - From /init + +#region - From /classes +Write-Verbose "[$scriptName] - [/classes] - Processing folder" + +#region - From /classes/Book.ps1 +Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Importing" + +class Book { + # Class properties + [string] $Title + [string] $Author + [string] $Synopsis + [string] $Publisher + [datetime] $PublishDate + [int] $PageCount + [string[]] $Tags + # Default constructor + Book() { $this.Init(@{}) } + # Convenience constructor from hashtable + Book([hashtable]$Properties) { $this.Init($Properties) } + # Common constructor for title and author + Book([string]$Title, [string]$Author) { + $this.Init(@{Title = $Title; Author = $Author }) + } + # Shared initializer method + [void] Init([hashtable]$Properties) { + foreach ($Property in $Properties.Keys) { + $this.$Property = $Properties.$Property + } + } + # Method to calculate reading time as 2 minutes per page + [timespan] GetReadingTime() { + if ($this.PageCount -le 0) { + throw 'Unable to determine reading time from page count.' + } + $Minutes = $this.PageCount * 2 + return [timespan]::new(0, $Minutes, 0) + } + # Method to calculate how long ago a book was published + [timespan] GetPublishedAge() { + if ( + $null -eq $this.PublishDate -or + $this.PublishDate -eq [datetime]::MinValue + ) { throw 'PublishDate not defined' } + + return (Get-Date) - $this.PublishDate + } + # Method to return a string representation of the book + [string] ToString() { + return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))" + } +} + +Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Done" +#endregion - From /classes/Book.ps1 +#region - From /classes/BookList.ps1 +Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Importing" + +class BookList { + # Static property to hold the list of books + static [System.Collections.Generic.List[Book]] $Books + # Static method to initialize the list of books. Called in the other + # static methods to avoid needing to explicit initialize the value. + static [void] Initialize() { [BookList]::Initialize($false) } + static [bool] Initialize([bool]$force) { + if ([BookList]::Books.Count -gt 0 -and -not $force) { + return $false + } + + [BookList]::Books = [System.Collections.Generic.List[Book]]::new() + + return $true + } + # Ensure a book is valid for the list. + static [void] Validate([book]$Book) { + $Prefix = @( + 'Book validation failed: Book must be defined with the Title,' + 'Author, and PublishDate properties, but' + ) -join ' ' + if ($null -eq $Book) { throw "$Prefix was null" } + if ([string]::IsNullOrEmpty($Book.Title)) { + throw "$Prefix Title wasn't defined" + } + if ([string]::IsNullOrEmpty($Book.Author)) { + throw "$Prefix Author wasn't defined" + } + if ([datetime]::MinValue -eq $Book.PublishDate) { + throw "$Prefix PublishDate wasn't defined" + } + } + # Static methods to manage the list of books. + # Add a book if it's not already in the list. + static [void] Add([Book]$Book) { + [BookList]::Initialize() + [BookList]::Validate($Book) + if ([BookList]::Books.Contains($Book)) { + throw "Book '$Book' already in list" + } + + $FindPredicate = { + param([Book]$b) + + $b.Title -eq $Book.Title -and + $b.Author -eq $Book.Author -and + $b.PublishDate -eq $Book.PublishDate + }.GetNewClosure() + if ([BookList]::Books.Find($FindPredicate)) { + throw "Book '$Book' already in list" + } + + [BookList]::Books.Add($Book) + } + # Clear the list of books. + static [void] Clear() { + [BookList]::Initialize() + [BookList]::Books.Clear() + } + # Find a specific book using a filtering scriptblock. + static [Book] Find([scriptblock]$Predicate) { + [BookList]::Initialize() + return [BookList]::Books.Find($Predicate) + } + # Find every book matching the filtering scriptblock. + static [Book[]] FindAll([scriptblock]$Predicate) { + [BookList]::Initialize() + return [BookList]::Books.FindAll($Predicate) + } + # Remove a specific book. + static [void] Remove([Book]$Book) { + [BookList]::Initialize() + [BookList]::Books.Remove($Book) + } + # Remove a book by property value. + static [void] RemoveBy([string]$Property, [string]$Value) { + [BookList]::Initialize() + $Index = [BookList]::Books.FindIndex({ + param($b) + $b.$Property -eq $Value + }.GetNewClosure()) + if ($Index -ge 0) { + [BookList]::Books.RemoveAt($Index) + } + } +} + +Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Done" +#endregion - From /classes/BookList.ps1 + +Write-Verbose "[$scriptName] - [/classes] - Done" +#endregion - From /classes + +#region - From /private +Write-Verbose "[$scriptName] - [/private] - Processing folder" + +#region - From /private/Get-InternalPSModule.ps1 +Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" + +Function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" +#endregion - From /private/Get-InternalPSModule.ps1 +#region - From /private/Set-InternalPSModule.ps1 +Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" + +Function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" +#endregion - From /private/Set-InternalPSModule.ps1 + +Write-Verbose "[$scriptName] - [/private] - Done" +#endregion - From /private + +#region - From /public +Write-Verbose "[$scriptName] - [/public] - Processing folder" + +#region - From /public/Get-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" + +#Requires -Modules Utilities + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug 'Debug message' + Write-Verbose 'Verbose message' + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" +#endregion - From /public/Get-PSModuleTest.ps1 +#region - From /public/New-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" + +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} + +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug 'Debug message' + Write-Verbose 'Verbose message' + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" +#endregion - From /public/New-PSModuleTest.ps1 +#region - From /public/Set-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" + +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding(SupportsShouldProcess)] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug 'Debug message' + Write-Verbose 'Verbose message' + if ($PSCmdlet.ShouldProcess($Name, 'Set-PSModuleTest')) { + Write-Output "Hello, $Name!" + } +} + +Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" +#endregion - From /public/Set-PSModuleTest.ps1 +#region - From /public/Test-PSModuleTest.ps1 +Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" + +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug 'Debug message' + Write-Verbose 'Verbose message' + Write-Output "Hello, $Name!" +} + +Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" +#endregion - From /public/Test-PSModuleTest.ps1 + +Write-Verbose "[$scriptName] - [/public] - Done" +#endregion - From /public + +#region - From /finally.ps1 +Write-Verbose "[$scriptName] - [/finally.ps1] - Importing" + +Write-Verbose '------------------------------' +Write-Verbose '--- THIS IS A LAST LOADER ---' +Write-Verbose '------------------------------' +Write-Verbose "[$scriptName] - [/finally.ps1] - Done" +#endregion - From /finally.ps1 + +$exports = @{ + Cmdlet = '' + Alias = '*' + Variable = '' + Function = @( + 'Get-PSModuleTest' + 'New-PSModuleTest' + 'Set-PSModuleTest' + 'Test-PSModuleTest' + ) +} +Export-ModuleMember @exports + diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/.github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..9e4353ba --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +Function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 new file mode 100644 index 00000000..973735ad --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' +Write-Verbose '--- THIS IS A LOADER ---' +Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Test/tests/src/assemblies/LsonLib.dll b/.github/actions/Test/tests/src/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 new file mode 100644 index 00000000..89f053cb --- /dev/null +++ b/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 @@ -0,0 +1,18 @@ +function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 new file mode 100644 index 00000000..cf870ba6 --- /dev/null +++ b/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 @@ -0,0 +1,22 @@ +function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 new file mode 100644 index 00000000..0e9aacfe --- /dev/null +++ b/.github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 @@ -0,0 +1,20 @@ +#Requires -Modules Utilities + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 new file mode 100644 index 00000000..8fc0641f --- /dev/null +++ b/.github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 @@ -0,0 +1,38 @@ +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} +#SkipTest:FunctionTest:Difficult to test due to the nature of the function. +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + + .NOTES + Testing if a module can have a [Markdown based link](https://example.com). + !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," + \[This is a test\] + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [Alias('New-PSModuleTestAlias1')] + [Alias('New-PSModuleTestAlias2')] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug "Debug message" + Write-Verbose "Verbose message" -Verbose + Write-Output "Hello, $Name!" +} + +New-Alias New-PSModuleTestAlias3 New-PSModuleTest +New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest +Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 new file mode 100644 index 00000000..a87ac117 --- /dev/null +++ b/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 new file mode 100644 index 00000000..4056e2f6 --- /dev/null +++ b/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 @@ -0,0 +1,20 @@ +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" + Write-Verbose 'Verbose message' -Verbose +} diff --git a/.github/actions/Test/tests/src/functions/public/completers.ps1 b/.github/actions/Test/tests/src/functions/public/completers.ps1 new file mode 100644 index 00000000..6b1adbb7 --- /dev/null +++ b/.github/actions/Test/tests/src/functions/public/completers.ps1 @@ -0,0 +1,8 @@ +Register-ArgumentCompleter -CommandName New-PSModuleTest -ParameterName Name -ScriptBlock { + param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) + $null = $commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters + + 'Alice', 'Bob', 'Charlie' | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { + [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) + } +} diff --git a/.github/actions/Test/tests/src/header.ps1 b/.github/actions/Test/tests/src/header.ps1 new file mode 100644 index 00000000..cc1fde9a --- /dev/null +++ b/.github/actions/Test/tests/src/header.ps1 @@ -0,0 +1,3 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() diff --git a/.github/actions/Test/tests/src/init/initializer.ps1 b/.github/actions/Test/tests/src/init/initializer.ps1 new file mode 100644 index 00000000..28396fb0 --- /dev/null +++ b/.github/actions/Test/tests/src/init/initializer.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------------' +Write-Verbose '--- THIS IS AN INITIALIZER ---' +Write-Verbose '-------------------------------' diff --git a/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..5d6af8ea --- /dev/null +++ b/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/src/scripts/loader.ps1 b/.github/actions/Test/tests/src/scripts/loader.ps1 new file mode 100644 index 00000000..973735ad --- /dev/null +++ b/.github/actions/Test/tests/src/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' +Write-Verbose '--- THIS IS A LOADER ---' +Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 b/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 new file mode 100644 index 00000000..f1fc2c3b --- /dev/null +++ b/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 @@ -0,0 +1,47 @@ +$script:HabitablePlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + }, + @{ + Name = 'Proxima Centauri b' + Mass = 1.17 + Diameter = 11449 + DayLength = 5.15 + }, + @{ + Name = 'Kepler-442b' + Mass = 2.34 + Diameter = 11349 + DayLength = 5.7 + }, + @{ + Name = 'Kepler-452b' + Mass = 5.0 + Diameter = 17340 + DayLength = 20.0 + } +) + +$script:InhabitedPlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + } +) diff --git a/.github/actions/Test/tests/src/variables/public/Moons.ps1 b/.github/actions/Test/tests/src/variables/public/Moons.ps1 new file mode 100644 index 00000000..dd0f33ca --- /dev/null +++ b/.github/actions/Test/tests/src/variables/public/Moons.ps1 @@ -0,0 +1,6 @@ +$script:Moons = @( + @{ + Planet = 'Earth' + Name = 'Moon' + } +) diff --git a/.github/actions/Test/tests/src/variables/public/Planets.ps1 b/.github/actions/Test/tests/src/variables/public/Planets.ps1 new file mode 100644 index 00000000..736584b9 --- /dev/null +++ b/.github/actions/Test/tests/src/variables/public/Planets.ps1 @@ -0,0 +1,20 @@ +$script:Planets = @( + @{ + Name = 'Mercury' + Mass = 0.330 + Diameter = 4879 + DayLength = 4222.6 + }, + @{ + Name = 'Venus' + Mass = 4.87 + Diameter = 12104 + DayLength = 2802.0 + }, + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + } +) diff --git a/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 b/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 new file mode 100644 index 00000000..acbcedfd --- /dev/null +++ b/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 @@ -0,0 +1,17 @@ +$script:SolarSystems = @( + @{ + Name = 'Solar System' + Planets = $script:Planets + Moons = $script:Moons + }, + @{ + Name = 'Alpha Centauri' + Planets = @() + Moons = @() + }, + @{ + Name = 'Sirius' + Planets = @() + Moons = @() + } +) diff --git a/.github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll b/.github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..36618070d5c9f5131ec66720aa0565c13e86d23f GIT binary patch literal 43520 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 + + + + System.Globalization.CultureInfo + + System.Globalization.CultureInfo + + + + + 16 + + + 16 + + + + + + + + LCID + + + Name + + + DisplayName + + + + + + + + diff --git a/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml new file mode 100644 index 00000000..4c972c2c --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml @@ -0,0 +1,65 @@ + + + + + mygciview + + System.IO.DirectoryInfo + System.IO.FileInfo + + + PSParentPath + + + + + + 7 + Left + + + + 26 + Right + + + + 26 + Right + + + + 14 + Right + + + + Left + + + + + + + + ModeWithoutHardLink + + + LastWriteTime + + + CreationTime + + + Length + + + Name + + + + + + + + diff --git a/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 new file mode 100644 index 00000000..89f053cb --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 @@ -0,0 +1,18 @@ +function Get-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 new file mode 100644 index 00000000..cf870ba6 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 @@ -0,0 +1,22 @@ +function Set-InternalPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 new file mode 100644 index 00000000..0e9aacfe --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 @@ -0,0 +1,20 @@ +#Requires -Modules Utilities + +function Get-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 new file mode 100644 index 00000000..8fc0641f --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 @@ -0,0 +1,38 @@ +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} +#SkipTest:FunctionTest:Difficult to test due to the nature of the function. +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function New-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + + .NOTES + Testing if a module can have a [Markdown based link](https://example.com). + !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," + \[This is a test\] + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [Alias('New-PSModuleTestAlias1')] + [Alias('New-PSModuleTestAlias2')] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Debug "Debug message" + Write-Verbose "Verbose message" -Verbose + Write-Output "Hello, $Name!" +} + +New-Alias New-PSModuleTestAlias3 New-PSModuleTest +New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest +Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 new file mode 100644 index 00000000..a87ac117 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 @@ -0,0 +1,22 @@ +function Set-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 new file mode 100644 index 00000000..4056e2f6 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 @@ -0,0 +1,20 @@ +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function Test-PSModuleTest { + <# + .SYNOPSIS + Performs tests on a module. + + .EXAMPLE + Test-PSModule -Name 'World' + + "Hello, World!" + #> + [CmdletBinding()] + param ( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" + Write-Verbose 'Verbose message' -Verbose +} diff --git a/.github/actions/Test/tests/srcWithManifest/header.ps1 b/.github/actions/Test/tests/srcWithManifest/header.ps1 new file mode 100644 index 00000000..cc1fde9a --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/header.ps1 @@ -0,0 +1,3 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] +[CmdletBinding()] +param() diff --git a/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 b/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 new file mode 100644 index 00000000..28396fb0 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------------' +Write-Verbose '--- THIS IS AN INITIALIZER ---' +Write-Verbose '-------------------------------' diff --git a/.github/actions/Test/tests/srcWithManifest/manifest.psd1 b/.github/actions/Test/tests/srcWithManifest/manifest.psd1 new file mode 100644 index 00000000..77348f13 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/manifest.psd1 @@ -0,0 +1,3 @@ +@{ + Author = 'Author' +} diff --git a/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 new file mode 100644 index 00000000..5d6af8ea --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 @@ -0,0 +1,19 @@ +function Get-OtherPSModule { + <# + .SYNOPSIS + Performs tests on a module. + + .DESCRIPTION + A longer description of the function. + + .EXAMPLE + Get-OtherPSModule -Name 'World' + #> + [CmdletBinding()] + param( + # Name of the person to greet. + [Parameter(Mandatory)] + [string] $Name + ) + Write-Output "Hello, $Name!" +} diff --git a/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 b/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 new file mode 100644 index 00000000..973735ad --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 @@ -0,0 +1,3 @@ +Write-Verbose '-------------------------' +Write-Verbose '--- THIS IS A LOADER ---' +Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml new file mode 100644 index 00000000..aef538b2 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml @@ -0,0 +1,21 @@ + + + + System.IO.FileInfo + + + Status + Success + + + + + System.IO.DirectoryInfo + + + Status + Success + + + + diff --git a/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml new file mode 100644 index 00000000..4cfaf6b8 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml @@ -0,0 +1,14 @@ + + + + System.IO.FileInfo + + + Age + + ((Get-Date) - ($this.CreationTime)).Days + + + + + diff --git a/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 new file mode 100644 index 00000000..f1fc2c3b --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 @@ -0,0 +1,47 @@ +$script:HabitablePlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + }, + @{ + Name = 'Proxima Centauri b' + Mass = 1.17 + Diameter = 11449 + DayLength = 5.15 + }, + @{ + Name = 'Kepler-442b' + Mass = 2.34 + Diameter = 11349 + DayLength = 5.7 + }, + @{ + Name = 'Kepler-452b' + Mass = 5.0 + Diameter = 17340 + DayLength = 20.0 + } +) + +$script:InhabitedPlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + } +) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 new file mode 100644 index 00000000..dd0f33ca --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 @@ -0,0 +1,6 @@ +$script:Moons = @( + @{ + Planet = 'Earth' + Name = 'Moon' + } +) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 new file mode 100644 index 00000000..736584b9 --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 @@ -0,0 +1,20 @@ +$script:Planets = @( + @{ + Name = 'Mercury' + Mass = 0.330 + Diameter = 4879 + DayLength = 4222.6 + }, + @{ + Name = 'Venus' + Mass = 4.87 + Diameter = 12104 + DayLength = 2802.0 + }, + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + } +) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 new file mode 100644 index 00000000..acbcedfd --- /dev/null +++ b/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 @@ -0,0 +1,17 @@ +$script:SolarSystems = @( + @{ + Name = 'Solar System' + Planets = $script:Planets + Moons = $script:Moons + }, + @{ + Name = 'Alpha Centauri' + Planets = @() + Moons = @() + }, + @{ + Name = 'Sirius' + Planets = @() + Moons = @() + } +) diff --git a/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 b/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..00b3cde7 --- /dev/null +++ b/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 @@ -0,0 +1,11 @@ +Describe 'Module' { + It 'Function: Get-PSModuleTest' { + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + It 'Function: Set-PSModuleTest' { + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + It 'Function: Test-PSModuleTest' { + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } +} diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 4822691c..04d2fbb0 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -111,7 +111,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -120,7 +120,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -143,7 +143,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -152,7 +152,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -175,7 +175,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -184,7 +184,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -211,7 +211,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -219,7 +219,7 @@ jobs: Version: ${{ inputs.Version }} - name: Build module - uses: PSModule/Build-PSModule@v2 + uses: ./.github/actions/Build with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -247,7 +247,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -262,7 +262,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -299,7 +299,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -314,7 +314,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -351,7 +351,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -366,7 +366,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -404,7 +404,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -572,7 +572,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 9f2c7cba..b2d72b50 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -118,7 +118,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -127,7 +127,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -150,7 +150,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -159,7 +159,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -182,7 +182,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -191,7 +191,7 @@ jobs: - name: Test source code id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -218,7 +218,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -226,7 +226,7 @@ jobs: Version: ${{ inputs.Version }} - name: Build module - uses: PSModule/Build-PSModule@v2 + uses: ./.github/actions/Build with: Name: ${{ inputs.Name }} Path: ${{ inputs.Path }} @@ -254,7 +254,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -269,7 +269,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -306,7 +306,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -321,7 +321,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -358,7 +358,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -373,7 +373,7 @@ jobs: - name: Test built module id: test - uses: PSModule/Test-PSModule@v2 + uses: ./.github/actions/Test continue-on-error: true with: Name: ${{ inputs.Name }} @@ -411,7 +411,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -548,7 +548,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -601,7 +601,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -714,7 +714,7 @@ jobs: uses: PSModule/Debug@v0 - name: Initialize environment - uses: PSModule/Initialize-PSModule@v1 + uses: ./.github/actions/Initialize with: Debug: ${{ inputs.Debug }} Prerelease: ${{ inputs.Prerelease }} @@ -728,7 +728,7 @@ jobs: path: ${{ inputs.ModulesOutputPath }} - name: Publish module - uses: PSModule/Publish-PSModule@v1 + uses: ./.github/actions/Publish with: Name: ${{ inputs.Name }} ModulePath: ${{ inputs.ModulesOutputPath }} From e328d85d28e3ba180c7a6d49c4510c70215430aa Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 10 Feb 2025 23:17:43 +0100 Subject: [PATCH 02/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Add=20build=20s?= =?UTF-8?q?cripts=20and=20restore=20configuration=20files=20for=20PSModule?= =?UTF-8?q?Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/Build/.github/CODEOWNERS | 50 --- .github/actions/Build/.github/dependabot.yml | 11 - .../Build/.github/linters/.markdown-lint.yml | 25 -- .../linters/.powershell-psscriptanalyzer.psd1 | 18 - .github/actions/Build/.github/release.yml | 18 - .../Build/.github/workflows/Auto-Release.yml | 36 -- .../Build/.github/workflows/Linter.yml | 32 -- .../src/classes/private/SecretWriter.ps1 | 15 - .../Build/tests/src/classes/public/Book.ps1 | 147 ------- .github/actions/Build/tests/src/finally.ps1 | 3 - .../private/Get-InternalPSModule.ps1 | 18 - .../private/Set-InternalPSModule.ps1 | 22 - .../public/PSModule/Get-PSModuleTest.ps1 | 22 - .../public/PSModule/New-PSModuleTest.ps1 | 37 -- .../src/functions/public/PSModule/PSModule.md | 1 - .../public/SomethingElse/SomethingElse.md | 1 - .../functions/public/Test-PSModuleTest.ps1 | 18 - .github/actions/Build/tests/src/header.ps1 | 3 - .../Build/tests/src/init/initializer.ps1 | 3 - .../tests/src/modules/OtherPSModule.psm1 | 19 - .../variables/private/PrivateVariables.ps1 | 47 --- .../tests/src/variables/public/Moons.ps1 | 6 - .../tests/src/variables/public/Planets.ps1 | 20 - .../src/variables/public/SolarSystems.ps1 | 17 - .../srcWithManifest/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes .../tests/srcWithManifest/data/Config.psd1 | 3 - .../tests/srcWithManifest/data/Settings.psd1 | 3 - .../Build/tests/srcWithManifest/finally.ps1 | 3 - .../formats/CultureInfo.Format.ps1xml | 37 -- .../formats/Mygciview.Format.ps1xml | 65 --- .../private/Get-InternalPSModule.ps1 | 18 - .../private/Set-InternalPSModule.ps1 | 22 - .../public/PSModule/Get-PSModuleTest.ps1 | 22 - .../public/PSModule/New-PSModuleTest.ps1 | 37 -- .../functions/public/PSModule/PSModule.md | 1 - .../public/SomethingElse/SomethingElse.md | 1 - .../functions/public/Test-PSModuleTest.ps1 | 18 - .../Build/tests/srcWithManifest/header.ps1 | 3 - .../srcWithManifest/init/initializer.ps1 | 3 - .../Build/tests/srcWithManifest/manifest.psd1 | 6 - .../tests/srcWithManifest/scripts/loader.ps1 | 3 - .../types/DirectoryInfo.Types.ps1xml | 21 - .../types/FileInfo.Types.ps1xml | 14 - .../variables/private/PrivateVariables.ps1 | 47 --- .../variables/public/Moons.ps1 | 6 - .../variables/public/Planets.ps1 | 20 - .../variables/public/SolarSystems.ps1 | 17 - .github/actions/Document/tests/README.md | 3 - .../.github/linters/.markdown-lint.yml | 25 -- .../linters/.powershell-psscriptanalyzer.psd1 | 17 - .../.github/workflows/Auto-Release.yml | 36 -- .../Initialize/.github/workflows/Linter.yml | 32 -- .../.github/linters/.markdown-lint.yml | 25 -- .../linters/.powershell-psscriptanalyzer.psd1 | 17 - .../.github/workflows/Auto-Release.yml | 36 -- .../Publish/.github/workflows/Linter.yml | 31 -- .../modules/PSModuleTest/PSModuleTest.psm1 | 382 ------------------ .../PSModuleTest/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes .../modules/PSModuleTest/data/Config.psd1 | 3 - .../modules/PSModuleTest/data/Settings.psd1 | 3 - .../formats/CultureInfo.Format.ps1xml | 37 -- .../formats/Mygciview.Format.ps1xml | 65 --- .../PSModuleTest/modules/OtherPSModule.psm1 | 19 - .../modules/PSModuleTest/scripts/loader.ps1 | 3 - .../types/DirectoryInfo.Types.ps1xml | 21 - .../PSModuleTest/types/FileInfo.Types.ps1xml | 14 - .../Test/.github/linters/.markdown-lint.yml | 25 -- .../linters/.powershell-psscriptanalyzer.psd1 | 18 - .../Test/.github/workflows/Auto-Release.yml | 36 -- .../actions/Test/.github/workflows/Linter.yml | 32 -- .../modules/PSModuleTest/PSModuleTest.psd1 | 75 ---- .../PSModuleTest/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes .../modules/PSModuleTest/data/Config.psd1 | 3 - .../modules/PSModuleTest/data/Settings.psd1 | 3 - .../formats/CultureInfo.Format.ps1xml | 37 -- .../formats/Mygciview.Format.ps1xml | 65 --- .../PSModuleTest/modules/OtherPSModule.psm1 | 19 - .../modules/PSModuleTest/scripts/loader.ps1 | 3 - .../types/DirectoryInfo.Types.ps1xml | 21 - .../PSModuleTest/types/FileInfo.Types.ps1xml | 14 - .../Test/tests/src/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes .../src/classes/private/SecretWriter.ps1 | 15 - .../Test/tests/src/classes/public/Book.ps1 | 147 ------- .../actions/Test/tests/src/data/Config.psd1 | 3 - .../actions/Test/tests/src/data/Settings.psd1 | 3 - .github/actions/Test/tests/src/finally.ps1 | 3 - .../src/formats/CultureInfo.Format.ps1xml | 37 -- .../tests/src/formats/Mygciview.Format.ps1xml | 65 --- .../private/Get-InternalPSModule.ps1 | 18 - .../private/Set-InternalPSModule.ps1 | 22 - .../src/functions/public/Set-PSModuleTest.ps1 | 22 - .../functions/public/Test-PSModuleTest.ps1 | 20 - .github/actions/Test/tests/src/header.ps1 | 3 - .../Test/tests/src/init/initializer.ps1 | 3 - .../Test/tests/src/modules/OtherPSModule.psm1 | 19 - .../actions/Test/tests/src/scripts/loader.ps1 | 3 - .../src/types/DirectoryInfo.Types.ps1xml | 21 - .../tests/src/types/FileInfo.Types.ps1xml | 14 - .../variables/private/PrivateVariables.ps1 | 47 --- .../Test/tests/src/variables/public/Moons.ps1 | 6 - .../tests/src/variables/public/Planets.ps1 | 20 - .../src/variables/public/SolarSystems.ps1 | 17 - .../srcWithManifest/assemblies/LsonLib.dll | Bin 43520 -> 0 bytes .../classes/private/SecretWriter.ps1 | 15 - .../srcWithManifest/classes/public/Book.ps1 | 147 ------- .../tests/srcWithManifest/data/Config.psd1 | 3 - .../tests/srcWithManifest/data/Settings.psd1 | 3 - .../Test/tests/srcWithManifest/finally.ps1 | 3 - .../formats/CultureInfo.Format.ps1xml | 37 -- .../formats/Mygciview.Format.ps1xml | 65 --- .../private/Get-InternalPSModule.ps1 | 18 - .../private/Set-InternalPSModule.ps1 | 22 - .../functions/public/Set-PSModuleTest.ps1 | 22 - .../functions/public/Test-PSModuleTest.ps1 | 20 - .../Test/tests/srcWithManifest/header.ps1 | 3 - .../srcWithManifest/init/initializer.ps1 | 3 - .../Test/tests/srcWithManifest/manifest.psd1 | 3 - .../modules/OtherPSModule.psm1 | 19 - .../tests/srcWithManifest/scripts/loader.ps1 | 3 - .../types/DirectoryInfo.Types.ps1xml | 21 - .../types/FileInfo.Types.ps1xml | 14 - .../variables/private/PrivateVariables.ps1 | 47 --- .../variables/public/Moons.ps1 | 6 - .../variables/public/Planets.ps1 | 20 - .../variables/public/SolarSystems.ps1 | 17 - .../Test/tests/tests/PSModuleTest.Tests.ps1 | 11 - .../Aciton-Test-Publish.yml} | 0 .../Action-Test-Build.yml} | 0 .../Action-Test-Document.yml} | 0 .../Action-Test-Initialize.yml} | 0 .../Action-Test-Test-Src-Default.yml} | 0 .../Action-Test-Test-Src-WithManifest.yml} | 0 .../Action-Test-Test-outputs.yml} | 0 .../docs/PSModuleTest/Get-PSModuleTest.md | 0 .../docs/PSModuleTest/New-PSModuleTest.md | 0 .../docs/PSModuleTest/Set-PSModuleTest.md | 0 .../docs/PSModuleTest/Test-PSModuleTest.md | 0 .../modules/PSModuleTest/PSModuleTest.psd1 | 0 .../modules/PSModuleTest/PSModuleTest.psm1 | 0 .../PSModuleTest}/assemblies/LsonLib.dll | Bin .../modules/PSModuleTest}/data/Config.psd1 | 0 .../modules/PSModuleTest}/data/Settings.psd1 | 0 .../formats/CultureInfo.Format.ps1xml | 0 .../formats/Mygciview.Format.ps1xml | 0 .../PSModuleTest}/modules/OtherPSModule.psm1 | 0 .../modules/PSModuleTest}/scripts/loader.ps1 | 0 .../types/DirectoryInfo.Types.ps1xml | 0 .../PSModuleTest}/types/FileInfo.Types.ps1xml | 0 .../src/functions/public/Get-PSModuleTest.ps1 | 0 .../src/functions/public/New-PSModuleTest.ps1 | 0 .../public/PSModule/Get-PSModuleTest.ps1 | 23 -- .../public/PSModule/New-PSModuleTest.ps1 | 37 -- .../src/functions/public/PSModule/PSModule.md | 1 - .../functions/public}/Set-PSModuleTest.ps1 | 0 .../public/SomethingElse/Set-PSModuleTest.ps1 | 22 - .../public/SomethingElse/SomethingElse.md | 1 - .../functions/public/Test-PSModuleTest.ps1 | 4 +- .../src/functions/public/completers.ps1 | 0 .../functions/public/Get-PSModuleTest.ps1 | 0 .../functions/public/New-PSModuleTest.ps1 | 0 .../public/PSModule/Get-PSModuleTest.ps1 | 23 -- .../public/PSModule/New-PSModuleTest.ps1 | 37 -- .../functions/public/PSModule/PSModule.md | 1 - .../functions/public}/Set-PSModuleTest.ps1 | 0 .../public/SomethingElse/Set-PSModuleTest.ps1 | 22 - .../public/SomethingElse/SomethingElse.md | 1 - .../functions/public/Test-PSModuleTest.ps1 | 4 +- tests/srcWithManifest/manifest.psd1 | 3 +- tests/tests/PSModuleTest.Tests.ps1 | 63 +-- .../Build/tests => tests}/tools/1-build.ps1 | 0 .../Build/tests => tests}/tools/2-build.ps1 | 0 171 files changed, 14 insertions(+), 3337 deletions(-) delete mode 100644 .github/actions/Build/.github/CODEOWNERS delete mode 100644 .github/actions/Build/.github/dependabot.yml delete mode 100644 .github/actions/Build/.github/linters/.markdown-lint.yml delete mode 100644 .github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 delete mode 100644 .github/actions/Build/.github/release.yml delete mode 100644 .github/actions/Build/.github/workflows/Auto-Release.yml delete mode 100644 .github/actions/Build/.github/workflows/Linter.yml delete mode 100644 .github/actions/Build/tests/src/classes/private/SecretWriter.ps1 delete mode 100644 .github/actions/Build/tests/src/classes/public/Book.ps1 delete mode 100644 .github/actions/Build/tests/src/finally.ps1 delete mode 100644 .github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 delete mode 100644 .github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 delete mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/src/functions/public/PSModule/PSModule.md delete mode 100644 .github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md delete mode 100644 .github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/src/header.ps1 delete mode 100644 .github/actions/Build/tests/src/init/initializer.ps1 delete mode 100644 .github/actions/Build/tests/src/modules/OtherPSModule.psm1 delete mode 100644 .github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 delete mode 100644 .github/actions/Build/tests/src/variables/public/Moons.ps1 delete mode 100644 .github/actions/Build/tests/src/variables/public/Planets.ps1 delete mode 100644 .github/actions/Build/tests/src/variables/public/SolarSystems.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll delete mode 100644 .github/actions/Build/tests/srcWithManifest/data/Config.psd1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/data/Settings.psd1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/finally.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml delete mode 100644 .github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md delete mode 100644 .github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/header.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/init/initializer.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/manifest.psd1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml delete mode 100644 .github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml delete mode 100644 .github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 delete mode 100644 .github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 delete mode 100644 .github/actions/Document/tests/README.md delete mode 100644 .github/actions/Initialize/.github/linters/.markdown-lint.yml delete mode 100644 .github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 delete mode 100644 .github/actions/Initialize/.github/workflows/Auto-Release.yml delete mode 100644 .github/actions/Initialize/.github/workflows/Linter.yml delete mode 100644 .github/actions/Publish/.github/linters/.markdown-lint.yml delete mode 100644 .github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 delete mode 100644 .github/actions/Publish/.github/workflows/Auto-Release.yml delete mode 100644 .github/actions/Publish/.github/workflows/Linter.yml delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/data/Config.psd1 delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/data/Settings.psd1 delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml delete mode 100644 .github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml delete mode 100644 .github/actions/Test/.github/linters/.markdown-lint.yml delete mode 100644 .github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 delete mode 100644 .github/actions/Test/.github/workflows/Auto-Release.yml delete mode 100644 .github/actions/Test/.github/workflows/Linter.yml delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/data/Config.psd1 delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/data/Settings.psd1 delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/src/assemblies/LsonLib.dll delete mode 100644 .github/actions/Test/tests/src/classes/private/SecretWriter.ps1 delete mode 100644 .github/actions/Test/tests/src/classes/public/Book.ps1 delete mode 100644 .github/actions/Test/tests/src/data/Config.psd1 delete mode 100644 .github/actions/Test/tests/src/data/Settings.psd1 delete mode 100644 .github/actions/Test/tests/src/finally.ps1 delete mode 100644 .github/actions/Test/tests/src/formats/CultureInfo.Format.ps1xml delete mode 100644 .github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml delete mode 100644 .github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 delete mode 100644 .github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 delete mode 100644 .github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 delete mode 100644 .github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 delete mode 100644 .github/actions/Test/tests/src/header.ps1 delete mode 100644 .github/actions/Test/tests/src/init/initializer.ps1 delete mode 100644 .github/actions/Test/tests/src/modules/OtherPSModule.psm1 delete mode 100644 .github/actions/Test/tests/src/scripts/loader.ps1 delete mode 100644 .github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/src/types/FileInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 delete mode 100644 .github/actions/Test/tests/src/variables/public/Moons.ps1 delete mode 100644 .github/actions/Test/tests/src/variables/public/Planets.ps1 delete mode 100644 .github/actions/Test/tests/src/variables/public/SolarSystems.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll delete mode 100644 .github/actions/Test/tests/srcWithManifest/classes/private/SecretWriter.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/classes/public/Book.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/data/Config.psd1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/data/Settings.psd1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/finally.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml delete mode 100644 .github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml delete mode 100644 .github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/header.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/init/initializer.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/manifest.psd1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml delete mode 100644 .github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 delete mode 100644 .github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 delete mode 100644 .github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 rename .github/{actions/Publish/.github/workflows/Action-Test.yml => workflows/Aciton-Test-Publish.yml} (100%) rename .github/{actions/Build/.github/workflows/Action-Test.yml => workflows/Action-Test-Build.yml} (100%) rename .github/{actions/Document/.github/workflows/Action-Test.yml => workflows/Action-Test-Document.yml} (100%) rename .github/{actions/Initialize/.github/workflows/Action-Test.yml => workflows/Action-Test-Initialize.yml} (100%) rename .github/{actions/Test/.github/workflows/Action-Test-Src-Default.yml => workflows/Action-Test-Test-Src-Default.yml} (100%) rename .github/{actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml => workflows/Action-Test-Test-Src-WithManifest.yml} (100%) rename .github/{actions/Test/.github/workflows/Action-Test-outputs.yml => workflows/Action-Test-Test-outputs.yml} (100%) rename {.github/actions/Test/tests => tests}/outputs/docs/PSModuleTest/Get-PSModuleTest.md (100%) rename {.github/actions/Test/tests => tests}/outputs/docs/PSModuleTest/New-PSModuleTest.md (100%) rename {.github/actions/Test/tests => tests}/outputs/docs/PSModuleTest/Set-PSModuleTest.md (100%) rename {.github/actions/Test/tests => tests}/outputs/docs/PSModuleTest/Test-PSModuleTest.md (100%) rename {.github/actions/Publish/tests => tests}/outputs/modules/PSModuleTest/PSModuleTest.psd1 (100%) rename {.github/actions/Test/tests => tests}/outputs/modules/PSModuleTest/PSModuleTest.psm1 (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/assemblies/LsonLib.dll (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/data/Config.psd1 (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/data/Settings.psd1 (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/formats/CultureInfo.Format.ps1xml (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/formats/Mygciview.Format.ps1xml (100%) rename {.github/actions/Build/tests/srcWithManifest => tests/outputs/modules/PSModuleTest}/modules/OtherPSModule.psm1 (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/scripts/loader.ps1 (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/types/DirectoryInfo.Types.ps1xml (100%) rename {.github/actions/Build/tests/src => tests/outputs/modules/PSModuleTest}/types/FileInfo.Types.ps1xml (100%) rename {.github/actions/Test/tests => tests}/src/functions/public/Get-PSModuleTest.ps1 (100%) rename {.github/actions/Test/tests => tests}/src/functions/public/New-PSModuleTest.ps1 (100%) delete mode 100644 tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 delete mode 100644 tests/src/functions/public/PSModule/New-PSModuleTest.ps1 delete mode 100644 tests/src/functions/public/PSModule/PSModule.md rename {.github/actions/Build/tests/src/functions/public/SomethingElse => tests/src/functions/public}/Set-PSModuleTest.ps1 (100%) delete mode 100644 tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 delete mode 100644 tests/src/functions/public/SomethingElse/SomethingElse.md rename {.github/actions/Test/tests => tests}/src/functions/public/completers.ps1 (100%) rename {.github/actions/Test/tests => tests}/srcWithManifest/functions/public/Get-PSModuleTest.ps1 (100%) rename {.github/actions/Test/tests => tests}/srcWithManifest/functions/public/New-PSModuleTest.ps1 (100%) delete mode 100644 tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 delete mode 100644 tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 delete mode 100644 tests/srcWithManifest/functions/public/PSModule/PSModule.md rename {.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse => tests/srcWithManifest/functions/public}/Set-PSModuleTest.ps1 (100%) delete mode 100644 tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 delete mode 100644 tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md rename {.github/actions/Build/tests => tests}/tools/1-build.ps1 (100%) rename {.github/actions/Build/tests => tests}/tools/2-build.ps1 (100%) diff --git a/.github/actions/Build/.github/CODEOWNERS b/.github/actions/Build/.github/CODEOWNERS deleted file mode 100644 index beae856d..00000000 --- a/.github/actions/Build/.github/CODEOWNERS +++ /dev/null @@ -1,50 +0,0 @@ -# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners -# Each line is a file pattern followed by one or more owners. - -# These owners will be the default owners for everything in -# the repo. Unless a later match takes precedence, -# @global-owner1 and @global-owner2 will be requested for -# review when someone opens a pull request. -* @PSModule/framework-maintainers - -# Order is important; the last matching pattern takes the most -# precedence. When someone opens a pull request that only -# modifies JS files, only @js-owner and not the global -# owner(s) will be requested for a review. -# *.js @js-owner - -# You can also use email addresses if you prefer. They'll be -# used to look up users just like we do for commit author -# emails. -# *.go docs@example.com - -# Teams can be specified as code owners as well. Teams should -# be identified in the format @org/team-name. Teams must have -# explicit write access to the repository. In this example, -# the octocats team in the octo-org organization owns all .txt files. -# *.txt @octo-org/octocats - -# In this example, @doctocat owns any files in the build/logs -# directory at the root of the repository and any of its -# subdirectories. -# /build/logs/ @doctocat - -# The `docs/*` pattern will match files like -# `docs/getting-started.md` but not further nested files like -# `docs/build-app/troubleshooting.md`. -# docs/* docs@example.com - -# In this example, @octocat owns any file in an apps directory -# anywhere in your repository. -# apps/ @octocat - -# In this example, @doctocat owns any file in the `/docs` -# directory in the root of your repository and any of its -# subdirectories. -# /docs/ @doctocat - -# In this example, @octocat owns any file in the `/apps` -# directory in the root of your repository except for the `/apps/github` -# subdirectory, as its owners are left empty. -# /apps/ @octocat -# /apps/github diff --git a/.github/actions/Build/.github/dependabot.yml b/.github/actions/Build/.github/dependabot.yml deleted file mode 100644 index f57e1e95..00000000 --- a/.github/actions/Build/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: github-actions # See documentation for possible values - directory: / # Location of package manifests - schedule: - interval: weekly diff --git a/.github/actions/Build/.github/linters/.markdown-lint.yml b/.github/actions/Build/.github/linters/.markdown-lint.yml deleted file mode 100644 index b9ecdfa9..00000000 --- a/.github/actions/Build/.github/linters/.markdown-lint.yml +++ /dev/null @@ -1,25 +0,0 @@ -########################### -## Markdown Linter rules ## -########################### - -# Linter rules doc: -# - https://github.com/DavidAnson/markdownlint - -############### -# Rules by id # -############### -MD004: false # Unordered list style -MD007: - indent: 2 # Unordered list indentation -MD013: - line_length: 808 # Line length -MD026: - punctuation: ".,;:!。,;:" # List of not allowed -MD029: false # Ordered list item prefix -MD033: false # Allow inline HTML -MD036: false # Emphasis used instead of a heading - -################# -# Rules by tags # -################# -blank_lines: false # Error on blank lines diff --git a/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 deleted file mode 100644 index 40d11d60..00000000 --- a/.github/actions/Build/.github/linters/.powershell-psscriptanalyzer.psd1 +++ /dev/null @@ -1,18 +0,0 @@ -#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings -@{ - #CustomRulePath='path\to\CustomRuleModule.psm1' - #RecurseCustomRulePath='path\of\customrules' - #Severity = @( - # 'Error' - # 'Warning' - #) - #IncludeDefaultRules=${true} - ExcludeRules = @( - 'PSMissingModuleManifestField' - 'PSAvoidUsingWriteHost' - ) - #IncludeRules = @( - # 'PSAvoidUsingWriteHost', - # 'MyCustomRuleName' - #) -} diff --git a/.github/actions/Build/.github/release.yml b/.github/actions/Build/.github/release.yml deleted file mode 100644 index 35c6ae86..00000000 --- a/.github/actions/Build/.github/release.yml +++ /dev/null @@ -1,18 +0,0 @@ -# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes - -changelog: - exclude: - labels: - - NoRelease - categories: - - title: 🌟 Breaking Changes - labels: - - Major - - Breaking - - title: 🚀 New Features - labels: - - Minor - - Feature - - title: Other Changes - labels: - - '*' diff --git a/.github/actions/Build/.github/workflows/Auto-Release.yml b/.github/actions/Build/.github/workflows/Auto-Release.yml deleted file mode 100644 index ec157c9d..00000000 --- a/.github/actions/Build/.github/workflows/Auto-Release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Auto-Release - -run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: - pull_request_target: - branches: - - main - types: - - closed - - opened - - reopened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - -jobs: - Auto-Release: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Auto-Release - uses: PSModule/Auto-Release@v1 - env: - GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication - with: - IncrementalPrerelease: false diff --git a/.github/actions/Build/.github/workflows/Linter.yml b/.github/actions/Build/.github/workflows/Linter.yml deleted file mode 100644 index f6f58f0a..00000000 --- a/.github/actions/Build/.github/workflows/Linter.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Linter - -run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: [pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - packages: read - statuses: write - -jobs: - Lint: - name: Lint code base - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Lint code base - uses: super-linter/super-linter@latest - env: - GITHUB_TOKEN: ${{ github.token }} - VALIDATE_JSCPD: false - VALIDATE_MARKDOWN_PRETTIER: false - VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Build/tests/src/classes/private/SecretWriter.ps1 b/.github/actions/Build/tests/src/classes/private/SecretWriter.ps1 deleted file mode 100644 index 1b1732a5..00000000 --- a/.github/actions/Build/tests/src/classes/private/SecretWriter.ps1 +++ /dev/null @@ -1,15 +0,0 @@ -class SecretWriter { - [string] $Alias - [string] $Name - [string] $Secret - - SecretWriter([string] $alias, [string] $name, [string] $secret) { - $this.Alias = $alias - $this.Name = $name - $this.Secret = $secret - } - - [string] GetAlias() { - return $this.Alias - } -} diff --git a/.github/actions/Build/tests/src/classes/public/Book.ps1 b/.github/actions/Build/tests/src/classes/public/Book.ps1 deleted file mode 100644 index 8917d9ab..00000000 --- a/.github/actions/Build/tests/src/classes/public/Book.ps1 +++ /dev/null @@ -1,147 +0,0 @@ -class Book { - # Class properties - [string] $Title - [string] $Author - [string] $Synopsis - [string] $Publisher - [datetime] $PublishDate - [int] $PageCount - [string[]] $Tags - # Default constructor - Book() { $this.Init(@{}) } - # Convenience constructor from hashtable - Book([hashtable]$Properties) { $this.Init($Properties) } - # Common constructor for title and author - Book([string]$Title, [string]$Author) { - $this.Init(@{Title = $Title; Author = $Author }) - } - # Shared initializer method - [void] Init([hashtable]$Properties) { - foreach ($Property in $Properties.Keys) { - $this.$Property = $Properties.$Property - } - } - # Method to calculate reading time as 2 minutes per page - [timespan] GetReadingTime() { - if ($this.PageCount -le 0) { - throw 'Unable to determine reading time from page count.' - } - $Minutes = $this.PageCount * 2 - return [timespan]::new(0, $Minutes, 0) - } - # Method to calculate how long ago a book was published - [timespan] GetPublishedAge() { - if ( - $null -eq $this.PublishDate -or - $this.PublishDate -eq [datetime]::MinValue - ) { throw 'PublishDate not defined' } - - return (Get-Date) - $this.PublishDate - } - # Method to return a string representation of the book - [string] ToString() { - return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))" - } -} - -class BookList { - # Static property to hold the list of books - static [System.Collections.Generic.List[Book]] $Books - # Static method to initialize the list of books. Called in the other - # static methods to avoid needing to explicit initialize the value. - static [void] Initialize() { [BookList]::Initialize($false) } - static [bool] Initialize([bool]$force) { - if ([BookList]::Books.Count -gt 0 -and -not $force) { - return $false - } - - [BookList]::Books = [System.Collections.Generic.List[Book]]::new() - - return $true - } - # Ensure a book is valid for the list. - static [void] Validate([book]$Book) { - $Prefix = @( - 'Book validation failed: Book must be defined with the Title,' - 'Author, and PublishDate properties, but' - ) -join ' ' - if ($null -eq $Book) { throw "$Prefix was null" } - if ([string]::IsNullOrEmpty($Book.Title)) { - throw "$Prefix Title wasn't defined" - } - if ([string]::IsNullOrEmpty($Book.Author)) { - throw "$Prefix Author wasn't defined" - } - if ([datetime]::MinValue -eq $Book.PublishDate) { - throw "$Prefix PublishDate wasn't defined" - } - } - # Static methods to manage the list of books. - # Add a book if it's not already in the list. - static [void] Add([Book]$Book) { - [BookList]::Initialize() - [BookList]::Validate($Book) - if ([BookList]::Books.Contains($Book)) { - throw "Book '$Book' already in list" - } - - $FindPredicate = { - param([Book]$b) - - $b.Title -eq $Book.Title -and - $b.Author -eq $Book.Author -and - $b.PublishDate -eq $Book.PublishDate - }.GetNewClosure() - if ([BookList]::Books.Find($FindPredicate)) { - throw "Book '$Book' already in list" - } - - [BookList]::Books.Add($Book) - } - # Clear the list of books. - static [void] Clear() { - [BookList]::Initialize() - [BookList]::Books.Clear() - } - # Find a specific book using a filtering scriptblock. - static [Book] Find([scriptblock]$Predicate) { - [BookList]::Initialize() - return [BookList]::Books.Find($Predicate) - } - # Find every book matching the filtering scriptblock. - static [Book[]] FindAll([scriptblock]$Predicate) { - [BookList]::Initialize() - return [BookList]::Books.FindAll($Predicate) - } - # Remove a specific book. - static [void] Remove([Book]$Book) { - [BookList]::Initialize() - [BookList]::Books.Remove($Book) - } - # Remove a book by property value. - static [void] RemoveBy([string]$Property, [string]$Value) { - [BookList]::Initialize() - $Index = [BookList]::Books.FindIndex({ - param($b) - $b.$Property -eq $Value - }.GetNewClosure()) - if ($Index -ge 0) { - [BookList]::Books.RemoveAt($Index) - } - } -} - -enum Binding { - Hardcover - Paperback - EBook -} - -enum Genre { - Mystery - Thriller - Romance - ScienceFiction - Fantasy - Horror -} diff --git a/.github/actions/Build/tests/src/finally.ps1 b/.github/actions/Build/tests/src/finally.ps1 deleted file mode 100644 index d8fc2071..00000000 --- a/.github/actions/Build/tests/src/finally.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '------------------------------' -Write-Verbose '--- THIS IS A LAST LOADER ---' -Write-Verbose '------------------------------' diff --git a/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 deleted file mode 100644 index 89f053cb..00000000 --- a/.github/actions/Build/tests/src/functions/private/Get-InternalPSModule.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 deleted file mode 100644 index cf870ba6..00000000 --- a/.github/actions/Build/tests/src/functions/private/Set-InternalPSModule.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 deleted file mode 100644 index 86beb12d..00000000 --- a/.github/actions/Build/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -#Requires -Modules Store -#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } -#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 deleted file mode 100644 index d4e6e266..00000000 --- a/.github/actions/Build/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - - .NOTES - Testing if a module can have a [Markdown based link](https://example.com). - !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," - \[This is a test\] - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [Alias('New-PSModuleTestAlias1')] - [Alias('New-PSModuleTestAlias2')] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -New-Alias New-PSModuleTestAlias3 New-PSModuleTest -New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest - - -Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md b/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md deleted file mode 100644 index 79741cf4..00000000 --- a/.github/actions/Build/tests/src/functions/public/PSModule/PSModule.md +++ /dev/null @@ -1 +0,0 @@ -# This is PSModule diff --git a/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md b/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md deleted file mode 100644 index d9f7e9ee..00000000 --- a/.github/actions/Build/tests/src/functions/public/SomethingElse/SomethingElse.md +++ /dev/null @@ -1 +0,0 @@ -# This is SomethingElse diff --git a/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 deleted file mode 100644 index 26be2b9b..00000000 --- a/.github/actions/Build/tests/src/functions/public/Test-PSModuleTest.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Test-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/src/header.ps1 b/.github/actions/Build/tests/src/header.ps1 deleted file mode 100644 index cc1fde9a..00000000 --- a/.github/actions/Build/tests/src/header.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() diff --git a/.github/actions/Build/tests/src/init/initializer.ps1 b/.github/actions/Build/tests/src/init/initializer.ps1 deleted file mode 100644 index 28396fb0..00000000 --- a/.github/actions/Build/tests/src/init/initializer.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------------' -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Write-Verbose '-------------------------------' diff --git a/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 b/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 deleted file mode 100644 index 5d6af8ea..00000000 --- a/.github/actions/Build/tests/src/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 b/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 deleted file mode 100644 index f1fc2c3b..00000000 --- a/.github/actions/Build/tests/src/variables/private/PrivateVariables.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -$script:HabitablePlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - }, - @{ - Name = 'Proxima Centauri b' - Mass = 1.17 - Diameter = 11449 - DayLength = 5.15 - }, - @{ - Name = 'Kepler-442b' - Mass = 2.34 - Diameter = 11349 - DayLength = 5.7 - }, - @{ - Name = 'Kepler-452b' - Mass = 5.0 - Diameter = 17340 - DayLength = 20.0 - } -) - -$script:InhabitedPlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - } -) diff --git a/.github/actions/Build/tests/src/variables/public/Moons.ps1 b/.github/actions/Build/tests/src/variables/public/Moons.ps1 deleted file mode 100644 index dd0f33ca..00000000 --- a/.github/actions/Build/tests/src/variables/public/Moons.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$script:Moons = @( - @{ - Planet = 'Earth' - Name = 'Moon' - } -) diff --git a/.github/actions/Build/tests/src/variables/public/Planets.ps1 b/.github/actions/Build/tests/src/variables/public/Planets.ps1 deleted file mode 100644 index 736584b9..00000000 --- a/.github/actions/Build/tests/src/variables/public/Planets.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$script:Planets = @( - @{ - Name = 'Mercury' - Mass = 0.330 - Diameter = 4879 - DayLength = 4222.6 - }, - @{ - Name = 'Venus' - Mass = 4.87 - Diameter = 12104 - DayLength = 2802.0 - }, - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - } -) diff --git a/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 b/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 deleted file mode 100644 index acbcedfd..00000000 --- a/.github/actions/Build/tests/src/variables/public/SolarSystems.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$script:SolarSystems = @( - @{ - Name = 'Solar System' - Planets = $script:Planets - Moons = $script:Moons - }, - @{ - Name = 'Alpha Centauri' - Planets = @() - Moons = @() - }, - @{ - Name = 'Sirius' - Planets = @() - Moons = @() - } -) diff --git a/.github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll b/.github/actions/Build/tests/srcWithManifest/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2c..00000000 --- a/.github/actions/Build/tests/srcWithManifest/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 deleted file mode 100644 index 89f053cb..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 deleted file mode 100644 index cf870ba6..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 deleted file mode 100644 index 86beb12d..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -#Requires -Modules Store -#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } -#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 deleted file mode 100644 index d4e6e266..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - - .NOTES - Testing if a module can have a [Markdown based link](https://example.com). - !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," - \[This is a test\] - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [Alias('New-PSModuleTestAlias1')] - [Alias('New-PSModuleTestAlias2')] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -New-Alias New-PSModuleTestAlias3 New-PSModuleTest -New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest - - -Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md b/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md deleted file mode 100644 index 79741cf4..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/public/PSModule/PSModule.md +++ /dev/null @@ -1 +0,0 @@ -# This is PSModule diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md b/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md deleted file mode 100644 index d9f7e9ee..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md +++ /dev/null @@ -1 +0,0 @@ -# This is SomethingElse diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 deleted file mode 100644 index 26be2b9b..00000000 --- a/.github/actions/Build/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Test-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Build/tests/srcWithManifest/header.ps1 b/.github/actions/Build/tests/srcWithManifest/header.ps1 deleted file mode 100644 index cc1fde9a..00000000 --- a/.github/actions/Build/tests/srcWithManifest/header.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() diff --git a/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 b/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 deleted file mode 100644 index f4121d25..00000000 --- a/.github/actions/Build/tests/srcWithManifest/init/initializer.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------------' -Verbose -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Verbose -Write-Verbose '-------------------------------' -Verbose diff --git a/.github/actions/Build/tests/srcWithManifest/manifest.psd1 b/.github/actions/Build/tests/srcWithManifest/manifest.psd1 deleted file mode 100644 index 9466cb8e..00000000 --- a/.github/actions/Build/tests/srcWithManifest/manifest.psd1 +++ /dev/null @@ -1,6 +0,0 @@ -@{ - ModuleVersion = '0.0.0' - RootModule = 'PSModuleTest.psm1' - Copyright = 'Test' - Description = 'This is a test module.' -} diff --git a/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 b/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 deleted file mode 100644 index 973735ad..00000000 --- a/.github/actions/Build/tests/srcWithManifest/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Write-Verbose '--- THIS IS A LOADER ---' -Write-Verbose '-------------------------' diff --git a/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b2..00000000 --- a/.github/actions/Build/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b8..00000000 --- a/.github/actions/Build/tests/srcWithManifest/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 deleted file mode 100644 index f1fc2c3b..00000000 --- a/.github/actions/Build/tests/srcWithManifest/variables/private/PrivateVariables.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -$script:HabitablePlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - }, - @{ - Name = 'Proxima Centauri b' - Mass = 1.17 - Diameter = 11449 - DayLength = 5.15 - }, - @{ - Name = 'Kepler-442b' - Mass = 2.34 - Diameter = 11349 - DayLength = 5.7 - }, - @{ - Name = 'Kepler-452b' - Mass = 5.0 - Diameter = 17340 - DayLength = 20.0 - } -) - -$script:InhabitedPlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - } -) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 deleted file mode 100644 index dd0f33ca..00000000 --- a/.github/actions/Build/tests/srcWithManifest/variables/public/Moons.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$script:Moons = @( - @{ - Planet = 'Earth' - Name = 'Moon' - } -) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 deleted file mode 100644 index 736584b9..00000000 --- a/.github/actions/Build/tests/srcWithManifest/variables/public/Planets.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$script:Planets = @( - @{ - Name = 'Mercury' - Mass = 0.330 - Diameter = 4879 - DayLength = 4222.6 - }, - @{ - Name = 'Venus' - Mass = 4.87 - Diameter = 12104 - DayLength = 2802.0 - }, - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - } -) diff --git a/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 deleted file mode 100644 index acbcedfd..00000000 --- a/.github/actions/Build/tests/srcWithManifest/variables/public/SolarSystems.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$script:SolarSystems = @( - @{ - Name = 'Solar System' - Planets = $script:Planets - Moons = $script:Moons - }, - @{ - Name = 'Alpha Centauri' - Planets = @() - Moons = @() - }, - @{ - Name = 'Sirius' - Planets = @() - Moons = @() - } -) diff --git a/.github/actions/Document/tests/README.md b/.github/actions/Document/tests/README.md deleted file mode 100644 index 43816d34..00000000 --- a/.github/actions/Document/tests/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Placeholder for tests - -Location for tests of the action. diff --git a/.github/actions/Initialize/.github/linters/.markdown-lint.yml b/.github/actions/Initialize/.github/linters/.markdown-lint.yml deleted file mode 100644 index b9ecdfa9..00000000 --- a/.github/actions/Initialize/.github/linters/.markdown-lint.yml +++ /dev/null @@ -1,25 +0,0 @@ -########################### -## Markdown Linter rules ## -########################### - -# Linter rules doc: -# - https://github.com/DavidAnson/markdownlint - -############### -# Rules by id # -############### -MD004: false # Unordered list style -MD007: - indent: 2 # Unordered list indentation -MD013: - line_length: 808 # Line length -MD026: - punctuation: ".,;:!。,;:" # List of not allowed -MD029: false # Ordered list item prefix -MD033: false # Allow inline HTML -MD036: false # Emphasis used instead of a heading - -################# -# Rules by tags # -################# -blank_lines: false # Error on blank lines diff --git a/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 deleted file mode 100644 index 6779d06f..00000000 --- a/.github/actions/Initialize/.github/linters/.powershell-psscriptanalyzer.psd1 +++ /dev/null @@ -1,17 +0,0 @@ -#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings -@{ - #CustomRulePath='path\to\CustomRuleModule.psm1' - #RecurseCustomRulePath='path\of\customrules' - #Severity = @( - # 'Error' - # 'Warning' - #) - #IncludeDefaultRules=${true} - ExcludeRules = @( - 'PSAvoidUsingWriteHost' - ) - #IncludeRules = @( - # 'PSAvoidUsingWriteHost', - # 'MyCustomRuleName' - #) -} diff --git a/.github/actions/Initialize/.github/workflows/Auto-Release.yml b/.github/actions/Initialize/.github/workflows/Auto-Release.yml deleted file mode 100644 index ec157c9d..00000000 --- a/.github/actions/Initialize/.github/workflows/Auto-Release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Auto-Release - -run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: - pull_request_target: - branches: - - main - types: - - closed - - opened - - reopened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - -jobs: - Auto-Release: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Auto-Release - uses: PSModule/Auto-Release@v1 - env: - GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication - with: - IncrementalPrerelease: false diff --git a/.github/actions/Initialize/.github/workflows/Linter.yml b/.github/actions/Initialize/.github/workflows/Linter.yml deleted file mode 100644 index f6f58f0a..00000000 --- a/.github/actions/Initialize/.github/workflows/Linter.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Linter - -run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: [pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - packages: read - statuses: write - -jobs: - Lint: - name: Lint code base - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Lint code base - uses: super-linter/super-linter@latest - env: - GITHUB_TOKEN: ${{ github.token }} - VALIDATE_JSCPD: false - VALIDATE_MARKDOWN_PRETTIER: false - VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Publish/.github/linters/.markdown-lint.yml b/.github/actions/Publish/.github/linters/.markdown-lint.yml deleted file mode 100644 index b9ecdfa9..00000000 --- a/.github/actions/Publish/.github/linters/.markdown-lint.yml +++ /dev/null @@ -1,25 +0,0 @@ -########################### -## Markdown Linter rules ## -########################### - -# Linter rules doc: -# - https://github.com/DavidAnson/markdownlint - -############### -# Rules by id # -############### -MD004: false # Unordered list style -MD007: - indent: 2 # Unordered list indentation -MD013: - line_length: 808 # Line length -MD026: - punctuation: ".,;:!。,;:" # List of not allowed -MD029: false # Ordered list item prefix -MD033: false # Allow inline HTML -MD036: false # Emphasis used instead of a heading - -################# -# Rules by tags # -################# -blank_lines: false # Error on blank lines diff --git a/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 deleted file mode 100644 index 6779d06f..00000000 --- a/.github/actions/Publish/.github/linters/.powershell-psscriptanalyzer.psd1 +++ /dev/null @@ -1,17 +0,0 @@ -#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings -@{ - #CustomRulePath='path\to\CustomRuleModule.psm1' - #RecurseCustomRulePath='path\of\customrules' - #Severity = @( - # 'Error' - # 'Warning' - #) - #IncludeDefaultRules=${true} - ExcludeRules = @( - 'PSAvoidUsingWriteHost' - ) - #IncludeRules = @( - # 'PSAvoidUsingWriteHost', - # 'MyCustomRuleName' - #) -} diff --git a/.github/actions/Publish/.github/workflows/Auto-Release.yml b/.github/actions/Publish/.github/workflows/Auto-Release.yml deleted file mode 100644 index ec157c9d..00000000 --- a/.github/actions/Publish/.github/workflows/Auto-Release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Auto-Release - -run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: - pull_request_target: - branches: - - main - types: - - closed - - opened - - reopened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - -jobs: - Auto-Release: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Auto-Release - uses: PSModule/Auto-Release@v1 - env: - GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication - with: - IncrementalPrerelease: false diff --git a/.github/actions/Publish/.github/workflows/Linter.yml b/.github/actions/Publish/.github/workflows/Linter.yml deleted file mode 100644 index d7650ae5..00000000 --- a/.github/actions/Publish/.github/workflows/Linter.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Linter - -run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: [pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - packages: read - statuses: write - -jobs: - Lint: - name: Lint code base - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Lint code base - uses: super-linter/super-linter@latest - env: - GITHUB_TOKEN: ${{ github.token }} - VALIDATE_MARKDOWN_PRETTIER: false - VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 deleted file mode 100644 index 143fe324..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 +++ /dev/null @@ -1,382 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() - -$scriptName = $MyInvocation.MyCommand.Name -Write-Verbose "[$scriptName] Importing module" - -#region - Data import -Write-Verbose "[$scriptName] - [data] - Processing folder" -$dataFolder = (Join-Path $PSScriptRoot 'data') -Write-Verbose "[$scriptName] - [data] - [$dataFolder]" -Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing" - New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done" -} - -Write-Verbose "[$scriptName] - [data] - Done" -#endregion - Data import - -#region - From /init -Write-Verbose "[$scriptName] - [/init] - Processing folder" - -#region - From /init/initializer.ps1 -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Importing" - -Write-Verbose '-------------------------------' -Verbose -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Verbose -Write-Verbose '-------------------------------' -Verbose - -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Done" -#endregion - From /init/initializer.ps1 - -Write-Verbose "[$scriptName] - [/init] - Done" -#endregion - From /init - -#region - From /classes -Write-Verbose "[$scriptName] - [/classes] - Processing folder" - -#region - From /classes/Book.ps1 -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Importing" - -class Book { - # Class properties - [string] $Title - [string] $Author - [string] $Synopsis - [string] $Publisher - [datetime] $PublishDate - [int] $PageCount - [string[]] $Tags - # Default constructor - Book() { $this.Init(@{}) } - # Convenience constructor from hashtable - Book([hashtable]$Properties) { $this.Init($Properties) } - # Common constructor for title and author - Book([string]$Title, [string]$Author) { - $this.Init(@{Title = $Title; Author = $Author }) - } - # Shared initializer method - [void] Init([hashtable]$Properties) { - foreach ($Property in $Properties.Keys) { - $this.$Property = $Properties.$Property - } - } - # Method to calculate reading time as 2 minutes per page - [timespan] GetReadingTime() { - if ($this.PageCount -le 0) { - throw 'Unable to determine reading time from page count.' - } - $Minutes = $this.PageCount * 2 - return [timespan]::new(0, $Minutes, 0) - } - # Method to calculate how long ago a book was published - [timespan] GetPublishedAge() { - if ( - $null -eq $this.PublishDate -or - $this.PublishDate -eq [datetime]::MinValue - ) { throw 'PublishDate not defined' } - - return (Get-Date) - $this.PublishDate - } - # Method to return a string representation of the book - [string] ToString() { - return "$($this.Title) by $($this.Author) ($($this.PublishDate.Year))" - } -} - -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Done" -#endregion - From /classes/Book.ps1 -#region - From /classes/BookList.ps1 -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Importing" - -class BookList { - # Static property to hold the list of books - static [System.Collections.Generic.List[Book]] $Books - # Static method to initialize the list of books. Called in the other - # static methods to avoid needing to explicit initialize the value. - static [void] Initialize() { [BookList]::Initialize($false) } - static [bool] Initialize([bool]$force) { - if ([BookList]::Books.Count -gt 0 -and -not $force) { - return $false - } - - [BookList]::Books = [System.Collections.Generic.List[Book]]::new() - - return $true - } - # Ensure a book is valid for the list. - static [void] Validate([book]$Book) { - $Prefix = @( - 'Book validation failed: Book must be defined with the Title,' - 'Author, and PublishDate properties, but' - ) -join ' ' - if ($null -eq $Book) { throw "$Prefix was null" } - if ([string]::IsNullOrEmpty($Book.Title)) { - throw "$Prefix Title wasn't defined" - } - if ([string]::IsNullOrEmpty($Book.Author)) { - throw "$Prefix Author wasn't defined" - } - if ([datetime]::MinValue -eq $Book.PublishDate) { - throw "$Prefix PublishDate wasn't defined" - } - } - # Static methods to manage the list of books. - # Add a book if it's not already in the list. - static [void] Add([Book]$Book) { - [BookList]::Initialize() - [BookList]::Validate($Book) - if ([BookList]::Books.Contains($Book)) { - throw "Book '$Book' already in list" - } - - $FindPredicate = { - param([Book]$b) - - $b.Title -eq $Book.Title -and - $b.Author -eq $Book.Author -and - $b.PublishDate -eq $Book.PublishDate - }.GetNewClosure() - if ([BookList]::Books.Find($FindPredicate)) { - throw "Book '$Book' already in list" - } - - [BookList]::Books.Add($Book) - } - # Clear the list of books. - static [void] Clear() { - [BookList]::Initialize() - [BookList]::Books.Clear() - } - # Find a specific book using a filtering scriptblock. - static [Book] Find([scriptblock]$Predicate) { - [BookList]::Initialize() - return [BookList]::Books.Find($Predicate) - } - # Find every book matching the filtering scriptblock. - static [Book[]] FindAll([scriptblock]$Predicate) { - [BookList]::Initialize() - return [BookList]::Books.FindAll($Predicate) - } - # Remove a specific book. - static [void] Remove([Book]$Book) { - [BookList]::Initialize() - [BookList]::Books.Remove($Book) - } - # Remove a book by property value. - static [void] RemoveBy([string]$Property, [string]$Value) { - [BookList]::Initialize() - $Index = [BookList]::Books.FindIndex({ - param($b) - $b.$Property -eq $Value - }.GetNewClosure()) - if ($Index -ge 0) { - [BookList]::Books.RemoveAt($Index) - } - } -} - -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Done" -#endregion - From /classes/BookList.ps1 - -Write-Verbose "[$scriptName] - [/classes] - Done" -#endregion - From /classes - -#region - From /private -Write-Verbose "[$scriptName] - [/private] - Processing folder" - -#region - From /private/Get-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" - -Function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" -#endregion - From /private/Get-InternalPSModule.ps1 -#region - From /private/Set-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" - -Function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" -#endregion - From /private/Set-InternalPSModule.ps1 - -Write-Verbose "[$scriptName] - [/private] - Done" -#endregion - From /private - -#region - From /public -Write-Verbose "[$scriptName] - [/public] - Processing folder" - -#region - From /public/Get-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" - -#Requires -Modules Utilities - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" -#endregion - From /public/Get-PSModuleTest.ps1 -#region - From /public/New-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" - -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" -#endregion - From /public/New-PSModuleTest.ps1 -#region - From /public/Set-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" - -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" -#endregion - From /public/Set-PSModuleTest.ps1 -#region - From /public/Test-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" - -function Test-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" -#endregion - From /public/Test-PSModuleTest.ps1 - -Write-Verbose "[$scriptName] - [/public] - Done" -#endregion - From /public - -#region - From /finally.ps1 -Write-Verbose "[$scriptName] - [/finally.ps1] - Importing" - -Write-Verbose '------------------------------' -Verbose -Write-Verbose '--- THIS IS A LAST LOADER ---' -Verbose -Write-Verbose '------------------------------' -Verbose -Write-Verbose "[$scriptName] - [/finally.ps1] - Done" -#endregion - From /finally.ps1 - -$exports = @{ - Cmdlet = '' - Alias = '*' - Variable = '' - Function = @( - 'Get-PSModuleTest' - 'New-PSModuleTest' - 'Set-PSModuleTest' - 'Test-PSModuleTest' - ) -} -Export-ModuleMember @exports - diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 zcmeIb3w&HvwLiYjIrDxcGm|ELl4+Zkp_7F41!*a@Z(8VsJ}7-jm?qOUG|7aSq|g_n z3Mf#tDDnfvOHmL}^^c zi+?hD)t2^Rs=JWiT*!8&TC-hU`JU9qT&mF9m1^%w&0DrI)tPV0HAbVMI?ejr`9zBi zi>^05bb&4HFpWutjV7W`A;+h3A3lJ43fEy=M3s^@mEN48$v|TeA^(@-4YcdRE18u4 zm+l(nEPQ$n5G~`xVWKP85Cc92MUXe+TSOxVlpQA{MHFxq2Y@eh;f+1HOM8GH+7FPz z#chS&?oW#7!p1_e(27ja?JyGDQMcoAeP*G%8Vk9OJP27=B4q>mtRN1UMKs4jbmFrI zRDyLg$xAcZiTchX3hHwE_TWRvw~^!AlT9W~ML9HxlUWR*XF|UGFxLfVv}^EZT!R%n_#|JS7w&Gd~XZaOOP;BR!t0ldk|Z zyYnXl8ShJ&=`<1=E39`)P;d$geAVgAkV1s&5D{wl+LILt<7jmh((+ZvpeM@sdrVOrv+%Hbl8d?;KdkL7w*`4H$+b<_y?>f@%lGYPEt0;qR$ zzPXcOI79vkK;B4?@=~#zKxXlS>_> zS%Ap$i5RhmMW4al&-I%zbYWo8OI6G_LXD8GHq}_=s|_|*_-dn#Kto53>Z3-+s1Ez< z=aa9tVRECQuUVsN=TAkwQ-`@()vOU_wGC1ct_TN9!xwy%iDyoMHCWM_HKHnXkXDK& z!t1Cf8l0Ye`|Y=3%p`pETqufuj#FmppbAGD{i0^ZsDX}VX8bz~hy)t$pTPbx9lT*l z?$3T&oI2FqB56;t2`$Y86LfS4+;W6%*kqHRI>84H3qEP(lFTiE;gElco6Rw%d-!$m zE@ND^Z!db$_|&)>zfP1%s;yXCTao@VYJF;4nNjWB^s6X~WGJ9~T*Xi2lWE5txotmy zPSBHe;>Zy4B|ULZ1S6K?L;WZuphqYgtR2%h9z(JAkCv=$Up{Snp zW_FrsconBERxFdggfBe_Ov3)!hQ@@ywrNtxUpwunsXPW9lJv*@^&vA|qv}ob*Up~g z_1CVO2;wXg?{E_b;&2r+jgielB4*)tjuLS%`pZY(K$|cexJ?)$Xj7rWpzic!(V@PM zbl3aDk(7h!@l%ujG%7?gm-!0A>?+aVajR78D(CnLL(AU`g z{VC}(6^GGl$tDl&LOU=ZY`+U-wsIWfQLl#pEQoPaRpx_JxVth7RGv><5{A!C@{1YS z+N|72cO4xR*5;>5-H@+lO^9k>+bUgkAxAw**hQ|aSI)=9_>(ys~)!r z8X^hr(IIfR5pi@BYOyO7Ph%mq>ysW#LZ>4g_Z&5lY(}yr5}5V|8f{xnkAB@bW;)J& z?tAw_-aDue=q(-x&2KGfUKVd0i99CWO>@pXrX+S(NP6-3lH$H(Fq0rFe;x$ZtVv^{ zX--bf3Za6DYQaq4`)F=y~X2DS{>o_xj?c5?mN`3Std)GG|Col^c%l0(N(p%er>D#N~v=4pbRdHJ8kXX6dPK0aI;9L<9>XYSMo0r1rPlWYEH*4`q zt#kcZC&Ff$n~k`oX2Wh7iif6s4xO6$XPMx?Nl(PU>FcmY=2g;_j$53F85-SYD0M%g z?z9c)n0_PTL^zkZKw10GJ`py@>?fI>YU~Iy)MH1D|F8EMB9ipk2|0ak&~9p&cOsUY zKPV4gFjmAXrv2p~>+Q^-%uh_g!9x)%SQ)RZ|8E(J|5R6u$KyPiUGsm9D<Nz127?s9@aR{^O8MtA%C6n=F{bUNHZbx8HWmV}Jx@<^%2sa-49{N!sUX{jn zo-a%pe=z-RPU%V1pRC5zS*_Q-!?6m)qaN119iYK;pRD>k36H(*bw6QvO6%T8?anA3 zUikqdhW$>{wxI!BsFvl~*|d)71~ADJGNpVFLob zY&%hA)d_GP%nqzECKcBB0;g-Rz=}3+JNow9gZ7ax8H1n1^crUuEQrMw{Nzk@Is8Nv zYhF8eKjN9*+dQ9*E;~BmOpg5hpRALxF*b_MRr!8-l1_T#UOY?t0C!9r3piWS>n7G9 z-6ZL06T?Wi*c)QvF=i&@uUQjDdjgpo-A~>S%6mZeh?2*8SAT!SF@?53VBnU;K*LA% zVlIlsoNGiR!?kB7BZ;tD%tbIL!p@+uz2%Sn1(rX7`vThOX2QmV=ERzBMfdoU73hfy z*(<{q0-;G*Q``H_?4>8N?`#rws%Z%GAj?b-NA=}3p(lgm$*Njj9ePsj+wy)e?{G(B z6vXn@Og0%DC#YIv*9S~lg=dT^y)nz>a0y*r{1CXf4%#bd6`V;=KhvSaeVgXZ9EnQ!x0z&x1jm^{98EFQcqBlb9p zc`%uqhsk4(Ux%Q->w{)>9-BKQ0^VQ5{*~%W6k?tz+Xqjf410cDH>Qh=3n51Bo}z>G z?y1cOJB*;M&d(Zz4}8Yv!^Oo#4j;HtKR$3N;RE{&&}T%64;L5DcKE=%`tcd5`G95s zpHU?~TwFZI;RB2Hij?= zTc!3y&dHR$Eb{>PsQ}59=#qi1nTBxBJ`U=vx{_j=tk;eKFWXU&!mPucBdn z2NK!(j<@v{l5%}j8S7grwDpy-%KCoX(bwzfTNM!h)mkDYm{VwZ0sK`{}D_Sl@v}w!RZ=eTAf4 zUscBXmI`fsCHAnsYXY`E_#J&q;b#&RzGxHd;JP4EF~3?(z8r_pc9m!KV%ybhu&S{s zVfAo2pXKH$wa|7$#w8q&<6gj&EwzkSUamNExmltq3=dMbnZF1;(o0|;ho(QDO`zz{ z$C5agVOi=Ow`sqmR$F<>*lb6{5wwv>PKH@2mMe`{m$W4;^d*ONj^M$s+LRa~?3-VQCWZ>UuqjMg3x4!KRs{_!C6 zY~uE4$M9E&n?Hv_kiQYy#T^Z9$mO}wl1wt>O|ZtV-_5EH+tm&=Cvv+|BM`Skw$9cS9#ac|8Ue#G?1`)=-?hTma-g*(lc{w}l>vrE66K`7uZvv5X2ovX2G>y;)} zVI6eDdgr|;FKj|OeF0KRY0Au_At9?)zi`s*U0ezmISo9v2x(dim`)#t{biivF^^XB zDAaxKv@YOoT>!0vvv`hrctfM%_f`SJL)#Mbkd8lR(vgh8OBI~E&<4E_f@F-9oxS1V zoaer=$4c4UQ=@Y2aSme4CwiP`?Mkk3ys=!yEhi>ljwz6_do{11(9eJL7 z&Zck)lt>JJQ!#c5)9Vl(%2fGe(1w-5eigHPYIHsQWY|~l_c>A9wp)-=rci48$`eP^S3Ps6()>Xdh25x$@J$xv+B+p@@01U0MENKM zJOoE6BAN4WL`u=iHftJ-9~{a`V|fv32>8++xbwC+NB7aZe!GHgycoG@G%J${xp@WE zvvTRIkcTdYQqzv3f0*@O#QJB>;iv}vaXN|BSL$>^k~}y^G8vU$n^*h6l*aTQ!V5>w z(IK$nh`1-?Q_t8X`ChsNVHJ;(gWC^BPQ-q^Tn)?HL1pEkWmd*axRRWRJHoA9p0$H( zg~H915TuHnz3gtKUujp_7u3YRgH^~Q!Po9ByIDSI7RPs<3oA>fUc${^;98l4TLCr? z_f6c#Q*I;8@!Yl6<%OHQew9VsO;DvYC;z>)I0+ykEfrZN!!BiO=(4o{w^vqxB9|9+Aww2* z80d1InRT8HS36VeXg^^60E10UK9+qtM+by(b)@+XwA~+&jsGYGd11!uw^3{7V-yl5 zY&prj19z;hh$H#AxDb5#n2-ktCZP-N8yb_DZC2smAWAPAKLHY}@JK1+8p-&TlabkF z6%LoMF01hS5_X|gc)oJueaAKv)LFC<(nQ2(=b2eO`}Tik{&&#vr??Y>#>s7%T%&NsuQbikFabfr_S^du+U$BwTh@o`U^<7p1XxWaT-dX6i-(3M{8N^f$~ zeLQ~ByP~#!|VZ$6A=iSFl_Alq%M>P-1!Oq;jyJzKFQT<)6S$Ldcg~V$! z)<=(1gKCkF!GZkxs45zCi(S?=%mZPB_5T-p2y+ZL$=B9ooQ%#MkA78gM(y(oofuGyL^~`A1G8ABngxfKtwikj%1C9lmPawoqv01++Ap+sv_C@)64sW7NA{1chV0 zr`9~a2w{WrfS)NIFwU{wF>4-QIu?&+n+FUr@EvnmTkby=55yy-2Lj4q@5}MDso#C2 zzX~25;!iF=#G^Hh7kiZ)K^IFu)fhww;blIC(YO|V&YqP*^}dTHVQLbLm-`nTH4!_p zB{G&D!RsR0The|^M{otKyt&H)(dLIxSJi8m{){%?jT|+XoK%`i8t{zG9mHJ+CTi|tBd4!McOeYzk}z})5ZAoC9=s7Ccpmh^6>5(2 zd^gq28CGC|n}yfmL29q-IyW2c zSM@-}-`GSAxT@$KW5>4PJJNzcuZyeFkC*Xr?cq9m;jTRA-K@$JJGt`E zx$N_Cs^SHiiv5jLg^j<>+$>oahe3l0Do&SSR#A@};%A6!>Y0PT1j*YAu6c>eWX|O> z1m*r^vKHVn-s|jF4^rZIX{Q2bzcTcZDl3~`Rok$vL_4H^8;g%X{XW)r!b#>%tN{28 zt+iVch0=FxdzIlWZ2YEwFAav??BA%VpD)tSAiuuCl)LOb)T}|kSHq_NSctj$oYUz) zqOv9x+8N-xg!R<#_;@TdDBc(x@cf9CXMsS%nJQJFa^#(mUVB*l{Knf5h{2*)ZxF&T zPbGbp+Nd||cYjb7Tm$LffN3-n^^a@tjn@djDdYEG`@n0t@M5Wctd#%CkrV7gJ6KKB z4;KP4JBz=_jIH2sA?0MLL%VoU`61N7m&?b+J^2rF((AME5)lH_`vVV<>w&1#tRTXp zY^dQEPew7X1%Oro#ka$gKJ2LYCa8Cbi)hkLIbH_)S=0wz5l`@bp@C_s_z~R3Rp&p- zSO~^kY^fuhwV}pFI~kpv@>{acQM0x&Vd0FXZ1y-`XXYJKWv7sj3xye<0td&jm7@0ei?{ch=u>her zLSwi8VcA5h?7o(#B3ECVVk4VnQ99X(cvC5k_q8k_*1}AByxXrg5P<^;)i-r zGlb`{HI-&{C4MDBNjNo#EqnF7U~x_n6wQpcJZrQHro2J5rA0Ae;ot?HA=K{#T%>y+ z0~$|Nc=-EY+%H(*@O$0T?*f=RxfEYp|65}K9W%7i%tYu(znT6Edg6%;hiv^WatLN) zInILdU=jiWVKV`95Z4d;=cAMP2NKw*9O@|(%)~NhG+%>cb?7&EpdfRIXoB@!9mv#} z8HcY0@>hj-<5|gL)(AmO=r>$TljD@@<$Thb>&VF#{_%#;ZuGmyto@r*$efOH&d67D z(aBt7?&O3-$D6s6%h9iIt{r+BJNMAF!%j0Z zbMa-!x0+(eZXAuw+PCoC^*Y}$>H85#50$>RFzY{|{lFt>$u?DTf&tbh-in!LD1R_% zKAC6P>0vZ&MafUr!zYxVus-k;Ecwg)geOkemM3o6u*!_ejLFPy{tVFOzcOex0QNFC z3IJaUfhDZZ{NOz^5MXzof;7B`v*0~{0G%d4X1&mvJ2SYK&Lr$cXcPzHI?Y?ThPjLL z;D$DHUzq*k@QbVPCC#K#X&A2!`kgZRr*$ zGyO{bPD7eqi&XZ}AvH`Q=OL8jky`STN!_bzaN@+f8l1EFK?1Gi&vG~iUjc>EMYbbI z=eiGOOxR{yM|BC0Vd)w*hFzuH3@(*6IwPEYPR&6)w%0ggPK|9IlBKcD{$YkP$!a-Y z!(*GhQBK*&*bbm6?y)_Y=~cv@isS^J%%yW7M~!VR$Hc@DyQa~T;eU126VOyH;AnXo z?&(d47`rhO@zCIc8k?e;BNP{u^j|CbGnLYx#g_Eve5F6XN@D$4z-|VjKc=lR{b3PX z|7l3V7#ssj`g8f9`f~y6KOJ|aKQ=^Ie=ZRHIU)LUK}r90qCXcZ{aI{Df6iC>^KLim z&jNNc5dHDuwM_prm|ofcOe6>B&*g*a&jqaiOx%_JSj@8iTp;>$LiFc?lK$&Oe=bz| zv)GdUoUiof2Qt>51?*-Z`lncbnzQokIR-`rfB2bY+myzp#>q{SC&C!~D?1&40Zb}m zFT;2IaUYpPdSy?cy=!xkDfYpn3$Y>}d)`X=~nGd3}^f|bYB&bKDk?|7lV{qNXIIg9*&|cAzaZGW9(IoFtxjy(p zTXn~B4xf!d&gaQ^tnZUiAAMQiX?{+(c(+EA^i3@2eDo=AYY0Cc<72o|;3z+*AC>eG zfsYBzhrE}e?s9>rN&YL|^#LEvuXr5aq4_S|WBBmh9Zrvp^u^DiiNgO&lK&YW=N}F- z42Btg7#u=0v*K3NYLHqJrF6Q`*9yGS!;}wrS?ALPo+3Hlid+}-Vcuqml^#xqeOp2E z9pr>)VuX2KB&7=lzUJZ5B3kXEyG2&e&zv6#F#M?Gd^)@ot$tn7hoYQLM!0m2Nc=^J z(+>ikLsy1)zoi#2L??N^7WUD#LixPV92FRlwtPFzwRTmC6y$S%@b6`DpBuD?7f2P? z8uJA+kiS26t&s(05n~Ss7SPzw1&cD4s-(L@*BUuI%p$e{3wxPM5)ph4us!~3jZS#e za56?$(i%ue0qYR#69L9*=vu+{2N@ed|03Am!ip!YdG!&&wg8)t9q(sE z>&u|ad`i*tQq~17jJ-g8Xi-DOc<+4p>?>pe!<37a&S=<`v9W@s>21L-5NtAq3@*Ez znDTV|oDpNEOW7GT-0=C{Z&U_W_g!9*1l$u~xG=)-gF%Lq@RJ{_`?8hEK#8&jIll`t z{9uq_wz9@mIzmbr?g=o=R*t}AQtPdSFOLe31$;49iJW^P;{z7;R!l(p$NsT_)9Blt zDS*H5Gu$4TA^GzF{~S0AaFOTiz(jh%T!QpR%;kVXE6xKP;bm^?;$s1yMq3Ozi>myEXQa zIAe!2c2&hNV9#sp615vDAu&aPo0$Z#wy4-UoY_?Zp|0b)SS!220 zRn*RtDcz#5Kx_1FP(H0Omgl1jIbhPmbYFn6O9i`%w)yV|kS+T_z91Cf?XE;9I9OvaNqZe^O0bH)rm-JY%nS~pUpm;l zU^TtwU}pzwC?#{}je#FktO^dL84k8CIE=P9SX*#7UEyF`gCpo(2iq1LNrxP4S8x=) z;b2z`KtINg)-v~C)BO04t`F608-q6@0%M-#*EEY>F z?`u{?=u~PF?4Z#Y91840UG_|%E;Ny@&{(E<D0wR%2&cjld3S><+6rG?@+ycF=es zFbh~EFJ&O%&5CnEQ)!CE)>qCnPNOv%>$aAMPNN=;J!P#Aolg4%J7}1dt-!t|*u%y_ z{CLqc8w+kmM43j1R9Ub+l6IASC)gD#QT{mC8=CIatE<=@n&DuNM_rh4kN>JtnbBqT zhGyE726;Xln&n`N1Gk1|JJ_S~TSIf`u+oKIjouNO%MHipVehNaTSM~{LJ#9q{!Gl1 z5#D0Oc)u?&GdQ1`1XFQo0j<(yd(4@^1$3!kSJ56sqO)kfE-RRy3!P>2^cKu7h0dm* z=(3TXuZI>pWg|TYLrds4Qg(&J)+O|N#ZzN%IoO9mdDASe%2EGNXem9RvEO=r5n4u7 zv$^ab@yJ;&uYQSsZ!|`K6u8sl`(fhNuA{vg zW4o-Qq4T-k!^GaRfzk>Ku=i}Bg&Je;*+3gK#@@4mc4&;f=e@L7W9&UGbhpOXds^s_ z!ic@6h5n>5_MR-gr7`xNRyr3?1FQ>sPaAb>jJ+pE`viL`SV*Mti(+()(Hc3P#e-+IP{FQUB)L!562chKDqRvYf5LxLS7juTz9cOmO?ka)az zQ)H3Cc*GTG-`NV|QQSi##hnfkN2zUelg2pmT}t-~rh04#J>g)thIUe533K5dn;hOn zQv_2zwwsn~jC*W1wP}odY&YG_4?23DzMLKr?E0Z|qSL~c)0dWU8CzlqR*MG(V@sSF z?xVoDT*kBL-0&Wnr7+A7=Y-!+Yc%#y#q#hKbcKVh4_`^QI9N7(75zXk)uIp3YYuj6 z=!2A6&JwsqTf} z<9_%E-K{b1ha2cMjj`o#q**Ju9$Vt#@J)2BgWcr4nLh7eUivs4a)7Wo4?+bsDexNYe?3(bc^oGVBs@NCaPczPwdMNvN_%`Zsu-n3)qWunbclgtE z$icoCzMbB1um{6;P~B>q%Xh+`p>s9%P{pC}owUWlei8mG-QZwPgzuue9qhN^&(SX( z?D_EL=_LnyC44uHJl~e^R`?4v#lft|J#?X9%GUo%eH!C_xR3U0j4l5qI=F_p93-~< zmudf6g|X$oN^fb5$HN2EwvNlL3Vhw)j9(4CMKI+(-=H5j*sY-l={3RFdt#Aq(yH}b zPkGNnbgjnNdmf@sXpFt*A$mkGwK6_HhjkgxG6yKKL2=<(=G)XP*j0$1Rgv$|D#30H zyq*{y`7UkIn3)_N`5x`k^*DZhpY~~trGKA3t1*`TeY#)QJ8X`L{E!X_rabwF^qj`n zf-V`I966L7x>&S@1D>L}P51$JBXhtUO+gHbj0&3ol^Jt_pl7I63k--5}VF zw7Ozid2GyoW@3nR!9DmA{PoJRfg6_4pY5gd+3(<>d5ct z0>N&iz45ll)6}N1|EdW3pP@dDooaPNo~55TSRwKUT9hSxcogG#h}r~u%J@EZf?uH9 zHFiln4eYZUnQ{-lS;J-D6YQzr3s|YXKtEBK@e!OlEtQ=bZwB^=F8gt0d*lVGX=N^I zo_>L91yj;rpc%T1r5~X~8e{24=-f>u=|^a*#(oA}j?mQ_drq)B1yhk*v8*DrpfKfW-RYzBn?Vdl;Eo|-Y0y+ z;+!#IhC8J6T0f_+^_wVtNpcQJ&i^cY)vCnP{j)IzS;J>V|Npss*5OFph9-7%RGRH( zr`f_PjrZVX^aiy?I7h+$wl(P%qp}ib!m+z(NZQnCH@B?xPPU@dQ?E*IJ`&_wZuouZ zY0~|oty`{2vn-qcKhmPvk&-4#&(8!{lh0tkXfR*0dyr}Vk@WFfq%^rpY;sp{a82Cy zKR&mAL{E2Jw?uauTRN~tV1OmvH2>VRTdRL0eSEtOEZyS~pOnbsPP@JFAJNBM*KM&{ z@dTxh^7j8SS(EcILM>V(49K_Ch2ycMG*hPxqL`ed_l$1bz0=WtN zV0416$9{hd*Uh*>xUR!>J>I{>aNUe6gzGw7*W;K#4A;%LLb$HObv>lTaNUe6gzGw7 z*Fz@nzs3Q*I8)E*(SUfL0$7P17KXD0E)uw0;97xMf$e}puu5Ud?E?1*d;rj(pG!Ju z%!rPrIG{npj9+0^A8qh#S4B(Xlaam;>zL8TQp{>2sWCc-CSsRiF-;TtI_ff8@a}7I zAP3kRV|Yt=E8w$ua&8CBXK1@nZlK%zX}V41wt>%c)B*l)BIhpCXY|ldAghN~`Kyc$ zV(C}Q&hQUK!>gs%9wS&W&Det@X}nu7Bie#pg8!(P47kca8E-*ePwYYIuLJu8e$3b< zG`oammzI8)dBnKhxY1K*-faBVGr_zM@N~0H__v`g`^+nZ@(SU(SJHbWeS@TLkn}B* zzD3fz1YRMs_6oc~;4K0lK-=;D$Dq&`tjCdK;Lpr3{I=xR5$}9(ju&4)WZT{?Hosr2 zaX&a$p_H|{T`YFB?6BM}wI0;g+w9ryx!T}e^gTvX#burc#d^2P4$JNIo#2(8+v&$a z=1^DhF{B@l-UfJ&{|kWJYq!&*@fv;H$C?m&v*>)ea22B2w0g6djEju z)6syinD=UwE(83n=X~V+$ zWA}LviX9G$|2$=U-t!nr|26z3;5rYW*yj)QdV;x46K=~i&srbznF9Dw#dP1xLirct zPo4{X_lX^D7I>e*Pg6Gwy5eq*-LC=+*rv*MQnmjL>JWt<>zvwf}Hv@0_ z_86z*i6LnI(5UstP42Y-{=MK2VEn%VSV{i{SVeCE4kZKc3PzF-uuf>wLQ^j^O%z5x z*8iZKA^Ec;f1c!DDfw3m{FuO-1>Pa>E`eVb_<+Fg3H+hJM+H7EaGb&X8w7R={ENyl zIsb10M_VuW8xg}^0Zh`tNF&}g{seF=Jr9_nKLbuCGunvniZh%m@EplsNde@nmz-9C zTd4s#Ma1hy+DUEER(d};zhB^|1zN_n^r6^Tf!`JQJA_he3VX&%^LnuS{vIxk|_@eJUB9GyyEX0 z#r$WT^lQKiPvUf+!2JRbNd94gvucG#V4uMK0uKm0ERa%6vtQr=frkasXwFXwoF(u= zf%^p>5O`Q1jS)(Lvjko!aKFF<0uKwMu|g?umcR=I?iYAK;9-GOCzJxeK!<3QG1?f1 zAMlxE%rO=k=NapbON|d0pD-RYUNhb@=9xM3Ci717^X3oD|1f`LK5IU2zG=Q~Myz4h zNmjiz)tYZDwJxyQt)12t)(zGtt*=@STd!MQ&qc}vsOM?VA3QN{ zvv<4q)86lSf8%}L`?B|KZva1kFx)rJH_JEQceZbtFX!v^UFLhAZ=dfb-zR-{`kwIp z*;nbW@sIVN;&1d%_BZ>_^!qUX`te4Q$5jyXUj(BmirJ87!UV=t5_4}AM%56^z15V$ zb5pP9eOQ&%g%~~%XLwD;Re=8zxdw1^^utch5$k^;y;W#BBex*^)8Kxda7Yz%>dAmV!8sKZyDRwf2RJ>@0LtG3n)E09#+FHc#p=Su+iXMu z@*4QtOXN3B2aMwV4zw~57ifraCSZ;69>7t?Y`|J$E?V$3eoZC_ZqoptLj(!ZAMu^g zAofz;1DF71f{qxc0KQ~o0ADj20ADvw1$@Jp2*?L;67&}2Cb5h=h1+dr07GU2V8lEX zFlJ5!tTZPBCd{eukZMp?(NIuU(Qr`0XFyp+CxNnxQlPA&F`yhm<3Txu(x4nd6F@nH z>Onb#8bLXPnm{>(CV{e=P6K5%HG{I6rh~GYW`MGqW`eSsW`VMr=74fIe(7xn-m(;F zH(i4@+f8&U_7M-$s}wQ5V%%$f#eC5GuK7*tKdl$6A)cRkzwZ0C?}xr$_@485`go

62(tSI^{0G^4vc*P3I!kY>Fm(SqKt)(a=mIl1ktvmL#; zbF=LQpo`|UixSzwc3^Jyz_xDdW)_pn@+Y&1)21l4xb@eed8$h~(*4UPo;EOVGV)kU z+#JPEA4rCyY%`YR+j={4GigzAX?7_N>Tl!5w6xITV!mr}`$p<4w&n{RNEA2H%I(FT zTxa9F?OoZ<_EsA$S-#kKR<0{oK+)!0Ps`liLLt}Hvn1P<-JEM%wWW~Dwk>LdVjV3l z?Op9X?b!||Q*$1KRpX*k=8WTzx%**;R=$z%(mVA7a%RqKoZZ$&v%9-h9kPhgt1_U>HCw+nW!ZOazg zvt2!Ndpml1b>^}{8;6cXo4fLb++1`#Ey#8NYBzN$*{Jjd^TPIX*=dkK{K)p?XkKn( z@8-?9!kj|>5^2!N9?oWm70QCbXUv?~(gJ_cMHrfm=N8(xG0s7*y(3qU!H0~t**)-z zjlC#3tGC^SDN$^+62$=Vr6TZM-Ck@jBcEL?<~lcaY+u#hU=ofJD44{(()Zl;n>z@!d4bc!b~&8u=|h8U#~_%eo1sbEF+5{1l| zIk}}}8&4$c=FWI11#)Mi_-~BvD{`IrZ8?Ir++X&X)V6BWeu98b(tH)>Xm&?O{t~## zHswYO3i(c5A|{hyE2h!8_IyE`@`cW9kIscvbPD#;DJNEQyyE!Du}SVNh&r2T4kAfm z`^sFl(7J_|WP7$q>_Vj6jAVzps&`>1r!w=v1qskPg$a6a$;uWhR#)Xm|Np zIAf2+;EuA)6}e4%xk%!(;A-PoNw~13`JR=%-QD>D;_CcMTXPa3O3}HLHM_7GlYLhY zuUAXCn8+ZzZCN+RM<`e-vFS@WnidmDPbo83CR2RRZdggn{}bbhqtvQA>G^L_*QPwJ z%N6p}b4lJ-2#$0yCQ&vS4M6*-k-E$!tfI+$ze5_T?~WcSj^MGItPA$V?UZ$o`G zoaXelcQEG2!0=&wqq>P#uy&YOWI4Vnk7Y*=vn=I%wgAFiTNV{D(0j7*FIKlVCv&$1 zQ9LkcIS$Gd)Ob^s#PR1+kc9No7S6)5vq&wxJjL3o(4$O=Ru<{J9<2O$4M}QmL%Y4a)%(fw=p5N0yh@Eva20WM#xf+d~Q?QE(p(RT#>^JLTVgvBwy6o z-O=9Kj;!vM`IqW6WJ%vIE9eCktwKF4tf-)F3p#svB*WoYHs64iJ&kaNvax=4;0&HU zU1<3e2otdNT?AlkV=x>)nyHzulfyRVrfuzoe3zsLX|;Z`ZFIHX_CtH{>IdF;ve|LS z-i46OYW(t(^*af2lg^kqsimb=J&{WX&&^}ii0QJsw}+Nsp|mu2sl#v;r}1o_zeGs+ zVfa!`vAGn22ay6giu1F)N>#~Kd0DcmEU5}dWhdn*TjX>%Kl`x5F|rlc@hn|(I@{8v zoPTJmcq8wd{Uv14% zE8bD&sEtxcZJ{iF87`~y3fKWm0ox=L1*CJR$CP>GrKlZPH}#^l5nl|9V%LuRDeR7> zh?dL&?IzF_aG#Exo!Ix?jXVFF?Qm2jlU*e}nz{*j^{6!wcbYi3zQ@r9KR^BMS_sX9 zh#qJ~4u52R6I$DWRwM1l3J_^(U`|_c<>?Z@6w*1ocfLg0)+XAHfu5}I82sem;Bw0~ z&C^DFb5L161sUzyzAPL1ESo=|XR?s{UR+sF;`=7(ryTC(T$!c^6dS>XOO>ABw{mcP z+)o=p*@L#^gx6s8S*GgqZDJd?6L?M?oM#c-3gQ==!F@o>-j#LUfk)@cG8sAaRx31P zPiAjrncVUe-l4OnHt1BFVC>yo#=Xgw+zyQI?bHblY`0EaUC84R(MX1Pp1b$m@>1d{ z7mM$7K?||W$%9*FBP8ZU0^1W7?7Mz&LM&iFuvth`v;$1B(u9gUl(;hn3blu08)|OG z)gy*rGjekgnT1~p-OOcMG#55O7tCWzKw~c+Od~cA8zu{`oaS0=!jiO<4D=3A@er}4 z*-qL9>Q>}-f5Gq+x5YN#G4_u79pZzoP{UWK^TE^&=Ln`28}0=mj$4U~TtVa;xdF(uFA(vs)3i@rQ&*q`0L zh87rvFFdiwV%G^jm6RJW5tmQ7te;u{k#{FARKh&r@RYNj3=7{E2=b)OV~s2>ElH!k zZ8!aH*w!sW(FfhLPf zt@+fP&kfuJ!}D5*ClVEkjJ_*Z0xeDSog$1`^7P8_iwV_4sumDxvB;L)jH`g99V^O9 z#}t-L_VOu(e&u;a&2yVTr_Ja3&gR9R7(?SgQ^8RQ+X;FcQoI~*L!BmESULN7!2r+jvQJTzTjFg}%XjfoSa&0#%AHcS8-gz2wn&}FM z{~XRP)AwC>d=uKF|A&ld;oE)DB08@Z#^vsy8uf^<5@}xH@x08dOd3(@ya8p_PIz`b zuIWUrAGmSMk?xsieWmj+Pkk(R!C%Nqk>N=hM!*XYAHvBP1JgGoaj}s|`H)WZ?Ex9* z^nHv=apD8`NbiuuZX*^n@Io1#SD^^qZo?Z%M!S~HPKq?joe7-kaBnWixczeN%R z`E61P(%lZJl2@m0X?3etw*NMey0OQg&p@g;_(5w9RgzbCPLNc=o5 zW(9DI`87odTB0OLNyD#6Bx|i?LBYgw(5gz@Km!eoS$-pcE9Ui^W@47lZze`2M*937 z%QQ{c$O?cc;PqR;BYv$AYlW;pAU4t;6tyfDWW_*WngPEz1{;_r4qutESitWKSY}Mv z#?TdJED#v(4=J7k0|BlX;3_byq$m30iRG57R3r(VrG&a9L*+zT+G+Xy9>}gYPxjXY z5=}8BMe$c0Kx==ZW&(e;2mSiP2!1vx7VrCcqVLhlkQ<4n{1u710cx?GVtG45)+mlG-Ug6Z+Y9i`=_z^IR#7w;7$q&q-(njnwrj3^UD zQ8(TjQ+*WgRrNq**9vitjVMF2v}Oi%o)CZ)GSEqiyXp7CYnK?NKcw!uAR5&LQC$!X z*%ITu0aXVHRf%(iT_~h$g>-i}v?jUyIYn=qxvd%}6?VnBN0U29eG#jGooZ z>^f!u?vL?9iRC_=pv4EnJBeOr6CrjaQdp9K-!mpVf=d5E(gC;>j@%`U8klY{fj+;* z8mZ=`#k^J`&Aph8`~6YLh$_E}njDo9SsZ(e#^BQ)GR$bg?~V5gm2(S_3C{sR)aC#2 z-fDkX=mKa8`$7N}@By~~6T8Pp0Ow2Nz42a@fff7}hqOx!LZ%vjA%{Uo)Ir1xffCtK z?p$^^0m({)5B7nRa2gdx_yQ6ke*gi)LL3SpVD{aGh{Z$pWo3tYsc0qY*$(wV#4=_S z@3nm5gMvljbCQ75sYJ+w1o#+H9ymN0n=~K91JsTR6e(HTaalaoS2DP}?x#bC-DA))H@RG$I z_<(s5#dvz*1l-8)LHaHni8p2LLJCt9rXY^bW*}H;n1NBu41*h;1O-NMbVsu>!o84& zKM03kd1D3PuTW?qgT)NaWw46Dn!s0gY*;;P%HgZ~_T$VwdHRTMApC%u2>^V>%Gndi z!;dKj{qR%EgJ1vLU5~CAwf)&UKX=8)PpLgCKYG(+H|~2TcC)fby!4mfeCs!#>3i#r zrzSiZZ(08AUC%sy-lwO|dbRWC?Y)&}U-7LsKDWYu$A}&E-@In)sxRNuQr!RGlRcm!7^t}4ry7-{-qxXlW};40eqwUf#H3r5UD zpZh|lFAB0LxKfsH6ecw37_M4}syYU6N`)Zgr*YNeY6=lLU1s$dl8A7U_F*bWjO67; zVitpu*r;Z&vKZlY3EZNN(`g3v44N3!$%;f+z(;uvfPojQ#N5G{8DuC!N${wH<2T?? z636eiX#yFliB!m;-~pLPAq;DR0B|fa0O6v@6|RCu9ULhc|KOtt;=MuXqW@A9)nvdlSyYoD$AtM1 ziy{z&1}lDy2b789yzA+f|Mo+XcFYGRGzMQlIJ^1 zlYq~GJ&{5eRUqu~xVF6nJW=2Q9Esn%<4X8}G_JjzdqE-vvjZE%3|KKyXZLnp1?RdZ zr7*MB&WAJtl5)f-*p0FgUIm+pI?<=^j>?hDGHtU=1B=Nb3QH;eUM-i_+okouu&Q$0 zfN?CcfG6seyD@9HsbNGR1?FdhCc8RE)o7wgS4T>Djf@Qm*SrohLJkE|z_EVQHINd1 z;?GSikRvq47AqjQcyE(i>DxOBtjO{0!7NprLh2iC5k^MagbeQR-a$Ub}x0Ewvm^a zMFVtx4t_WiPkw$W&L^Dl?E=oK!w>yAC-G9>xhu6I-eFrDdLl&9og-CYBj-iQcg(<^EW@dp~?7e`sNLPEv$IE&iC=>ZkrJM*z%Xh9KL7a_5S#EFR#D*nuVjc z&&uEa>yJM8(72OUeC*OOuYK>DuWbA33kUZ6>?8E~SBz(uFW;X!{VNxq@~5vq@Vimd z9^3TN%nPmWeE-j%&irxrSDzbw<<(z3`I(P==$gkGF8f;hU%yi~eT>okVDKW==X&Eq z@~a>`SB`{=Yrci+HlEVwt-R}ohWGqAuz2nbTQ>iB*T$c|%`KQWeM5I4&&Mx{8!pLT z!iS`ApoGsLT^Z&ljEeA?Ee}&Vj z67EiY_JA8}nVT=n>*!d5g97R+2f3V_QDmC8$AL$soBIEy{~ik%V#J|DedV<|W)j|o z56ow}g}BxnCVWeWG4)AXh=uqb*h*>voR4oEt)xY=U)_THQv5x$WkUE(&x=QS;amEC z5sxJKTaa?c%;J3WNHPHC;WEILH;flx$C5X>7GYPB&n57uj=0t;z1LVoIlo_5o6SN% z_j*1EF$Q!hZFdjk)Fw1dXt(+|1sln*0sl5G{>_Cne(|Ta!?AfRpE0hoZrSVHF5AIO zXMdV86&a4^^H9R?x_R5ZyG+l;$mb2|#VFx{-c(j^HR|z6j#9fOVNbQmx$p!2_?{Jh zSr#1BD^lLn#y8mkl{V%48?lSaThRnrwWzlk{5MMtZfQ4OtFVTfv6YX_c4>WiUW)F* zAY36_@y$xO65AXMTurfJC - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2c..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 deleted file mode 100644 index 9e4353ba..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -Function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 deleted file mode 100644 index 29ad42f6..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Verbose -Write-Verbose '--- THIS IS A LOADER ---' -Verbose -Write-Verbose '-------------------------' -Verbose diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b2..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b8..00000000 --- a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/.github/actions/Test/.github/linters/.markdown-lint.yml b/.github/actions/Test/.github/linters/.markdown-lint.yml deleted file mode 100644 index b9ecdfa9..00000000 --- a/.github/actions/Test/.github/linters/.markdown-lint.yml +++ /dev/null @@ -1,25 +0,0 @@ -########################### -## Markdown Linter rules ## -########################### - -# Linter rules doc: -# - https://github.com/DavidAnson/markdownlint - -############### -# Rules by id # -############### -MD004: false # Unordered list style -MD007: - indent: 2 # Unordered list indentation -MD013: - line_length: 808 # Line length -MD026: - punctuation: ".,;:!。,;:" # List of not allowed -MD029: false # Ordered list item prefix -MD033: false # Allow inline HTML -MD036: false # Emphasis used instead of a heading - -################# -# Rules by tags # -################# -blank_lines: false # Error on blank lines diff --git a/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 b/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 deleted file mode 100644 index 40d11d60..00000000 --- a/.github/actions/Test/.github/linters/.powershell-psscriptanalyzer.psd1 +++ /dev/null @@ -1,18 +0,0 @@ -#Documentation: https://github.com/PowerShell/PSScriptAnalyzer/blob/master/docs/Cmdlets/Invoke-ScriptAnalyzer.md#-settings -@{ - #CustomRulePath='path\to\CustomRuleModule.psm1' - #RecurseCustomRulePath='path\of\customrules' - #Severity = @( - # 'Error' - # 'Warning' - #) - #IncludeDefaultRules=${true} - ExcludeRules = @( - 'PSMissingModuleManifestField' - 'PSAvoidUsingWriteHost' - ) - #IncludeRules = @( - # 'PSAvoidUsingWriteHost', - # 'MyCustomRuleName' - #) -} diff --git a/.github/actions/Test/.github/workflows/Auto-Release.yml b/.github/actions/Test/.github/workflows/Auto-Release.yml deleted file mode 100644 index ec157c9d..00000000 --- a/.github/actions/Test/.github/workflows/Auto-Release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Auto-Release - -run-name: "Auto-Release - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: - pull_request_target: - branches: - - main - types: - - closed - - opened - - reopened - - synchronize - - labeled - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - -jobs: - Auto-Release: - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Auto-Release - uses: PSModule/Auto-Release@v1 - env: - GITHUB_TOKEN: ${{ github.token }} # Used for GitHub CLI authentication - with: - IncrementalPrerelease: false diff --git a/.github/actions/Test/.github/workflows/Linter.yml b/.github/actions/Test/.github/workflows/Linter.yml deleted file mode 100644 index f6f58f0a..00000000 --- a/.github/actions/Test/.github/workflows/Linter.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Linter - -run-name: "Linter - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: [pull_request] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - packages: read - statuses: write - -jobs: - Lint: - name: Lint code base - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Lint code base - uses: super-linter/super-linter@latest - env: - GITHUB_TOKEN: ${{ github.token }} - VALIDATE_JSCPD: false - VALIDATE_MARKDOWN_PRETTIER: false - VALIDATE_YAML_PRETTIER: false diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 deleted file mode 100644 index ebe988d3..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 +++ /dev/null @@ -1,75 +0,0 @@ -@{ - RootModule = 'PSModuleTest.psm1' - ModuleVersion = '999.0.0' - CompatiblePSEditions = @( - 'Core' - 'Desktop' - ) - GUID = '20b37221-db1c-43db-9cca-f22b33123548' - Author = 'PSModule' - CompanyName = 'PSModule' - Copyright = '(c) 2024 PSModule. All rights reserved.' - Description = 'Process a module from source code to published module.' - PowerShellVersion = '5.1' - ProcessorArchitecture = 'None' - RequiredModules = @( - @{ - ModuleVersion = '1.0' - ModuleName = 'PSSemVer' - } - 'Utilities' - ) - RequiredAssemblies = 'assemblies/LsonLib.dll' - ScriptsToProcess = 'scripts/loader.ps1' - TypesToProcess = @( - 'types/DirectoryInfo.Types.ps1xml' - 'types/FileInfo.Types.ps1xml' - ) - FormatsToProcess = @( - 'formats/CultureInfo.Format.ps1xml' - 'formats/Mygciview.Format.ps1xml' - ) - NestedModules = @( - 'modules/OtherPSModule.psm1' - ) - FunctionsToExport = @( - 'Get-PSModuleTest' - 'New-PSModuleTest' - 'Set-PSModuleTest' - 'Test-PSModuleTest' - ) - CmdletsToExport = @() - VariablesToExport = @() - AliasesToExport = '*' - ModuleList = @( - 'modules/OtherPSModule.psm1' - ) - FileList = @( - 'PSModuleTest.psd1' - 'PSModuleTest.psm1' - 'assemblies/LsonLib.dll' - 'data/Config.psd1' - 'data/Settings.psd1' - 'formats/CultureInfo.Format.ps1xml' - 'formats/Mygciview.Format.ps1xml' - 'modules/OtherPSModule.psm1' - 'scripts/loader.ps1' - 'types/DirectoryInfo.Types.ps1xml' - 'types/FileInfo.Types.ps1xml' - ) - PrivateData = @{ - PSData = @{ - Tags = @( - 'workflow' - 'powershell' - 'powershell-module' - 'PSEdition_Desktop' - 'PSEdition_Core' - ) - LicenseUri = 'https://github.com/PSModule/Process-PSModule/blob/main/LICENSE' - ProjectUri = 'https://github.com/PSModule/Process-PSModule' - IconUri = 'https://raw.githubusercontent.com/PSModule/Process-PSModule/main/icon/icon.png' - } - } -} - diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/.github/actions/Test/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2c..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 deleted file mode 100644 index 9e4353ba..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -Function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 deleted file mode 100644 index 973735ad..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Write-Verbose '--- THIS IS A LOADER ---' -Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b2..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b8..00000000 --- a/.github/actions/Test/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/.github/actions/Test/tests/src/assemblies/LsonLib.dll b/.github/actions/Test/tests/src/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2c..00000000 --- a/.github/actions/Test/tests/src/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 deleted file mode 100644 index 89f053cb..00000000 --- a/.github/actions/Test/tests/src/functions/private/Get-InternalPSModule.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 deleted file mode 100644 index cf870ba6..00000000 --- a/.github/actions/Test/tests/src/functions/private/Set-InternalPSModule.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 deleted file mode 100644 index a87ac117..00000000 --- a/.github/actions/Test/tests/src/functions/public/Set-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 deleted file mode 100644 index 4056e2f6..00000000 --- a/.github/actions/Test/tests/src/functions/public/Test-PSModuleTest.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -#SkipTest:Verbose:Just want to test that a function can have multiple skips. -function Test-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" - Write-Verbose 'Verbose message' -Verbose -} diff --git a/.github/actions/Test/tests/src/header.ps1 b/.github/actions/Test/tests/src/header.ps1 deleted file mode 100644 index cc1fde9a..00000000 --- a/.github/actions/Test/tests/src/header.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() diff --git a/.github/actions/Test/tests/src/init/initializer.ps1 b/.github/actions/Test/tests/src/init/initializer.ps1 deleted file mode 100644 index 28396fb0..00000000 --- a/.github/actions/Test/tests/src/init/initializer.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------------' -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Write-Verbose '-------------------------------' diff --git a/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 deleted file mode 100644 index 5d6af8ea..00000000 --- a/.github/actions/Test/tests/src/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/src/scripts/loader.ps1 b/.github/actions/Test/tests/src/scripts/loader.ps1 deleted file mode 100644 index 973735ad..00000000 --- a/.github/actions/Test/tests/src/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Write-Verbose '--- THIS IS A LOADER ---' -Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b2..00000000 --- a/.github/actions/Test/tests/src/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b8..00000000 --- a/.github/actions/Test/tests/src/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 b/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 deleted file mode 100644 index f1fc2c3b..00000000 --- a/.github/actions/Test/tests/src/variables/private/PrivateVariables.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -$script:HabitablePlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - }, - @{ - Name = 'Proxima Centauri b' - Mass = 1.17 - Diameter = 11449 - DayLength = 5.15 - }, - @{ - Name = 'Kepler-442b' - Mass = 2.34 - Diameter = 11349 - DayLength = 5.7 - }, - @{ - Name = 'Kepler-452b' - Mass = 5.0 - Diameter = 17340 - DayLength = 20.0 - } -) - -$script:InhabitedPlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - } -) diff --git a/.github/actions/Test/tests/src/variables/public/Moons.ps1 b/.github/actions/Test/tests/src/variables/public/Moons.ps1 deleted file mode 100644 index dd0f33ca..00000000 --- a/.github/actions/Test/tests/src/variables/public/Moons.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$script:Moons = @( - @{ - Planet = 'Earth' - Name = 'Moon' - } -) diff --git a/.github/actions/Test/tests/src/variables/public/Planets.ps1 b/.github/actions/Test/tests/src/variables/public/Planets.ps1 deleted file mode 100644 index 736584b9..00000000 --- a/.github/actions/Test/tests/src/variables/public/Planets.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$script:Planets = @( - @{ - Name = 'Mercury' - Mass = 0.330 - Diameter = 4879 - DayLength = 4222.6 - }, - @{ - Name = 'Venus' - Mass = 4.87 - Diameter = 12104 - DayLength = 2802.0 - }, - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - } -) diff --git a/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 b/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 deleted file mode 100644 index acbcedfd..00000000 --- a/.github/actions/Test/tests/src/variables/public/SolarSystems.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$script:SolarSystems = @( - @{ - Name = 'Solar System' - Planets = $script:Planets - Moons = $script:Moons - }, - @{ - Name = 'Alpha Centauri' - Planets = @() - Moons = @() - }, - @{ - Name = 'Sirius' - Planets = @() - Moons = @() - } -) diff --git a/.github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll b/.github/actions/Test/tests/srcWithManifest/assemblies/LsonLib.dll deleted file mode 100644 index 36618070d5c9f5131ec66720aa0565c13e86d23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43520 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 - - - - System.Globalization.CultureInfo - - System.Globalization.CultureInfo - - - - - 16 - - - 16 - - - - - - - - LCID - - - Name - - - DisplayName - - - - - - - - diff --git a/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml deleted file mode 100644 index 4c972c2c..00000000 --- a/.github/actions/Test/tests/srcWithManifest/formats/Mygciview.Format.ps1xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - mygciview - - System.IO.DirectoryInfo - System.IO.FileInfo - - - PSParentPath - - - - - - 7 - Left - - - - 26 - Right - - - - 26 - Right - - - - 14 - Right - - - - Left - - - - - - - - ModeWithoutHardLink - - - LastWriteTime - - - CreationTime - - - Length - - - Name - - - - - - - - diff --git a/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 deleted file mode 100644 index 89f053cb..00000000 --- a/.github/actions/Test/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -function Get-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 deleted file mode 100644 index cf870ba6..00000000 --- a/.github/actions/Test/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-InternalPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 deleted file mode 100644 index a87ac117..00000000 --- a/.github/actions/Test/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 deleted file mode 100644 index 4056e2f6..00000000 --- a/.github/actions/Test/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -#SkipTest:Verbose:Just want to test that a function can have multiple skips. -function Test-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" - Write-Verbose 'Verbose message' -Verbose -} diff --git a/.github/actions/Test/tests/srcWithManifest/header.ps1 b/.github/actions/Test/tests/srcWithManifest/header.ps1 deleted file mode 100644 index cc1fde9a..00000000 --- a/.github/actions/Test/tests/srcWithManifest/header.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')] -[CmdletBinding()] -param() diff --git a/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 b/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 deleted file mode 100644 index 28396fb0..00000000 --- a/.github/actions/Test/tests/srcWithManifest/init/initializer.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------------' -Write-Verbose '--- THIS IS AN INITIALIZER ---' -Write-Verbose '-------------------------------' diff --git a/.github/actions/Test/tests/srcWithManifest/manifest.psd1 b/.github/actions/Test/tests/srcWithManifest/manifest.psd1 deleted file mode 100644 index 77348f13..00000000 --- a/.github/actions/Test/tests/srcWithManifest/manifest.psd1 +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Author = 'Author' -} diff --git a/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 b/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 deleted file mode 100644 index 5d6af8ea..00000000 --- a/.github/actions/Test/tests/srcWithManifest/modules/OtherPSModule.psm1 +++ /dev/null @@ -1,19 +0,0 @@ -function Get-OtherPSModule { - <# - .SYNOPSIS - Performs tests on a module. - - .DESCRIPTION - A longer description of the function. - - .EXAMPLE - Get-OtherPSModule -Name 'World' - #> - [CmdletBinding()] - param( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 b/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 deleted file mode 100644 index 973735ad..00000000 --- a/.github/actions/Test/tests/srcWithManifest/scripts/loader.ps1 +++ /dev/null @@ -1,3 +0,0 @@ -Write-Verbose '-------------------------' -Write-Verbose '--- THIS IS A LOADER ---' -Write-Verbose '-------------------------' diff --git a/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml deleted file mode 100644 index aef538b2..00000000 --- a/.github/actions/Test/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - System.IO.FileInfo - - - Status - Success - - - - - System.IO.DirectoryInfo - - - Status - Success - - - - diff --git a/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml deleted file mode 100644 index 4cfaf6b8..00000000 --- a/.github/actions/Test/tests/srcWithManifest/types/FileInfo.Types.ps1xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - System.IO.FileInfo - - - Age - - ((Get-Date) - ($this.CreationTime)).Days - - - - - diff --git a/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 deleted file mode 100644 index f1fc2c3b..00000000 --- a/.github/actions/Test/tests/srcWithManifest/variables/private/PrivateVariables.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -$script:HabitablePlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - }, - @{ - Name = 'Proxima Centauri b' - Mass = 1.17 - Diameter = 11449 - DayLength = 5.15 - }, - @{ - Name = 'Kepler-442b' - Mass = 2.34 - Diameter = 11349 - DayLength = 5.7 - }, - @{ - Name = 'Kepler-452b' - Mass = 5.0 - Diameter = 17340 - DayLength = 20.0 - } -) - -$script:InhabitedPlanets = @( - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - }, - @{ - Name = 'Mars' - Mass = 0.642 - Diameter = 6792 - DayLength = 24.7 - } -) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 deleted file mode 100644 index dd0f33ca..00000000 --- a/.github/actions/Test/tests/srcWithManifest/variables/public/Moons.ps1 +++ /dev/null @@ -1,6 +0,0 @@ -$script:Moons = @( - @{ - Planet = 'Earth' - Name = 'Moon' - } -) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 deleted file mode 100644 index 736584b9..00000000 --- a/.github/actions/Test/tests/srcWithManifest/variables/public/Planets.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -$script:Planets = @( - @{ - Name = 'Mercury' - Mass = 0.330 - Diameter = 4879 - DayLength = 4222.6 - }, - @{ - Name = 'Venus' - Mass = 4.87 - Diameter = 12104 - DayLength = 2802.0 - }, - @{ - Name = 'Earth' - Mass = 5.97 - Diameter = 12756 - DayLength = 24.0 - } -) diff --git a/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 deleted file mode 100644 index acbcedfd..00000000 --- a/.github/actions/Test/tests/srcWithManifest/variables/public/SolarSystems.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$script:SolarSystems = @( - @{ - Name = 'Solar System' - Planets = $script:Planets - Moons = $script:Moons - }, - @{ - Name = 'Alpha Centauri' - Planets = @() - Moons = @() - }, - @{ - Name = 'Sirius' - Planets = @() - Moons = @() - } -) diff --git a/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 b/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 deleted file mode 100644 index 00b3cde7..00000000 --- a/.github/actions/Test/tests/tests/PSModuleTest.Tests.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -Describe 'Module' { - It 'Function: Get-PSModuleTest' { - Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Set-PSModuleTest' { - Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - It 'Function: Test-PSModuleTest' { - Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } -} diff --git a/.github/actions/Publish/.github/workflows/Action-Test.yml b/.github/workflows/Aciton-Test-Publish.yml similarity index 100% rename from .github/actions/Publish/.github/workflows/Action-Test.yml rename to .github/workflows/Aciton-Test-Publish.yml diff --git a/.github/actions/Build/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test-Build.yml similarity index 100% rename from .github/actions/Build/.github/workflows/Action-Test.yml rename to .github/workflows/Action-Test-Build.yml diff --git a/.github/actions/Document/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test-Document.yml similarity index 100% rename from .github/actions/Document/.github/workflows/Action-Test.yml rename to .github/workflows/Action-Test-Document.yml diff --git a/.github/actions/Initialize/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test-Initialize.yml similarity index 100% rename from .github/actions/Initialize/.github/workflows/Action-Test.yml rename to .github/workflows/Action-Test-Initialize.yml diff --git a/.github/actions/Test/.github/workflows/Action-Test-Src-Default.yml b/.github/workflows/Action-Test-Test-Src-Default.yml similarity index 100% rename from .github/actions/Test/.github/workflows/Action-Test-Src-Default.yml rename to .github/workflows/Action-Test-Test-Src-Default.yml diff --git a/.github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml b/.github/workflows/Action-Test-Test-Src-WithManifest.yml similarity index 100% rename from .github/actions/Test/.github/workflows/Action-Test-Src-WithManifest.yml rename to .github/workflows/Action-Test-Test-Src-WithManifest.yml diff --git a/.github/actions/Test/.github/workflows/Action-Test-outputs.yml b/.github/workflows/Action-Test-Test-outputs.yml similarity index 100% rename from .github/actions/Test/.github/workflows/Action-Test-outputs.yml rename to .github/workflows/Action-Test-Test-outputs.yml diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md b/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md similarity index 100% rename from .github/actions/Test/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md rename to tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md b/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md similarity index 100% rename from .github/actions/Test/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md rename to tests/outputs/docs/PSModuleTest/New-PSModuleTest.md diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md b/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md similarity index 100% rename from .github/actions/Test/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md rename to tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md diff --git a/.github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md b/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md similarity index 100% rename from .github/actions/Test/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md rename to tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md diff --git a/.github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 similarity index 100% rename from .github/actions/Publish/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 rename to tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 diff --git a/.github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 similarity index 100% rename from .github/actions/Test/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 rename to tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 diff --git a/.github/actions/Build/tests/src/assemblies/LsonLib.dll b/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll similarity index 100% rename from .github/actions/Build/tests/src/assemblies/LsonLib.dll rename to tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll diff --git a/.github/actions/Build/tests/src/data/Config.psd1 b/tests/outputs/modules/PSModuleTest/data/Config.psd1 similarity index 100% rename from .github/actions/Build/tests/src/data/Config.psd1 rename to tests/outputs/modules/PSModuleTest/data/Config.psd1 diff --git a/.github/actions/Build/tests/src/data/Settings.psd1 b/tests/outputs/modules/PSModuleTest/data/Settings.psd1 similarity index 100% rename from .github/actions/Build/tests/src/data/Settings.psd1 rename to tests/outputs/modules/PSModuleTest/data/Settings.psd1 diff --git a/.github/actions/Build/tests/src/formats/CultureInfo.Format.ps1xml b/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml similarity index 100% rename from .github/actions/Build/tests/src/formats/CultureInfo.Format.ps1xml rename to tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml diff --git a/.github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml b/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml similarity index 100% rename from .github/actions/Build/tests/src/formats/Mygciview.Format.ps1xml rename to tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml diff --git a/.github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 b/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 similarity index 100% rename from .github/actions/Build/tests/srcWithManifest/modules/OtherPSModule.psm1 rename to tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 diff --git a/.github/actions/Build/tests/src/scripts/loader.ps1 b/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 similarity index 100% rename from .github/actions/Build/tests/src/scripts/loader.ps1 rename to tests/outputs/modules/PSModuleTest/scripts/loader.ps1 diff --git a/.github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml b/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from .github/actions/Build/tests/src/types/DirectoryInfo.Types.ps1xml rename to tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml diff --git a/.github/actions/Build/tests/src/types/FileInfo.Types.ps1xml b/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml similarity index 100% rename from .github/actions/Build/tests/src/types/FileInfo.Types.ps1xml rename to tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml diff --git a/.github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 b/tests/src/functions/public/Get-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Test/tests/src/functions/public/Get-PSModuleTest.ps1 rename to tests/src/functions/public/Get-PSModuleTest.ps1 diff --git a/.github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 b/tests/src/functions/public/New-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Test/tests/src/functions/public/New-PSModuleTest.ps1 rename to tests/src/functions/public/New-PSModuleTest.ps1 diff --git a/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 b/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 deleted file mode 100644 index 73a5c620..00000000 --- a/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -#Requires -Modules Utilities -#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } -#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } -#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 b/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 deleted file mode 100644 index d4e6e266..00000000 --- a/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - - .NOTES - Testing if a module can have a [Markdown based link](https://example.com). - !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," - \[This is a test\] - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [Alias('New-PSModuleTestAlias1')] - [Alias('New-PSModuleTestAlias2')] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -New-Alias New-PSModuleTestAlias3 New-PSModuleTest -New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest - - -Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/src/functions/public/PSModule/PSModule.md b/tests/src/functions/public/PSModule/PSModule.md deleted file mode 100644 index 79741cf4..00000000 --- a/tests/src/functions/public/PSModule/PSModule.md +++ /dev/null @@ -1 +0,0 @@ -# This is PSModule diff --git a/.github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/src/functions/public/Set-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Build/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 rename to tests/src/functions/public/Set-PSModuleTest.ps1 diff --git a/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 deleted file mode 100644 index a87ac117..00000000 --- a/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/tests/src/functions/public/SomethingElse/SomethingElse.md b/tests/src/functions/public/SomethingElse/SomethingElse.md deleted file mode 100644 index d9f7e9ee..00000000 --- a/tests/src/functions/public/SomethingElse/SomethingElse.md +++ /dev/null @@ -1 +0,0 @@ -# This is SomethingElse diff --git a/tests/src/functions/public/Test-PSModuleTest.ps1 b/tests/src/functions/public/Test-PSModuleTest.ps1 index 26be2b9b..4056e2f6 100644 --- a/tests/src/functions/public/Test-PSModuleTest.ps1 +++ b/tests/src/functions/public/Test-PSModuleTest.ps1 @@ -1,4 +1,5 @@ -function Test-PSModuleTest { +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -15,4 +16,5 @@ [string] $Name ) Write-Output "Hello, $Name!" + Write-Verbose 'Verbose message' -Verbose } diff --git a/.github/actions/Test/tests/src/functions/public/completers.ps1 b/tests/src/functions/public/completers.ps1 similarity index 100% rename from .github/actions/Test/tests/src/functions/public/completers.ps1 rename to tests/src/functions/public/completers.ps1 diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Test/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 diff --git a/.github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Test/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 deleted file mode 100644 index 73a5c620..00000000 --- a/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -#Requires -Modules Utilities -#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } -#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } -#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } - -function Get-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 deleted file mode 100644 index d4e6e266..00000000 --- a/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 +++ /dev/null @@ -1,37 +0,0 @@ -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - - .NOTES - Testing if a module can have a [Markdown based link](https://example.com). - !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," - \[This is a test\] - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [Alias('New-PSModuleTestAlias1')] - [Alias('New-PSModuleTestAlias2')] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} - -New-Alias New-PSModuleTestAlias3 New-PSModuleTest -New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest - - -Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/srcWithManifest/functions/public/PSModule/PSModule.md b/tests/srcWithManifest/functions/public/PSModule/PSModule.md deleted file mode 100644 index 79741cf4..00000000 --- a/tests/srcWithManifest/functions/public/PSModule/PSModule.md +++ /dev/null @@ -1 +0,0 @@ -# This is PSModule diff --git a/.github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 similarity index 100% rename from .github/actions/Build/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 deleted file mode 100644 index a87ac117..00000000 --- a/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 +++ /dev/null @@ -1,22 +0,0 @@ -function Set-PSModuleTest { - <# - .SYNOPSIS - Performs tests on a module. - - .EXAMPLE - Test-PSModule -Name 'World' - - "Hello, World!" - #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] - [CmdletBinding()] - param ( - # Name of the person to greet. - [Parameter(Mandatory)] - [string] $Name - ) - Write-Output "Hello, $Name!" -} diff --git a/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md b/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md deleted file mode 100644 index d9f7e9ee..00000000 --- a/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md +++ /dev/null @@ -1 +0,0 @@ -# This is SomethingElse diff --git a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 index 26be2b9b..4056e2f6 100644 --- a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 @@ -1,4 +1,5 @@ -function Test-PSModuleTest { +#SkipTest:Verbose:Just want to test that a function can have multiple skips. +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -15,4 +16,5 @@ [string] $Name ) Write-Output "Hello, $Name!" + Write-Verbose 'Verbose message' -Verbose } diff --git a/tests/srcWithManifest/manifest.psd1 b/tests/srcWithManifest/manifest.psd1 index 73e59522..77348f13 100644 --- a/tests/srcWithManifest/manifest.psd1 +++ b/tests/srcWithManifest/manifest.psd1 @@ -1,4 +1,3 @@ @{ - Author = 'Author' - PowerShellVersion = '5.1' + Author = 'Author' } diff --git a/tests/tests/PSModuleTest.Tests.ps1 b/tests/tests/PSModuleTest.Tests.ps1 index 2be65edb..00b3cde7 100644 --- a/tests/tests/PSModuleTest.Tests.ps1 +++ b/tests/tests/PSModuleTest.Tests.ps1 @@ -1,60 +1,11 @@ -[CmdletBinding()] -Param( - # Path to the module to test. - [Parameter()] - [string] $Path -) - -Write-Verbose "Path to the module: [$Path]" -Verbose -Describe 'Environment Variables are available' { - It 'Should be available [<_>]' -ForEach @( - 'TEST_APP_ENT_CLIENT_ID', - 'TEST_APP_ENT_PRIVATE_KEY', - 'TEST_APP_ORG_CLIENT_ID', - 'TEST_APP_ORG_PRIVATE_KEY', - 'TEST_USER_ORG_FG_PAT', - 'TEST_USER_USER_FG_PAT', - 'TEST_USER_PAT' - ) { - $name = $_ - Write-Verbose "Environment variable: [$name]" -Verbose - Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty +Describe 'Module' { + It 'Function: Get-PSModuleTest' { + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' } -} - -Describe 'PSModuleTest.Tests.ps1' { - Context 'Function: Test-PSModuleTest' { - It 'Should be able to call the function' { - Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose - Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - } - - Context 'Function: Get-PSModuleTest' { - It 'Should be able to call the function' { - Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose - Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - } - - Context 'Function: New-PSModuleTest' { - It 'Should be able to call the function' { - Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose - New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } - } - - Context 'Function: Set-PSModuleTest' { - It 'Should be able to call the function' { - Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose - Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' - } + It 'Function: Set-PSModuleTest' { + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' } - - Context 'Variables' { - It "Exports a variable for SolarSystems that contains 'Solar System'" { - Write-Verbose ($SolarSystems | Out-String) -Verbose - $SolarSystems[0].Name | Should -Be 'Solar System' - } + It 'Function: Test-PSModuleTest' { + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' } } diff --git a/.github/actions/Build/tests/tools/1-build.ps1 b/tests/tools/1-build.ps1 similarity index 100% rename from .github/actions/Build/tests/tools/1-build.ps1 rename to tests/tools/1-build.ps1 diff --git a/.github/actions/Build/tests/tools/2-build.ps1 b/tests/tools/2-build.ps1 similarity index 100% rename from .github/actions/Build/tests/tools/2-build.ps1 rename to tests/tools/2-build.ps1 From 9ec75ff6b701ac3fcb044af7432b881b9866a3f4 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 10 Feb 2025 23:26:17 +0100 Subject: [PATCH 03/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Update=20workfl?= =?UTF-8?q?ow=20actions=20to=20use=20local=20Initialize=20action=20instead?= =?UTF-8?q?=20of=20PSModule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/Initialize/README.md | 2 +- .github/actions/Publish/README.md | 2 +- .github/actions/Test/README.md | 4 ++-- .github/workflows/Aciton-Test-Publish.yml | 12 ++++++------ .github/workflows/Action-Test-Build.yml | 8 ++++---- .github/workflows/Action-Test-Document.yml | 2 +- .github/workflows/Action-Test-Initialize.yml | 2 +- .github/workflows/Action-Test-Test-Src-Default.yml | 4 ++-- .../workflows/Action-Test-Test-Src-WithManifest.yml | 4 ++-- .github/workflows/Action-Test-Test-outputs.yml | 4 ++-- 10 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/actions/Initialize/README.md b/.github/actions/Initialize/README.md index ec0f2b98..c59e0c3b 100644 --- a/.github/actions/Initialize/README.md +++ b/.github/actions/Initialize/README.md @@ -59,7 +59,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize ``` ## Permissions diff --git a/.github/actions/Publish/README.md b/.github/actions/Publish/README.md index 547ed2ed..e753fff5 100644 --- a/.github/actions/Publish/README.md +++ b/.github/actions/Publish/README.md @@ -96,7 +96,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Publish-PSModule uses: PSModule/Publish-PSModule@main diff --git a/.github/actions/Test/README.md b/.github/actions/Test/README.md index 2461ad07..c46b91eb 100644 --- a/.github/actions/Test/README.md +++ b/.github/actions/Test/README.md @@ -52,7 +52,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Test-PSModule uses: PSModule/Test-PSModule@main @@ -80,7 +80,7 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Test-PSModule uses: PSModule/Test-PSModule@main diff --git a/.github/workflows/Aciton-Test-Publish.yml b/.github/workflows/Aciton-Test-Publish.yml index 35bb52d7..9f0bad54 100644 --- a/.github/workflows/Aciton-Test-Publish.yml +++ b/.github/workflows/Aciton-Test-Publish.yml @@ -1,6 +1,6 @@ -name: Action-Test +name: Aciton-Test-Publish -run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Aciton-Test-Publish - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -18,17 +18,17 @@ permissions: jobs: ActionTestDefault: - name: Action-Test - [Default] + name: Aciton-Test-Publish - [Default] runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - - name: Action-Test - uses: ./ + - name: Aciton-Test-Publish + uses: ./.github/actions/Publish env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/workflows/Action-Test-Build.yml b/.github/workflows/Action-Test-Build.yml index cd9ca95f..d696b2c5 100644 --- a/.github/workflows/Action-Test-Build.yml +++ b/.github/workflows/Action-Test-Build.yml @@ -26,10 +26,10 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Action-Test - uses: ./ + uses: ./.github/actions/Build with: Name: PSModuleTest Path: tests/src @@ -44,10 +44,10 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Action-Test - uses: ./ + uses: ./.github/actions/Build with: Name: PSModuleTest Path: tests/srcWithManifest diff --git a/.github/workflows/Action-Test-Document.yml b/.github/workflows/Action-Test-Document.yml index 405a7239..09207898 100644 --- a/.github/workflows/Action-Test-Document.yml +++ b/.github/workflows/Action-Test-Document.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Action-Test - uses: ./ + uses: ./.github/actions/Document with: working-directory: ./tests subject: PSModule diff --git a/.github/workflows/Action-Test-Initialize.yml b/.github/workflows/Action-Test-Initialize.yml index bc42ee46..a975f166 100644 --- a/.github/workflows/Action-Test-Initialize.yml +++ b/.github/workflows/Action-Test-Initialize.yml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v4 - name: Action-Test - uses: ./ + uses: ./.github/actions/Initialize - name: Run GitHub-script uses: PSModule/GitHub-script@v1 diff --git a/.github/workflows/Action-Test-Test-Src-Default.yml b/.github/workflows/Action-Test-Test-Src-Default.yml index 0fa6911e..ce00aa40 100644 --- a/.github/workflows/Action-Test-Test-Src-Default.yml +++ b/.github/workflows/Action-Test-Test-Src-Default.yml @@ -27,10 +27,10 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Action-Test - uses: ./ + uses: ./.github/actions/Test id: action-test env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/Action-Test-Test-Src-WithManifest.yml b/.github/workflows/Action-Test-Test-Src-WithManifest.yml index b14f85b8..89f3eb7b 100644 --- a/.github/workflows/Action-Test-Test-Src-WithManifest.yml +++ b/.github/workflows/Action-Test-Test-Src-WithManifest.yml @@ -27,10 +27,10 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Action-Test - uses: ./ + uses: ./.github/actions/Test id: action-test env: GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/Action-Test-Test-outputs.yml b/.github/workflows/Action-Test-Test-outputs.yml index 84749eca..047c05b3 100644 --- a/.github/workflows/Action-Test-Test-outputs.yml +++ b/.github/workflows/Action-Test-Test-outputs.yml @@ -27,10 +27,10 @@ jobs: uses: actions/checkout@v4 - name: Initialize environment - uses: PSModule/Initialize-PSModule@main + uses: ./.github/actions/Initialize - name: Action-Test - uses: ./ + uses: ./.github/actions/Test id: action-test env: GITHUB_TOKEN: ${{ github.token }} From 8ab41006a211024d862d1e90b147ec3c89b08644 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 10 Feb 2025 23:33:47 +0100 Subject: [PATCH 04/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Rename=20workfl?= =?UTF-8?q?ow=20actions=20for=20consistency=20and=20clarity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Action-Test-Build.yml | 12 ++++++------ .github/workflows/Action-Test-Document.yml | 8 ++++---- .github/workflows/Action-Test-Initialize.yml | 8 ++++---- .github/workflows/Action-Test-Test-Src-Default.yml | 12 ++++++------ .../workflows/Action-Test-Test-Src-WithManifest.yml | 4 ++-- .github/workflows/Action-Test-Test-outputs.yml | 12 ++++++------ 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/Action-Test-Build.yml b/.github/workflows/Action-Test-Build.yml index d696b2c5..695c1961 100644 --- a/.github/workflows/Action-Test-Build.yml +++ b/.github/workflows/Action-Test-Build.yml @@ -1,6 +1,6 @@ -name: Action-Test +name: Action-Test-Build -run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Action-Test-Build - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -19,7 +19,7 @@ permissions: {} jobs: ActionTestDefault: - name: Action-Test - [Default] + name: Action-Test-Build - [Default] runs-on: ubuntu-latest steps: - name: Checkout repo @@ -28,7 +28,7 @@ jobs: - name: Initialize environment uses: ./.github/actions/Initialize - - name: Action-Test + - name: Action-Test-Build uses: ./.github/actions/Build with: Name: PSModuleTest @@ -37,7 +37,7 @@ jobs: DocsOutputPath: tests/outputs/docs ActionTestWithManifest: - name: Action-Test - [DefaultWithManifest] + name: Action-Test-Build - [DefaultWithManifest] runs-on: ubuntu-24.04 steps: - name: Checkout repo @@ -46,7 +46,7 @@ jobs: - name: Initialize environment uses: ./.github/actions/Initialize - - name: Action-Test + - name: Action-Test-Build uses: ./.github/actions/Build with: Name: PSModuleTest diff --git a/.github/workflows/Action-Test-Document.yml b/.github/workflows/Action-Test-Document.yml index 09207898..4b02d82f 100644 --- a/.github/workflows/Action-Test-Document.yml +++ b/.github/workflows/Action-Test-Document.yml @@ -1,6 +1,6 @@ -name: Action-Test +name: Action-Test-Document -run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Action-Test-Document - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -18,14 +18,14 @@ permissions: jobs: ActionTestBasic: - name: Action-Test - [Basic] + name: Action-Test-Document - [Basic] runs-on: ubuntu-latest steps: # Need to check out as part of the test, as its a local action - name: Checkout repo uses: actions/checkout@v4 - - name: Action-Test + - name: Action-Test-Document uses: ./.github/actions/Document with: working-directory: ./tests diff --git a/.github/workflows/Action-Test-Initialize.yml b/.github/workflows/Action-Test-Initialize.yml index a975f166..df99df41 100644 --- a/.github/workflows/Action-Test-Initialize.yml +++ b/.github/workflows/Action-Test-Initialize.yml @@ -1,6 +1,6 @@ -name: Action-Test +name: Action-Test-Initialize -run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Action-Test-Initialize - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -20,13 +20,13 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - name: Action-Test - [Basic] - [${{ matrix.os }}] + name: Action-Test-Initialize - [Basic] - [${{ matrix.os }}] runs-on: ${{ matrix.os }} steps: - name: Checkout repo uses: actions/checkout@v4 - - name: Action-Test + - name: Action-Test-Initialize uses: ./.github/actions/Initialize - name: Run GitHub-script diff --git a/.github/workflows/Action-Test-Test-Src-Default.yml b/.github/workflows/Action-Test-Test-Src-Default.yml index ce00aa40..40464578 100644 --- a/.github/workflows/Action-Test-Test-Src-Default.yml +++ b/.github/workflows/Action-Test-Test-Src-Default.yml @@ -1,6 +1,6 @@ -name: Action-Test [Src-Default] +name: Action-Test-Test-Src-Default -run-name: "Action-Test [Src-Default] - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Action-Test-Test-Src-Default - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - name: Action-Test [Src-Default] - [${{ matrix.os }}] + name: Action-Test-Test-Src-Default - [${{ matrix.os }}] runs-on: ${{ matrix.os }} steps: - name: Checkout repo @@ -29,9 +29,9 @@ jobs: - name: Initialize environment uses: ./.github/actions/Initialize - - name: Action-Test + - name: Action-Test-Test-outputs uses: ./.github/actions/Test - id: action-test + id: test env: GITHUB_TOKEN: ${{ github.token }} with: @@ -42,7 +42,7 @@ jobs: - name: Status shell: pwsh env: - PASSED: ${{ steps.action-test.outputs.passed }} + PASSED: ${{ steps.test.outputs.passed }} run: | Write-Host "Passed: [$env:PASSED]" if ($env:PASSED -ne 'true') { diff --git a/.github/workflows/Action-Test-Test-Src-WithManifest.yml b/.github/workflows/Action-Test-Test-Src-WithManifest.yml index 89f3eb7b..76b1045f 100644 --- a/.github/workflows/Action-Test-Test-Src-WithManifest.yml +++ b/.github/workflows/Action-Test-Test-Src-WithManifest.yml @@ -31,7 +31,7 @@ jobs: - name: Action-Test uses: ./.github/actions/Test - id: action-test + id: test env: GITHUB_TOKEN: ${{ github.token }} with: @@ -42,7 +42,7 @@ jobs: - name: Status shell: pwsh env: - PASSED: ${{ steps.action-test.outputs.passed }} + PASSED: ${{ steps.test.outputs.passed }} run: | Write-Host "Passed: [$env:PASSED]" if ($env:PASSED -ne 'true') { diff --git a/.github/workflows/Action-Test-Test-outputs.yml b/.github/workflows/Action-Test-Test-outputs.yml index 047c05b3..1ff8a5c0 100644 --- a/.github/workflows/Action-Test-Test-outputs.yml +++ b/.github/workflows/Action-Test-Test-outputs.yml @@ -1,6 +1,6 @@ -name: Action-Test [outputs] +name: Action-Test-Test-outputs -run-name: "Action-Test [outputs] - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" +run-name: "Action-Test-Test-outputs - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" on: workflow_dispatch: @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - name: Action-Test [outputs] - [${{ matrix.os }}] + name: Action-Test-Test-outputs - [${{ matrix.os }}] runs-on: ${{ matrix.os }} steps: - name: Checkout repo @@ -29,9 +29,9 @@ jobs: - name: Initialize environment uses: ./.github/actions/Initialize - - name: Action-Test + - name: Action-Test-Test-outputs uses: ./.github/actions/Test - id: action-test + id: test env: GITHUB_TOKEN: ${{ github.token }} with: @@ -42,7 +42,7 @@ jobs: - name: Status shell: pwsh env: - PASSED: ${{ steps.action-test.outputs.passed }} + PASSED: ${{ steps.test.outputs.passed }} run: | Write-Host "Passed: [$env:PASSED]" if ($env:PASSED -ne 'true') { From 42d8b67fb6dbe827804adb2b4b4bd90a1bdc4825 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 00:10:29 +0100 Subject: [PATCH 05/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Add=20new=20PSM?= =?UTF-8?q?odule=20and=20SomethingElse=20documentation=20files;=20update?= =?UTF-8?q?=20manifest=20and=20action=20references?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/Publish/README.md | 2 +- .github/actions/Test/README.md | 2 +- .../functions/public/{ => PSModule}/Get-PSModuleTest.ps1 | 3 +++ .../functions/public/{ => PSModule}/New-PSModuleTest.ps1 | 7 +++---- tests/src/functions/public/PSModule/PSModule.md | 1 + .../public/{ => SomethingElse}/Set-PSModuleTest.ps1 | 0 tests/src/functions/public/SomethingElse/SomethingElse.md | 1 + tests/src/functions/public/Test-PSModuleTest.ps1 | 4 +--- .../functions/public/{ => PSModule}/Get-PSModuleTest.ps1 | 3 +++ .../functions/public/{ => PSModule}/New-PSModuleTest.ps1 | 7 +++---- .../srcWithManifest/functions/public/PSModule/PSModule.md | 1 + .../public/{ => SomethingElse}/Set-PSModuleTest.ps1 | 0 .../functions/public/SomethingElse/SomethingElse.md | 1 + .../srcWithManifest/functions/public/Test-PSModuleTest.ps1 | 2 -- .../functions/public/completers.ps1 | 0 tests/srcWithManifest/manifest.psd1 | 3 ++- 16 files changed, 21 insertions(+), 16 deletions(-) rename tests/src/functions/public/{ => PSModule}/Get-PSModuleTest.ps1 (62%) rename tests/src/functions/public/{ => PSModule}/New-PSModuleTest.ps1 (81%) create mode 100644 tests/src/functions/public/PSModule/PSModule.md rename tests/src/functions/public/{ => SomethingElse}/Set-PSModuleTest.ps1 (100%) create mode 100644 tests/src/functions/public/SomethingElse/SomethingElse.md rename tests/srcWithManifest/functions/public/{ => PSModule}/Get-PSModuleTest.ps1 (62%) rename tests/srcWithManifest/functions/public/{ => PSModule}/New-PSModuleTest.ps1 (81%) create mode 100644 tests/srcWithManifest/functions/public/PSModule/PSModule.md rename tests/srcWithManifest/functions/public/{ => SomethingElse}/Set-PSModuleTest.ps1 (100%) create mode 100644 tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md rename tests/{src => srcWithManifest}/functions/public/completers.ps1 (100%) diff --git a/.github/actions/Publish/README.md b/.github/actions/Publish/README.md index e753fff5..398db254 100644 --- a/.github/actions/Publish/README.md +++ b/.github/actions/Publish/README.md @@ -99,7 +99,7 @@ jobs: uses: ./.github/actions/Initialize - name: Publish-PSModule - uses: PSModule/Publish-PSModule@main + uses: ./.github/actions/Publish env: GITHUB_TOKEN: ${{ github.token }} with: diff --git a/.github/actions/Test/README.md b/.github/actions/Test/README.md index c46b91eb..44fdafaa 100644 --- a/.github/actions/Test/README.md +++ b/.github/actions/Test/README.md @@ -55,7 +55,7 @@ jobs: uses: ./.github/actions/Initialize - name: Test-PSModule - uses: PSModule/Test-PSModule@main + uses: ./.github/actions/Test with: Path: src TestType: SourceCode diff --git a/tests/src/functions/public/Get-PSModuleTest.ps1 b/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 62% rename from tests/src/functions/public/Get-PSModuleTest.ps1 rename to tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 index 0e9aacfe..73a5c620 100644 --- a/tests/src/functions/public/Get-PSModuleTest.ps1 +++ b/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -1,4 +1,7 @@ #Requires -Modules Utilities +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } +#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } function Get-PSModuleTest { <# diff --git a/tests/src/functions/public/New-PSModuleTest.ps1 b/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 81% rename from tests/src/functions/public/New-PSModuleTest.ps1 rename to tests/src/functions/public/PSModule/New-PSModuleTest.ps1 index 8fc0641f..d4e6e266 100644 --- a/tests/src/functions/public/New-PSModuleTest.ps1 +++ b/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 @@ -1,6 +1,5 @@ #Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} -#SkipTest:FunctionTest:Difficult to test due to the nature of the function. -#SkipTest:Verbose:Just want to test that a function can have multiple skips. + function New-PSModuleTest { <# .SYNOPSIS @@ -28,11 +27,11 @@ function New-PSModuleTest { [Parameter(Mandatory)] [string] $Name ) - Write-Debug "Debug message" - Write-Verbose "Verbose message" -Verbose Write-Output "Hello, $Name!" } New-Alias New-PSModuleTestAlias3 New-PSModuleTest New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/src/functions/public/PSModule/PSModule.md b/tests/src/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/tests/src/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/tests/src/functions/public/Set-PSModuleTest.ps1 b/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/Set-PSModuleTest.ps1 rename to tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/src/functions/public/SomethingElse/SomethingElse.md b/tests/src/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/tests/src/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/tests/src/functions/public/Test-PSModuleTest.ps1 b/tests/src/functions/public/Test-PSModuleTest.ps1 index 4056e2f6..26be2b9b 100644 --- a/tests/src/functions/public/Test-PSModuleTest.ps1 +++ b/tests/src/functions/public/Test-PSModuleTest.ps1 @@ -1,5 +1,4 @@ -#SkipTest:Verbose:Just want to test that a function can have multiple skips. -function Test-PSModuleTest { +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -16,5 +15,4 @@ function Test-PSModuleTest { [string] $Name ) Write-Output "Hello, $Name!" - Write-Verbose 'Verbose message' -Verbose } diff --git a/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 62% rename from tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 index 0e9aacfe..73a5c620 100644 --- a/tests/srcWithManifest/functions/public/Get-PSModuleTest.ps1 +++ b/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 @@ -1,4 +1,7 @@ #Requires -Modules Utilities +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } +#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } function Get-PSModuleTest { <# diff --git a/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 81% rename from tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 index 8fc0641f..d4e6e266 100644 --- a/tests/srcWithManifest/functions/public/New-PSModuleTest.ps1 +++ b/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 @@ -1,6 +1,5 @@ #Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} -#SkipTest:FunctionTest:Difficult to test due to the nature of the function. -#SkipTest:Verbose:Just want to test that a function can have multiple skips. + function New-PSModuleTest { <# .SYNOPSIS @@ -28,11 +27,11 @@ function New-PSModuleTest { [Parameter(Mandatory)] [string] $Name ) - Write-Debug "Debug message" - Write-Verbose "Verbose message" -Verbose Write-Output "Hello, $Name!" } New-Alias New-PSModuleTestAlias3 New-PSModuleTest New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest + + Set-Alias New-PSModuleTestAlias5 New-PSModuleTest diff --git a/tests/srcWithManifest/functions/public/PSModule/PSModule.md b/tests/srcWithManifest/functions/public/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/tests/srcWithManifest/functions/public/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/Set-PSModuleTest.ps1 rename to tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md b/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 index 4056e2f6..a582e883 100644 --- a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 @@ -3,10 +3,8 @@ function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. - .EXAMPLE Test-PSModule -Name 'World' - "Hello, World!" #> [CmdletBinding()] diff --git a/tests/src/functions/public/completers.ps1 b/tests/srcWithManifest/functions/public/completers.ps1 similarity index 100% rename from tests/src/functions/public/completers.ps1 rename to tests/srcWithManifest/functions/public/completers.ps1 diff --git a/tests/srcWithManifest/manifest.psd1 b/tests/srcWithManifest/manifest.psd1 index 77348f13..73e59522 100644 --- a/tests/srcWithManifest/manifest.psd1 +++ b/tests/srcWithManifest/manifest.psd1 @@ -1,3 +1,4 @@ @{ - Author = 'Author' + Author = 'Author' + PowerShellVersion = '5.1' } From 26bb3d2290d31744d8458d7dd6ec421d0d8608db Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 00:15:31 +0100 Subject: [PATCH 06/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Enhance=20PSMod?= =?UTF-8?q?uleTest=20with=20additional=20tests=20and=20environment=20varia?= =?UTF-8?q?ble=20checks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../functions/public/Test-PSModuleTest.ps1 | 2 + tests/tests/PSModuleTest.Tests.ps1 | 63 ++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 index a582e883..4056e2f6 100644 --- a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 +++ b/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 @@ -3,8 +3,10 @@ function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. + .EXAMPLE Test-PSModule -Name 'World' + "Hello, World!" #> [CmdletBinding()] diff --git a/tests/tests/PSModuleTest.Tests.ps1 b/tests/tests/PSModuleTest.Tests.ps1 index 00b3cde7..2be65edb 100644 --- a/tests/tests/PSModuleTest.Tests.ps1 +++ b/tests/tests/PSModuleTest.Tests.ps1 @@ -1,11 +1,60 @@ -Describe 'Module' { - It 'Function: Get-PSModuleTest' { - Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' +[CmdletBinding()] +Param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty } - It 'Function: Set-PSModuleTest' { - Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' +} + +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } } - It 'Function: Test-PSModuleTest' { - Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } } } From 7a920a928a0cbc180d0c5cc42d79c3359080e4ba Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 00:18:45 +0100 Subject: [PATCH 07/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Update=20module?= =?UTF-8?q?=20requirement=20in=20main.ps1=20script=20from=20Utilities=20to?= =?UTF-8?q?=20GitHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/Document/scripts/main.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/Document/scripts/main.ps1 b/.github/actions/Document/scripts/main.ps1 index 4f36aec4..855bf763 100644 --- a/.github/actions/Document/scripts/main.ps1 +++ b/.github/actions/Document/scripts/main.ps1 @@ -1,4 +1,4 @@ -#Requires -Modules Utilities +#Requires -Modules GitHub [CmdletBinding()] param() From fea0c555b9a9130bef903d820f9edec32ed61f8b Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 00:22:06 +0100 Subject: [PATCH 08/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Add=20environme?= =?UTF-8?q?nt=20variables=20for=20testing=20in=20Action-Test=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Action-Test-Test-outputs.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/Action-Test-Test-outputs.yml b/.github/workflows/Action-Test-Test-outputs.yml index 1ff8a5c0..0069f36e 100644 --- a/.github/workflows/Action-Test-Test-outputs.yml +++ b/.github/workflows/Action-Test-Test-outputs.yml @@ -14,6 +14,15 @@ concurrency: permissions: {} +env: + TEST_APP_ENT_CLIENT_ID: ${{ secrets.TEST_APP_ENT_CLIENT_ID }} + TEST_APP_ENT_PRIVATE_KEY: ${{ secrets.TEST_APP_ENT_PRIVATE_KEY }} + TEST_APP_ORG_CLIENT_ID: ${{ secrets.TEST_APP_ORG_CLIENT_ID }} + TEST_APP_ORG_PRIVATE_KEY: ${{ secrets.TEST_APP_ORG_PRIVATE_KEY }} + TEST_USER_ORG_FG_PAT: ${{ secrets.TEST_USER_ORG_FG_PAT }} + TEST_USER_USER_FG_PAT: ${{ secrets.TEST_USER_USER_FG_PAT }} + TEST_USER_PAT: ${{ secrets.TEST_USER_PAT }} + jobs: ActionTest: strategy: From c8b673bccaffcfaa5577d2de64bc5110b1af7326 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 00:26:37 +0100 Subject: [PATCH 09/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Clean=20up=20fo?= =?UTF-8?q?rmatting=20in=20manifest.psd1=20by=20removing=20unnecessary=20l?= =?UTF-8?q?ine=20breaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/srcWithManifest/manifest.psd1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/srcWithManifest/manifest.psd1 b/tests/srcWithManifest/manifest.psd1 index 73e59522..77348f13 100644 --- a/tests/srcWithManifest/manifest.psd1 +++ b/tests/srcWithManifest/manifest.psd1 @@ -1,4 +1,3 @@ @{ - Author = 'Author' - PowerShellVersion = '5.1' + Author = 'Author' } From 8fe96a87b3491205a0cb5d2f97f09ba06e5f99b5 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 11:25:17 +0100 Subject: [PATCH 10/17] TestRepofix --- .github/workflows/Aciton-Test-Publish.yml | 2 +- .github/workflows/Action-Test-Build.yml | 12 ++-- .github/workflows/Action-Test-Document.yml | 2 +- .../Action-Test-Test-Src-Default.yml | 2 +- .../Action-Test-Test-Src-WithManifest.yml | 2 +- .../workflows/Action-Test-Test-outputs.yml | 2 +- .../workflows/Workflow-Test-Default-CI.yml | 6 +- .../docs/PSModuleTest/Get-PSModuleTest.md | 0 .../docs/PSModuleTest/New-PSModuleTest.md | 0 .../docs/PSModuleTest/Set-PSModuleTest.md | 0 .../docs/PSModuleTest/Test-PSModuleTest.md | 0 .../modules/PSModuleTest/PSModuleTest.psd1 | 0 .../modules/PSModuleTest/PSModuleTest.psm1 | 0 .../PSModuleTest/assemblies/LsonLib.dll | Bin .../modules/PSModuleTest/data/Config.psd1 | 0 .../modules/PSModuleTest/data/Settings.psd1 | 0 .../formats/CultureInfo.Format.ps1xml | 0 .../formats/Mygciview.Format.ps1xml | 0 .../PSModuleTest/modules/OtherPSModule.psm1 | 0 .../modules/PSModuleTest/scripts/loader.ps1 | 0 .../types/DirectoryInfo.Types.ps1xml | 0 .../PSModuleTest/types/FileInfo.Types.ps1xml | 0 .../tests/PSModuleTest.Tests.ps1 | 0 tests/{ => srcTestRepo}/icon/icon.png | Bin .../src/assemblies/LsonLib.dll | Bin .../src/classes/private/SecretWriter.ps1 | 0 .../src/classes/public/Book.ps1 | 0 tests/{ => srcTestRepo}/src/data/Config.psd1 | 0 .../{ => srcTestRepo}/src/data/Settings.psd1 | 0 tests/{ => srcTestRepo}/src/finally.ps1 | 0 .../src/formats/CultureInfo.Format.ps1xml | 0 .../src/formats/Mygciview.Format.ps1xml | 0 .../private/Get-InternalPSModule.ps1 | 0 .../private/Set-InternalPSModule.ps1 | 0 .../public/PSModule/Get-PSModuleTest.ps1 | 0 .../public/PSModule/New-PSModuleTest.ps1 | 0 .../src/functions/public/PSModule/PSModule.md | 0 .../public/SomethingElse/Set-PSModuleTest.ps1 | 0 .../public/SomethingElse/SomethingElse.md | 0 .../functions/public/Test-PSModuleTest.ps1 | 0 tests/{ => srcTestRepo}/src/header.ps1 | 0 .../src/init/initializer.ps1 | 0 .../src/modules/OtherPSModule.psm1 | 0 .../{ => srcTestRepo}/src/scripts/loader.ps1 | 0 .../src/types/DirectoryInfo.Types.ps1xml | 0 .../src/types/FileInfo.Types.ps1xml | 0 .../variables/private/PrivateVariables.ps1 | 0 .../src/variables/public/Moons.ps1 | 0 .../src/variables/public/Planets.ps1 | 0 .../src/variables/public/SolarSystems.ps1 | 0 .../srcTestRepo/tests/PSModuleTest.Tests.ps1 | 60 ++++++++++++++++++ tests/srcWithManifestTestRepo/icon/icon.png | Bin 0 -> 5882 bytes .../src}/assemblies/LsonLib.dll | Bin .../src}/classes/private/SecretWriter.ps1 | 0 .../src}/classes/public/Book.ps1 | 0 .../src}/data/Config.psd1 | 0 .../src}/data/Settings.psd1 | 0 .../src}/finally.ps1 | 0 .../src}/formats/CultureInfo.Format.ps1xml | 0 .../src}/formats/Mygciview.Format.ps1xml | 0 .../private/Get-InternalPSModule.ps1 | 0 .../private/Set-InternalPSModule.ps1 | 0 .../public/PSModule/Get-PSModuleTest.ps1 | 0 .../public/PSModule/New-PSModuleTest.ps1 | 0 .../functions/public/PSModule/PSModule.md | 0 .../public/SomethingElse/Set-PSModuleTest.ps1 | 0 .../public/SomethingElse/SomethingElse.md | 0 .../functions/public/Test-PSModuleTest.ps1 | 0 .../src}/functions/public/completers.ps1 | 0 .../src}/header.ps1 | 0 .../src}/init/initializer.ps1 | 0 .../src}/manifest.psd1 | 0 .../src}/modules/OtherPSModule.psm1 | 0 .../src}/scripts/loader.ps1 | 0 .../src}/types/DirectoryInfo.Types.ps1xml | 0 .../src}/types/FileInfo.Types.ps1xml | 0 .../variables/private/PrivateVariables.ps1 | 0 .../src}/variables/public/Moons.ps1 | 0 .../src}/variables/public/Planets.ps1 | 0 .../src}/variables/public/SolarSystems.ps1 | 0 .../tests/PSModuleTest.Tests.ps1 | 60 ++++++++++++++++++ .../tools/1-build.ps1 | 0 .../tools/2-build.ps1 | 0 83 files changed, 134 insertions(+), 14 deletions(-) rename tests/{ => outputTestRepo}/outputs/docs/PSModuleTest/Get-PSModuleTest.md (100%) rename tests/{ => outputTestRepo}/outputs/docs/PSModuleTest/New-PSModuleTest.md (100%) rename tests/{ => outputTestRepo}/outputs/docs/PSModuleTest/Set-PSModuleTest.md (100%) rename tests/{ => outputTestRepo}/outputs/docs/PSModuleTest/Test-PSModuleTest.md (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/PSModuleTest.psd1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/PSModuleTest.psm1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/assemblies/LsonLib.dll (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/data/Config.psd1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/data/Settings.psd1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/scripts/loader.ps1 (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml (100%) rename tests/{ => outputTestRepo}/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml (100%) rename tests/{ => outputTestRepo}/tests/PSModuleTest.Tests.ps1 (100%) rename tests/{ => srcTestRepo}/icon/icon.png (100%) rename tests/{ => srcTestRepo}/src/assemblies/LsonLib.dll (100%) rename tests/{ => srcTestRepo}/src/classes/private/SecretWriter.ps1 (100%) rename tests/{ => srcTestRepo}/src/classes/public/Book.ps1 (100%) rename tests/{ => srcTestRepo}/src/data/Config.psd1 (100%) rename tests/{ => srcTestRepo}/src/data/Settings.psd1 (100%) rename tests/{ => srcTestRepo}/src/finally.ps1 (100%) rename tests/{ => srcTestRepo}/src/formats/CultureInfo.Format.ps1xml (100%) rename tests/{ => srcTestRepo}/src/formats/Mygciview.Format.ps1xml (100%) rename tests/{ => srcTestRepo}/src/functions/private/Get-InternalPSModule.ps1 (100%) rename tests/{ => srcTestRepo}/src/functions/private/Set-InternalPSModule.ps1 (100%) rename tests/{ => srcTestRepo}/src/functions/public/PSModule/Get-PSModuleTest.ps1 (100%) rename tests/{ => srcTestRepo}/src/functions/public/PSModule/New-PSModuleTest.ps1 (100%) rename tests/{ => srcTestRepo}/src/functions/public/PSModule/PSModule.md (100%) rename tests/{ => srcTestRepo}/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 (100%) rename tests/{ => srcTestRepo}/src/functions/public/SomethingElse/SomethingElse.md (100%) rename tests/{ => srcTestRepo}/src/functions/public/Test-PSModuleTest.ps1 (100%) rename tests/{ => srcTestRepo}/src/header.ps1 (100%) rename tests/{ => srcTestRepo}/src/init/initializer.ps1 (100%) rename tests/{ => srcTestRepo}/src/modules/OtherPSModule.psm1 (100%) rename tests/{ => srcTestRepo}/src/scripts/loader.ps1 (100%) rename tests/{ => srcTestRepo}/src/types/DirectoryInfo.Types.ps1xml (100%) rename tests/{ => srcTestRepo}/src/types/FileInfo.Types.ps1xml (100%) rename tests/{ => srcTestRepo}/src/variables/private/PrivateVariables.ps1 (100%) rename tests/{ => srcTestRepo}/src/variables/public/Moons.ps1 (100%) rename tests/{ => srcTestRepo}/src/variables/public/Planets.ps1 (100%) rename tests/{ => srcTestRepo}/src/variables/public/SolarSystems.ps1 (100%) create mode 100644 tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 create mode 100644 tests/srcWithManifestTestRepo/icon/icon.png rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/assemblies/LsonLib.dll (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/classes/private/SecretWriter.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/classes/public/Book.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/data/Config.psd1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/data/Settings.psd1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/finally.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/formats/CultureInfo.Format.ps1xml (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/formats/Mygciview.Format.ps1xml (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/private/Get-InternalPSModule.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/private/Set-InternalPSModule.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/PSModule/Get-PSModuleTest.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/PSModule/New-PSModuleTest.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/PSModule/PSModule.md (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/SomethingElse/Set-PSModuleTest.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/SomethingElse/SomethingElse.md (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/Test-PSModuleTest.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/functions/public/completers.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/header.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/init/initializer.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/manifest.psd1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/modules/OtherPSModule.psm1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/scripts/loader.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/types/DirectoryInfo.Types.ps1xml (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/types/FileInfo.Types.ps1xml (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/variables/private/PrivateVariables.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/variables/public/Moons.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/variables/public/Planets.ps1 (100%) rename tests/{srcWithManifest => srcWithManifestTestRepo/src}/variables/public/SolarSystems.ps1 (100%) create mode 100644 tests/srcWithManifestTestRepo/tests/PSModuleTest.Tests.ps1 rename tests/{ => srcWithManifestTestRepo}/tools/1-build.ps1 (100%) rename tests/{ => srcWithManifestTestRepo}/tools/2-build.ps1 (100%) diff --git a/.github/workflows/Aciton-Test-Publish.yml b/.github/workflows/Aciton-Test-Publish.yml index 9f0bad54..1a9b0811 100644 --- a/.github/workflows/Aciton-Test-Publish.yml +++ b/.github/workflows/Aciton-Test-Publish.yml @@ -35,6 +35,6 @@ jobs: Verbose: true Debug: true Name: PSModuleTest - ModulePath: tests/outputs/modules + ModulePath: tests/outputTestRepo/outputs/modules APIKey: ${{ secrets.APIKEY }} WhatIf: true diff --git a/.github/workflows/Action-Test-Build.yml b/.github/workflows/Action-Test-Build.yml index 695c1961..653391db 100644 --- a/.github/workflows/Action-Test-Build.yml +++ b/.github/workflows/Action-Test-Build.yml @@ -32,9 +32,9 @@ jobs: uses: ./.github/actions/Build with: Name: PSModuleTest - Path: tests/src - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcTestRepo/src + ModulesOutputPath: tests/srcTestRepo/outputs/modules + DocsOutputPath: tests/srcTestRepo/outputs/docs ActionTestWithManifest: name: Action-Test-Build - [DefaultWithManifest] @@ -50,8 +50,8 @@ jobs: uses: ./.github/actions/Build with: Name: PSModuleTest - Path: tests/srcWithManifest - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcWithManifestRepo/src + ModulesOutputPath: tests/srcWithManifestRepo/outputs/modules + DocsOutputPath: tests/srcWithManifestRepo/outputs/docs ModuleArtifactName: moduleWithManifest DocsArtifactName: docsWithManifest diff --git a/.github/workflows/Action-Test-Document.yml b/.github/workflows/Action-Test-Document.yml index 4b02d82f..65121592 100644 --- a/.github/workflows/Action-Test-Document.yml +++ b/.github/workflows/Action-Test-Document.yml @@ -28,5 +28,5 @@ jobs: - name: Action-Test-Document uses: ./.github/actions/Document with: - working-directory: ./tests + working-directory: tests/srcTestRepo/src subject: PSModule diff --git a/.github/workflows/Action-Test-Test-Src-Default.yml b/.github/workflows/Action-Test-Test-Src-Default.yml index 40464578..b472c5ea 100644 --- a/.github/workflows/Action-Test-Test-Src-Default.yml +++ b/.github/workflows/Action-Test-Test-Src-Default.yml @@ -36,7 +36,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} with: Name: PSModuleTest - Path: tests/src + Path: tests/srcTestRepo/src TestType: SourceCode - name: Status diff --git a/.github/workflows/Action-Test-Test-Src-WithManifest.yml b/.github/workflows/Action-Test-Test-Src-WithManifest.yml index 76b1045f..45aa4e4b 100644 --- a/.github/workflows/Action-Test-Test-Src-WithManifest.yml +++ b/.github/workflows/Action-Test-Test-Src-WithManifest.yml @@ -36,7 +36,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} with: Name: PSModuleTest - Path: tests/srcWithManifest + Path: tests/srcWithManifestTestRepo/src TestType: SourceCode - name: Status diff --git a/.github/workflows/Action-Test-Test-outputs.yml b/.github/workflows/Action-Test-Test-outputs.yml index 0069f36e..2258a32e 100644 --- a/.github/workflows/Action-Test-Test-outputs.yml +++ b/.github/workflows/Action-Test-Test-outputs.yml @@ -45,7 +45,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} with: Name: PSModuleTest - Path: tests/outputs/modules + Path: tests/outputTestRepo/outputs/modules TestType: Module - name: Status diff --git a/.github/workflows/Workflow-Test-Default-CI.yml b/.github/workflows/Workflow-Test-Default-CI.yml index 4828c258..6d10da29 100644 --- a/.github/workflows/Workflow-Test-Default-CI.yml +++ b/.github/workflows/Workflow-Test-Default-CI.yml @@ -23,7 +23,7 @@ jobs: secrets: inherit with: Name: PSModuleTest - Path: tests/src - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcTestRepo + ModulesOutputPath: tests/srcTestRepo/outputs/modules + DocsOutputPath: tests/srcTestRepo/outputs/docs SkipTests: Module diff --git a/tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Get-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/New-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/New-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Set-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md diff --git a/tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md similarity index 100% rename from tests/outputs/docs/PSModuleTest/Test-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md diff --git a/tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/PSModuleTest.psd1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 diff --git a/tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/PSModuleTest.psm1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 diff --git a/tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll b/tests/outputTestRepo/outputs/modules/PSModuleTest/assemblies/LsonLib.dll similarity index 100% rename from tests/outputs/modules/PSModuleTest/assemblies/LsonLib.dll rename to tests/outputTestRepo/outputs/modules/PSModuleTest/assemblies/LsonLib.dll diff --git a/tests/outputs/modules/PSModuleTest/data/Config.psd1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/data/Config.psd1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/data/Config.psd1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/data/Config.psd1 diff --git a/tests/outputs/modules/PSModuleTest/data/Settings.psd1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/data/Settings.psd1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/data/Settings.psd1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/data/Settings.psd1 diff --git a/tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml b/tests/outputTestRepo/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml rename to tests/outputTestRepo/outputs/modules/PSModuleTest/formats/CultureInfo.Format.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml b/tests/outputTestRepo/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml rename to tests/outputTestRepo/outputs/modules/PSModuleTest/formats/Mygciview.Format.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 diff --git a/tests/outputs/modules/PSModuleTest/scripts/loader.ps1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/scripts/loader.ps1 similarity index 100% rename from tests/outputs/modules/PSModuleTest/scripts/loader.ps1 rename to tests/outputTestRepo/outputs/modules/PSModuleTest/scripts/loader.ps1 diff --git a/tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml b/tests/outputTestRepo/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml rename to tests/outputTestRepo/outputs/modules/PSModuleTest/types/DirectoryInfo.Types.ps1xml diff --git a/tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml b/tests/outputTestRepo/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml rename to tests/outputTestRepo/outputs/modules/PSModuleTest/types/FileInfo.Types.ps1xml diff --git a/tests/tests/PSModuleTest.Tests.ps1 b/tests/outputTestRepo/tests/PSModuleTest.Tests.ps1 similarity index 100% rename from tests/tests/PSModuleTest.Tests.ps1 rename to tests/outputTestRepo/tests/PSModuleTest.Tests.ps1 diff --git a/tests/icon/icon.png b/tests/srcTestRepo/icon/icon.png similarity index 100% rename from tests/icon/icon.png rename to tests/srcTestRepo/icon/icon.png diff --git a/tests/src/assemblies/LsonLib.dll b/tests/srcTestRepo/src/assemblies/LsonLib.dll similarity index 100% rename from tests/src/assemblies/LsonLib.dll rename to tests/srcTestRepo/src/assemblies/LsonLib.dll diff --git a/tests/src/classes/private/SecretWriter.ps1 b/tests/srcTestRepo/src/classes/private/SecretWriter.ps1 similarity index 100% rename from tests/src/classes/private/SecretWriter.ps1 rename to tests/srcTestRepo/src/classes/private/SecretWriter.ps1 diff --git a/tests/src/classes/public/Book.ps1 b/tests/srcTestRepo/src/classes/public/Book.ps1 similarity index 100% rename from tests/src/classes/public/Book.ps1 rename to tests/srcTestRepo/src/classes/public/Book.ps1 diff --git a/tests/src/data/Config.psd1 b/tests/srcTestRepo/src/data/Config.psd1 similarity index 100% rename from tests/src/data/Config.psd1 rename to tests/srcTestRepo/src/data/Config.psd1 diff --git a/tests/src/data/Settings.psd1 b/tests/srcTestRepo/src/data/Settings.psd1 similarity index 100% rename from tests/src/data/Settings.psd1 rename to tests/srcTestRepo/src/data/Settings.psd1 diff --git a/tests/src/finally.ps1 b/tests/srcTestRepo/src/finally.ps1 similarity index 100% rename from tests/src/finally.ps1 rename to tests/srcTestRepo/src/finally.ps1 diff --git a/tests/src/formats/CultureInfo.Format.ps1xml b/tests/srcTestRepo/src/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/src/formats/CultureInfo.Format.ps1xml rename to tests/srcTestRepo/src/formats/CultureInfo.Format.ps1xml diff --git a/tests/src/formats/Mygciview.Format.ps1xml b/tests/srcTestRepo/src/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/src/formats/Mygciview.Format.ps1xml rename to tests/srcTestRepo/src/formats/Mygciview.Format.ps1xml diff --git a/tests/src/functions/private/Get-InternalPSModule.ps1 b/tests/srcTestRepo/src/functions/private/Get-InternalPSModule.ps1 similarity index 100% rename from tests/src/functions/private/Get-InternalPSModule.ps1 rename to tests/srcTestRepo/src/functions/private/Get-InternalPSModule.ps1 diff --git a/tests/src/functions/private/Set-InternalPSModule.ps1 b/tests/srcTestRepo/src/functions/private/Set-InternalPSModule.ps1 similarity index 100% rename from tests/src/functions/private/Set-InternalPSModule.ps1 rename to tests/srcTestRepo/src/functions/private/Set-InternalPSModule.ps1 diff --git a/tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/PSModule/Get-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 diff --git a/tests/src/functions/public/PSModule/New-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/PSModule/New-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 diff --git a/tests/src/functions/public/PSModule/PSModule.md b/tests/srcTestRepo/src/functions/public/PSModule/PSModule.md similarity index 100% rename from tests/src/functions/public/PSModule/PSModule.md rename to tests/srcTestRepo/src/functions/public/PSModule/PSModule.md diff --git a/tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/src/functions/public/SomethingElse/SomethingElse.md b/tests/srcTestRepo/src/functions/public/SomethingElse/SomethingElse.md similarity index 100% rename from tests/src/functions/public/SomethingElse/SomethingElse.md rename to tests/srcTestRepo/src/functions/public/SomethingElse/SomethingElse.md diff --git a/tests/src/functions/public/Test-PSModuleTest.ps1 b/tests/srcTestRepo/src/functions/public/Test-PSModuleTest.ps1 similarity index 100% rename from tests/src/functions/public/Test-PSModuleTest.ps1 rename to tests/srcTestRepo/src/functions/public/Test-PSModuleTest.ps1 diff --git a/tests/src/header.ps1 b/tests/srcTestRepo/src/header.ps1 similarity index 100% rename from tests/src/header.ps1 rename to tests/srcTestRepo/src/header.ps1 diff --git a/tests/src/init/initializer.ps1 b/tests/srcTestRepo/src/init/initializer.ps1 similarity index 100% rename from tests/src/init/initializer.ps1 rename to tests/srcTestRepo/src/init/initializer.ps1 diff --git a/tests/src/modules/OtherPSModule.psm1 b/tests/srcTestRepo/src/modules/OtherPSModule.psm1 similarity index 100% rename from tests/src/modules/OtherPSModule.psm1 rename to tests/srcTestRepo/src/modules/OtherPSModule.psm1 diff --git a/tests/src/scripts/loader.ps1 b/tests/srcTestRepo/src/scripts/loader.ps1 similarity index 100% rename from tests/src/scripts/loader.ps1 rename to tests/srcTestRepo/src/scripts/loader.ps1 diff --git a/tests/src/types/DirectoryInfo.Types.ps1xml b/tests/srcTestRepo/src/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/src/types/DirectoryInfo.Types.ps1xml rename to tests/srcTestRepo/src/types/DirectoryInfo.Types.ps1xml diff --git a/tests/src/types/FileInfo.Types.ps1xml b/tests/srcTestRepo/src/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/src/types/FileInfo.Types.ps1xml rename to tests/srcTestRepo/src/types/FileInfo.Types.ps1xml diff --git a/tests/src/variables/private/PrivateVariables.ps1 b/tests/srcTestRepo/src/variables/private/PrivateVariables.ps1 similarity index 100% rename from tests/src/variables/private/PrivateVariables.ps1 rename to tests/srcTestRepo/src/variables/private/PrivateVariables.ps1 diff --git a/tests/src/variables/public/Moons.ps1 b/tests/srcTestRepo/src/variables/public/Moons.ps1 similarity index 100% rename from tests/src/variables/public/Moons.ps1 rename to tests/srcTestRepo/src/variables/public/Moons.ps1 diff --git a/tests/src/variables/public/Planets.ps1 b/tests/srcTestRepo/src/variables/public/Planets.ps1 similarity index 100% rename from tests/src/variables/public/Planets.ps1 rename to tests/srcTestRepo/src/variables/public/Planets.ps1 diff --git a/tests/src/variables/public/SolarSystems.ps1 b/tests/srcTestRepo/src/variables/public/SolarSystems.ps1 similarity index 100% rename from tests/src/variables/public/SolarSystems.ps1 rename to tests/srcTestRepo/src/variables/public/SolarSystems.ps1 diff --git a/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 b/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..2be65edb --- /dev/null +++ b/tests/srcTestRepo/tests/PSModuleTest.Tests.ps1 @@ -0,0 +1,60 @@ +[CmdletBinding()] +Param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty + } +} + +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } + } +} diff --git a/tests/srcWithManifestTestRepo/icon/icon.png b/tests/srcWithManifestTestRepo/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..be83fd5fd3914846c735d44415569b86c254ccad GIT binary patch literal 5882 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 OgRD;4;a-^H$^Qd{UB>JH literal 0 HcmV?d00001 diff --git a/tests/srcWithManifest/assemblies/LsonLib.dll b/tests/srcWithManifestTestRepo/src/assemblies/LsonLib.dll similarity index 100% rename from tests/srcWithManifest/assemblies/LsonLib.dll rename to tests/srcWithManifestTestRepo/src/assemblies/LsonLib.dll diff --git a/tests/srcWithManifest/classes/private/SecretWriter.ps1 b/tests/srcWithManifestTestRepo/src/classes/private/SecretWriter.ps1 similarity index 100% rename from tests/srcWithManifest/classes/private/SecretWriter.ps1 rename to tests/srcWithManifestTestRepo/src/classes/private/SecretWriter.ps1 diff --git a/tests/srcWithManifest/classes/public/Book.ps1 b/tests/srcWithManifestTestRepo/src/classes/public/Book.ps1 similarity index 100% rename from tests/srcWithManifest/classes/public/Book.ps1 rename to tests/srcWithManifestTestRepo/src/classes/public/Book.ps1 diff --git a/tests/srcWithManifest/data/Config.psd1 b/tests/srcWithManifestTestRepo/src/data/Config.psd1 similarity index 100% rename from tests/srcWithManifest/data/Config.psd1 rename to tests/srcWithManifestTestRepo/src/data/Config.psd1 diff --git a/tests/srcWithManifest/data/Settings.psd1 b/tests/srcWithManifestTestRepo/src/data/Settings.psd1 similarity index 100% rename from tests/srcWithManifest/data/Settings.psd1 rename to tests/srcWithManifestTestRepo/src/data/Settings.psd1 diff --git a/tests/srcWithManifest/finally.ps1 b/tests/srcWithManifestTestRepo/src/finally.ps1 similarity index 100% rename from tests/srcWithManifest/finally.ps1 rename to tests/srcWithManifestTestRepo/src/finally.ps1 diff --git a/tests/srcWithManifest/formats/CultureInfo.Format.ps1xml b/tests/srcWithManifestTestRepo/src/formats/CultureInfo.Format.ps1xml similarity index 100% rename from tests/srcWithManifest/formats/CultureInfo.Format.ps1xml rename to tests/srcWithManifestTestRepo/src/formats/CultureInfo.Format.ps1xml diff --git a/tests/srcWithManifest/formats/Mygciview.Format.ps1xml b/tests/srcWithManifestTestRepo/src/formats/Mygciview.Format.ps1xml similarity index 100% rename from tests/srcWithManifest/formats/Mygciview.Format.ps1xml rename to tests/srcWithManifestTestRepo/src/formats/Mygciview.Format.ps1xml diff --git a/tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 b/tests/srcWithManifestTestRepo/src/functions/private/Get-InternalPSModule.ps1 similarity index 100% rename from tests/srcWithManifest/functions/private/Get-InternalPSModule.ps1 rename to tests/srcWithManifestTestRepo/src/functions/private/Get-InternalPSModule.ps1 diff --git a/tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 b/tests/srcWithManifestTestRepo/src/functions/private/Set-InternalPSModule.ps1 similarity index 100% rename from tests/srcWithManifest/functions/private/Set-InternalPSModule.ps1 rename to tests/srcWithManifestTestRepo/src/functions/private/Set-InternalPSModule.ps1 diff --git a/tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/PSModule/Get-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/PSModule/Get-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/PSModule/New-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/PSModule/New-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/PSModule/PSModule.md b/tests/srcWithManifestTestRepo/src/functions/public/PSModule/PSModule.md similarity index 100% rename from tests/srcWithManifest/functions/public/PSModule/PSModule.md rename to tests/srcWithManifestTestRepo/src/functions/public/PSModule/PSModule.md diff --git a/tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/SomethingElse/Set-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/Set-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md b/tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/SomethingElse.md similarity index 100% rename from tests/srcWithManifest/functions/public/SomethingElse/SomethingElse.md rename to tests/srcWithManifestTestRepo/src/functions/public/SomethingElse/SomethingElse.md diff --git a/tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/Test-PSModuleTest.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/Test-PSModuleTest.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/Test-PSModuleTest.ps1 diff --git a/tests/srcWithManifest/functions/public/completers.ps1 b/tests/srcWithManifestTestRepo/src/functions/public/completers.ps1 similarity index 100% rename from tests/srcWithManifest/functions/public/completers.ps1 rename to tests/srcWithManifestTestRepo/src/functions/public/completers.ps1 diff --git a/tests/srcWithManifest/header.ps1 b/tests/srcWithManifestTestRepo/src/header.ps1 similarity index 100% rename from tests/srcWithManifest/header.ps1 rename to tests/srcWithManifestTestRepo/src/header.ps1 diff --git a/tests/srcWithManifest/init/initializer.ps1 b/tests/srcWithManifestTestRepo/src/init/initializer.ps1 similarity index 100% rename from tests/srcWithManifest/init/initializer.ps1 rename to tests/srcWithManifestTestRepo/src/init/initializer.ps1 diff --git a/tests/srcWithManifest/manifest.psd1 b/tests/srcWithManifestTestRepo/src/manifest.psd1 similarity index 100% rename from tests/srcWithManifest/manifest.psd1 rename to tests/srcWithManifestTestRepo/src/manifest.psd1 diff --git a/tests/srcWithManifest/modules/OtherPSModule.psm1 b/tests/srcWithManifestTestRepo/src/modules/OtherPSModule.psm1 similarity index 100% rename from tests/srcWithManifest/modules/OtherPSModule.psm1 rename to tests/srcWithManifestTestRepo/src/modules/OtherPSModule.psm1 diff --git a/tests/srcWithManifest/scripts/loader.ps1 b/tests/srcWithManifestTestRepo/src/scripts/loader.ps1 similarity index 100% rename from tests/srcWithManifest/scripts/loader.ps1 rename to tests/srcWithManifestTestRepo/src/scripts/loader.ps1 diff --git a/tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml b/tests/srcWithManifestTestRepo/src/types/DirectoryInfo.Types.ps1xml similarity index 100% rename from tests/srcWithManifest/types/DirectoryInfo.Types.ps1xml rename to tests/srcWithManifestTestRepo/src/types/DirectoryInfo.Types.ps1xml diff --git a/tests/srcWithManifest/types/FileInfo.Types.ps1xml b/tests/srcWithManifestTestRepo/src/types/FileInfo.Types.ps1xml similarity index 100% rename from tests/srcWithManifest/types/FileInfo.Types.ps1xml rename to tests/srcWithManifestTestRepo/src/types/FileInfo.Types.ps1xml diff --git a/tests/srcWithManifest/variables/private/PrivateVariables.ps1 b/tests/srcWithManifestTestRepo/src/variables/private/PrivateVariables.ps1 similarity index 100% rename from tests/srcWithManifest/variables/private/PrivateVariables.ps1 rename to tests/srcWithManifestTestRepo/src/variables/private/PrivateVariables.ps1 diff --git a/tests/srcWithManifest/variables/public/Moons.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/Moons.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/Moons.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/Moons.ps1 diff --git a/tests/srcWithManifest/variables/public/Planets.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/Planets.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/Planets.ps1 diff --git a/tests/srcWithManifest/variables/public/SolarSystems.ps1 b/tests/srcWithManifestTestRepo/src/variables/public/SolarSystems.ps1 similarity index 100% rename from tests/srcWithManifest/variables/public/SolarSystems.ps1 rename to tests/srcWithManifestTestRepo/src/variables/public/SolarSystems.ps1 diff --git a/tests/srcWithManifestTestRepo/tests/PSModuleTest.Tests.ps1 b/tests/srcWithManifestTestRepo/tests/PSModuleTest.Tests.ps1 new file mode 100644 index 00000000..2be65edb --- /dev/null +++ b/tests/srcWithManifestTestRepo/tests/PSModuleTest.Tests.ps1 @@ -0,0 +1,60 @@ +[CmdletBinding()] +Param( + # Path to the module to test. + [Parameter()] + [string] $Path +) + +Write-Verbose "Path to the module: [$Path]" -Verbose +Describe 'Environment Variables are available' { + It 'Should be available [<_>]' -ForEach @( + 'TEST_APP_ENT_CLIENT_ID', + 'TEST_APP_ENT_PRIVATE_KEY', + 'TEST_APP_ORG_CLIENT_ID', + 'TEST_APP_ORG_PRIVATE_KEY', + 'TEST_USER_ORG_FG_PAT', + 'TEST_USER_USER_FG_PAT', + 'TEST_USER_PAT' + ) { + $name = $_ + Write-Verbose "Environment variable: [$name]" -Verbose + Get-ChildItem env: | Where-Object { $_.Name -eq $name } | Should -Not -BeNullOrEmpty + } +} + +Describe 'PSModuleTest.Tests.ps1' { + Context 'Function: Test-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Test-PSModuleTest -Name 'World' | Out-String) -Verbose + Test-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Get-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Get-PSModuleTest -Name 'World' | Out-String) -Verbose + Get-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: New-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (New-PSModuleTest -Name 'World' | Out-String) -Verbose + New-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Function: Set-PSModuleTest' { + It 'Should be able to call the function' { + Write-Verbose (Set-PSModuleTest -Name 'World' | Out-String) -Verbose + Set-PSModuleTest -Name 'World' | Should -Be 'Hello, World!' + } + } + + Context 'Variables' { + It "Exports a variable for SolarSystems that contains 'Solar System'" { + Write-Verbose ($SolarSystems | Out-String) -Verbose + $SolarSystems[0].Name | Should -Be 'Solar System' + } + } +} diff --git a/tests/tools/1-build.ps1 b/tests/srcWithManifestTestRepo/tools/1-build.ps1 similarity index 100% rename from tests/tools/1-build.ps1 rename to tests/srcWithManifestTestRepo/tools/1-build.ps1 diff --git a/tests/tools/2-build.ps1 b/tests/srcWithManifestTestRepo/tools/2-build.ps1 similarity index 100% rename from tests/tools/2-build.ps1 rename to tests/srcWithManifestTestRepo/tools/2-build.ps1 From bcd7044b23d450a0ba5c9b86b8fee74af3d45891 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 11:39:15 +0100 Subject: [PATCH 11/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Update=20paths?= =?UTF-8?q?=20in=20Action-Test-Build=20workflow=20for=20manifest=20test=20?= =?UTF-8?q?repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Action-Test-Build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Action-Test-Build.yml b/.github/workflows/Action-Test-Build.yml index 653391db..072a4a88 100644 --- a/.github/workflows/Action-Test-Build.yml +++ b/.github/workflows/Action-Test-Build.yml @@ -50,8 +50,8 @@ jobs: uses: ./.github/actions/Build with: Name: PSModuleTest - Path: tests/srcWithManifestRepo/src - ModulesOutputPath: tests/srcWithManifestRepo/outputs/modules - DocsOutputPath: tests/srcWithManifestRepo/outputs/docs + Path: tests/srcWithManifestTestRepo/src + ModulesOutputPath: tests/srcWithManifestTestRepo/outputs/modules + DocsOutputPath: tests/srcWithManifestTestRepo/outputs/docs ModuleArtifactName: moduleWithManifest DocsArtifactName: docsWithManifest From 21e8b23bd687aa68bf8c29f629b44a80411f4bff Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 11:45:09 +0100 Subject: [PATCH 12/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Add=20documenta?= =?UTF-8?q?tion=20files=20for=20PSModule=20and=20SomethingElse=20modules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Get-PSModuleTest.md | 1 + .../New-PSModuleTest.md | 4 + .../outputs/docs/PSModule/PSModule.md | 1 + .../Set-PSModuleTest.md | 1 + .../docs/SomethingElse/SomethingElse.md | 1 + .../{PSModuleTest => }/Test-PSModuleTest.md | 1 + .../modules/PSModuleTest/PSModuleTest.psd1 | 31 +- .../modules/PSModuleTest/PSModuleTest.psm1 | 418 +++++++++++++----- .../PSModuleTest/modules/OtherPSModule.psm1 | 2 +- 9 files changed, 333 insertions(+), 127 deletions(-) rename tests/outputTestRepo/outputs/docs/{PSModuleTest => PSModule}/Get-PSModuleTest.md (99%) rename tests/outputTestRepo/outputs/docs/{PSModuleTest => PSModule}/New-PSModuleTest.md (89%) create mode 100644 tests/outputTestRepo/outputs/docs/PSModule/PSModule.md rename tests/outputTestRepo/outputs/docs/{PSModuleTest => SomethingElse}/Set-PSModuleTest.md (99%) create mode 100644 tests/outputTestRepo/outputs/docs/SomethingElse/SomethingElse.md rename tests/outputTestRepo/outputs/docs/{PSModuleTest => }/Test-PSModuleTest.md (99%) diff --git a/tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModule/Get-PSModuleTest.md similarity index 99% rename from tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModule/Get-PSModuleTest.md index 346f9b93..2179b427 100644 --- a/tests/outputTestRepo/outputs/docs/PSModuleTest/Get-PSModuleTest.md +++ b/tests/outputTestRepo/outputs/docs/PSModule/Get-PSModuleTest.md @@ -70,3 +70,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## NOTES ## RELATED LINKS + diff --git a/tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/PSModule/New-PSModuleTest.md similarity index 89% rename from tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/PSModule/New-PSModuleTest.md index e3ce5e7e..68096092 100644 --- a/tests/outputTestRepo/outputs/docs/PSModuleTest/New-PSModuleTest.md +++ b/tests/outputTestRepo/outputs/docs/PSModule/New-PSModuleTest.md @@ -68,5 +68,9 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## OUTPUTS ## NOTES +Testing if a module can have a [Markdown based link](https://example.com). +!"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," +\[This is a test\] ## RELATED LINKS + diff --git a/tests/outputTestRepo/outputs/docs/PSModule/PSModule.md b/tests/outputTestRepo/outputs/docs/PSModule/PSModule.md new file mode 100644 index 00000000..79741cf4 --- /dev/null +++ b/tests/outputTestRepo/outputs/docs/PSModule/PSModule.md @@ -0,0 +1 @@ +# This is PSModule diff --git a/tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/SomethingElse/Set-PSModuleTest.md similarity index 99% rename from tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/SomethingElse/Set-PSModuleTest.md index 6504d6f4..8c7fcf15 100644 --- a/tests/outputTestRepo/outputs/docs/PSModuleTest/Set-PSModuleTest.md +++ b/tests/outputTestRepo/outputs/docs/SomethingElse/Set-PSModuleTest.md @@ -70,3 +70,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## NOTES ## RELATED LINKS + diff --git a/tests/outputTestRepo/outputs/docs/SomethingElse/SomethingElse.md b/tests/outputTestRepo/outputs/docs/SomethingElse/SomethingElse.md new file mode 100644 index 00000000..d9f7e9ee --- /dev/null +++ b/tests/outputTestRepo/outputs/docs/SomethingElse/SomethingElse.md @@ -0,0 +1 @@ +# This is SomethingElse diff --git a/tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md b/tests/outputTestRepo/outputs/docs/Test-PSModuleTest.md similarity index 99% rename from tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md rename to tests/outputTestRepo/outputs/docs/Test-PSModuleTest.md index 59fc9f86..ce17f7bb 100644 --- a/tests/outputTestRepo/outputs/docs/PSModuleTest/Test-PSModuleTest.md +++ b/tests/outputTestRepo/outputs/docs/Test-PSModuleTest.md @@ -70,3 +70,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable ## NOTES ## RELATED LINKS + diff --git a/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 index ebe988d3..4dfc77af 100644 --- a/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 +++ b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psd1 @@ -5,17 +5,25 @@ 'Core' 'Desktop' ) - GUID = '20b37221-db1c-43db-9cca-f22b33123548' + GUID = 'e4fb58a5-2027-4542-b7be-e5e5f352e358' Author = 'PSModule' CompanyName = 'PSModule' - Copyright = '(c) 2024 PSModule. All rights reserved.' + Copyright = '(c) 2025 PSModule. All rights reserved.' Description = 'Process a module from source code to published module.' PowerShellVersion = '5.1' ProcessorArchitecture = 'None' RequiredModules = @( @{ - ModuleVersion = '1.0' - ModuleName = 'PSSemVer' + ModuleVersion = '1.1.8' + ModuleName = 'DynamicParams' + } + @{ + RequiredVersion = '1.0.0' + ModuleName = 'PSSemVer' + } + @{ + ModuleVersion = '0.3.1' + ModuleName = 'Store' } 'Utilities' ) @@ -39,13 +47,22 @@ 'Test-PSModuleTest' ) CmdletsToExport = @() - VariablesToExport = @() - AliasesToExport = '*' + VariablesToExport = @( + 'Moons' + 'Planets' + 'SolarSystems' + ) + AliasesToExport = @( + 'New-PSModuleTestAlias1' + 'New-PSModuleTestAlias2' + 'New-PSModuleTestAlias3' + 'New-PSModuleTestAlias4' + 'New-PSModuleTestAlias5' + ) ModuleList = @( 'modules/OtherPSModule.psm1' ) FileList = @( - 'PSModuleTest.psd1' 'PSModuleTest.psm1' 'assemblies/LsonLib.dll' 'data/Config.psd1' diff --git a/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 index 3553dd95..ffcb5734 100644 --- a/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 +++ b/tests/outputTestRepo/outputs/modules/PSModuleTest/PSModuleTest.psm1 @@ -2,44 +2,60 @@ [CmdletBinding()] param() -$scriptName = $MyInvocation.MyCommand.Name -Write-Verbose "[$scriptName] Importing module" - -#region - Data import -Write-Verbose "[$scriptName] - [data] - Processing folder" +$baseName = [System.IO.Path]::GetFileNameWithoutExtension($PSCommandPath) +$script:PSModuleInfo = Test-ModuleManifest -Path "$PSScriptRoot\$baseName.psd1" +$script:PSModuleInfo | Format-List | Out-String -Stream | ForEach-Object { Write-Debug $_ } +$scriptName = $script:PSModuleInfo.Name +Write-Debug "[$scriptName] - Importing module" +#region Data importer +Write-Debug "[$scriptName] - [data] - Processing folder" $dataFolder = (Join-Path $PSScriptRoot 'data') -Write-Verbose "[$scriptName] - [data] - [$dataFolder]" +Write-Debug "[$scriptName] - [data] - [$dataFolder]" Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object { - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing" + Write-Debug "[$scriptName] - [data] - [$($_.BaseName)] - Importing" New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force - Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done" + Write-Debug "[$scriptName] - [data] - [$($_.BaseName)] - Done" } - -Write-Verbose "[$scriptName] - [data] - Done" -#endregion - Data import - -#region - From /init -Write-Verbose "[$scriptName] - [/init] - Processing folder" - -#region - From /init/initializer.ps1 -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Importing" - +Write-Debug "[$scriptName] - [data] - Done" +#endregion Data importer +#region [init] +Write-Debug "[$scriptName] - [init] - Processing folder" +#region [init] - [initializer] +Write-Debug "[$scriptName] - [init] - [initializer] - Importing" Write-Verbose '-------------------------------' Write-Verbose '--- THIS IS AN INITIALIZER ---' Write-Verbose '-------------------------------' +Write-Debug "[$scriptName] - [init] - [initializer] - Done" +#endregion [init] - [initializer] +Write-Debug "[$scriptName] - [init] - Done" +#endregion [init] +#region [classes] - [private] +Write-Debug "[$scriptName] - [classes] - [private] - Processing folder" +#region [classes] - [private] - [SecretWriter] +Write-Debug "[$scriptName] - [classes] - [private] - [SecretWriter] - Importing" +class SecretWriter { + [string] $Alias + [string] $Name + [string] $Secret + + SecretWriter([string] $alias, [string] $name, [string] $secret) { + $this.Alias = $alias + $this.Name = $name + $this.Secret = $secret + } -Write-Verbose "[$scriptName] - [/init/initializer.ps1] - Done" -#endregion - From /init/initializer.ps1 - -Write-Verbose "[$scriptName] - [/init] - Done" -#endregion - From /init - -#region - From /classes -Write-Verbose "[$scriptName] - [/classes] - Processing folder" - -#region - From /classes/Book.ps1 -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Importing" - + [string] GetAlias() { + return $this.Alias + } +} +Write-Debug "[$scriptName] - [classes] - [private] - [SecretWriter] - Done" +#endregion [classes] - [private] - [SecretWriter] +Write-Debug "[$scriptName] - [classes] - [private] - Done" +#endregion [classes] - [private] +#region [classes] - [public] +Write-Debug "[$scriptName] - [classes] - [public] - Processing folder" +#region [classes] - [public] - [Book] +Write-Debug "[$scriptName] - [classes] - [public] - [Book] - Importing" class Book { # Class properties [string] $Title @@ -86,11 +102,6 @@ class Book { } } -Write-Verbose "[$scriptName] - [/classes/Book.ps1] - Done" -#endregion - From /classes/Book.ps1 -#region - From /classes/BookList.ps1 -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Importing" - class BookList { # Static property to hold the list of books static [System.Collections.Generic.List[Book]] $Books @@ -178,19 +189,29 @@ class BookList { } } -Write-Verbose "[$scriptName] - [/classes/BookList.ps1] - Done" -#endregion - From /classes/BookList.ps1 - -Write-Verbose "[$scriptName] - [/classes] - Done" -#endregion - From /classes - -#region - From /private -Write-Verbose "[$scriptName] - [/private] - Processing folder" - -#region - From /private/Get-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Importing" +enum Binding { + Hardcover + Paperback + EBook +} -Function Get-InternalPSModule { +enum Genre { + Mystery + Thriller + Romance + ScienceFiction + Fantasy + Horror +} +Write-Debug "[$scriptName] - [classes] - [public] - [Book] - Done" +#endregion [classes] - [public] - [Book] +Write-Debug "[$scriptName] - [classes] - [public] - Done" +#endregion [classes] - [public] +#region [functions] - [private] +Write-Debug "[$scriptName] - [functions] - [private] - Processing folder" +#region [functions] - [private] - [Get-InternalPSModule] +Write-Debug "[$scriptName] - [functions] - [private] - [Get-InternalPSModule] - Importing" +function Get-InternalPSModule { <# .SYNOPSIS Performs tests on a module. @@ -208,13 +229,11 @@ Function Get-InternalPSModule { ) Write-Output "Hello, $Name!" } - -Write-Verbose "[$scriptName] - [/private/Get-InternalPSModule.ps1] - Done" -#endregion - From /private/Get-InternalPSModule.ps1 -#region - From /private/Set-InternalPSModule.ps1 -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Importing" - -Function Set-InternalPSModule { +Write-Debug "[$scriptName] - [functions] - [private] - [Get-InternalPSModule] - Done" +#endregion [functions] - [private] - [Get-InternalPSModule] +#region [functions] - [private] - [Set-InternalPSModule] +Write-Debug "[$scriptName] - [functions] - [private] - [Set-InternalPSModule] - Importing" +function Set-InternalPSModule { <# .SYNOPSIS Performs tests on a module. @@ -236,22 +255,15 @@ Function Set-InternalPSModule { ) Write-Output "Hello, $Name!" } - -Write-Verbose "[$scriptName] - [/private/Set-InternalPSModule.ps1] - Done" -#endregion - From /private/Set-InternalPSModule.ps1 - -Write-Verbose "[$scriptName] - [/private] - Done" -#endregion - From /private - -#region - From /public -Write-Verbose "[$scriptName] - [/public] - Processing folder" - -#region - From /public/Get-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Importing" - -#Requires -Modules Utilities - -function Get-PSModuleTest { +Write-Debug "[$scriptName] - [functions] - [private] - [Set-InternalPSModule] - Done" +#endregion [functions] - [private] - [Set-InternalPSModule] +Write-Debug "[$scriptName] - [functions] - [private] - Done" +#endregion [functions] - [private] +#region [functions] - [public] +Write-Debug "[$scriptName] - [functions] - [public] - Processing folder" +#region [functions] - [public] - [Test-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [Test-PSModuleTest] - Importing" +function Test-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -267,19 +279,20 @@ function Get-PSModuleTest { [Parameter(Mandatory)] [string] $Name ) - Write-Debug 'Debug message' - Write-Verbose 'Verbose message' Write-Output "Hello, $Name!" } +Write-Debug "[$scriptName] - [functions] - [public] - [Test-PSModuleTest] - Done" +#endregion [functions] - [public] - [Test-PSModuleTest] +#region [functions] - [public] - [PSModule] +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - Processing folder" +#region [functions] - [public] - [PSModule] - [Get-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - [Get-PSModuleTest] - Importing" +#Requires -Modules Utilities +#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' } +#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' } +#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' } -Write-Verbose "[$scriptName] - [/public/Get-PSModuleTest.ps1] - Done" -#endregion - From /public/Get-PSModuleTest.ps1 -#region - From /public/New-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Importing" - -#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} - -function New-PSModuleTest { +function Get-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -289,27 +302,21 @@ function New-PSModuleTest { "Hello, World!" #> - [Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', - Justification = 'Reason for suppressing' - )] [CmdletBinding()] param ( # Name of the person to greet. [Parameter(Mandatory)] [string] $Name ) - Write-Debug 'Debug message' - Write-Verbose 'Verbose message' Write-Output "Hello, $Name!" } +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - [Get-PSModuleTest] - Done" +#endregion [functions] - [public] - [PSModule] - [Get-PSModuleTest] +#region [functions] - [public] - [PSModule] - [New-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - [New-PSModuleTest] - Importing" +#Requires -Modules @{ModuleName='PSSemVer'; ModuleVersion='1.0'} -Write-Verbose "[$scriptName] - [/public/New-PSModuleTest.ps1] - Done" -#endregion - From /public/New-PSModuleTest.ps1 -#region - From /public/Set-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Importing" - -function Set-PSModuleTest { +function New-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -318,30 +325,41 @@ function Set-PSModuleTest { Test-PSModule -Name 'World' "Hello, World!" + + .NOTES + Testing if a module can have a [Markdown based link](https://example.com). + !"#¤%&/()=?`´^¨*'-_+§½{[]}<>|@£$€¥¢:;.," + \[This is a test\] #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', Justification = 'Reason for suppressing' )] - [CmdletBinding(SupportsShouldProcess)] + [Alias('New-PSModuleTestAlias1')] + [Alias('New-PSModuleTestAlias2')] + [CmdletBinding()] param ( # Name of the person to greet. [Parameter(Mandatory)] [string] $Name ) - Write-Debug 'Debug message' - Write-Verbose 'Verbose message' - if ($PSCmdlet.ShouldProcess($Name, 'Set-PSModuleTest')) { - Write-Output "Hello, $Name!" - } + Write-Output "Hello, $Name!" } -Write-Verbose "[$scriptName] - [/public/Set-PSModuleTest.ps1] - Done" -#endregion - From /public/Set-PSModuleTest.ps1 -#region - From /public/Test-PSModuleTest.ps1 -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Importing" +New-Alias New-PSModuleTestAlias3 New-PSModuleTest +New-Alias -Name New-PSModuleTestAlias4 -Value New-PSModuleTest -function Test-PSModuleTest { + +Set-Alias New-PSModuleTestAlias5 New-PSModuleTest +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - [New-PSModuleTest] - Done" +#endregion [functions] - [public] - [PSModule] - [New-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [PSModule] - Done" +#endregion [functions] - [public] - [PSModule] +#region [functions] - [public] - [SomethingElse] +Write-Debug "[$scriptName] - [functions] - [public] - [SomethingElse] - Processing folder" +#region [functions] - [public] - [SomethingElse] - [Set-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [SomethingElse] - [Set-PSModuleTest] - Importing" +function Set-PSModuleTest { <# .SYNOPSIS Performs tests on a module. @@ -351,42 +369,204 @@ function Test-PSModuleTest { "Hello, World!" #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', '', Scope = 'Function', + Justification = 'Reason for suppressing' + )] [CmdletBinding()] param ( # Name of the person to greet. [Parameter(Mandatory)] [string] $Name ) - Write-Debug 'Debug message' - Write-Verbose 'Verbose message' Write-Output "Hello, $Name!" } - -Write-Verbose "[$scriptName] - [/public/Test-PSModuleTest.ps1] - Done" -#endregion - From /public/Test-PSModuleTest.ps1 - -Write-Verbose "[$scriptName] - [/public] - Done" -#endregion - From /public - -#region - From /finally.ps1 -Write-Verbose "[$scriptName] - [/finally.ps1] - Importing" - +Write-Debug "[$scriptName] - [functions] - [public] - [SomethingElse] - [Set-PSModuleTest] - Done" +#endregion [functions] - [public] - [SomethingElse] - [Set-PSModuleTest] +Write-Debug "[$scriptName] - [functions] - [public] - [SomethingElse] - Done" +#endregion [functions] - [public] - [SomethingElse] +Write-Debug "[$scriptName] - [functions] - [public] - Done" +#endregion [functions] - [public] +#region [variables] - [private] +Write-Debug "[$scriptName] - [variables] - [private] - Processing folder" +#region [variables] - [private] - [PrivateVariables] +Write-Debug "[$scriptName] - [variables] - [private] - [PrivateVariables] - Importing" +$script:HabitablePlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + }, + @{ + Name = 'Proxima Centauri b' + Mass = 1.17 + Diameter = 11449 + DayLength = 5.15 + }, + @{ + Name = 'Kepler-442b' + Mass = 2.34 + Diameter = 11349 + DayLength = 5.7 + }, + @{ + Name = 'Kepler-452b' + Mass = 5.0 + Diameter = 17340 + DayLength = 20.0 + } +) + +$script:InhabitedPlanets = @( + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + }, + @{ + Name = 'Mars' + Mass = 0.642 + Diameter = 6792 + DayLength = 24.7 + } +) +Write-Debug "[$scriptName] - [variables] - [private] - [PrivateVariables] - Done" +#endregion [variables] - [private] - [PrivateVariables] +Write-Debug "[$scriptName] - [variables] - [private] - Done" +#endregion [variables] - [private] +#region [variables] - [public] +Write-Debug "[$scriptName] - [variables] - [public] - Processing folder" +#region [variables] - [public] - [Moons] +Write-Debug "[$scriptName] - [variables] - [public] - [Moons] - Importing" +$script:Moons = @( + @{ + Planet = 'Earth' + Name = 'Moon' + } +) +Write-Debug "[$scriptName] - [variables] - [public] - [Moons] - Done" +#endregion [variables] - [public] - [Moons] +#region [variables] - [public] - [Planets] +Write-Debug "[$scriptName] - [variables] - [public] - [Planets] - Importing" +$script:Planets = @( + @{ + Name = 'Mercury' + Mass = 0.330 + Diameter = 4879 + DayLength = 4222.6 + }, + @{ + Name = 'Venus' + Mass = 4.87 + Diameter = 12104 + DayLength = 2802.0 + }, + @{ + Name = 'Earth' + Mass = 5.97 + Diameter = 12756 + DayLength = 24.0 + } +) +Write-Debug "[$scriptName] - [variables] - [public] - [Planets] - Done" +#endregion [variables] - [public] - [Planets] +#region [variables] - [public] - [SolarSystems] +Write-Debug "[$scriptName] - [variables] - [public] - [SolarSystems] - Importing" +$script:SolarSystems = @( + @{ + Name = 'Solar System' + Planets = $script:Planets + Moons = $script:Moons + }, + @{ + Name = 'Alpha Centauri' + Planets = @() + Moons = @() + }, + @{ + Name = 'Sirius' + Planets = @() + Moons = @() + } +) +Write-Debug "[$scriptName] - [variables] - [public] - [SolarSystems] - Done" +#endregion [variables] - [public] - [SolarSystems] +Write-Debug "[$scriptName] - [variables] - [public] - Done" +#endregion [variables] - [public] +#region [finally] +Write-Debug "[$scriptName] - [finally] - Importing" Write-Verbose '------------------------------' Write-Verbose '--- THIS IS A LAST LOADER ---' Write-Verbose '------------------------------' -Write-Verbose "[$scriptName] - [/finally.ps1] - Done" -#endregion - From /finally.ps1 +Write-Debug "[$scriptName] - [finally] - Done" +#endregion [finally] +#region Class exporter +# Get the internal TypeAccelerators class to use its static methods. +$TypeAcceleratorsClass = [psobject].Assembly.GetType( + 'System.Management.Automation.TypeAccelerators' +) +# Ensure none of the types would clobber an existing type accelerator. +# If a type accelerator with the same name exists, throw an exception. +$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get +# Define the types to export with type accelerators. +$ExportableEnums = @( + [Binding] + [Genre] +) +$ExportableEnums | ForEach-Object { Write-Verbose "Exporting enum '$($_.FullName)'." } +foreach ($Type in $ExportableEnums) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Enum already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing enum '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} +$ExportableClasses = @( + [Book] + [BookList] +) +$ExportableClasses | ForEach-Object { Write-Verbose "Exporting class '$($_.FullName)'." } +foreach ($Type in $ExportableClasses) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + Write-Verbose "Class already exists [$($Type.FullName)]. Skipping." + } else { + Write-Verbose "Importing class '$Type'." + $TypeAcceleratorsClass::Add($Type.FullName, $Type) + } +} +# Remove type accelerators when the module is removed. +$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { + foreach ($Type in ($ExportableEnums + $ExportableClasses)) { + $TypeAcceleratorsClass::Remove($Type.FullName) + } +}.GetNewClosure() +#endregion Class exporter +#region Member exporter $exports = @{ - Cmdlet = '' Alias = '*' - Variable = '' + Cmdlet = '' Function = @( 'Get-PSModuleTest' 'New-PSModuleTest' 'Set-PSModuleTest' 'Test-PSModuleTest' ) + Variable = @( + 'Moons' + 'Planets' + 'SolarSystems' + ) } Export-ModuleMember @exports +#endregion Member exporter diff --git a/tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 b/tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 index 9e4353ba..5d6af8ea 100644 --- a/tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 +++ b/tests/outputTestRepo/outputs/modules/PSModuleTest/modules/OtherPSModule.psm1 @@ -1,4 +1,4 @@ -Function Get-OtherPSModule { +function Get-OtherPSModule { <# .SYNOPSIS Performs tests on a module. From daefb55391875277445bfc543684f3efef831878 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 11:51:14 +0100 Subject: [PATCH 13/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Update=20paths?= =?UTF-8?q?=20in=20CI=20workflows=20for=20PSModuleTest=20to=20reflect=20ne?= =?UTF-8?q?w=20directory=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Workflow-Test-Default-CI.yml | 2 +- .github/workflows/Workflow-Test-Default.yml | 6 +++--- .github/workflows/Workflow-Test-WithManifest-CI.yml | 6 +++--- .github/workflows/Workflow-Test-WithManifest.yml | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/Workflow-Test-Default-CI.yml b/.github/workflows/Workflow-Test-Default-CI.yml index 6d10da29..7f91a079 100644 --- a/.github/workflows/Workflow-Test-Default-CI.yml +++ b/.github/workflows/Workflow-Test-Default-CI.yml @@ -23,7 +23,7 @@ jobs: secrets: inherit with: Name: PSModuleTest - Path: tests/srcTestRepo + Path: tests/srcTestRepo/src ModulesOutputPath: tests/srcTestRepo/outputs/modules DocsOutputPath: tests/srcTestRepo/outputs/docs SkipTests: Module diff --git a/.github/workflows/Workflow-Test-Default.yml b/.github/workflows/Workflow-Test-Default.yml index 2c72d2bb..3ae91ac9 100644 --- a/.github/workflows/Workflow-Test-Default.yml +++ b/.github/workflows/Workflow-Test-Default.yml @@ -25,8 +25,8 @@ jobs: secrets: inherit with: Name: PSModuleTest - Path: tests/src - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcTestRepo/src + ModulesOutputPath: tests/srcTestRepo/outputs/modules + DocsOutputPath: tests/srcTestRepo/outputs/docs TestProcess: true SkipTests: Module diff --git a/.github/workflows/Workflow-Test-WithManifest-CI.yml b/.github/workflows/Workflow-Test-WithManifest-CI.yml index e998ec66..663c7e5e 100644 --- a/.github/workflows/Workflow-Test-WithManifest-CI.yml +++ b/.github/workflows/Workflow-Test-WithManifest-CI.yml @@ -23,7 +23,7 @@ jobs: secrets: inherit with: Name: PSModuleTest - Path: tests/srcWithManifest - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcWithManifestTestRepo/src + ModulesOutputPath: tests/srcWithManifestTestRepo/outputs/modules + DocsOutputPath: tests/srcWithManifestTestRepo/outputs/docs SkipTests: Linux diff --git a/.github/workflows/Workflow-Test-WithManifest.yml b/.github/workflows/Workflow-Test-WithManifest.yml index ea4d4fdf..40034ff2 100644 --- a/.github/workflows/Workflow-Test-WithManifest.yml +++ b/.github/workflows/Workflow-Test-WithManifest.yml @@ -25,8 +25,8 @@ jobs: secrets: inherit with: Name: PSModuleTest - Path: tests/srcWithManifest - ModulesOutputPath: tests/outputs/modules - DocsOutputPath: tests/outputs/docs + Path: tests/srcWithManifestTestRepo/src + ModulesOutputPath: tests/srcWithManifestTestRepo/outputs/modules + DocsOutputPath: tests/srcWithManifestTestRepo/outputs/docs TestProcess: true SkipTests: Linux From 99366fe215f8af5459aed053ad929769239d9b87 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 11:53:13 +0100 Subject: [PATCH 14/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Remove=20obsole?= =?UTF-8?q?te=20Action-Test-Document=20workflow=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Action-Test-Document.yml | 32 ---------------------- 1 file changed, 32 deletions(-) delete mode 100644 .github/workflows/Action-Test-Document.yml diff --git a/.github/workflows/Action-Test-Document.yml b/.github/workflows/Action-Test-Document.yml deleted file mode 100644 index 65121592..00000000 --- a/.github/workflows/Action-Test-Document.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Action-Test-Document - -run-name: "Action-Test-Document - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}" - -on: - workflow_dispatch: - pull_request: - schedule: - - cron: '0 0 * * *' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - pull-requests: read - -jobs: - ActionTestBasic: - name: Action-Test-Document - [Basic] - runs-on: ubuntu-latest - steps: - # Need to check out as part of the test, as its a local action - - name: Checkout repo - uses: actions/checkout@v4 - - - name: Action-Test-Document - uses: ./.github/actions/Document - with: - working-directory: tests/srcTestRepo/src - subject: PSModule From 4c2a026fcb801e259be1b161008020e12ad09538 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 11 Feb 2025 13:03:47 +0100 Subject: [PATCH 15/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Remove=20obsole?= =?UTF-8?q?te=20README=20and=20mkdocs.yml=20files=20from=20test=20director?= =?UTF-8?q?ies=20and=20add=20new=20ones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/{ => outputTestRepo}/README.md | 0 tests/{ => outputTestRepo}/mkdocs.yml | 0 tests/srcTestRepo/README.md | 3 + tests/srcTestRepo/mkdocs.yml | 75 ++++++++++++++++++++++++ tests/srcWithManifestTestRepo/README.md | 3 + tests/srcWithManifestTestRepo/mkdocs.yml | 75 ++++++++++++++++++++++++ 6 files changed, 156 insertions(+) rename tests/{ => outputTestRepo}/README.md (100%) rename tests/{ => outputTestRepo}/mkdocs.yml (100%) create mode 100644 tests/srcTestRepo/README.md create mode 100644 tests/srcTestRepo/mkdocs.yml create mode 100644 tests/srcWithManifestTestRepo/README.md create mode 100644 tests/srcWithManifestTestRepo/mkdocs.yml diff --git a/tests/README.md b/tests/outputTestRepo/README.md similarity index 100% rename from tests/README.md rename to tests/outputTestRepo/README.md diff --git a/tests/mkdocs.yml b/tests/outputTestRepo/mkdocs.yml similarity index 100% rename from tests/mkdocs.yml rename to tests/outputTestRepo/mkdocs.yml diff --git a/tests/srcTestRepo/README.md b/tests/srcTestRepo/README.md new file mode 100644 index 00000000..b459e352 --- /dev/null +++ b/tests/srcTestRepo/README.md @@ -0,0 +1,3 @@ +# Test module + +This is a test readme. diff --git a/tests/srcTestRepo/mkdocs.yml b/tests/srcTestRepo/mkdocs.yml new file mode 100644 index 00000000..df5e17ad --- /dev/null +++ b/tests/srcTestRepo/mkdocs.yml @@ -0,0 +1,75 @@ +site_name: -{{ REPO_NAME }}- +theme: + name: material + language: en + font: + text: Roboto + code: Sono + logo: Assets/icon.png + favicon: Assets/icon.png + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + primary: black + accent: green + icon: material/toggle-switch-off-outline + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + primary: indigo + accent: green + icon: material/toggle-switch + name: Switch to system preference + icon: + repo: material/github + features: + - navigation.instant + - navigation.instant.progress + - navigation.indexes + - navigation.top + - navigation.tracking + - navigation.expand + - search.suggest + - search.highlight + +repo_name: -{{ REPO_OWNER }}-/-{{ REPO_NAME }}- +repo_url: https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}- + +plugins: + - search + +markdown_extensions: + - toc: + permalink: true # Adds a link icon to headings + - attr_list + - admonition + - md_in_html + - pymdownx.details # Enables collapsible admonitions + +extra: + social: + - icon: fontawesome/brands/discord + link: https://discord.gg/jedJWCPAhD + name: -{{ REPO_OWNER }}- on Discord + - icon: fontawesome/brands/github + link: https://github.com/-{{ REPO_OWNER }}-/ + name: -{{ REPO_OWNER }}- on GitHub + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + actions: + - accept + - reject diff --git a/tests/srcWithManifestTestRepo/README.md b/tests/srcWithManifestTestRepo/README.md new file mode 100644 index 00000000..b459e352 --- /dev/null +++ b/tests/srcWithManifestTestRepo/README.md @@ -0,0 +1,3 @@ +# Test module + +This is a test readme. diff --git a/tests/srcWithManifestTestRepo/mkdocs.yml b/tests/srcWithManifestTestRepo/mkdocs.yml new file mode 100644 index 00000000..df5e17ad --- /dev/null +++ b/tests/srcWithManifestTestRepo/mkdocs.yml @@ -0,0 +1,75 @@ +site_name: -{{ REPO_NAME }}- +theme: + name: material + language: en + font: + text: Roboto + code: Sono + logo: Assets/icon.png + favicon: Assets/icon.png + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + primary: black + accent: green + icon: material/toggle-switch-off-outline + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + primary: indigo + accent: green + icon: material/toggle-switch + name: Switch to system preference + icon: + repo: material/github + features: + - navigation.instant + - navigation.instant.progress + - navigation.indexes + - navigation.top + - navigation.tracking + - navigation.expand + - search.suggest + - search.highlight + +repo_name: -{{ REPO_OWNER }}-/-{{ REPO_NAME }}- +repo_url: https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}- + +plugins: + - search + +markdown_extensions: + - toc: + permalink: true # Adds a link icon to headings + - attr_list + - admonition + - md_in_html + - pymdownx.details # Enables collapsible admonitions + +extra: + social: + - icon: fontawesome/brands/discord + link: https://discord.gg/jedJWCPAhD + name: -{{ REPO_OWNER }}- on Discord + - icon: fontawesome/brands/github + link: https://github.com/-{{ REPO_OWNER }}-/ + name: -{{ REPO_OWNER }}- on GitHub + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + actions: + - accept + - reject From fcc6e4fb54d3b2aa3168ed976355985ef40c0b97 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Wed, 12 Feb 2025 15:16:36 +0100 Subject: [PATCH 16/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Add=20documenta?= =?UTF-8?q?tion=20files=20and=20workflows=20for=20PSModule=20framework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Docs.yml | 58 ++++++++ README.md | 125 +++------------- .../actions/Build/README.md => docs/Build.md | 0 .../Document/README.md => docs/Document.md | 0 .../README.md => docs/Initialize.md | 0 .../Publish/README.md => docs/Publish.md | 0 docs/README.md | 135 ++++++++++++++++++ .../actions/Test/README.md => docs/Test.md | 0 mkdocs.yml | 85 +++++++++++ 9 files changed, 299 insertions(+), 104 deletions(-) create mode 100644 .github/workflows/Docs.yml rename .github/actions/Build/README.md => docs/Build.md (100%) rename .github/actions/Document/README.md => docs/Document.md (100%) rename .github/actions/Initialize/README.md => docs/Initialize.md (100%) rename .github/actions/Publish/README.md => docs/Publish.md (100%) create mode 100644 docs/README.md rename .github/actions/Test/README.md => docs/Test.md (100%) create mode 100644 mkdocs.yml diff --git a/.github/workflows/Docs.yml b/.github/workflows/Docs.yml new file mode 100644 index 00000000..e89f35f3 --- /dev/null +++ b/.github/workflows/Docs.yml @@ -0,0 +1,58 @@ +name: Publish Docs + +on: + workflow_dispatch: + push: + branches: + - main + paths: + - docs/** + - mkdocs.yml + - .github/workflows/Docs.yml + +env: + GH_TOKEN: ${{ github.token }} + +defaults: + run: + shell: pwsh + +jobs: + build: + runs-on: ubuntu-latest + + permissions: + contents: read # to checkout the repo + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/configure-pages@v5 + + - name: Install mkdoks-material + run: | + pip install mkdocs-material + pip install mkdocs-git-authors-plugin + pip install mkdocs-git-revision-date-localized-plugin + pip install mkdocs-git-committers-plugin-2 + + - name: Build mkdocs-material project + run: | + mkdocs build --config-file ./mkdocs.yml --strict --site-dir _site/ + + - uses: actions/upload-pages-artifact@v3 + + deploy: + needs: build + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index b324c6cc..79305955 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,31 @@ -# Process-PSModule +# PSModule CI/CD Workflow -A workflow for the PSModule process, stitching together the `Initialize`, `Build`, `Test`, and `Publish` actions to create a complete -CI/CD pipeline for PowerShell modules. The workflow is used by all PowerShell modules in the PSModule organization. +## Overview -## Specifications and practices +The **Process-PSModule** workflow is a comprehensive GitHub reusable workflow that automates the **CI/CD pipeline** for PowerShell modules. It integrates the entire module lifecycle, from initialization to publication, ensuring best practices, compatibility, and compliance with industry standards. -Process-PSModule follows: +## Features -- [Test-Driven Development](https://testdriven.io/test-driven-development/) using [Pester](https://pester.dev) and [PSScriptAnalyzer](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) -- [GitHub Flow specifications](https://docs.github.com/en/get-started/using-github/github-flow) -- [SemVer 2.0.0 specifications](https://semver.org) -- [Continiuous Delivery practices](https://en.wikipedia.org/wiki/Continuous_delivery) +This workflow seamlessly stitches together the following actions: -## How it works +- **[Initialize-PSModule](https://github.com/PSModule/Initialize-PSModule)**: Prepares the GitHub Actions runner with required dependencies. +- **[Build-PSModule](https://github.com/PSModule/Build-PSModule)**: Compiles the source code into a production-ready PowerShell module. +- **[Test-PSModule](https://github.com/PSModule/Test-PSModule)**: Executes Pester and PSScriptAnalyzer tests to validate the module. +- **[Publish-PSModule](https://github.com/PSModule/Publish-PSModule)**: Publishes the module to the PowerShell Gallery, generates documentation, and creates GitHub releases. -The workflow is designed to be trigger on pull requests to the repository's default branch. -When a pull request is opened, closed, reopened, synchronized (push), or labeled, the workflow will run. -Depending on the labels in the pull requests, the workflow will result in different outcomes. +## How It Works -![Process diagram](./media/Process-PSModule.png) +The workflow triggers automatically on pull requests to the repository's default branch, responding to events such as opening, closing, synchronization, and labeling. Based on the assigned labels, it determines the appropriate workflow actions to execute. -- [Test-PSModule](https://github.com/PSModule/Test-PSModule/) - Tests the source code using PSScriptAnalyzer, PSModule source code tests suites. This runs on 4 different environments to check compatibility. - - PowerShell 7.x on Windows, Ubuntu and macOS. - - Windows PowerShell 5.1 on Windows. -- [Build-PSModule](https://github.com/PSModule/Build-PSModule/) - Compiles the repository into an efficient PowerShell module. -- [Test-PSModule](https://github.com/PSModule/Test-PSModule/) - Tests the compiled module using PSScriptAnalyzer, PSModule module tests and custom module tests from the module repository. This runs on 4 different environments to check compatibility. - - PowerShell 7.x on Windows, Ubuntu and macOS. - - Windows PowerShell 5.1 on Windows. -- [Publish-PSModule](https://github.com/PSModule/Publish-PSModule/) - Publishes the module to the PowerShell Gallery, docs to GitHub Pages, and creates a release on the GitHub repository. +### Key Practices Followed +- **Test-Driven Development** using [Pester](https://pester.dev) and [PSScriptAnalyzer](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) +- **GitHub Flow** for streamlined branching and merging +- **Semantic Versioning (SemVer 2.0.0)** to manage module versions systematically +- **Continuous Delivery (CD)** principles for automated deployments -To use the workflow, create a new file in the `.github/workflows` directory of the module repository and add the following content. -

-Workflow suggestion +## Usage + +To use this workflow in your PowerShell module repository, create a new GitHub Actions workflow file under `.github/workflows`: ```yaml name: Process-PSModule @@ -47,89 +41,12 @@ on: - synchronize - labeled -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - jobs: Process-PSModule: uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v2 secrets: inherit - ``` -
- -## Usage - -### Inputs - -| Name | Type | Description | Required | Default | -| ---- | ---- | ----------- | -------- | ------- | -| `Name` | `string` | The name of the module to process. This defaults to the repository name if nothing is specified. | `false` | N/A | -| `Path` | `string` | The path to the source code of the module. | `false` | `src` | -| `ModulesOutputPath` | `string` | The path to the output directory for the modules. | `false` | `outputs/modules` | -| `DocsOutputPath` | `string` | The path to the output directory for the documentation. | `false` | `outputs/docs` | -| `PublishDocs` | `boolean` | Whether to publish the documentation using MkDocs and GitHub Pages. | `false` | `true` | -| `SiteOutputPath` | `string` | The path to the output directory for the site. | `false` | `outputs/site` | -| `SkipTests` | `string` | Defines what types of tests to skip. Allowed values are 'All', 'SourceCode', 'Module', 'None', 'macOS', 'Windows', 'Linux'. | `false` | `None` | -| `TestProcess` | `boolean` | Whether to test the process. | `false` | `false` | -| `Version` | `string` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | N/A | -| `Prerelease` | `boolean` | Whether to use a prerelease version of the 'GitHub' module. | `false` | `false` | -| `Debug` | `boolean` | Whether to enable debug output. Adds a `debug` step to every job. | `false` | `false` | -| `Verbose` | `boolean` | Whether to enable verbose output. | `false` | `false` | - -### Secrets - -The following secrets are used by the workflow. They can be automatically provided (if available) by setting the `secrets: inherit` -in the workflow file. - -| Name | Location | Description | Default | -| ---- | -------- | ----------- | ------- | -| `GITHUB_TOKEN` | `github` context | The token used to authenticate with GitHub. | `${{ secrets.GITHUB_TOKEN }}` | -| `APIKey` | GitHub secrets | The API key for the PowerShell Gallery. | N/A | -| `TEST_APP_ENT_CLIENT_ID` | GitHub secrets | The client ID of an Enterprise GitHub App for running tests. | N/A | -| `TEST_APP_ENT_PRIVATE_KEY` | GitHub secrets | The private key of an Enterprise GitHub App for running tests. | N/A | -| `TEST_APP_ORG_CLIENT_ID` | GitHub secrets | The client ID of an Organization GitHub App for running tests. | N/A | -| `TEST_APP_ORG_PRIVATE_KEY` | GitHub secrets | The private key of an Organization GitHub App for running tests. | N/A | -| `TEST_USER_ORG_FG_PAT` | GitHub secrets | The fine-grained personal access token with org access for running tests. | N/A | -| `TEST_USER_USER_FG_PAT` | GitHub secrets | The fine-grained personal access token with user account access for running tests. | N/A | -| `TEST_USER_PAT` | GitHub secrets | The classic personal access token for running tests. | N/A | - -## Permissions - -The action requires the following permissions: - -If running the action in a restrictive mode, the following permissions needs to be granted to the action: - -```yaml -permissions: - contents: write # Create releases - pull-requests: write # Create comments on the PRs - statuses: write # Update the status of the PRs from the linter -``` - -### Publishing to GitHub Pages - -To publish the documentation to GitHub Pages, the action requires the following permissions: - -```yaml -permissions: - pages: write # Deploy to Pages - id-token: write # Verify the deployment originates from an appropriate source -``` - -For more info see [Deploy GitHub Pages site](https://github.com/marketplace/actions/deploy-github-pages-site). - -## Compatibility -The action is compatible with the following configurations: +## Documentation -| OS | Shell | -| --- | --- | -| windows-latest | pwsh | -| macos-latest | pwsh | -| ubuntu-latest | pwsh | +For a detailed guide on how to configure and use the **Process-PSModule** workflow, please review the [documentation](https://PSModule.io/Process-PSModule). diff --git a/.github/actions/Build/README.md b/docs/Build.md similarity index 100% rename from .github/actions/Build/README.md rename to docs/Build.md diff --git a/.github/actions/Document/README.md b/docs/Document.md similarity index 100% rename from .github/actions/Document/README.md rename to docs/Document.md diff --git a/.github/actions/Initialize/README.md b/docs/Initialize.md similarity index 100% rename from .github/actions/Initialize/README.md rename to docs/Initialize.md diff --git a/.github/actions/Publish/README.md b/docs/Publish.md similarity index 100% rename from .github/actions/Publish/README.md rename to docs/Publish.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..b324c6cc --- /dev/null +++ b/docs/README.md @@ -0,0 +1,135 @@ +# Process-PSModule + +A workflow for the PSModule process, stitching together the `Initialize`, `Build`, `Test`, and `Publish` actions to create a complete +CI/CD pipeline for PowerShell modules. The workflow is used by all PowerShell modules in the PSModule organization. + +## Specifications and practices + +Process-PSModule follows: + +- [Test-Driven Development](https://testdriven.io/test-driven-development/) using [Pester](https://pester.dev) and [PSScriptAnalyzer](https://learn.microsoft.com/en-us/powershell/utility-modules/psscriptanalyzer/overview?view=ps-modules) +- [GitHub Flow specifications](https://docs.github.com/en/get-started/using-github/github-flow) +- [SemVer 2.0.0 specifications](https://semver.org) +- [Continiuous Delivery practices](https://en.wikipedia.org/wiki/Continuous_delivery) + +## How it works + +The workflow is designed to be trigger on pull requests to the repository's default branch. +When a pull request is opened, closed, reopened, synchronized (push), or labeled, the workflow will run. +Depending on the labels in the pull requests, the workflow will result in different outcomes. + +![Process diagram](./media/Process-PSModule.png) + +- [Test-PSModule](https://github.com/PSModule/Test-PSModule/) - Tests the source code using PSScriptAnalyzer, PSModule source code tests suites. This runs on 4 different environments to check compatibility. + - PowerShell 7.x on Windows, Ubuntu and macOS. + - Windows PowerShell 5.1 on Windows. +- [Build-PSModule](https://github.com/PSModule/Build-PSModule/) - Compiles the repository into an efficient PowerShell module. +- [Test-PSModule](https://github.com/PSModule/Test-PSModule/) - Tests the compiled module using PSScriptAnalyzer, PSModule module tests and custom module tests from the module repository. This runs on 4 different environments to check compatibility. + - PowerShell 7.x on Windows, Ubuntu and macOS. + - Windows PowerShell 5.1 on Windows. +- [Publish-PSModule](https://github.com/PSModule/Publish-PSModule/) - Publishes the module to the PowerShell Gallery, docs to GitHub Pages, and creates a release on the GitHub repository. + +To use the workflow, create a new file in the `.github/workflows` directory of the module repository and add the following content. +
+Workflow suggestion + +```yaml +name: Process-PSModule + +on: + pull_request: + branches: + - main + types: + - closed + - opened + - reopened + - synchronize + - labeled + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: write + pull-requests: write + +jobs: + Process-PSModule: + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@v2 + secrets: inherit + +``` +
+ +## Usage + +### Inputs + +| Name | Type | Description | Required | Default | +| ---- | ---- | ----------- | -------- | ------- | +| `Name` | `string` | The name of the module to process. This defaults to the repository name if nothing is specified. | `false` | N/A | +| `Path` | `string` | The path to the source code of the module. | `false` | `src` | +| `ModulesOutputPath` | `string` | The path to the output directory for the modules. | `false` | `outputs/modules` | +| `DocsOutputPath` | `string` | The path to the output directory for the documentation. | `false` | `outputs/docs` | +| `PublishDocs` | `boolean` | Whether to publish the documentation using MkDocs and GitHub Pages. | `false` | `true` | +| `SiteOutputPath` | `string` | The path to the output directory for the site. | `false` | `outputs/site` | +| `SkipTests` | `string` | Defines what types of tests to skip. Allowed values are 'All', 'SourceCode', 'Module', 'None', 'macOS', 'Windows', 'Linux'. | `false` | `None` | +| `TestProcess` | `boolean` | Whether to test the process. | `false` | `false` | +| `Version` | `string` | Specifies the version of the GitHub module to be installed. The value must be an exact version. | `false` | N/A | +| `Prerelease` | `boolean` | Whether to use a prerelease version of the 'GitHub' module. | `false` | `false` | +| `Debug` | `boolean` | Whether to enable debug output. Adds a `debug` step to every job. | `false` | `false` | +| `Verbose` | `boolean` | Whether to enable verbose output. | `false` | `false` | + +### Secrets + +The following secrets are used by the workflow. They can be automatically provided (if available) by setting the `secrets: inherit` +in the workflow file. + +| Name | Location | Description | Default | +| ---- | -------- | ----------- | ------- | +| `GITHUB_TOKEN` | `github` context | The token used to authenticate with GitHub. | `${{ secrets.GITHUB_TOKEN }}` | +| `APIKey` | GitHub secrets | The API key for the PowerShell Gallery. | N/A | +| `TEST_APP_ENT_CLIENT_ID` | GitHub secrets | The client ID of an Enterprise GitHub App for running tests. | N/A | +| `TEST_APP_ENT_PRIVATE_KEY` | GitHub secrets | The private key of an Enterprise GitHub App for running tests. | N/A | +| `TEST_APP_ORG_CLIENT_ID` | GitHub secrets | The client ID of an Organization GitHub App for running tests. | N/A | +| `TEST_APP_ORG_PRIVATE_KEY` | GitHub secrets | The private key of an Organization GitHub App for running tests. | N/A | +| `TEST_USER_ORG_FG_PAT` | GitHub secrets | The fine-grained personal access token with org access for running tests. | N/A | +| `TEST_USER_USER_FG_PAT` | GitHub secrets | The fine-grained personal access token with user account access for running tests. | N/A | +| `TEST_USER_PAT` | GitHub secrets | The classic personal access token for running tests. | N/A | + +## Permissions + +The action requires the following permissions: + +If running the action in a restrictive mode, the following permissions needs to be granted to the action: + +```yaml +permissions: + contents: write # Create releases + pull-requests: write # Create comments on the PRs + statuses: write # Update the status of the PRs from the linter +``` + +### Publishing to GitHub Pages + +To publish the documentation to GitHub Pages, the action requires the following permissions: + +```yaml +permissions: + pages: write # Deploy to Pages + id-token: write # Verify the deployment originates from an appropriate source +``` + +For more info see [Deploy GitHub Pages site](https://github.com/marketplace/actions/deploy-github-pages-site). + +## Compatibility + +The action is compatible with the following configurations: + +| OS | Shell | +| --- | --- | +| windows-latest | pwsh | +| macos-latest | pwsh | +| ubuntu-latest | pwsh | diff --git a/.github/actions/Test/README.md b/docs/Test.md similarity index 100% rename from .github/actions/Test/README.md rename to docs/Test.md diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..949abbbd --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,85 @@ +site_name: PSModule Docs +theme: + name: material + language: en + font: + text: Roboto + code: Sono + logo: assets/icon.png + favicon: assets/icon.png + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/link + name: Switch to dark mode + # Palette toggle for dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + toggle: + primary: black + accent: green + icon: material/toggle-switch-off-outline + name: Switch to light mode + # Palette toggle for light mode + - media: '(prefers-color-scheme: light)' + scheme: default + toggle: + primary: indigo + accent: green + icon: material/toggle-switch + name: Switch to system preference + icon: + repo: material/github + features: + - navigation.instant + - navigation.instant.progress + - navigation.tabs + - navigation.indexes + # - navigation.top + - navigation.tracking + - search.suggest + - search.highlight + +nav: + - Home: README.md + - Projects: + - PowerShell Modules: PowerShell/index.md + - GitHub Actions: GitHub-Actions/index.md + +repo_name: PSModule/docs +repo_url: https://github.com/PSModule/docs + +plugins: + - search + - git-authors + - git-revision-date-localized: + enable_creation_date: true + type: timeago + +markdown_extensions: + - toc: + permalink: true # Adds a link icon to headings + - attr_list + - admonition + - md_in_html + - pymdownx.details # Enables collapsible admonitions + +extra: + social: + - icon: fontawesome/brands/discord + link: https://discord.gg/jedJWCPAhD + name: PSModule on Discord + - icon: fontawesome/brands/github + link: https://github.com/PSModule/ + name: PSModule on GitHub + consent: + title: Cookie consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + actions: + - accept + - reject From e2e93f0de76058f100f882f5ecbbcc8c254fb1bd Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Wed, 12 Feb 2025 15:28:43 +0100 Subject: [PATCH 17/17] =?UTF-8?q?=F0=9F=A9=B9=20[Patch]:=20Update=20permis?= =?UTF-8?q?sions=20in=20Docs.yml=20workflow=20for=20enhanced=20deployment?= =?UTF-8?q?=20capabilities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/Docs.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Docs.yml b/.github/workflows/Docs.yml index e89f35f3..50c152ba 100644 --- a/.github/workflows/Docs.yml +++ b/.github/workflows/Docs.yml @@ -10,6 +10,11 @@ on: - mkdocs.yml - .github/workflows/Docs.yml +permissions: + contents: read # to checkout the repo + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + env: GH_TOKEN: ${{ github.token }} @@ -20,9 +25,6 @@ defaults: jobs: build: runs-on: ubuntu-latest - - permissions: - contents: read # to checkout the repo steps: - uses: actions/checkout@v4 with: