From d5578af1ce7041da66734731f1a8f45bda905c6f Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 6 Jul 2026 08:27:03 +0200 Subject: [PATCH 01/12] Standardize README landing page --- README.md | 108 ++++-------------------------------------------------- 1 file changed, 8 insertions(+), 100 deletions(-) diff --git a/README.md b/README.md index ebb04ec..fe93142 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,27 @@ # Hashtable -Hashtable is a comprehensive module that provides functions for working with PowerShell hashtables. -It enables you to convert hashtables to PSCustomObjects and vice versa, format hashtables into readable PowerShell -code, merge hashtables with override support, and remove entries based on specific criteria. This collection of -utilities is designed to simplify complex hashtable manipulations and help automate your PowerShell workflows. - -## Prerequisites - -This module uses the following external resources: -- The [PSModule framework](https://github.com/PSModule) for building, testing, and publishing the module. +Hashtable is a PowerShell module that simplifies common hashtable operations. ## Installation -To install the module from the PowerShell Gallery, you can use the following command: +Install the module from the PowerShell Gallery: ```powershell Install-PSResource -Name Hashtable Import-Module -Name Hashtable ``` -## Usage - -Below are some examples illustrating typical use cases for the module. - -### Example 1: Converting a Hashtable to a PSCustomObject - -This example demonstrates how to convert a nested hashtable into a PSCustomObject, making it easier to manipulate and explore your data. - -```powershell -$hashtable = @{ - Name = 'Alice' - Age = 30 - Contact = @{ - Email = 'alice@example.com' - Phone = '123-456-7890' - } -} - -$object = $hashtable | ConvertFrom-Hashtable -$object | Format-List -``` - -### Example 2: Merging Hashtables - -Merge a default settings hashtable with user-specified overrides. In this example, the values in the override hashtable -replace those in the main hashtable. - -```powershell -$defaultSettings = @{ - Theme = 'Light' - Language = 'en' - Layout = 'Standard' -} -$userSettings = @{ - Theme = 'Dark' - Layout = 'Compact' -} - -$mergedSettings = $defaultSettings | Merge-Hashtable -Overrides $userSettings -$mergedSettings -``` - -### Example 3: Formatting a Hashtable as PowerShell Code - -Convert a hashtable into a nicely formatted PowerShell code representation. This is especially useful for exporting -configurations to a `.psd1` file. - -```powershell -$configuration = @{ - Server = 'localhost' - Port = 8080 - Credentials = @{ - Username = 'admin' - Password = 'P@ssw0rd' - } - Enabled = $true -} - -$formattedConfig = $configuration | Format-Hashtable -Write-Output $formattedConfig -``` +## Documentation -### Example 4: Removing Hashtable Entries Based on Criteria +Documentation is published at [psmodule.io/Hashtable](https://psmodule.io/Hashtable/). -Remove specific entries from a hashtable, such as keys with null or empty values, or those matching a particular name. +Use PowerShell help and command discovery for module details: ```powershell -$ht = @{ - ValidKey = 'SomeValue' - EmptyKey = '' - RemoveMe = 'Unwanted' -} - -# Remove entries with null or empty values and keys named 'RemoveMe' -$ht | Remove-HashtableEntry -NullOrEmptyValues -Keys 'RemoveMe' -$ht +Get-Command -Module Hashtable +Get-Help -Examples ``` -You can use `Get-Command -Module 'Hashtable'` to list available commands, and `Get-Help -Examples ` to view command-specific examples. - -## Documentation - -Detailed documentation for each function is available via inline help. For more extensive documentation, please visit the -[Hashtable docs](https://psmodule.io/Hashtable/) or [PSModule Docs](https://psmodule.io/docs). - ## Contributing -Coder or not, you can contribute to the project! We welcome all contributions. - -### For Users - -If you don't code, your feedback is invaluable. If you encounter issues, unexpected behaviors, or missing functionality, -please submit a bug report or feature request via the project's issues page. - -### For Developers - -If you code, we'd love to see your contributions. Please review the [Contribution Guidelines](CONTRIBUTING.md) for more details. -You can start by picking up an existing issue or submitting a new one if you have an idea for a new feature or improvement. +Issues and pull requests are welcome. Please use the repository issue tracker to report bugs, request features, or discuss improvements. From 5809ebaeb0858b3dfd3d2378e02fc4e172342484 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 6 Jul 2026 10:41:28 +0200 Subject: [PATCH 02/12] Address Copilot README review --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe93142..cb5edcb 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Install-PSResource -Name Hashtable Import-Module -Name Hashtable ``` +If your environment still uses PowerShellGet, install the module with `Install-Module -Name Hashtable` instead. + ## Documentation Documentation is published at [psmodule.io/Hashtable](https://psmodule.io/Hashtable/). @@ -19,7 +21,7 @@ Use PowerShell help and command discovery for module details: ```powershell Get-Command -Module Hashtable -Get-Help -Examples +Get-Help 'CommandName' -Examples ``` ## Contributing From c28f667387d51c0663e06eea9891a63932c7e78a Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 6 Jul 2026 10:49:31 +0200 Subject: [PATCH 03/12] Address Copilot README review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb5edcb..f35ecdf 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Use PowerShell help and command discovery for module details: ```powershell Get-Command -Module Hashtable -Get-Help 'CommandName' -Examples +Get-Help ConvertTo-HashTable -Examples ``` ## Contributing From 0883750528e06f66d5a58e03d891141bfbfc2cab Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 6 Jul 2026 10:57:47 +0200 Subject: [PATCH 04/12] Address Copilot README review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f35ecdf..dacb588 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Use PowerShell help and command discovery for module details: ```powershell Get-Command -Module Hashtable -Get-Help ConvertTo-HashTable -Examples +Get-Help ConvertTo-Hashtable -Examples ``` ## Contributing From af2fa3a94f6a77d654e4818a49b8a7e77c2be01f Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 7 Jul 2026 17:45:52 +0200 Subject: [PATCH 05/12] Require Pester 6.x in test files --- tests/Hashtable.Tests.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Hashtable.Tests.ps1 b/tests/Hashtable.Tests.ps1 index 561cbe8..d9640c3 100644 --- a/tests/Hashtable.Tests.ps1 +++ b/tests/Hashtable.Tests.ps1 @@ -1,4 +1,6 @@ -Describe 'Module' { +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*'; GUID = 'a699dea5-2c73-4616-a270-1f7abb777e71' } + +Describe 'Module' { Describe 'Merge-Hashtable' { It 'Merges two hashtable' { $Main = @{ From ab811591b16cea369a481e60dc3952766b2369ba Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Tue, 7 Jul 2026 21:11:51 +0200 Subject: [PATCH 06/12] Drop the GUID from the Pester requirement The GUID pins module identity (precise pinning), a stricter control than the lock-to-major risk appetite. Keep only the version range. --- tests/Hashtable.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Hashtable.Tests.ps1 b/tests/Hashtable.Tests.ps1 index d9640c3..f3f84f1 100644 --- a/tests/Hashtable.Tests.ps1 +++ b/tests/Hashtable.Tests.ps1 @@ -1,4 +1,4 @@ -#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*'; GUID = 'a699dea5-2c73-4616-a270-1f7abb777e71' } +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*' } Describe 'Module' { Describe 'Merge-Hashtable' { From bdb2a808650285e08c0a5f78926e1aa9eba1c9a6 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 12 Jul 2026 11:55:29 +0200 Subject: [PATCH 07/12] Adopt Process-PSModule v6.1.4 --- .github/workflows/Process-PSModule.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Process-PSModule.yml b/.github/workflows/Process-PSModule.yml index 9462763..a8e37ad 100644 --- a/.github/workflows/Process-PSModule.yml +++ b/.github/workflows/Process-PSModule.yml @@ -27,5 +27,5 @@ permissions: jobs: Process-PSModule: - uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@205d193f34cbbaf9992955c21d842bcf98a1859f # v5.4.6 + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@da180bac16b13bfbcdf08b2e4e221b5b49e5ff28 # v6.1.4 secrets: inherit From a595b269d8f4709901b91a11b98e17f34486aa94 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 12 Jul 2026 11:57:38 +0200 Subject: [PATCH 08/12] docs: restore Usage showcase and remove Contributing in README --- README.md | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index dacb588..7354e3f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Hashtable -Hashtable is a PowerShell module that simplifies common hashtable operations. +Hashtable is a comprehensive PowerShell module for working with hashtables. It converts hashtables to and from +PSCustomObjects, formats hashtables into readable PowerShell code, merges hashtables with override support, and removes +entries based on specific criteria — simplifying complex hashtable manipulations in your automation workflows. ## Installation @@ -11,7 +13,81 @@ Install-PSResource -Name Hashtable Import-Module -Name Hashtable ``` -If your environment still uses PowerShellGet, install the module with `Install-Module -Name Hashtable` instead. +## Usage + +### Example: Convert a hashtable to a PSCustomObject + +Convert a nested hashtable into a PSCustomObject, making it easier to manipulate and explore your data. + +```powershell +$hashtable = @{ + Name = 'Alice' + Age = 30 + Contact = @{ + Email = 'alice@example.com' + Phone = '123-456-7890' + } +} + +$object = $hashtable | ConvertFrom-Hashtable +$object | Format-List +``` + +### Example: Merge hashtables with overrides + +Merge a default settings hashtable with user-specified overrides. Values in the override hashtable replace those in the +base hashtable. + +```powershell +$defaultSettings = @{ + Theme = 'Light' + Language = 'en' + Layout = 'Standard' +} +$userSettings = @{ + Theme = 'Dark' + Layout = 'Compact' +} + +$mergedSettings = $defaultSettings | Merge-Hashtable -Overrides $userSettings +$mergedSettings +``` + +### Example: Format a hashtable as PowerShell code + +Convert a hashtable into a nicely formatted PowerShell code representation — useful for exporting configuration to a +`.psd1` file. + +```powershell +$configuration = @{ + Server = 'localhost' + Port = 8080 + Credentials = @{ + Username = 'admin' + Password = 'P@ssw0rd' + } + Enabled = $true +} + +$formattedConfig = $configuration | Format-Hashtable +Write-Output $formattedConfig +``` + +### Example: Remove hashtable entries by criteria + +Remove specific entries from a hashtable, such as keys with null or empty values or a key matching a particular name. + +```powershell +$ht = @{ + ValidKey = 'SomeValue' + EmptyKey = '' + RemoveMe = 'Unwanted' +} + +# Remove entries with null or empty values and the key named 'RemoveMe' +$ht | Remove-HashtableEntry -NullOrEmptyValues -Keys 'RemoveMe' +$ht +``` ## Documentation @@ -21,9 +97,5 @@ Use PowerShell help and command discovery for module details: ```powershell Get-Command -Module Hashtable -Get-Help ConvertTo-Hashtable -Examples +Get-Help -Name ConvertTo-Hashtable -Examples ``` - -## Contributing - -Issues and pull requests are welcome. Please use the repository issue tracker to report bugs, request features, or discuss improvements. From 47a95e46135123595a8381040a32ee834e00db8c Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 3 Aug 2026 04:04:48 +0200 Subject: [PATCH 09/12] Bump Process-PSModule to v6.1.4 Updates the reusable workflow reference to Process-PSModule v6.1.4. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/Process-PSModule.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Process-PSModule.yml b/.github/workflows/Process-PSModule.yml index 9462763..a8e37ad 100644 --- a/.github/workflows/Process-PSModule.yml +++ b/.github/workflows/Process-PSModule.yml @@ -27,5 +27,5 @@ permissions: jobs: Process-PSModule: - uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@205d193f34cbbaf9992955c21d842bcf98a1859f # v5.4.6 + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@da180bac16b13bfbcdf08b2e4e221b5b49e5ff28 # v6.1.4 secrets: inherit From 8bd25078d029a6d2344d2d803beabd43b30c5508 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 3 Aug 2026 04:04:53 +0200 Subject: [PATCH 10/12] Standardize README landing page Adopts the standard module landing-page format used across PSModule repositories (docs-only). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- README.md | 66 ++++++++++++++++++++----------------------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index ebb04ec..7354e3f 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,12 @@ # Hashtable -Hashtable is a comprehensive module that provides functions for working with PowerShell hashtables. -It enables you to convert hashtables to PSCustomObjects and vice versa, format hashtables into readable PowerShell -code, merge hashtables with override support, and remove entries based on specific criteria. This collection of -utilities is designed to simplify complex hashtable manipulations and help automate your PowerShell workflows. - -## Prerequisites - -This module uses the following external resources: -- The [PSModule framework](https://github.com/PSModule) for building, testing, and publishing the module. +Hashtable is a comprehensive PowerShell module for working with hashtables. It converts hashtables to and from +PSCustomObjects, formats hashtables into readable PowerShell code, merges hashtables with override support, and removes +entries based on specific criteria — simplifying complex hashtable manipulations in your automation workflows. ## Installation -To install the module from the PowerShell Gallery, you can use the following command: +Install the module from the PowerShell Gallery: ```powershell Install-PSResource -Name Hashtable @@ -21,11 +15,9 @@ Import-Module -Name Hashtable ## Usage -Below are some examples illustrating typical use cases for the module. - -### Example 1: Converting a Hashtable to a PSCustomObject +### Example: Convert a hashtable to a PSCustomObject -This example demonstrates how to convert a nested hashtable into a PSCustomObject, making it easier to manipulate and explore your data. +Convert a nested hashtable into a PSCustomObject, making it easier to manipulate and explore your data. ```powershell $hashtable = @{ @@ -41,10 +33,10 @@ $object = $hashtable | ConvertFrom-Hashtable $object | Format-List ``` -### Example 2: Merging Hashtables +### Example: Merge hashtables with overrides -Merge a default settings hashtable with user-specified overrides. In this example, the values in the override hashtable -replace those in the main hashtable. +Merge a default settings hashtable with user-specified overrides. Values in the override hashtable replace those in the +base hashtable. ```powershell $defaultSettings = @{ @@ -61,10 +53,10 @@ $mergedSettings = $defaultSettings | Merge-Hashtable -Overrides $userSettings $mergedSettings ``` -### Example 3: Formatting a Hashtable as PowerShell Code +### Example: Format a hashtable as PowerShell code -Convert a hashtable into a nicely formatted PowerShell code representation. This is especially useful for exporting -configurations to a `.psd1` file. +Convert a hashtable into a nicely formatted PowerShell code representation — useful for exporting configuration to a +`.psd1` file. ```powershell $configuration = @{ @@ -81,39 +73,29 @@ $formattedConfig = $configuration | Format-Hashtable Write-Output $formattedConfig ``` -### Example 4: Removing Hashtable Entries Based on Criteria +### Example: Remove hashtable entries by criteria -Remove specific entries from a hashtable, such as keys with null or empty values, or those matching a particular name. +Remove specific entries from a hashtable, such as keys with null or empty values or a key matching a particular name. ```powershell $ht = @{ - ValidKey = 'SomeValue' - EmptyKey = '' - RemoveMe = 'Unwanted' + ValidKey = 'SomeValue' + EmptyKey = '' + RemoveMe = 'Unwanted' } -# Remove entries with null or empty values and keys named 'RemoveMe' +# Remove entries with null or empty values and the key named 'RemoveMe' $ht | Remove-HashtableEntry -NullOrEmptyValues -Keys 'RemoveMe' $ht ``` -You can use `Get-Command -Module 'Hashtable'` to list available commands, and `Get-Help -Examples ` to view command-specific examples. - ## Documentation -Detailed documentation for each function is available via inline help. For more extensive documentation, please visit the -[Hashtable docs](https://psmodule.io/Hashtable/) or [PSModule Docs](https://psmodule.io/docs). - -## Contributing +Documentation is published at [psmodule.io/Hashtable](https://psmodule.io/Hashtable/). -Coder or not, you can contribute to the project! We welcome all contributions. +Use PowerShell help and command discovery for module details: -### For Users - -If you don't code, your feedback is invaluable. If you encounter issues, unexpected behaviors, or missing functionality, -please submit a bug report or feature request via the project's issues page. - -### For Developers - -If you code, we'd love to see your contributions. Please review the [Contribution Guidelines](CONTRIBUTING.md) for more details. -You can start by picking up an existing issue or submitting a new one if you have an idea for a new feature or improvement. +```powershell +Get-Command -Module Hashtable +Get-Help -Name ConvertTo-Hashtable -Examples +``` From 3b61900dc66311dbf2a6e322e962ba34da506b12 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 3 Aug 2026 04:05:00 +0200 Subject: [PATCH 11/12] Require Pester 6.x in tests Adds a #Requires statement to lock test execution to Pester 6.x, matching the version used by Process-PSModule v6.1.4. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- tests/Hashtable.Tests.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Hashtable.Tests.ps1 b/tests/Hashtable.Tests.ps1 index 561cbe8..f3f84f1 100644 --- a/tests/Hashtable.Tests.ps1 +++ b/tests/Hashtable.Tests.ps1 @@ -1,4 +1,6 @@ -Describe 'Module' { +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*' } + +Describe 'Module' { Describe 'Merge-Hashtable' { It 'Merges two hashtable' { $Main = @{ From 9044b2c87a9b54b65cab7be998c21eb81f897792 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 3 Aug 2026 05:19:52 +0200 Subject: [PATCH 12/12] Add test for merging into an empty hashtable Incorporates the test from #13 to cover the empty-main merge case. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- tests/Hashtable.Tests.ps1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/Hashtable.Tests.ps1 b/tests/Hashtable.Tests.ps1 index f3f84f1..7fb085e 100644 --- a/tests/Hashtable.Tests.ps1 +++ b/tests/Hashtable.Tests.ps1 @@ -2,6 +2,18 @@ Describe 'Module' { Describe 'Merge-Hashtable' { + It 'Merges into an empty hashtable' { + $Main = @{} + $Override = @{ + Key1 = 'Value1' + Key2 = 'Value2' + } + $Result = Merge-Hashtable -Main $Main -Overrides $Override + + $Result.Key1 | Should -Be 'Value1' + $Result.Key2 | Should -Be 'Value2' + } + It 'Merges two hashtable' { $Main = @{ Action = ''