diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 53188fe..c3f3010 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,10 +5,12 @@ version: 2 updates: - - package-ecosystem: github-actions # See documentation for possible values - directory: / # Location of package manifests + - package-ecosystem: github-actions + directory: / labels: - dependencies - github-actions schedule: - interval: weekly + interval: daily + cooldown: + default-days: 7 diff --git a/.github/mkdocs.yml b/.github/mkdocs.yml deleted file mode 100644 index df5e17a..0000000 --- a/.github/mkdocs.yml +++ /dev/null @@ -1,75 +0,0 @@ -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/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ff2067e --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,36 @@ + + + + + +## New: + + + +## Technical Details + + + +
+Related issues + + + +
diff --git a/.github/workflows/Process-PSModule.yml b/.github/workflows/Process-PSModule.yml index 9462763..0454b2d 100644 --- a/.github/workflows/Process-PSModule.yml +++ b/.github/workflows/Process-PSModule.yml @@ -27,5 +27,6 @@ permissions: jobs: Process-PSModule: - uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@205d193f34cbbaf9992955c21d842bcf98a1859f # v5.4.6 - secrets: inherit + uses: PSModule/Process-PSModule/.github/workflows/workflow.yml@688896dc3ef70fb35bd74ae5328e76d5e57fe08a # v6.1.15 + secrets: + APIKey: ${{ secrets.APIKEY }} diff --git a/.github/zensical.toml b/.github/zensical.toml new file mode 100644 index 0000000..2ed17a5 --- /dev/null +++ b/.github/zensical.toml @@ -0,0 +1,63 @@ +[project] +site_name = "-{{ REPO_NAME }}-" +repo_name = "-{{ REPO_OWNER }}-/-{{ REPO_NAME }}-" +repo_url = "https://github.com/-{{ REPO_OWNER }}-/-{{ REPO_NAME }}-" + +[project.theme] +variant = "classic" +language = "en" +logo = "Assets/icon.png" +favicon = "Assets/icon.png" +features = [ + "navigation.instant", + "navigation.instant.progress", + "navigation.top", + "navigation.tracking", + "navigation.expand", + "search.suggest", + "search.highlight", + "content.code.copy" +] + +[[project.theme.palette]] +media = "(prefers-color-scheme)" +toggle.icon = "lucide/sun-moon" +toggle.name = "Switch to dark mode" + +[[project.theme.palette]] +media = "(prefers-color-scheme: dark)" +scheme = "slate" +primary = "black" +accent = "light-blue" +toggle.icon = "lucide/moon" +toggle.name = "Switch to light mode" + +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" +scheme = "default" +primary = "black" +accent = "light-blue" +toggle.icon = "lucide/sun" +toggle.name = "Switch to system preference" + +[project.theme.icon] +repo = "fontawesome/brands/github" + +[project.markdown_extensions.toc] +permalink = true + +[project.markdown_extensions.attr_list] +[project.markdown_extensions.admonition] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.pymdownx.details] +[project.markdown_extensions.pymdownx.superfences] + +[[project.extra.social]] +icon = "fontawesome/brands/discord" +link = "https://discord.psmodule.io" +name = "-{{ REPO_OWNER }}- on Discord" + +[[project.extra.social]] +icon = "fontawesome/brands/github" +link = "https://github.com/-{{ REPO_OWNER }}-/" +name = "-{{ REPO_OWNER }}- on GitHub" diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..9ffd661 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,36 @@ +# Agents + +## Main directive + +Everything is a work in progress and can be improved. +If you find a problem or improvement, fix if small; otherwise open an issue. + +## Repo guidance + +`PSSemVer` is a PowerShell module that adds a SemVer 2.0.0 compatible `[PSSemVer]` class and the +commands that create and convert it. The class is a public type, so its constructors, methods, and +comparison semantics are the module's API — treat changes to them as breaking until proven otherwise. + +- [`README.md`](README.md) — what this repository is and what the module does. +- [`CONTRIBUTING.md`](CONTRIBUTING.md) — how to contribute to this repository. +- [Semantic Versioning 2.0.0](https://semver.org/) — the specification this module implements. + +## PSModule Framework guidance + +Regarding repo structure, module source code and how the Process-PSModule workflow works. +For PSModule-specific build, layout, and process guidance: + +- [Repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) — the expected repository layout and required files. +- [Module anatomy](https://psmodule.github.io/docs/Modules/Process-PSModule/module-anatomy/) — source layout and framework conventions. +- [Build, test, pack, publish](https://psmodule.github.io/docs/Modules/Process-PSModule/build-test-pack-publish/) — the CI/CD pipeline. +- [Standards](https://psmodule.github.io/docs/Modules/Standards/) — PowerShell module coding standards. +- [PSModule/memory](https://github.com/PSModule/memory) — durable cross-session agent working memory for the PSModule organization. + +## Org-wide guidance + +For cross-cutting ways of working and standards: + +- [Agentic Development](https://msxorg.github.io/docs/Ways-of-Working/Agentic-Development/) — how agents and humans collaborate in this ecosystem. +- [Ways of Working](https://msxorg.github.io/docs/Ways-of-Working/) — contribution workflow, branching, PRs, issues. +- [Coding Standards](https://msxorg.github.io/docs/Coding-Standards/) — language-level conventions. +- [MSXOrg/memory](https://github.com/MSXOrg/memory) — durable agent working memory: gotchas, knowledge, and agent role notes. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..da0659f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,2 @@ + +@AGENTS.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..a1e4233 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[psmodule@psmodule.io](mailto:psmodule@psmodule.io). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..15f724a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,44 @@ +# Contributing + +Thank you for contributing to this module. +Read [`AGENTS.md`](AGENTS.md) first for the full guidance chain and documentation references. + +## Before you start + +1. Read [`README.md`](README.md) to understand what the module does. +2. Familiarise yourself with the [repository defaults](https://psmodule.github.io/docs/Modules/Repository-Defaults/) that this repository must satisfy. +3. Check the open issues and pull requests to avoid duplicate work. + +## Workflow + +This project follows the [MSXOrg contribution workflow](https://msxorg.github.io/docs/Ways-of-Working/Contribution-Workflow/): + +1. Open or pick up an issue that describes the change. +2. Create a branch from `main` following the `/-` convention (e.g. `feat/42-add-security-md`). +3. Make small, focused commits and push often. +4. Open a **draft PR** as soon as the change has a basic shape — early feedback is preferred. +5. Run the **Copilot review loop**: request a Copilot review, address its feedback, and repeat until it reports a clean round. File an issue for any out-of-scope findings rather than expanding the PR. +6. Mark the PR ready for review and enable auto-merge. It lands automatically once the required checks pass and a reviewer approves. + +For branching details, see [Branching and Merging](https://msxorg.github.io/docs/Ways-of-Working/Branching-and-Merging/). + +## Pull requests + +- Keep PRs small and focused on a single deliverable. +- The PR title should follow the [commit conventions](https://msxorg.github.io/docs/Ways-of-Working/Commit-Conventions/). + +For PR format guidance, see [PR Format](https://msxorg.github.io/docs/Ways-of-Working/PR-Format/). + +## Issues + +Use GitHub Issues to report bugs, request features, or propose improvements. +Follow the [issue format](https://msxorg.github.io/docs/Ways-of-Working/Issue-Format/) guidance. + +## Code standards + +PowerShell in this module follows the [PSModule Standards](https://psmodule.github.io/docs/Modules/Standards/) and the +[MSXOrg Coding Standards](https://msxorg.github.io/docs/Coding-Standards/). + +## Questions + +Open a GitHub Discussion or file an issue if something is unclear. diff --git a/README.md b/README.md index 5d48836..4002671 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,62 @@ # PSSemVer -This module introduces a SemVer 2.0.0 compatible class for PowerShell. - -## Prerequisites - -No prerequisites. +PSSemVer adds a [Semantic Versioning 2.0.0](https://semver.org/) compatible `[PSSemVer]` class to PowerShell, plus the commands to +create and convert it. Unlike the built-in `[version]` type, it understands prerelease labels, build metadata, and tag prefixes such +as `v1.2.3`, and it compares versions using the precedence rules from the SemVer specification. ## Installation -To install the module and class run the following command: +Install the module from the PowerShell Gallery: ```powershell -Install-Module -Name PSSemVer +Install-PSResource -Name PSSemVer Import-Module -Name PSSemVer ``` -## Usage - -Here is a list of example that are typical use cases for the module. -This section should provide a good overview of the module's capabilities. +## Capabilities -### Create a new SemVer object +Parse a version from a string, including prerelease, build metadata, and a tag prefix: ```powershell -$Version = New-PSSemVer -Version 1.0.0 +$version = New-PSSemVer -Version 'v1.2.3-alpha.1+001' +$version.Prefix # v +$version.Major # 1 +$version.Prerelease # alpha.1 +$version.BuildMetadata # 001 ``` -### Create a new SemVer object with prerelease and build metadata +Compare versions using SemVer precedence, so prereleases sort before their release: ```powershell -$Version = New-PSSemVer -Version 1.0.0 -PreRelease 'alpha' -Build '2020-01-01' +[PSSemVer]'1.0.0-beta.2' -lt [PSSemVer]'1.0.0-beta.11' # True +[PSSemVer]'1.0.0-rc.1' -lt [PSSemVer]'1.0.0' # True ``` -### Create a new SemVer object from a string +Bump a version in place, including the prerelease counter: ```powershell -$Version = New-PSSemVer -Version '1.0.0-alpha+2020-01-01' +$version = New-PSSemVer -Version '1.2.3' +$version.BumpMinor() # 1.3.0 +$version.SetPrerelease('alpha') # 1.3.0-alpha +$version.BumpPrereleaseNumber() # 1.3.0-alpha.1 ``` -### Compare two SemVer objects +Convert values coming off the pipeline and sort them by SemVer precedence: ```powershell -$Version1 = New-PSSemVer -Version 1.0.0 -$Version2 = New-PSSemVer -Version 1.0.1 -$Version1 -lt $Version2 ->_ true +'1.0.0', '0.9.0', '1.0.0-rc.1' | ConvertTo-PSSemVer | Sort-Object +# 0.9.0 +# 1.0.0-rc.1 +# 1.0.0 ``` -### Increment the major version +## Documentation -```powershell -$Version = New-PSSemVer -Version 1.0.0 -$Version.BumpMajor() -``` +Documentation is published at [psmodule.io/PSSemVer](https://psmodule.io/PSSemVer/). -### Increment the minor version +Use PowerShell help and command discovery for module details: ```powershell -$Version = New-PSSemVer -Version 1.0.0 -$Version.BumpMinor() +Get-Command -Module PSSemVer +Get-Help -Name New-PSSemVer -Examples ``` - -### Increment the patch version - -```powershell -$Version = New-PSSemVer -Version 1.0.0 -$Version.BumpPatch() -``` - -### Set the prerelease - -```powershell -$Version = New-PSSemVer -Version 1.0.0 -$Version.SetPreRelease('alpha') -``` - -## Contributing - -Coder or not, you can contribute to the project! We welcome all contributions. - -### For Users - -If you don't code, you still sit on valuable information that can make this project even better. If you experience that the -product does unexpected things, throw errors or is missing functionality, you can help by submitting bugs and feature requests. -Please see the issues tab on this project and submit a new issue that matches your needs. - -### For Developers - -If you do code, we'd love to have your contributions. Please read the [Contribution guidelines](CONTRIBUTING.md) for more information. -You can either help by picking up an existing issue or submit a new one if you have an idea for a new feature or improvement. - -## Links - -- [Semantic Versioning 2.0.0](https://semver.org/) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..f11e7a6 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Supported versions + +Only the latest released version of this module is supported. +Fixes are shipped as a new release rather than backported to older versions, so upgrade before reporting an issue. + +## Reporting a vulnerability + +Do not report security issues through public issues, pull requests, or discussions. +A public report puts other users at risk before a fix exists. + +Report privately instead: + +1. Open the repository's **Security** tab and use **Report a vulnerability** to file a private security advisory. +2. If private reporting is unavailable, send an email to [psmodule@psmodule.io](mailto:psmodule@psmodule.io). + +Include what the problem is, which module version is affected, and how to reproduce it. +Reports are handled privately until a fixed version is published. diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..3849b07 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,21 @@ +# Support + +## This module + +Use the issues on this repository for bugs, feature requests, and questions about the module. +Search the existing issues first, the answer may already be there. + +For anything that does not belong in a public issue, send an email to [psmodule@psmodule.io](mailto:psmodule@psmodule.io). + +Do not use issues to report security vulnerabilities. Follow [`SECURITY.md`](SECURITY.md) instead. + +## PowerShell Gallery + +Problems with the PowerShell Gallery itself, such as package listings, downloads, or accounts, belong with the Gallery maintainers: + +- [PowerShell/PowerShellGallery issues](https://github.com/PowerShell/PowerShellGallery/issues) +- [cgadmin@microsoft.com](mailto:cgadmin@microsoft.com) + +## Fixing it yourself + +Contributions are welcome. Read [`CONTRIBUTING.md`](CONTRIBUTING.md) to get started. diff --git a/src/functions/public/ConvertTo-PSSemVer.ps1 b/src/functions/public/ConvertTo-PSSemVer.ps1 index f086ae4..933fbd5 100644 --- a/src/functions/public/ConvertTo-PSSemVer.ps1 +++ b/src/functions/public/ConvertTo-PSSemVer.ps1 @@ -7,7 +7,7 @@ This function takes a version string and converts it to a PSSemVer object. .EXAMPLE - '1.2.3-alpha.1+001' | ConvertTo-SemVer + '1.2.3-alpha.1+001' | ConvertTo-PSSemVer Major : 1 Minor : 2 @@ -17,6 +17,12 @@ .NOTES Compatible with SemVer 2.0.0. + + .LINK + https://psmodule.io/PSSemVer/Functions/ConvertTo-PSSemVer/ + + .LINK + https://semver.org/ #> [OutputType([PSSemVer])] [CmdletBinding()] diff --git a/src/functions/public/New-PSSemVer.ps1 b/src/functions/public/New-PSSemVer.ps1 index 0fcf005..b03871e 100644 --- a/src/functions/public/New-PSSemVer.ps1 +++ b/src/functions/public/New-PSSemVer.ps1 @@ -7,7 +7,7 @@ This function creates a new PSSemVer object. .EXAMPLE - New-SemVer -Version '1.2.3-alpha.1+001' + New-PSSemVer -Version '1.2.3-alpha.1+001' Major : 1 Minor : 2 @@ -16,7 +16,7 @@ BuildMetadata : 001 .EXAMPLE - New-SemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' -BuildMetadata '001' + New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' -BuildMetadata '001' Major : 1 Minor : 2 @@ -26,6 +26,12 @@ .NOTES Compatible with SemVer 2.0.0. + + .LINK + https://psmodule.io/PSSemVer/Functions/New-PSSemVer/ + + .LINK + https://semver.org/ #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSUseShouldProcessForStateChangingFunctions', '', diff --git a/tests/PSSemVer.Tests.ps1 b/tests/PSSemVer.Tests.ps1 index 67fbf5c..995a1e6 100644 --- a/tests/PSSemVer.Tests.ps1 +++ b/tests/PSSemVer.Tests.ps1 @@ -1,4 +1,13 @@ -Describe 'PSSemVer' { +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '6.0.0'; MaximumVersion = '6.*' } + +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'Required for Pester tests' +)] +[CmdletBinding()] +param() + +Describe 'PSSemVer' { Describe 'Function: New-PSSemVer' { It "'New-PSSemVer -Major 1 -Minor 2 -Patch 3' => '1.2.3'" { $PSSemVer = New-PSSemVer -Major 1 -Minor 2 -Patch 3 @@ -163,22 +172,18 @@ Describe 'Class: ToString()' { It "New-PSSemVer -Major 1 -Minor 2 -Patch 3 => '1.2.3'" { $PSSemVer = New-PSSemVer -Major 1 -Minor 2 -Patch 3 - Write-Verbose ($PSSemVer.ToString()) -Verbose $PSSemVer.ToString() | Should -Be '1.2.3' } It "New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' -Build '001' => '1.2.3-alpha.1+001'" { $PSSemVer = New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' -Build '001' - Write-Verbose ($PSSemVer.ToString()) $PSSemVer.ToString() | Should -Be '1.2.3-alpha.1+001' } It "New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' => '1.2.3-alpha.1'" { $PSSemVer = New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' - Write-Verbose ($PSSemVer.ToString()) $PSSemVer.ToString() | Should -Be '1.2.3-alpha.1' } It "New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Build '001' => '1.2.3+001'" { $PSSemVer = New-PSSemVer -Major 1 -Minor 2 -Patch 3 -Build '001' - Write-Verbose ($PSSemVer.ToString()) $PSSemVer.ToString() | Should -Be '1.2.3+001' } }