diff --git a/.docfx/docfx.json b/.docfx/docfx.json index 79276251a..fd6d91999 100644 --- a/.docfx/docfx.json +++ b/.docfx/docfx.json @@ -4,6 +4,7 @@ "src": [ { "files": [ + "Cuemon.Kernel/**.csproj", "Cuemon.Core/**.csproj", "Cuemon.Data/**.csproj", "Cuemon.Data.Integrity/**.csproj", diff --git a/.github/prompts/nuget-pouplate.prompt.md b/.github/prompts/nuget-pouplate.prompt.md index 5c0e2dffa..c3199e30c 100644 --- a/.github/prompts/nuget-pouplate.prompt.md +++ b/.github/prompts/nuget-pouplate.prompt.md @@ -30,8 +30,6 @@ Transformation rules (strict): - Keep one bullet per logical change; deduplicate repeated commit messages. - Prefer imperative, product-facing summaries over raw commit text. - Mention concrete type/member names and namespace when identifiable, matching existing tone. -- Preserve NBSP-only spacer lines (`U+00A0`) between sections. -- Alaways end with a newline followed by spacer lines (`U+00A0`) between sections. - Do not reorder historical sections and do not rewrite previous version blocks. Tag and range rules: @@ -43,7 +41,6 @@ Tag and range rules: Notes: - Do not infer target versions from changelog text; parse only explicit `Version: x.y.z` lines. - Keep edits minimal and strictly inside the current version block. -- DO NOT REMOVE THE ASCII 0xA0 NBSP CHARACTERS OR RUN ANY SORT OF TRIM on spacer lines. - Do not open PRs or create branches. Example run command (agent): diff --git a/.github/prompts/nuget.prompt.md b/.github/prompts/nuget.prompt.md index 19a08c146..98381c027 100644 --- a/.github/prompts/nuget.prompt.md +++ b/.github/prompts/nuget.prompt.md @@ -12,24 +12,23 @@ Behavior (exact): 1. Read the file and find the first line that starts with `Availability:` (case-sensitive). 2. If found, capture the remainder of that line as `previous-tfm` and prepend the exact template shown below (substituting `{{version}}` and `{{previous-tfm}}`). 3. If not found within the first 3 lines, do nothing for that file. - 4. Apply the template exactly as shown, preserving all whitespace and blank lines (including NBSP U+00A0 characters). + 4. Apply the template exactly as shown, preserving all whitespace and blank lines - PER FILE - DO NOT ASSUME CONTENT IS THE SAME ACROSS FILES. 5. Save the file in-place - do not open PRs or create branches. 6. Continue to the next file until all matching files have been processed. 7. Do not assume that each file are the same - process each file independently. -Exact template to prepend (preserve whitespace and trailing NBSP U+00A0 on the blank lines): +Exact template to prepend: ``` Version: {{version}} Availability: {{previous-tfm}} -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + ``` Notes: - Do not attempt to infer versions or parse changelogs — use the provided `params.version` value. - Keep edits minimal: only prepend the template block; preserve the rest of the file unchanged for human interference. -- DO NOT REMOVE THE ASCII 0xA0 NBSP CHARACTERS OR RUN ANY SORT OF TRIM on the blank lines in the template! - DO NOT RUN ANY SORT OF GIT COMMANDS - once the files are saved, you are done. Example run command (agent): diff --git a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt index 87da3de80..f4c3d0e76 100644 --- a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,88 +36,88 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.AspNetCore.App/README.md b/.nuget/Cuemon.AspNetCore.App/README.md index 0162cd31c..b89515880 100644 --- a/.nuget/Cuemon.AspNetCore.App/README.md +++ b/.nuget/Cuemon.AspNetCore.App/README.md @@ -92,6 +92,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt index b9a324bec..47dcb0fd2 100644 --- a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,107 +36,107 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # New Features - ADDED DigestCryptoAlgorithm enum in the Cuemon.AspNetCore.Authentication.Digest namespace that specifies the supported digest algorithms for HTTP Digest Access Authentication - ADDED DigestHashFactory class in the Cuemon.AspNetCore.Authentication.Digest namespace that provides access to factory methods for creating and configuring Hash instances based on UnkeyedCryptoHash{TAlgorithm} -  + # Improvements - EXTENDED DigestAuthenticationOptions class in the Cuemon.AspNetCore.Authentication.Digest namespace with a property named DigestAlgorithm that specifies the digest algorithm to use for HTTP Digest Access Authentication; default is DigestCryptoAlgorithm.Sha256 -  + # Bug Fixes - FIXED DigestAuthenticationHandler class in the Cuemon.AspNetCore.Authentication.Digest namespace to use newly added DigestCryptoAlgorithm enum in the Cuemon.AspNetCore.Authentication.Digest namespace - FIXED DigestAuthenticationMiddleware class in the Cuemon.AspNetCore.Authentication.Digest namespace to use newly added DigestCryptoAlgorithm enum in the Cuemon.AspNetCore.Authentication.Digest namespace - FIXED DigestAuthorizationHeaderBuilder class in the Cuemon.AspNetCore.Authentication.Digest namespace to use newly added DigestCryptoAlgorithm enum in the Cuemon.AspNetCore.Authentication.Digest namespace -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # Bug Fixes - FIXED DigestAuthenticationHandler class in the Cuemon.AspNetCore.Authentication.Digest namespace to remove quoted string values for the following parameters: stale and algorithm - FIXED DigestAuthenticationMiddleware class in the Cuemon.AspNetCore.Authentication.Digest namespace to remove quoted string values for the following parameters: stale and algorithm - FIXED DigestAuthorizationHeader class in the Cuemon.AspNetCore.Authentication.Digest namespace to remove quoted string values for the following parameters: algorithm, qop and nc - FIXED DigestAuthorizationHeader class in the Cuemon.AspNetCore.Authentication.Digest namespace so stale is removed from the parameters including marking previous code obsolete - FIXED DigestAuthorizationHeader class in the Cuemon.AspNetCore.Authentication.Digest namespace to accommodate the issues mentioned in https://github.com/gimlichael/Cuemon/issues/115 -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.AspNetCore.Authentication/README.md b/.nuget/Cuemon.AspNetCore.Authentication/README.md index 0ecdead99..0270c1230 100644 --- a/.nuget/Cuemon.AspNetCore.Authentication/README.md +++ b/.nuget/Cuemon.AspNetCore.Authentication/README.md @@ -58,6 +58,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt index 6f1224c8c..69b177628 100644 --- a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,92 +36,92 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Improvements - EXTENDED ExceptionDescriptorResult class in the Cuemon.AspNetCore.Mvc namespace to have an extra overload that accepts ProblemDetails - CHANGED FaultDescriptorFilter class in the Cuemon.AspNetCore.Mvc.Filters.Diagnostics namespace to support preferred fault descriptor (e.g., FaultDetails or ProblemDetails) -  + diff --git a/.nuget/Cuemon.AspNetCore.Mvc/README.md b/.nuget/Cuemon.AspNetCore.Mvc/README.md index ec9df0ab6..8c2099845 100644 --- a/.nuget/Cuemon.AspNetCore.Mvc/README.md +++ b/.nuget/Cuemon.AspNetCore.Mvc/README.md @@ -62,6 +62,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt index 87da3de80..f4c3d0e76 100644 --- a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,88 +36,88 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/README.md b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/README.md index a32fbdfc5..43a517330 100644 --- a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/README.md +++ b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt index 8f3259bef..cb048a715 100644 --- a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt @@ -1,30 +1,36 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # New Features - ADDED VaryAcceptMiddleware class in the Cuemon.AspNetCore.Http.Headers namespace that adds the Vary header with the value of Accept to the HTTP response -  + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -33,98 +39,98 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED BadRequestMessage property from the class from the ApiKeySentinelOptions class in the Cuemon.AspNetCore.Http.Headers namespace -  + # New Features - ADDED PreferredFaultDescriptor enum in the Cuemon.AspNetCore.Diagnostics namespace that specifies the preferred output format of an Exception raised in the context of either vanilla ASP.NET or ASP.NET MVC -  + # Improvements - EXTENDED FaultDescriptorOptions class in the Cuemon.AspNetCore.Diagnostics namespace to include a property named FaultDescriptor (PreferredFaultDescriptor); default is PreferredFaultDescriptor.FaultDetails - EXTENDED HttpExceptionDescriptor class in the Cuemon.AspNetCore.Diagnostics namespace to include two new properties; Instance (Uri) and TraceId (string) -  + diff --git a/.nuget/Cuemon.AspNetCore/README.md b/.nuget/Cuemon.AspNetCore/README.md index dad13749a..a918fa606 100644 --- a/.nuget/Cuemon.AspNetCore/README.md +++ b/.nuget/Cuemon.AspNetCore/README.md @@ -62,6 +62,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt index c4439657c..5f028037f 100644 --- a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,84 +36,84 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # References - Cuemon.Core - Cuemon.Data.Integrity @@ -137,15 +143,15 @@ Availability: .NET 9, .NET 8 and .NET Standard 2.0 - Cuemon.Security.Cryptography - Cuemon.Threading - Cuemon.Xml -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) - ADDED Support for TFM .NET Standard 2.0 -  + # References - Cuemon.Core - Cuemon.Data.Integrity @@ -176,4 +182,4 @@ Availability: .NET 9, .NET 8 and .NET Standard 2.0 - Cuemon.Security.Cryptography - Cuemon.Threading - Cuemon.Xml -  + diff --git a/.nuget/Cuemon.Core.App/README.md b/.nuget/Cuemon.Core.App/README.md index 8417d78a8..dffb297ba 100644 --- a/.nuget/Cuemon.Core.App/README.md +++ b/.nuget/Cuemon.Core.App/README.md @@ -112,6 +112,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Core/PackageReleaseNotes.txt index 7061f355b..d8c5aa0c0 100644 --- a/.nuget/Cuemon.Core/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Core/PackageReleaseNotes.txt @@ -1,61 +1,70 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +# Improvements +- CHANGED Selected foundational types now reside in Cuemon.Kernel to establish a smaller essential substrate; Cuemon.Core preserves compatibility through type forwarding + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # Improvements - CHANGED World class in the Cuemon.Globalization namespace to exclude redundancies in region handling -  + # Bug Fixes - FIXED World class in the Cuemon.Globalization namespace where retrieving countries by code in GetStatisticalRegion was not included -  + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED AssemblyContext class in the Cuemon.Reflection namespace that provides filtered discovery of assemblies in the current application domain, with optional traversal of referenced assemblies - ADDED AssemblyContextOptions class in the Cuemon.Reflection namespace that provides configuration options for AssemblyContext filtering and traversal - ADDED StackDecoratorExtensions class in the Cuemon.Collections.Generic namespace with TryPop extension method for IDecorator - ADDED Patterns class in the Cuemon namespace with two new methods: IsFatalException and IsRecoverableException -  + # Improvements - CHANGED Patterns class in the Cuemon namespace so TryInvoke overloads apply exception filters via IsFatalException and IsRecoverableException - CHANGED World class in the Cuemon.Globalization namespace where StatisticalRegions now returns IEnumerable -  + # Bug Fixes - FIXED AssemblyContextOptions class in the Cuemon.Reflection namespace to safely handle recoverable reflection exceptions while inspecting exported types -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # Improvements - OPTIMIZED StreamDecoratorExtensions class in the Cuemon.IO namespace to reduce memory allocations and improve throughput of InvokeToByteArray by eliminating redundant buffer copies for non-MemoryStream inputs (allocation ratio reduced from ~2x to ~1x for typical payload sizes) - OPTIMIZED StreamDecoratorExtensions class in the Cuemon.IO namespace to cache Length access and avoid repeated virtual calls on seekable streams - OPTIMIZED StreamDecoratorExtensions class in the Cuemon.IO namespace to return Array.Empty() for zero-length seekable streams to avoid unnecessary MemoryStream allocation -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED StatisticalRegionInfo class in the Cuemon.Globalization namespace that provides information about a specific statistical region - ADDED StatisticalRegionKind enum in the Cuemon.Globalization namespace that defines the kind of statistical region -  + # Improvements - EXTENDED World class in the Cuemon.Globalization namespace with a new method: GetStatisticalRegions, which retrieves a list of statistical regions for a given UN M.49 country code - EXTENDED World class in the Cuemon.Globalization namespace with a new method: GetCountry, which retrieves the country information for a given UN M.49 country code - EXTENDED World class in the Cuemon.Globalization namespace with a new method: GetCountry, which retrieves the country information for a given RegionInfo object - EXTENDED World class in the Cuemon.Globalization namespace with a new property: StatisticalRegions, which retrieves a list of all statistical regions -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -64,19 +73,19 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED IPostConfigurableParameterObject interface in the Cuemon.Configuration namespace that defines a contract for parameter objects that require post-configuration logic -  + # Improvements - EXTENDED Validator class in the Cuemon namespace to support invoking parameter objects implementing the IPostConfigurableParameterObject interface - OPTIMIZED FowlerNollVoHash class in the Cuemon.Security namespace for better performance when computing hash codes @@ -84,91 +93,91 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 - OPTIMIZED RandomString method on the Generate class in the Cuemon namespace with a sequential char-array builder and length guard, reducing overhead and allocations - OPTIMIZED DelimitedString class in the Cuemon namespace with a specialized fast-path for single-character delimiters and qualifiers, reducing overhead and allocations - OPTIMIZED CyclicRedundancyCheck class in the Cuemon.Security namespace switching CRC lookup tables to ulong[] and simplified initialization/loop structure, increasing throughput and reducing unnecessary copying -  + # Bug Fixes - FIXED Patterns class in the Cuemon namespace to use generic object creation expressions to eliminate reflection overhead -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # New Features - ADDED Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations - ADDED AsyncRunOptions class in the Cuemon.Threading namespace that provides configuration options for the Awaiter.RunUntilSuccessfulOrTimeoutAsync method -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # Bug Fixes - FIXED Disposable class in the Cuemon namespace to set the disposed flag to true immediately after the Dispose method is called after thread safety check (previously it was set to true after the Dispose method had completed) -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # Breaking Changes - REMOVED DefaultYamlConverter class from the Cuemon.Runtime.Serialization.Converters namespace - REMOVED YamlSerializer class from the Cuemon.Runtime.Serialization namespace @@ -225,13 +234,12 @@ Availability: .NET 9, .NET 8 and .NET Standard 2.0 - REMOVED IHierarchy interface from the Cuemon namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly) - REMOVED ObjectHierarchyOptions class from the Cuemon.Reflection namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly and renamed to HierarchyOptions) - REMOVED HierarchySerializer class from the Cuemon.Runtime.Serialization namespace (moved to the Cuemon.Extensions.Runtime.Serialization namespace in the Cuemon.Extensions.Core assembly) -  + # New Features - ADDED Failure record in the Cuemon.Diagnostics namespace that represents a failure model with detailed information about an exception -  + # Improvements - EXTENDED Condition class in the Cuemon namespace with an additional method: HasDifference - EXTENDED Validator class in the Cuemon namespace with five new methods: ThrowIfContainsReservedKeyword, ThrowIfNotDifferent, ThrowIfDifferent, ThrowIfContainsAny and ThrowIfNotContainsAny - CHANGED Validator class in the Cuemon namespace to comply with RSPEC-3343 - EXTENDED Decorator class in the Cuemon namespace with an additional method: RawEnclose -  diff --git a/.nuget/Cuemon.Core/README.md b/.nuget/Cuemon.Core/README.md index 7c52ded42..403bcbfc7 100644 --- a/.nuget/Cuemon.Core/README.md +++ b/.nuget/Cuemon.Core/README.md @@ -9,9 +9,9 @@ Your versatile companion for: It is (by heart) free, flexible and built to extend and boost your agile codebelt. -## **Cuemon** for .NET +## **Cuemon (Core)** for .NET -The `Cuemon` namespace contains fundamental types such as value and reference types, factories and utility classes, interfaces, attributes and feature rich delegates that support functional programming on a whole new level. The namespace is an addition to the `System` namespace. +Cuemon.Core provides higher-level building blocks on top of Cuemon.Kernel, including factories, formatting and parsing helpers, collections, reflection, runtime and messaging abstractions, time and range types, globalization data, and non-cryptographic hashing utilities. It serves as the broader compatibility-oriented core of the Cuemon ecosystem and is an addition to the System namespace. More documentation available at our documentation site: @@ -67,6 +67,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Data.Integrity/README.md b/.nuget/Cuemon.Data.Integrity/README.md index 403dda1a8..005a60a0a 100644 --- a/.nuget/Cuemon.Data.Integrity/README.md +++ b/.nuget/Cuemon.Data.Integrity/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt index aad86751c..ad503555d 100644 --- a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,89 +36,89 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - CHANGED System.Data.SqlClient to Microsoft.Data.SqlClient since the former is officially deprecated -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Data.SqlClient/README.md b/.nuget/Cuemon.Data.SqlClient/README.md index 12599de84..b9360db42 100644 --- a/.nuget/Cuemon.Data.SqlClient/README.md +++ b/.nuget/Cuemon.Data.SqlClient/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Data/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Data/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Data/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Data/README.md b/.nuget/Cuemon.Data/README.md index 45550a712..e8a3be02c 100644 --- a/.nuget/Cuemon.Data/README.md +++ b/.nuget/Cuemon.Data/README.md @@ -56,6 +56,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Diagnostics/README.md b/.nuget/Cuemon.Diagnostics/README.md index dc3b415de..3d010db39 100644 --- a/.nuget/Cuemon.Diagnostics/README.md +++ b/.nuget/Cuemon.Diagnostics/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt index 87da3de80..f4c3d0e76 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,88 +36,88 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/README.md index 33914f60b..f01467266 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt index 4a4275970..a1a7f9726 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,91 +36,91 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED HttpExceptionDescriptorResponseHandlerExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json namespace -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/README.md index 10b967009..91a9652fb 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/README.md @@ -56,6 +56,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt index 66bcc196b..b3f038362 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,91 +36,91 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED HttpExceptionDescriptorResponseHandlerExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml namespace -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/README.md index a643dcfe4..f28486177 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/README.md @@ -56,6 +56,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt index 87da3de80..f4c3d0e76 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,88 +36,88 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/README.md index 74dbc575e..962ee80ae 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt index 17606033c..00e5601f2 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -30,91 +36,91 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED MvcBuilderExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml namespace - REMOVED MvcCoreBuilderExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml namespace @@ -123,4 +129,4 @@ Availability: .NET 9 and .NET 8 - REMOVED YamlSerializationOutputFormatter class from the Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml namespace - REMOVED MvcBuilderExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Filters namespace - REMOVED MvcCoreBuilderExtensions class from the Cuemon.Extensions.AspNetCore.Mvc.Filters namespace -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/README.md index ba6e2c19b..bfa75a673 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/README.md @@ -58,6 +58,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt index fa5435d17..8716e4727 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt @@ -1,37 +1,43 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED MinimalJsonOptions class in the Cuemon.Extensions.AspNetCore.Text.Json namespace that maps JsonFormatterOptions to ASP.NET Core JsonOptions for minimal APIs - ADDED ServiceCollectionExtensions class in the Cuemon.Extensions.AspNetCore.Text.Json namespace with AddMinimalJsonOptions method -  + # Improvements - CHANGED ServiceCollectionExtensions class in the Cuemon.Extensions.AspNetCore.Text.Json.Formatters namespace so AddJsonFormatterOptions uses TryConfigure to avoid duplicate option registrations -  + # Bug Fixes - FIXED duplicate IConfigureOptions registrations when AddJsonFormatterOptions is called multiple times -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -40,91 +46,91 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Improvements - EXTENDED JsonConverterCollectionExtensions class in the Cuemon.Extensions.AspNetCore.Text.Json.Converters namespace to include two new extension methods: AddProblemDetailsConverter and AddHeaderDictionaryConverter -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/README.md index b01c7a49b..cabc65bb7 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/README.md @@ -56,6 +56,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt index aeb9df430..786d3bd8c 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt @@ -1,36 +1,42 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # New Features - ADDED ServiceCollectionExtensions class in the Cuemon.Extensions.AspNetCore.Xml namespace with AddMinimalXmlOptions extension method for registering XmlFormatterOptions with IServiceCollection -  + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # Improvements - CHANGED ServiceCollectionExtensions class in the Cuemon.Extensions.AspNetCore.Xml.Formatters namespace so AddXmlFormatterOptions uses TryConfigure to avoid duplicate option registrations -  + # Bug Fixes - FIXED duplicate IConfigureOptions registrations when AddXmlFormatterOptions is called multiple times -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -39,91 +45,91 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Improvements - EXTENDED XmlConverterExtensions class in the Cuemon.Extensions.AspNetCore.Xml.Converters namespace to include one new extension method: AddProblemDetailsConverter -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Xml/README.md b/.nuget/Cuemon.Extensions.AspNetCore.Xml/README.md index 3e1d7e0c2..cd7958564 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore.Xml/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore.Xml/README.md @@ -56,6 +56,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt index bc82caa1b..6e47635ba 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt @@ -1,30 +1,36 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10 and .NET 9 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # New Features - EXTENDED ApplicationBuilderExtensions class in the Cuemon.Extensions.AspNetCore.Http.Headers namespace with the UseVaryAccept extension method that adds the Vary header with the value of Accept to the HTTP response -  + Version: 10.3.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10 and .NET 9 @@ -33,96 +39,96 @@ Availability: .NET 10 and .NET 9 Version 10.1.1 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10 and .NET 9 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10 and .NET 9 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9 and .NET 8 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED HttpExceptionDescriptorResponseHandlerExtensions class from the Cuemon.Extensions.AspNetCore.Diagnostics namespace - REMOVED YamlConverterExtensions class from the Cuemon.Extensions.AspNetCore.Text.Yaml.Converters namespace - REMOVED ServiceCollectionExtensions class from the Cuemon.Extensions.AspNetCore.Text.Yaml.Formatters namespace -  + # Improvements - CHANGED ApplicationBuilderExtensions class in the Cuemon.Extensions.AspNetCore.Diagnostics namespace to support preferred fault descriptor (e.g., FaultDetails or ProblemDetails) in the UseFaultDescriptorExceptionHandler extension method -  + diff --git a/.nuget/Cuemon.Extensions.AspNetCore/README.md b/.nuget/Cuemon.Extensions.AspNetCore/README.md index 8bc47e670..abf041337 100644 --- a/.nuget/Cuemon.Extensions.AspNetCore/README.md +++ b/.nuget/Cuemon.Extensions.AspNetCore/README.md @@ -61,6 +61,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt index 71c9aaf74..98c27d617 100644 --- a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt @@ -1,30 +1,36 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED StackExtensions class in the Cuemon.Extensions.Collections.Generic namespace with TryPop extension method for Stack on compatible target frameworks without native Stack.TryPop -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -33,88 +39,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Collections.Generic/README.md b/.nuget/Cuemon.Extensions.Collections.Generic/README.md index a136109b9..c82c739b6 100644 --- a/.nuget/Cuemon.Extensions.Collections.Generic/README.md +++ b/.nuget/Cuemon.Extensions.Collections.Generic/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Collections.Specialized/README.md b/.nuget/Cuemon.Extensions.Collections.Specialized/README.md index cbf1f7d8a..d8e9b11ec 100644 --- a/.nuget/Cuemon.Extensions.Collections.Specialized/README.md +++ b/.nuget/Cuemon.Extensions.Collections.Specialized/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt index 24191d252..7cecb8979 100644 --- a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt @@ -1,30 +1,36 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # New Features - ADDED StatisticalRegionExtensions class in the Cuemon.Extensions.Globalization that consist of extension methods for the StatisticalRegionInfo class: IsWorld, IsRegion, IsSubregion, IsIntermediateRegion, IsCountryOrTerritory, IsArea, HasIsoCodes and HasRegionInfo -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -33,97 +39,97 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED ConditionExtensions class from the Cuemon.Extensions namespace and moved members to Condition class in the Cuemon.Core assembly (Cuemon namespace) - REMOVED ValidatorExtensions class from the Cuemon.Extensions namespace and moved members to Validator class in the Cuemon.Core assembly (Cuemon namespace) - REMOVED ReplaceLineEndings extension method from the StringExtensions class in the Cuemon.Extensions namespace - REMOVED MappingExtensions class from the Cuemon.Extensions namespace -  + # New Features - ADDED ActionFactory class in the Cuemon.Extensions namespace that provides access to factory methods for creating ActionFactory{TTuple} objects that encapsulate a delegate with a variable amount of generic arguments - ADDED FuncFactory class in the Cuemon.Extensions namespace that provides access to factory methods for creating FuncFactory{TTuple, TResult} objects that encapsulate a function delegate with a variable amount of generic arguments @@ -138,4 +144,3 @@ Availability: .NET 9, .NET 8 and .NET Standard 2.0 - ADDED HierarchyOptions class in the Cuemon.Extensions.Runtime namespace that represents a set of options to configure the behavior of the Hierarchy and HierarchySerializer class - ADDED IHierarchy interface in the Cuemon.Extensions.Runtime namespace that defines a way to expose a node of a hierarchical structure - ADDED HierarchySerializer class in the Cuemon.Extensions.Runtime.Serialization namespace that provides a way to serialize objects to nodes of IHierarchy -  \ No newline at end of file diff --git a/.nuget/Cuemon.Extensions.Core/README.md b/.nuget/Cuemon.Extensions.Core/README.md index 86ee9af93..ac0c1d712 100644 --- a/.nuget/Cuemon.Extensions.Core/README.md +++ b/.nuget/Cuemon.Extensions.Core/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Data.Integrity/README.md b/.nuget/Cuemon.Extensions.Data.Integrity/README.md index 14be2474f..64c7b017a 100644 --- a/.nuget/Cuemon.Extensions.Data.Integrity/README.md +++ b/.nuget/Cuemon.Extensions.Data.Integrity/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Data/README.md b/.nuget/Cuemon.Extensions.Data/README.md index 8e957bc5b..a9250ea58 100644 --- a/.nuget/Cuemon.Extensions.Data/README.md +++ b/.nuget/Cuemon.Extensions.Data/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt index 0a6f4ce6c..095ed03f2 100644 --- a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt @@ -1,33 +1,39 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # Improvements - CHANGED ServiceCollectionExtensions class in the Cuemon.Extensions.DependencyInjection namespace to use TryConfigure in Add/TryAdd overloads that accept Action to avoid duplicate option registrations -  + # Bug Fixes - FIXED duplicate IConfigureOptions registrations when using Add/TryAdd overloads repeatedly with configuration delegates -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -36,88 +42,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.DependencyInjection/README.md b/.nuget/Cuemon.Extensions.DependencyInjection/README.md index 9ccaeb378..ffeae400c 100644 --- a/.nuget/Cuemon.Extensions.DependencyInjection/README.md +++ b/.nuget/Cuemon.Extensions.DependencyInjection/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt index ed9e5d9b5..34b9ae1fc 100644 --- a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,91 +36,91 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Breaking Changes - REMOVED ExceptionDescriptorExtensions class from the Cuemon.Extensions.Diagnostics namespace -  + diff --git a/.nuget/Cuemon.Extensions.Diagnostics/README.md b/.nuget/Cuemon.Extensions.Diagnostics/README.md index 541e1e63e..374c53347 100644 --- a/.nuget/Cuemon.Extensions.Diagnostics/README.md +++ b/.nuget/Cuemon.Extensions.Diagnostics/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt index 08515d30d..00f219d52 100644 --- a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,89 +36,89 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for IHostingEnvironment interface (TFM netstandard2.0) -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Hosting/README.md b/.nuget/Cuemon.Extensions.Hosting/README.md index 771656950..4d5a59eed 100644 --- a/.nuget/Cuemon.Extensions.Hosting/README.md +++ b/.nuget/Cuemon.Extensions.Hosting/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt index 1159b055a..e6756089d 100644 --- a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.IO/README.md b/.nuget/Cuemon.Extensions.IO/README.md index eafa2a06a..4f8ef30ec 100644 --- a/.nuget/Cuemon.Extensions.IO/README.md +++ b/.nuget/Cuemon.Extensions.IO/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Net/README.md b/.nuget/Cuemon.Extensions.Net/README.md index d8fe93821..2ee7883cb 100644 --- a/.nuget/Cuemon.Extensions.Net/README.md +++ b/.nuget/Cuemon.Extensions.Net/README.md @@ -57,6 +57,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Reflection/README.md b/.nuget/Cuemon.Extensions.Reflection/README.md index d23f730b4..86db2073d 100644 --- a/.nuget/Cuemon.Extensions.Reflection/README.md +++ b/.nuget/Cuemon.Extensions.Reflection/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Runtime.Caching/README.md b/.nuget/Cuemon.Extensions.Runtime.Caching/README.md index 92a9c94df..24f7a3c8d 100644 --- a/.nuget/Cuemon.Extensions.Runtime.Caching/README.md +++ b/.nuget/Cuemon.Extensions.Runtime.Caching/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt index 41d751cde..03816ccd6 100644 --- a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,100 +36,100 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) - ADDED Support for TFM .NET Standard 2.0 -  + # New Features - ADDED FailureConverter class in the Cuemon.Extensions.Text.Json.Converters namespace to convert FailureConverter to JSON -  + # Improvements - EXTENDED JsonConverterCollectionExtensions class in the Cuemon.Extensions.Text.Json.Converters namespace to include three new extension methods: AddFailureConverter, RemoveAllOf and RemoveAllOf{T} - EXTENDED JsonSerializerOptionsExtensions class in the Cuemon.Extensions.Text.Json namespace to include one new extension method: Clone -  + # Bug Fixes - FIXED ExceptionConverter class in the Cuemon.Extensions.Text.Json.Converters namespace to use JsonSerializerOptions when converting JSON to Exception - FIXED the JSON converter in the Cuemon.Extensions.Text.Json.Converters namespace that converts a Failure to JSON so it uses the actual key-value from the Data property of an exception instead of always writing key -  + diff --git a/.nuget/Cuemon.Extensions.Text.Json/README.md b/.nuget/Cuemon.Extensions.Text.Json/README.md index bde7b88e8..aee262941 100644 --- a/.nuget/Cuemon.Extensions.Text.Json/README.md +++ b/.nuget/Cuemon.Extensions.Text.Json/README.md @@ -57,6 +57,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Extensions.Text/README.md b/.nuget/Cuemon.Extensions.Text/README.md index f4b3071e6..816e2d256 100644 --- a/.nuget/Cuemon.Extensions.Text/README.md +++ b/.nuget/Cuemon.Extensions.Text/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt index 42877a15a..9fb0aafa4 100644 --- a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,92 +36,92 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - REMOVED Dependency on Backport.System.Threading.Lock (since System.Threading.Lock is now available in modern TFMs) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # New Features - ADDED support for System.Threading.Lock object that targets .NET TFM prior to .NET 9 (credits to Mark Cilia Vincenti, https://github.com/MarkCiliaVincenti/Backport.System.Threading.Lock) -  + diff --git a/.nuget/Cuemon.Extensions.Threading/README.md b/.nuget/Cuemon.Extensions.Threading/README.md index 99c60377d..29b417369 100644 --- a/.nuget/Cuemon.Extensions.Threading/README.md +++ b/.nuget/Cuemon.Extensions.Threading/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt index 4091d0f3d..ee4f83ddc 100644 --- a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt @@ -1,30 +1,36 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # Improvements - CHANGED XmlConverterExtensions in the Cuemon.Extensions.Xml.Serialization.Converters namespace to support flattening items when serializing in the AddEnumerableConverter method -  + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -33,91 +39,91 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # Improvements - EXTENDED XmlConverterExtensions class in the Cuemon.Extensions.Xml.Serialization.Converters namespace to include one new extension method: AddFailureConverter -  + diff --git a/.nuget/Cuemon.Extensions.Xml/README.md b/.nuget/Cuemon.Extensions.Xml/README.md index 87bbdc4f1..61b15516b 100644 --- a/.nuget/Cuemon.Extensions.Xml/README.md +++ b/.nuget/Cuemon.Extensions.Xml/README.md @@ -58,6 +58,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.IO/PackageReleaseNotes.txt index 1420c5397..a83d99e94 100644 --- a/.nuget/Cuemon.IO/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.IO/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.IO/README.md b/.nuget/Cuemon.IO/README.md index 648c4742d..a26a8dacd 100644 --- a/.nuget/Cuemon.IO/README.md +++ b/.nuget/Cuemon.IO/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt b/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt new file mode 100644 index 000000000..45d0153b2 --- /dev/null +++ b/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt @@ -0,0 +1,13 @@ +Version: 10.5.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + +# New Features +- ADDED the initial Kernel surface that provides the essential Cuemon.Core substrate, including foundational types such as Validator, Patterns, Condition, Decorator, and related supporting abstractions + +# Bug Fixes + +- FIXED Arguments class in the Cuemon.Collections.Generic namespace so Concat appends the second array at the correct offset when the input arrays have different lengths +- FIXED ByteOrderMark class in the Cuemon.Text namespace to correctly detect UTF-8 and UTF-16 BOMs from short byte buffers and short streams, while only removing a preamble when the byte sequence matches the full encoding preamble exactly diff --git a/.nuget/Cuemon.Kernel/README.md b/.nuget/Cuemon.Kernel/README.md new file mode 100644 index 000000000..aed26d665 --- /dev/null +++ b/.nuget/Cuemon.Kernel/README.md @@ -0,0 +1,64 @@ +## About + +An open-source project (MIT license) that enhances and complements the Microsoft .NET platform. It provides powerful capabilities for developers across modern, cross-platform, and legacy environments. + +Your versatile companion for: +- Modern development with `.NET 9` and `.NET 10`, +- Cross-platform libraries with `.NET Standard 2` (where applicable), +- Legacy applications on `.NET Framework 4.6.2` and newer. + +It is (by heart) free, flexible and built to extend and boost your agile codebelt. + +## **Cuemon (Kernel)** for .NET + +Cuemon.Kernel provides the essential Cuemon programming substrate, including validators, conditions, decorators, configuration abstractions, asynchronous option types, disposable patterns, and core text encoding helpers. It is the minimal foundational layer for the Cuemon ecosystem and an addition to the System namespace. + +More documentation available at our documentation site: + +- [Cuemon](https://docs.cuemon.net/api/dotnet/Cuemon.html) 🔗 + +## Related Packages + +* [Cuemon.AspNetCore](https://www.nuget.org/packages/Cuemon.AspNetCore/) 📦 +* [Cuemon.AspNetCore.App](https://www.nuget.org/packages/Cuemon.AspNetCore.App/) 🏭 +* [Cuemon.AspNetCore.Authentication](https://www.nuget.org/packages/Cuemon.AspNetCore.Authentication/) 📦 +* [Cuemon.AspNetCore.Mvc](https://www.nuget.org/packages/Cuemon.AspNetCore.Mvc/) 📦 +* [Cuemon.AspNetCore.Razor.TagHelpers](https://www.nuget.org/packages/Cuemon.AspNetCore.Razor.TagHelpers/) 📦 +* [Cuemon.Core](https://www.nuget.org/packages/Cuemon.Core/) 📦 +* [Cuemon.Core.App](https://www.nuget.org/packages/Cuemon.Core.App/) 🏭 +* [Cuemon.Data](https://www.nuget.org/packages/Cuemon.Data/) 📦 +* [Cuemon.Data.Integrity](https://www.nuget.org/packages/Cuemon.Data.Integrity/) 📦 +* [Cuemon.Data.SqlClient](https://www.nuget.org/packages/Cuemon.Data.SqlClient/) 📦 +* [Cuemon.Diagnostics](https://www.nuget.org/packages/Cuemon.Diagnostics/) 📦 +* [Cuemon.Extensions.AspNetCore](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore/) 📦 +* [Cuemon.Extensions.AspNetCore.Authentication](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Authentication/) 📦 +* [Cuemon.Extensions.AspNetCore.Mvc](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Mvc/) 📦 +* [Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/) 📦 +* [Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/) 📦 +* [Cuemon.Extensions.AspNetCore.Mvc.RazorPages](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/) 📦 +* [Cuemon.Extensions.AspNetCore.Text.Json](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Text.Json/) 📦 +* [Cuemon.Extensions.AspNetCore.Xml](https://www.nuget.org/packages/Cuemon.Extensions.AspNetCore.Xml/) 📦 +* [Cuemon.Extensions.Collections.Generic](https://www.nuget.org/packages/Cuemon.Extensions.Collections.Generic/) 📦 +* [Cuemon.Extensions.Collections.Specialized](https://www.nuget.org/packages/Cuemon.Extensions.Collections.Specialized/) 📦 +* [Cuemon.Extensions.Core](https://www.nuget.org/packages/Cuemon.Extensions.Core/) 📦 +* [Cuemon.Extensions.Data](https://www.nuget.org/packages/Cuemon.Extensions.Data/) 📦 +* [Cuemon.Extensions.Data.Integrity](https://www.nuget.org/packages/Cuemon.Extensions.Data.Integrity/) 📦 +* [Cuemon.Extensions.DependencyInjection](https://www.nuget.org/packages/Cuemon.Extensions.DependencyInjection/) 📦 +* [Cuemon.Extensions.Diagnostics](https://www.nuget.org/packages/Cuemon.Extensions.Diagnostics/) 📦 +* [Cuemon.Extensions.Hosting](https://www.nuget.org/packages/Cuemon.Extensions.Hosting/) 📦 +* [Cuemon.Extensions.IO](https://www.nuget.org/packages/Cuemon.Extensions.IO/) 📦 +* [Cuemon.Extensions.Net](https://www.nuget.org/packages/Cuemon.Extensions.Net/) 📦 +* [Cuemon.Extensions.Reflection](https://www.nuget.org/packages/Cuemon.Extensions.Reflection/) 📦 +* [Cuemon.Extensions.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Extensions.Runtime.Caching/) 📦 +* [Cuemon.Extensions.Text](https://www.nuget.org/packages/Cuemon.Extensions.Text/) 📦 +* [Cuemon.Extensions.Text.Json](https://www.nuget.org/packages/Cuemon.Extensions.Text.Json/) 📦 +* [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 +* [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 +* [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ +* [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 +* [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 +* [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 +* [Cuemon.Security.Cryptography](https://www.nuget.org/packages/Cuemon.Security.Cryptography/) 📦 +* [Cuemon.Threading](https://www.nuget.org/packages/Cuemon.Threading/) 📦 +* [Cuemon.Xml](https://www.nuget.org/packages/Cuemon.Xml/) 📦 diff --git a/.nuget/Cuemon.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Net/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Net/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Net/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Net/README.md b/.nuget/Cuemon.Net/README.md index c96680796..279f5d5df 100644 --- a/.nuget/Cuemon.Net/README.md +++ b/.nuget/Cuemon.Net/README.md @@ -58,6 +58,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Resilience/README.md b/.nuget/Cuemon.Resilience/README.md index 9ff5ffd27..6796a3496 100644 --- a/.nuget/Cuemon.Resilience/README.md +++ b/.nuget/Cuemon.Resilience/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt index 1464c21f1..1e4007a55 100644 --- a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,88 +36,88 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Runtime.Caching/README.md b/.nuget/Cuemon.Runtime.Caching/README.md index 649860ebb..aa889c925 100644 --- a/.nuget/Cuemon.Runtime.Caching/README.md +++ b/.nuget/Cuemon.Runtime.Caching/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt index 5a119274c..4d0301ad0 100644 --- a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,102 +36,102 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + # Improvements - OPTIMIZED AesCryptor class in the Cuemon.Security.Cryptography namespace to use TransformFinalBlock instead of stream-based transforms, reducing overhead and allocations -  + # Bug Fixes - FIXED SecureHashAlgorithm512 class in the Cuemon.Security.Cryptography namespace to allow optional setup delegate -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + # New Features - ADDED SecureHashAlgorithm512256 class in the Cuemon.Security.Cryptography namespace that provides a a SHA-512-256 implementation of the SHA (Secure Hash Algorithm) cryptographic hashing algorithm for 512-bit hash values - ADDED SHA512256 class in the Cuemon.Security.Cryptography namespace that represents the SHA-512/256 cryptographic hash algorithm, which produces a 256-bit hash value using the SHA-512 algorithm as its base -  + # Improvements - EXTENDED UnkeyedCryptoAlgorithm enum in the Cuemon.Security.Cryptography namespace with Sha512Slash256 - EXTENDED UnkeyedHashFactory class in the Cuemon.Security.Cryptography namespace with CreateCryptoSha512Slash256 method -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + diff --git a/.nuget/Cuemon.Security.Cryptography/README.md b/.nuget/Cuemon.Security.Cryptography/README.md index 03097b956..761c5ed1d 100644 --- a/.nuget/Cuemon.Security.Cryptography/README.md +++ b/.nuget/Cuemon.Security.Cryptography/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt index f2f21801f..206979be6 100644 --- a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt @@ -1,27 +1,33 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -30,93 +36,93 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # New Features - ADDED AsyncPatterns class in the Cuemon.Threading namespace that provides a generic way to support different types of design patterns and practices with small utility methods scoped to Task - ADDED AsyncActionFactory class in the Cuemon.Threading namespace that provides access to factory methods for creating AsyncActionFactory{TTuple} instances that encapsulate a Task based action delegate with a variable amount of generic arguments - ADDED AsyncFuncFactory class in the Cuemon.Threading namespace that provides access to factory methods for creating AsyncFuncFactory{TTuple,TResult} instances that encapsulate a Task{TResult} based function delegate with a variable amount of generic arguments -  + diff --git a/.nuget/Cuemon.Threading/README.md b/.nuget/Cuemon.Threading/README.md index cc0c463ba..0fc3c5e7a 100644 --- a/.nuget/Cuemon.Threading/README.md +++ b/.nuget/Cuemon.Threading/README.md @@ -55,6 +55,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt index 0b0cac96a..e53238b97 100644 --- a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt +++ b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt @@ -1,34 +1,40 @@ -Version: 10.4.0 +Version: 10.5.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + +Version: 10.4.0 +Availability: .NET 10, .NET 9 and .NET Standard 2.0 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + # New Features - ADDED FlattenCollectionItems property to XmlSerializerOptions in the Cuemon.Xml.Serialization namespace to control item flattening during enumerable XML serialization - ADDED flattenItems parameter to AddEnumerableConverter in XmlConverterDecoratorExtensions in the Cuemon.Xml.Serialization.Converters namespace to support item flattening -  + # Bug Fixes - FIXED DefaultXmlConverter class in the Cuemon.Xml.Serialization.Converters namespace to conditionally encapsulate child nodes and prevent duplicate element wrapping -  + Version: 10.3.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version: 10.2.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.2 Availability: .NET 10, .NET 9 and .NET Standard 2.0 @@ -37,97 +43,97 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0 Version 10.1.1 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.1.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 10.0.0 Availability: .NET 10, .NET 9 and .NET Standard 2.0 -  + # ALM - ADDED Support for TFM .NET 10 (LTS) - REMOVED Support for TFM .NET 8 (LTS) - CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) -  + Version 9.0.10 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.9 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.8 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.7 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.6 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.5 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.4 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.3 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.2 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.1 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs -  + Version 9.0.0 Availability: .NET 9, .NET 8 and .NET Standard 2.0 -  + # ALM - CHANGED Dependencies to latest and greatest with respect to TFMs - REMOVED Support for TFM .NET 6 (LTS) -  + # New Features - ADDED FailureConverter class in the Cuemon.Xml.Serialization.Converters namespace to convert FailureConverter to XML -  + # Improvements - EXTENDED XmlConverter{T} class in the Cuemon.Xml.Serialization.Converters namespace to use generic type T with two new abstract methods: WriteXml and ReadXml -  + # Bug Fixes - FIXED ExceptionConverter class in the Cuemon.Xml.Serialization.Converters namespace to use Environment.NewLine instead of Alphanumeric.NewLine (vital for non-Windows operating systems) -  + diff --git a/.nuget/Cuemon.Xml/README.md b/.nuget/Cuemon.Xml/README.md index 5a4da732b..13dd271b6 100644 --- a/.nuget/Cuemon.Xml/README.md +++ b/.nuget/Cuemon.Xml/README.md @@ -60,6 +60,7 @@ More documentation available at our documentation site: * [Cuemon.Extensions.Threading](https://www.nuget.org/packages/Cuemon.Extensions.Threading/) 📦 * [Cuemon.Extensions.Xml](https://www.nuget.org/packages/Cuemon.Extensions.Xml/) 📦 * [Cuemon.IO](https://www.nuget.org/packages/Cuemon.IO/) 📦 +* [Cuemon.Kernel](https://www.nuget.org/packages/Cuemon.Kernel/) ⚙️ * [Cuemon.Net](https://www.nuget.org/packages/Cuemon.Net/) 📦 * [Cuemon.Resilience](https://www.nuget.org/packages/Cuemon.Resilience/) 📦 * [Cuemon.Runtime.Caching](https://www.nuget.org/packages/Cuemon.Runtime.Caching/) 📦 diff --git a/CHANGELOG.md b/CHANGELOG.md index 10fc000c9..ff0ee1042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,54 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), For more details, please refer to `PackageReleaseNotes.txt` on a per assembly basis in the `.nuget` folder. +## [10.5.0] - 2026-03-13 + +Okay, so this might look like a major release — and effort-wise it certainly felt like one — but it's actually a fully backward-compatible minor bump. Thanks to a helping hand from AI and a long-standing wish to carve out a small, lean core from Cuemon, we've introduced a brand-new assembly: **Cuemon.Kernel**. Think of it as the nano (or at least noticeably smaller) sibling of `Cuemon.Core`, shipping only the most essential and much-loved types — validators, conditions, decorators, disposable patterns, the options/parameter-object infrastructure, text encoding helpers and async primitives. + +If you've ever wondered about Microsoft's own split between `mscorlib.dll`, `System.dll`, `System.Core.dll` and `System.Private.CoreLib.dll` — well, `Cuemon.Kernel` is probably our equivalent of `mscorlib.dll` and `System.dll`. Not quite as dramatic, but you get the idea. + +The key detail: every public API stays exactly where it was. `Cuemon.Core` now references `Cuemon.Kernel` and uses `TypeForwardedTo` attributes for every type that moved, so existing consumers won't notice a thing. No breaking changes, no missing types, just a cleaner layering underneath. + +> [!NOTE] +> To be clear, this is not a refactoring release. The code in `Cuemon.Core` that moved to `Cuemon.Kernel` is still exactly the same (only exception being the bug fixes), just compiled into a different assembly. The only "refactoring" aspect is the introduction of `TypeForwardedTo` attributes in `Cuemon.Core` to maintain backward compatibility. + +This release also bumps all package dependencies to their latest compatible versions and includes minor XML documentation improvements in `DelimitedString` and `StringFactory` as well as bug fixing. + +### Added + +- **`Cuemon.Kernel`** assembly (new) — a lightweight, foundational subset of `Cuemon.Core` containing the most essential primitives: + - `Alphanumeric`, `CasingMethod`, `GuidFormats`, `Endianness`, `UriScheme` enums and constants, + - `Condition`, `ConditionalValue`, `ExceptionCondition` guard and condition utilities, + - `Validator` with the full suite of `ThrowIf*` guard-clause methods, + - `Patterns` with safe-invoke, configure, and exception-filter helpers, + - `Decorator` / `IDecorator` decoration infrastructure, + - `Disposable`, `FinalizeDisposable`, `DisposableOptions` lifecycle types, + - `Convertible`, `ConvertibleConverterDictionary`, `ConvertibleOptions` conversion primitives, + - `IParameterObject`, `IValidatableParameterObject`, `IPostConfigurableParameterObject` configuration contracts, + - `TesterFunc` delegate family and `SuccessfulValue` / `UnsuccessfulValue` result types, + - `Arguments` collection helper, + - `StreamDecoratorExtensions` stream utilities, + - `AsyncOptions`, `AsyncRunOptions`, `IAsyncOptions`, `Awaiter` async primitives, + - `ByteOrderMark`, `EncodingOptions`, `FallbackEncodingOptions`, `IEncodingOptions`, `PreambleSequence`, `EnumStringOptions` text encoding helpers, + - `IParser`, `IConfigurableParser`, `UriStringOptions`, `ProtocolRelativeUriStringOptions` parser contracts, + - `EndianOptions` byte-order configuration, + - `TypeArgumentException`, `TypeArgumentOutOfRangeException`, `ArgumentReservedKeywordException` custom exception types, + - `CallerArgumentExpressionAttribute` polyfill (for `netstandard2.0` and pre-.NET Core 3.0 targets), +- **`Cuemon.Kernel.Tests`** test project with comprehensive unit tests; a few migrated from `Cuemon.Core.Tests`, but the majority written beforehand creation of `Cuemon.Kernel`. + +### Changed + +- `Cuemon.Core` assembly now depends on `Cuemon.Kernel` and uses `[TypeForwardedTo]` attributes for all types that moved, preserving full backward compatibility, +- `Cuemon.Core` package description updated to reflect its role as higher-level building blocks on top of `Cuemon.Kernel`, +- `DelimitedString` class in the `Cuemon` namespace received improved XML documentation for the `Split` method, +- `StringFactory` class in the `Cuemon` namespace received improved XML documentation across factory methods, +- `Directory.Build.targets` simplified the `PreparePackageReleaseNotesFromFile` target to use `System.IO.File.ReadAllText` instead of `ReadLinesFromFile`. + +### Fixed + +- `Arguments` class in the `Cuemon.Collections.Generic` namespace so `Concat` appends the second array at the correct offset when the input arrays have different lengths, +- `ByteOrderMark` class in the `Cuemon.Text` namespace to correctly detect UTF-8 and UTF-16 BOMs from short byte buffers and short streams, while only removing a preamble when the byte sequence matches the full encoding preamble exactly. + ## [10.4.0] - 2026-02-27 This is a minor release that introduces support for flattening items in enumerable XML serialization, while also improving the behavior of the default XML converter to prevent duplicate element wrapping. A few bug fixes and improvements were also included in this release. @@ -515,7 +563,6 @@ This release was primarily focused on adapting a more modern way of performing C - YamlFormatterOptions class in the Cuemon.Text.Yaml.Formatters to include the ObsoleteAttribute with this message: All YAML marshalling has been moved to its own assembly; Cuemon.Extensions.YamlDotNet. This member will be removed with next major version - YamlConverterFactory class in the Cuemon.Text.Yaml to include the ObsoleteAttribute with this message: All YAML marshalling has been moved to its own assembly; Cuemon.Extensions.YamlDotNet. This member will be removed with next major version - YamlNamingPolicy class in the Cuemon.Text.Yaml to include the ObsoleteAttribute with this message: All YAML marshalling has been moved to its own assembly; Cuemon.Extensions.YamlDotNet. This member will be removed with next major version -  ### Fixed diff --git a/Cuemon.slnx b/Cuemon.slnx index 98a51fca2..044f05386 100644 --- a/Cuemon.slnx +++ b/Cuemon.slnx @@ -39,6 +39,7 @@ + @@ -78,6 +79,7 @@ + diff --git a/Directory.Build.targets b/Directory.Build.targets index ed6077c35..00bb68a3d 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,10 +1,7 @@  - - - - @(PackageReleaseNotesLines, '%0A') + $([System.IO.File]::ReadAllText('$(PackageReleaseNotesFile)')) diff --git a/Directory.Packages.props b/Directory.Packages.props index b255f63f3..d827e75f8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,10 +6,10 @@ - - - - + + + + @@ -22,31 +22,31 @@ - + - - - - - + + + + + - + - - - - - + + + + + - - - - - + + + + + diff --git a/src/Cuemon.Core/Collections/Generic/Arguments.cs b/src/Cuemon.Core/Collections/Generic/Arguments.cs deleted file mode 100644 index 40ea8acb3..000000000 --- a/src/Cuemon.Core/Collections/Generic/Arguments.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Cuemon.Collections.Generic -{ - /// - /// Provides a set of static methods for both typing (no conversion) and converting a variable number of arguments into its equivalent , and . - /// - public static class Arguments - { - /// - /// Concatenates two arrays. - /// - /// The type of the elements of the input arrays. - /// The first array to concatenate. - /// The array to concatenate to the first array. - /// An that contains the concatenated elements of the two input arrays. - public static T[] Concat(T[] args1, T[] args2) - { - if (args1 == null) { return Array.Empty(); } - if (args2 == null) { return args1; } - if (args1.Length == 0 || args2.Length == 0) { return args1.Length == 0 ? args2 : args1; } - var result = new T[args1.Length + args2.Length]; - args1.CopyTo(result, 0); - args2.CopyTo(result, args2.Length); - return result; - } - - /// - /// Returns the input typed as . - /// - /// The type of the elements of . - /// The to type as . - /// The input typed as . - /// The method has no effect other than to change the compile-time type of from to . - public static T[] ToArrayOf(params T[] args) - { - return args; - } - - /// - /// Returns the input typed as . - /// - /// The to type as . - /// The input typed as . - /// The method has no effect other than to change the compile-time type of from to . - public static object[] ToArray(params object[] args) - { - return args; - } - - /// - /// Returns the input typed as . - /// - /// The type of the elements of . - /// The to type as . - /// The input typed as . - /// The method has no effect other than to change the compile-time type of from to . - public static IEnumerable ToEnumerableOf(params T[] args) - { - return args; - } - - /// - /// Returns the input typed as . - /// - /// The to type as . - /// The input typed as . - /// The method has no effect other than to change the compile-time type of from to . - public static IEnumerable ToEnumerable(params object[] args) - { - return args; - } - - /// - /// Returns an with the specified as the only element. - /// - /// The type of the element of . - /// The to type as . - /// An with the specified as the only element. - /// The method has no effect other than to change the compile-time type of from to . - public static IEnumerable Yield(T arg) - { - yield return arg; - } - } -} \ No newline at end of file diff --git a/src/Cuemon.Core/Cuemon.Core.csproj b/src/Cuemon.Core/Cuemon.Core.csproj index 5d2ea3a9c..5779338c7 100644 --- a/src/Cuemon.Core/Cuemon.Core.csproj +++ b/src/Cuemon.Core/Cuemon.Core.csproj @@ -1,4 +1,4 @@ - + 000bdf91-e7c7-4cb4-a39d-e1a5374c5602 @@ -9,12 +9,17 @@ Cuemon.Core Cuemon Cuemon - The Cuemon namespace contains fundamental types such as value and reference types, factories and utility classes, interfaces, attributes and feature rich delegates that support functional programming on a whole new level. The namespace is an addition to the System namespace. - action-factory calculator configure configure-revert configure-exchange configurable condition options-pattern decorator delimited-string disposable finalize-disposable safe-invoke safe-invoke-async func-factory patterns reference-project clean-architecture clean-code task-action-factory task-func-factory template template-factory time-range time-unit validator guard text-encoding parser-factory security aes-cryptor cyclic-redundancy-check fowler-noll-vo-hash hash-factory hash-result keyed-crypto-hash keyed-crypto-algorithm message-digest non-crypto-algorithm unkeyed-crypto-hash globalization unm49 region country m49 + Cuemon.Core provides higher-level building blocks on top of Cuemon.Kernel, including factories, formatting and parsing helpers, collections, reflection, runtime and messaging abstractions, time and range types, globalization data, and non-cryptographic hashing utilities. It serves as the broader compatibility-oriented core of the Cuemon ecosystem and is an addition to the System namespace. + action-factory async-action-factory async-func-factory calculator collections correlation-token cyclic-redundancy-check date-span date-time-range delimited-string exception-descriptor fowler-noll-vo-hash func-factory generate globalization hash-factory hash-result messaging mutable-tuple non-crypto-algorithm object-formatting pager pagination parser-factory partitioner range reflection request-token runtime string-factory task-action-factory task-func-factory tester-factory time-range time-unit tweaker unm49 region country m49 watcher + Cuemon.Core + + + + diff --git a/src/Cuemon.Core/DelimitedString.cs b/src/Cuemon.Core/DelimitedString.cs index c5451a8d6..f834aa680 100644 --- a/src/Cuemon.Core/DelimitedString.cs +++ b/src/Cuemon.Core/DelimitedString.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Text; @@ -44,19 +44,37 @@ public static string Create(IEnumerable source, Action - /// Returns a that contain the substrings of delimited by a that may be quoted by . + /// Splits the specified into substrings by using the configured and . /// - /// The value containing substrings and delimiters. + /// The delimited string to split. /// The which may be configured. - /// A that contain the substrings of delimited by a and optionally surrounded within . - /// - /// This method was inspired by two articles on StackOverflow @ http://stackoverflow.com/questions/2807536/split-string-in-c-sharp, https://stackoverflow.com/questions/3776458/split-a-comma-separated-string-with-both-quoted-and-unquoted-strings and https://stackoverflow.com/questions/6542996/how-to-split-csv-whose-columns-may-contain. - /// The default implementation conforms with the RFC-4180 standard. - /// + /// + /// An array of values that contains the substrings extracted from . + /// + /// + /// is , empty, or consists only of white-space characters. + /// /// - /// An error occurred while splitting into substrings separated by and quoted with . - /// This is typically related to data corruption, eg. a field has not been properly closed with the specified. + /// Thrown when cannot be split using the configured and . + /// This typically indicates malformed input, such as an unclosed qualified field. /// + /// + /// The default implementation conforms to RFC 4180. + /// + /// This implementation was inspired by the following Stack Overflow discussions: + /// + /// + /// + /// https://stackoverflow.com/questions/2807536/split-string-in-c-sharp + /// + /// + /// https://stackoverflow.com/questions/3776458/split-a-comma-separated-string-with-both-quoted-and-unquoted-strings + /// + /// + /// https://stackoverflow.com/questions/6542996/how-to-split-csv-whose-columns-may-contain + /// + /// + /// public static string[] Split(string value, Action setup = null) { Validator.ThrowIfNullOrWhitespace(value); diff --git a/src/Cuemon.Core/Properties/AssemblyInfo.cs b/src/Cuemon.Core/Properties/AssemblyInfo.cs index a905199ee..fcf48d89a 100644 --- a/src/Cuemon.Core/Properties/AssemblyInfo.cs +++ b/src/Cuemon.Core/Properties/AssemblyInfo.cs @@ -1,4 +1,84 @@ -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Cuemon; +using Cuemon.Collections.Generic; +using Cuemon.Configuration; +using Cuemon.IO; +using Cuemon.Text; +using Cuemon.Threading; [assembly: ComVisible(false)] -[assembly: Guid("989939cf-cef2-4e23-8bce-725255e35ce6")] \ No newline at end of file +[assembly: Guid("989939cf-cef2-4e23-8bce-725255e35ce6")] +[assembly: TypeForwardedTo(typeof(Alphanumeric))] +[assembly: TypeForwardedTo(typeof(ArgumentReservedKeywordException))] +[assembly: TypeForwardedTo(typeof(Arguments))] +[assembly: TypeForwardedTo(typeof(AsyncOptions))] +[assembly: TypeForwardedTo(typeof(AsyncRunOptions))] +[assembly: TypeForwardedTo(typeof(Awaiter))] +[assembly: TypeForwardedTo(typeof(ByteOrderMark))] +[assembly: TypeForwardedTo(typeof(CasingMethod))] +[assembly: TypeForwardedTo(typeof(Condition))] +[assembly: TypeForwardedTo(typeof(ConditionalValue))] +[assembly: TypeForwardedTo(typeof(ConditionalValue<>))] +[assembly: TypeForwardedTo(typeof(Convertible))] +[assembly: TypeForwardedTo(typeof(ConvertibleConverterDictionary))] +[assembly: TypeForwardedTo(typeof(ConvertibleOptions))] +[assembly: TypeForwardedTo(typeof(Decorator))] +[assembly: TypeForwardedTo(typeof(Decorator<>))] +[assembly: TypeForwardedTo(typeof(Disposable))] +[assembly: TypeForwardedTo(typeof(DisposableOptions))] +[assembly: TypeForwardedTo(typeof(EndianOptions))] +[assembly: TypeForwardedTo(typeof(EncodingOptions))] +[assembly: TypeForwardedTo(typeof(Endianness))] +[assembly: TypeForwardedTo(typeof(EnumStringOptions))] +[assembly: TypeForwardedTo(typeof(ExceptionCondition<>))] +[assembly: TypeForwardedTo(typeof(ExceptionHandler<>))] +[assembly: TypeForwardedTo(typeof(ExceptionHandler<,>))] +[assembly: TypeForwardedTo(typeof(ExceptionInvoker<>))] +[assembly: TypeForwardedTo(typeof(ExceptionInvoker<,>))] +[assembly: TypeForwardedTo(typeof(FallbackEncodingOptions))] +[assembly: TypeForwardedTo(typeof(FinalizeDisposable))] +[assembly: TypeForwardedTo(typeof(GuidFormats))] +[assembly: TypeForwardedTo(typeof(IAsyncOptions))] +[assembly: TypeForwardedTo(typeof(IConfigurableParser<>))] +[assembly: TypeForwardedTo(typeof(IConfigurableParser<,>))] +[assembly: TypeForwardedTo(typeof(IDecorator<>))] +[assembly: TypeForwardedTo(typeof(IEncodingOptions))] +[assembly: TypeForwardedTo(typeof(IParameterObject))] +[assembly: TypeForwardedTo(typeof(IParser))] +[assembly: TypeForwardedTo(typeof(IParser<>))] +[assembly: TypeForwardedTo(typeof(IPostConfigurableParameterObject))] +[assembly: TypeForwardedTo(typeof(IValidatableParameterObject))] +[assembly: TypeForwardedTo(typeof(Patterns))] +[assembly: TypeForwardedTo(typeof(PreambleSequence))] +[assembly: TypeForwardedTo(typeof(ProtocolRelativeUriStringOptions))] +[assembly: TypeForwardedTo(typeof(StreamDecoratorExtensions))] +[assembly: TypeForwardedTo(typeof(SuccessfulValue))] +[assembly: TypeForwardedTo(typeof(SuccessfulValue<>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,,,>))] +[assembly: TypeForwardedTo(typeof(TypeArgumentException))] +[assembly: TypeForwardedTo(typeof(TypeArgumentOutOfRangeException))] +[assembly: TypeForwardedTo(typeof(UnsuccessfulValue))] +[assembly: TypeForwardedTo(typeof(UnsuccessfulValue<>))] +[assembly: TypeForwardedTo(typeof(UriScheme))] +[assembly: TypeForwardedTo(typeof(UriStringOptions))] +[assembly: TypeForwardedTo(typeof(Validator))] +#if !NETCOREAPP3_0_OR_GREATER +[assembly: TypeForwardedTo(typeof(CallerArgumentExpressionAttribute))] +#endif diff --git a/src/Cuemon.Core/StringFactory.cs b/src/Cuemon.Core/StringFactory.cs index b8759a4c6..d7adaa19f 100644 --- a/src/Cuemon.Core/StringFactory.cs +++ b/src/Cuemon.Core/StringFactory.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; @@ -7,19 +7,19 @@ namespace Cuemon { /// - /// Provides access to factory methods for creating and configuring encoded instances. + /// Provides access to factory methods for creating encoded string representations. /// public static class StringFactory { private static readonly IDictionary UriSchemeToStringLookupTable = ParserFactory.StringToUriSchemeLookupTable.ToDictionary(pair => pair.Value, pair => pair.Key); /// - /// Creates a hexadecimal string representation from the specified . + /// Creates a hexadecimal string representation of the specified byte array. /// - /// The to convert. - /// A hexadecimal string representation that is equivalent to . + /// The byte array to convert. + /// A hexadecimal string representation of . /// - /// cannot be null. + /// is . /// public static string CreateHexadecimal(byte[] value) { @@ -32,16 +32,16 @@ public static string CreateHexadecimal(byte[] value) } /// - /// Creates a hexadecimal string representation from the specified . + /// Creates a hexadecimal string representation of the specified string. /// - /// The to convert. - /// The which may be configured. - /// A hexadecimal string representation that is equivalent to . + /// The string to convert. + /// The delegate that configures the encoding behavior. + /// A hexadecimal string representation of . /// - /// cannot be null. + /// is . /// /// - /// was initialized with an invalid . + /// configures an invalid value for . /// public static string CreateHexadecimal(string value, Action setup = null) { @@ -51,12 +51,12 @@ public static string CreateHexadecimal(string value, Action set } /// - /// Creates a binary digits string representation from the specified . + /// Creates a binary digit string representation of the specified byte array. /// - /// The to convert. - /// A binary digits string representation that is equivalent to . + /// The byte array to convert. + /// A binary digit string representation of . /// - /// cannot be null. + /// is . /// public static string CreateBinaryDigits(byte[] value) { @@ -65,14 +65,20 @@ public static string CreateBinaryDigits(byte[] value) } /// - /// Creates a base64 string representation, in URL-safe characters, from the specified . + /// Creates a URL-safe Base64 string representation of the specified byte array. /// - /// The to convert. - /// A base64 string representation, in URL-safe characters, that is equivalent to . + /// The byte array to convert. + /// A URL-safe Base64 string representation of . /// - /// cannot be null. + /// is . /// - /// Source: http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-08#appendix-C + /// + /// This method uses the Base64 URL encoding convention by removing padding characters and replacing + /// + with - and / with _. + /// + /// The implementation was inspired by Appendix C of the JSON Web Signature (JWS) draft specification. + /// + /// public static string CreateUrlEncodedBase64(byte[] value) { Validator.ThrowIfNull(value); @@ -84,16 +90,16 @@ public static string CreateUrlEncodedBase64(byte[] value) } /// - /// Creates a protocol-relative URL string representation from the specified . + /// Creates a protocol-relative URL string representation of the specified . /// - /// The to convert. - /// The which may be configured. - /// A protocol-relative URL string representation that is equivalent to . + /// The URI to convert. + /// The delegate that configures the protocol-relative URL format. + /// A protocol-relative URL string representation of . /// - /// cannot be null. + /// is . /// /// - /// must be an absolute URI. + /// is not an absolute URI. /// public static string CreateProtocolRelativeUrl(Uri value, Action setup = null) { @@ -105,10 +111,14 @@ public static string CreateProtocolRelativeUrl(Uri value, Action - /// Creates an URI scheme string representation from the specified . + /// Creates the string representation of the specified . /// - /// The to convert. - /// An URI scheme string representation that is equivalent to . + /// The URI scheme to convert. + /// The string representation of . + /// + /// Returns the string representation of when + /// is not found in the lookup table. + /// public static string CreateUriScheme(UriScheme value) { if (!UriSchemeToStringLookupTable.TryGetValue(value, out var result)) @@ -118,4 +128,4 @@ public static string CreateUriScheme(UriScheme value) return result; } } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/Text/ByteOrderMark.cs b/src/Cuemon.Core/Text/ByteOrderMark.cs deleted file mode 100644 index cac80e91e..000000000 --- a/src/Cuemon.Core/Text/ByteOrderMark.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.IO; -using System.Text; -using Cuemon.IO; - -namespace Cuemon.Text -{ - /// - /// Provides a set of static methods for Unicode related operations. - /// - public static class ByteOrderMark - { - /// - /// Decodes a BOM-preamble of the specified to its equivalent representation. - /// - /// The to be converted into an . - /// An that is equivalent to the BOM-preamble of . - /// - /// cannot be null. - /// - /// - /// was without byte order mark information (BOM). - /// - public static Encoding Decode(byte[] bytes) - { - Validator.ThrowIfNull(bytes); - if (bytes.Length >= 4) - { - if (BomIsUtf8(bytes)) { return Encoding.GetEncoding("UTF-8"); } - if (BomIsUtf32BigEndian(bytes)) { return Encoding.GetEncoding("UTF-32BE"); } - if (BomIsUtf32(bytes)) { return Encoding.GetEncoding("UTF-32"); } - if (BomIsUtf16BigEndian(bytes)) { return Encoding.GetEncoding("UNICODEFFFE"); } - if (BomIsUtf16(bytes)) { return Encoding.GetEncoding("UTF-16"); } - } - throw new ArgumentException("Unable to locate and decode BOM.", nameof(bytes)); - } - - private static bool BomIsUtf8(byte[] bytes) - { - return bytes[0] == 0xEF && - bytes[1] == 0xBB && - bytes[2] == 0xBF; - } - - private static bool BomIsUtf32BigEndian(byte[] bytes) - { - return bytes[0] == 0x00 && - bytes[1] == 0x00 && - bytes[2] == 0xFE && - bytes[3] == 0xFF; - } - - private static bool BomIsUtf32(byte[] bytes) - { - return bytes[0] == 0xFF && - bytes[1] == 0xFE && - bytes[2] == 0x00 && - bytes[3] == 0x00; - } - - private static bool BomIsUtf16BigEndian(byte[] bytes) - { - return bytes[0] == 0xFE && - bytes[1] == 0xFF; - } - - private static bool BomIsUtf16(byte[] bytes) - { - return bytes[0] == 0xFF && - bytes[1] == 0xFE; - } - - /// - /// Tries to detect an object from the specified . - /// If unsuccessful, the value is returned. Default is . - /// - /// The to parse for an . - /// The to use when conversion is unsuccessful. - /// Either the detected encoding of or the encoding. - public static Encoding DetectEncodingOrDefault(byte[] input, Encoding fallbackEncoding) - { - if (TryDetectEncoding(input, out var result)) - { - return result; - } - return fallbackEncoding ?? EncodingOptions.DefaultEncoding; - } - - /// - /// Tries to detect an object from the specified . - /// If unsuccessful, the value is returned. - /// - /// The to parse for an . - /// The to use when conversion is unsuccessful. - /// Either the detected encoding of or the encoding. - public static Encoding DetectEncodingOrDefault(Stream value, Encoding fallbackEncoding) - { - if (TryDetectEncoding(value, out var result)) - { - return result; - } - return fallbackEncoding; - } - - /// - /// Tries to resolve the Unicode object from the specified . - /// - /// The to resolve the Unicode object from. - /// When this method returns, it contains the Unicode value equivalent to the encoding contained in , if the conversion succeeded, or a null reference (Nothing in Visual Basic) if the conversion failed. The conversion fails if the parameter is null, or does not contain a Unicode representation of an . - /// true if the parameter was converted successfully; otherwise, false. - public static bool TryDetectEncoding(byte[] input, out Encoding result) - { - return Patterns.TryInvoke(() => Decode(input), out result); - } - - /// - /// Tries to resolve the Unicode object from the specified object. - /// - /// The object to resolve the Unicode object from. - /// When this method returns, it contains the Unicode value equivalent to the encoding contained in , if the conversion succeeded, or a null reference (Nothing in Visual Basic) if the conversion failed. The conversion fails if the parameter is null, or does not contain a Unicode representation of an . - /// true if the parameter was converted successfully; otherwise, false. - public static bool TryDetectEncoding(Stream value, out Encoding result) - { - if (value == null || !value.CanSeek) - { - result = null; - return false; - } - - byte[] byteOrderMarks = { 0, 0, 0, 0 }; - var startingPosition = value.Position; - value.Position = 0; - value.Read(byteOrderMarks, 0, 4); // only read the first 4 bytes - value.Seek(startingPosition, SeekOrigin.Begin); // reset to original position - - return TryDetectEncoding(byteOrderMarks, out result); - } - - /// - /// Removes the preamble information (if present) from the specified . - /// - /// The to process. - /// The encoding to use when determining the preamble to remove. - /// The which may be configured. - /// A without preamble information. - public static Stream Remove(Stream value, Encoding encoding, Action setup = null) - { - Validator.ThrowIfNull(value); - Validator.ThrowIfNull(encoding); - - var option = Patterns.Configure(setup); - var bytes = Decorator.Enclose(value).InvokeToByteArray(leaveOpen: option.LeaveOpen); - bytes = Remove(bytes, encoding); - return Patterns.SafeInvoke(() => new MemoryStream(bytes.Length), ms => - { - ms.Write(bytes, 0, bytes.Length); - ms.Position = 0; - return ms; - }); - } - - /// - /// Removes the preamble information (if present) from the specified . - /// - /// The bytes to process. - /// The encoding to use when determining the preamble to remove. - /// A array without preamble information. - public static byte[] Remove(byte[] bytes, Encoding encoding) - { - Validator.ThrowIfNull(bytes); - Validator.ThrowIfNull(encoding); - if (bytes.Length <= 1) { return bytes; } - var preamble = encoding.GetPreamble(); - if (preamble.Length == 0) { return bytes; } - if ((preamble[0] == bytes[0] && preamble[1] == bytes[1]) || (preamble[0] == bytes[1] && preamble[1] == bytes[0])) - { - var bytesToRead = bytes.Length; - bytesToRead -= preamble.Length; - var bytesWithNoPreamble = new byte[bytesToRead]; - Array.Copy(bytes, preamble.Length, bytesWithNoPreamble, 0, bytesToRead); - return bytesWithNoPreamble; - } - return bytes; - } - } -} \ No newline at end of file diff --git a/src/Cuemon.Core/Alphanumeric.cs b/src/Cuemon.Kernel/Alphanumeric.cs similarity index 99% rename from src/Cuemon.Core/Alphanumeric.cs rename to src/Cuemon.Kernel/Alphanumeric.cs index e66346580..afa6c67e3 100644 --- a/src/Cuemon.Core/Alphanumeric.cs +++ b/src/Cuemon.Kernel/Alphanumeric.cs @@ -1,4 +1,4 @@ -namespace Cuemon +namespace Cuemon { /// /// Provides a set of alphanumeric constant and static fields that consists of both letters, numbers and other symbols (such as punctuation marks and mathematical symbols). @@ -90,4 +90,4 @@ public static class Alphanumeric /// public const char CaretChar = '^'; } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/ArgumentReservedKeywordException.cs b/src/Cuemon.Kernel/ArgumentReservedKeywordException.cs similarity index 100% rename from src/Cuemon.Core/ArgumentReservedKeywordException.cs rename to src/Cuemon.Kernel/ArgumentReservedKeywordException.cs diff --git a/src/Cuemon.Core/CasingMethod.cs b/src/Cuemon.Kernel/CasingMethod.cs similarity index 97% rename from src/Cuemon.Core/CasingMethod.cs rename to src/Cuemon.Kernel/CasingMethod.cs index db8db8cc0..ac67ee897 100644 --- a/src/Cuemon.Core/CasingMethod.cs +++ b/src/Cuemon.Kernel/CasingMethod.cs @@ -1,4 +1,4 @@ -namespace Cuemon +namespace Cuemon { /// /// Specifies ways that a string must be converted in terms of casing. @@ -22,4 +22,4 @@ public enum CasingMethod /// TitleCase } -} \ No newline at end of file +} diff --git a/src/Cuemon.Kernel/Collections/Generic/Arguments.cs b/src/Cuemon.Kernel/Collections/Generic/Arguments.cs new file mode 100644 index 000000000..1e0d9f9c2 --- /dev/null +++ b/src/Cuemon.Kernel/Collections/Generic/Arguments.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; + +namespace Cuemon.Collections.Generic +{ + /// + /// Provides static helper methods for wrapping, projecting, and concatenating arguments as arrays and enumerable sequences. + /// + public static class Arguments + { + /// + /// Concatenates two arrays. + /// + /// The type of the elements of the input arrays. + /// The first array to concatenate. + /// The array to concatenate to the first array. + /// + /// A new array that contains the elements of followed by the elements of . + /// + public static T[] Concat(T[] args1, T[] args2) + { + if (args1 == null) { return Array.Empty(); } + if (args2 == null) { return args1; } + if (args1.Length == 0 || args2.Length == 0) { return args1.Length == 0 ? args2 : args1; } + var result = new T[args1.Length + args2.Length]; + args1.CopyTo(result, 0); + args2.CopyTo(result, args1.Length); + return result; + } + + /// + /// Returns the specified arguments as an array of . + /// + /// The type of the elements in . + /// The arguments to return as an array of . + /// The specified . + /// This method performs no conversion. It simply returns the supplied arguments as a array. + public static T[] ToArrayOf(params T[] args) + { + return args; + } + + /// + /// Returns the specified arguments as an array of . + /// + /// The arguments to return as an array of . + /// The specified . + /// This method performs no conversion. It simply returns the supplied arguments as an array of . + public static object[] ToArray(params object[] args) + { + return args; + } + + /// + /// Returns the specified arguments as an . + /// + /// The type of the elements in . + /// The arguments to return as an . + /// The specified exposed as an . + /// This method performs no conversion. It simply exposes the supplied arguments through the interface. + public static IEnumerable ToEnumerableOf(params T[] args) + { + return args; + } + + /// + /// Returns the specified arguments as an of . + /// + /// The arguments to return as an enumerable sequence of . + /// The specified exposed as an of . + /// This method performs no conversion. It simply exposes the supplied arguments through the interface. + public static IEnumerable ToEnumerable(params object[] args) + { + return args; + } + + /// + /// Returns an with the specified as the only element. + /// + /// The type of the element of . + /// The to type as . + /// An with the specified as the only element. + /// The method has no effect other than to change the compile-time type of from to . + public static IEnumerable Yield(T arg) + { + yield return arg; + } + } +} diff --git a/src/Cuemon.Core/Condition.cs b/src/Cuemon.Kernel/Condition.cs similarity index 91% rename from src/Cuemon.Core/Condition.cs rename to src/Cuemon.Kernel/Condition.cs index 4151739f0..b2e5713cd 100644 --- a/src/Cuemon.Core/Condition.cs +++ b/src/Cuemon.Kernel/Condition.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; @@ -278,7 +279,7 @@ public static bool HasConsecutiveCharacters(string value, char character, int le public static bool IsBase64(string value) { if (string.IsNullOrEmpty(value)) { return false; } - return ParserFactory.FromBase64().TryParse(value, out _); + return Patterns.TryInvoke(() => Convert.FromBase64String(value), out _); } /// @@ -383,7 +384,20 @@ public static bool IsEmpty(string value) public static bool IsEnum(string value, Action setup = null) where T : struct, IConvertible { if (string.IsNullOrWhiteSpace(value)) { return false; } - return typeof(T).GetTypeInfo().IsEnum && ParserFactory.FromEnum().TryParse(value, out _, setup); + var enumType = typeof(T); + if (!enumType.GetTypeInfo().IsEnum) { return false; } + try + { + var options = Patterns.Configure(setup); + var hasFlags = enumType.GetTypeInfo().IsDefined(typeof(FlagsAttribute), false); + var result = Enum.Parse(enumType, value, options.IgnoreCase); + if (hasFlags && value.IndexOf(',') != -1) { return true; } + return Enum.IsDefined(enumType, result); + } + catch (Exception e) when (Patterns.IsRecoverableException(e)) + { + return false; + } } /// @@ -464,7 +478,7 @@ public static bool IsGuid(string value) public static bool IsGuid(string value, GuidFormats format) { if (string.IsNullOrWhiteSpace(value)) { return false; } - return ParserFactory.FromGuid().TryParse(value, out _, o => o.Formats = format); + return TryParseGuid(value, format); } /// @@ -622,7 +636,21 @@ public static bool IsPrime(int value) /// true if the specified is a protocol relative URI; otherwise, false. public static bool IsProtocolRelativeUrl(string value, Action setup = null) { - return ParserFactory.FromProtocolRelativeUri().TryParse(value, out _, setup); + if (string.IsNullOrWhiteSpace(value)) { return false; } + try + { + var options = Patterns.Configure(setup, validator: o => + { + Validator.ThrowIfFalse(value.StartsWith(o.RelativeReference, StringComparison.OrdinalIgnoreCase), nameof(value), FormattableString.Invariant($"The specified input did not start with the expected input of: {o.RelativeReference}.")); + }); + var relativeReferenceLength = options.RelativeReference.Length; + var candidate = value.Remove(0, relativeReferenceLength).Insert(0, FormattableString.Invariant($"{CreateUriScheme(options.Protocol)}://")); + return Uri.TryCreate(candidate, UriKind.Absolute, out _); + } + catch (Exception e) when (Patterns.IsRecoverableException(e)) + { + return false; + } } /// @@ -654,8 +682,46 @@ public static void IsTrue(bool condition, Action expression) /// true if the specified is a valid URI; otherwise, false. public static bool IsUri(string value, Action setup = null) { - return ParserFactory.FromUri().TryParse(value, out _, setup); + if (string.IsNullOrWhiteSpace(value)) { return false; } + try + { + Validator.ThrowIfInvalidConfigurator(setup, out UriStringOptions options); + var isValid = options.Kind == UriKind.Relative; + if (!isValid) + { + foreach (var scheme in options.Schemes) + { + switch (scheme) + { + case UriScheme.Undefined: + break; + case UriScheme.File: + case UriScheme.Ftp: + case UriScheme.Sftp: + case UriScheme.Gopher: + case UriScheme.Http: + case UriScheme.Https: + case UriScheme.Mailto: + case UriScheme.NetPipe: + case UriScheme.NetTcp: + case UriScheme.News: + case UriScheme.Nntp: + isValid = value.StartsWith(CreateUriScheme(scheme), StringComparison.OrdinalIgnoreCase); + break; + default: + throw new InvalidEnumArgumentException(nameof(setup), (int)scheme, typeof(UriScheme)); + } + if (isValid) { break; } + } + } + return isValid && Uri.TryCreate(value, options.Kind, out _); + } + catch (Exception e) when (Patterns.IsRecoverableException(e)) + { + return false; + } } + /// /// Determines whether the specified consist only of white-space characters. /// @@ -666,6 +732,7 @@ public static bool IsWhiteSpace(string value) if (value is null) { return false; } return value.All(char.IsWhiteSpace); } + /// /// Determines whether the specified is within range of and . /// @@ -810,7 +877,9 @@ public static TResult TernaryIf(bool condition, Fun /// public static bool HasDifference(string first, string second, out string difference) { - difference = Decorator.Enclose(first, false).Difference(second); + first ??= string.Empty; + second ??= string.Empty; + difference = string.Concat(second.Except(first)); return difference.Length != 0; } @@ -822,5 +891,40 @@ private static bool IsHexDigit(char character) return character <= 102; return false; } + + private static string CreateUriScheme(UriScheme scheme) + { + return scheme switch + { + UriScheme.File => "file", + UriScheme.Ftp => "ftp", + UriScheme.Gopher => "gopher", + UriScheme.Http => "http", + UriScheme.Https => "https", + UriScheme.Mailto => "mailto", + UriScheme.NetPipe => "net.pipe", + UriScheme.NetTcp => "net.tcp", + UriScheme.News => "news", + UriScheme.Nntp => "nntp", + UriScheme.Sftp => "sftp", + _ => UriScheme.Undefined.ToString() + }; + } + + private static bool TryParseGuid(string value, GuidFormats format) + { + if (format.HasFlag(GuidFormats.Any)) { return Guid.TryParse(value, out _); } + + var hasHyphens = value.IndexOf('-') != -1; + var hasBraces = value.StartsWith("{", StringComparison.OrdinalIgnoreCase) && value.EndsWith("}", StringComparison.OrdinalIgnoreCase); + var hasParentheses = value.StartsWith("(", StringComparison.OrdinalIgnoreCase) && value.EndsWith(")", StringComparison.OrdinalIgnoreCase); + var hasHexadecimalStructure = hasBraces && value.Split(',').Length == 11; + + return (!hasHyphens && format.HasFlag(GuidFormats.N) && Guid.TryParseExact(value, "N", out _)) + || (hasHyphens && format.HasFlag(GuidFormats.D) && Guid.TryParseExact(value, "D", out _)) + || (hasBraces && hasHyphens && format.HasFlag(GuidFormats.B) && Guid.TryParseExact(value, "B", out _)) + || (hasParentheses && hasHyphens && format.HasFlag(GuidFormats.P) && Guid.TryParseExact(value, "P", out _)) + || (hasHexadecimalStructure && format.HasFlag(GuidFormats.X) && Guid.TryParseExact(value, "X", out _)); + } } } diff --git a/src/Cuemon.Core/ConditionalValue.cs b/src/Cuemon.Kernel/ConditionalValue.cs similarity index 100% rename from src/Cuemon.Core/ConditionalValue.cs rename to src/Cuemon.Kernel/ConditionalValue.cs diff --git a/src/Cuemon.Core/Configuration/IParameterObject.cs b/src/Cuemon.Kernel/Configuration/IParameterObject.cs similarity index 100% rename from src/Cuemon.Core/Configuration/IParameterObject.cs rename to src/Cuemon.Kernel/Configuration/IParameterObject.cs diff --git a/src/Cuemon.Core/Configuration/IPostConfigurableParameterObject.cs b/src/Cuemon.Kernel/Configuration/IPostConfigurableParameterObject.cs similarity index 100% rename from src/Cuemon.Core/Configuration/IPostConfigurableParameterObject.cs rename to src/Cuemon.Kernel/Configuration/IPostConfigurableParameterObject.cs diff --git a/src/Cuemon.Core/Configuration/IValidatableParameterObject.cs b/src/Cuemon.Kernel/Configuration/IValidatableParameterObject.cs similarity index 100% rename from src/Cuemon.Core/Configuration/IValidatableParameterObject.cs rename to src/Cuemon.Kernel/Configuration/IValidatableParameterObject.cs diff --git a/src/Cuemon.Core/Convertible.cs b/src/Cuemon.Kernel/Convertible.cs similarity index 57% rename from src/Cuemon.Core/Convertible.cs rename to src/Cuemon.Kernel/Convertible.cs index 14b2e4a11..ac5b24f07 100644 --- a/src/Cuemon.Core/Convertible.cs +++ b/src/Cuemon.Kernel/Convertible.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; @@ -9,7 +9,7 @@ namespace Cuemon { /// - /// Provides a set of static methods, suitable for verifying integrity of data, that convert implementations to and from a sequence of bytes. + /// Provides static helper methods for converting values to and from byte arrays, including support for configurable encoding, byte order, and custom converters. /// public static class Convertible { @@ -39,27 +39,27 @@ public static class Convertible }; /// - /// A representation for a null value when converting to a . + /// Represents a null value when converting to a byte array. /// public const int NullValue = 0; /// - /// Defines how many bits is needed for one byte. + /// Represents the number of bits in a byte. /// public const int BitsPerByte = 8; /// - /// Defines how many bits is needed for one nibble (one hexadecimal digit). + /// Represents the number of bits in a nibble. /// public const int BitsPerNibble = BitsPerByte / 2; /// - /// Registers the specified implementation of to make it globally known. + /// Registers a custom converter for the specified implementation. /// - /// The type of the implementation to use. - /// The function delegate that converts an implementation to its equivalent . + /// The type of the implementation to register. + /// The delegate that converts an instance of to a byte array. /// - /// cannot be null. + /// is . /// public static void RegisterConvertible(Func converter) where T : IConvertible { @@ -68,40 +68,40 @@ public static void RegisterConvertible(Func converter) where T : I } /// - /// Reverse the bits of the specified . + /// Reverses the bit order of the specified 8-bit unsigned integer. /// - /// The unsigned 8-bit integer to reverse bits on. - /// A with the bits reversed. + /// The value whose bits to reverse. + /// A whose bits are reversed. public static byte ReverseBits8(byte input) { return (byte)ReverseBits(input, sizeof(byte)); } /// - /// Reverse the bits of the specified . + /// Reverses the bit order of the specified 16-bit unsigned integer. /// - /// The unsigned 16-bit integer to reverse bits on. - /// A with the bits reversed. + /// The value whose bits to reverse. + /// A whose bits are reversed. public static ushort ReverseBits16(ushort input) { return (ushort)ReverseBits(input, sizeof(ushort)); } /// - /// Reverse the bits of the specified . + /// Reverses the bit order of the specified 32-bit unsigned integer. /// - /// The unsigned 32-bit integer to reverse bits on. - /// A with the bits reversed. + /// The value whose bits to reverse. + /// A whose bits are reversed. public static uint ReverseBits32(uint input) { return (uint)ReverseBits(input, sizeof(uint)); } /// - /// Reverse the bits of the specified . + /// Reverses the bit order of the specified 64-bit unsigned integer. /// - /// The unsigned 64-bit integer to reverse bits on. - /// A with the bits reversed. + /// The value whose bits to reverse. + /// A whose bits are reversed. public static ulong ReverseBits64(ulong input) { return ReverseBits(input, sizeof(ulong)); @@ -119,14 +119,19 @@ private static ulong ReverseBits(ulong input, byte byteSize) } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The implementation to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the conversion options. + /// A byte array that represents . /// - /// is an unknown implementation of ; please use RegisterConvertible to make a custom implementation globally known -or- use setup to add a custom implementation using ConvertibleOptions.Converters..Add. + /// is of a type for which no converter has been registered or configured. /// + /// + /// Returns the byte representation of when is . + /// Custom converters may be registered globally with or supplied + /// locally through . + /// public static byte[] GetBytes(IConvertible input, Action setup = null) { if (input == null) { return BitConverter.GetBytes(NullValue); } @@ -157,11 +162,13 @@ public static byte[] GetBytes(IConvertible input, Action set } /// - /// Returns the specified sequence of as an aggregated . + /// Converts the specified sequence of values to a single aggregated byte array. /// - /// The sequence to convert. - /// The which may be configured. - /// An aggregated that is otherwise equivalent to . + /// The sequence of values to convert. + /// The delegate that configures the conversion options. + /// + /// A byte array containing the concatenated byte representations of the elements in . + /// public static byte[] GetBytes(IEnumerable input, Action setup = null) { var result = new List(); @@ -174,118 +181,124 @@ public static byte[] GetBytes(IEnumerable input, Action - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(bool input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(byte input, Action setup = null) { return GetBytesCore(input, x => new[] { x }, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(char input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// A that is equivalent to . + /// The value to convert. + /// A byte array that represents . + /// + /// The value is formatted using the universal sortable date and time pattern and encoded with ASCII. + /// public static byte[] GetBytes(DateTime input) { return GetBytes(input.ToString("u", CultureInfo.InvariantCulture), o => o.Encoding = Encoding.ASCII); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// A that is equivalent to . + /// The value to convert. + /// A byte array representing . public static byte[] GetBytes(DBNull input) { - return GetBytesCore(input, x => BitConverter.GetBytes(NullValue), null); + return GetBytesCore(input, _ => BitConverter.GetBytes(NullValue), null); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// A that is equivalent to . + /// The value to convert. + /// A byte array that represents . + /// + /// The value is formatted using the invariant culture and encoded with ASCII. + /// public static byte[] GetBytes(decimal input) { return GetBytes(input.ToString(CultureInfo.InvariantCulture), o => o.Encoding = Encoding.ASCII); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(double input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(short input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(int input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(long input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(sbyte input, Action setup = null) { #if NET9_0_OR_GREATER @@ -296,62 +309,65 @@ public static byte[] GetBytes(sbyte input, Action setup = null) } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(float input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(ushort input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(uint input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as a . + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents . public static byte[] GetBytes(ulong input, Action setup = null) { return GetBytesCore(input, BitConverter.GetBytes, setup); } /// - /// Returns the specified as its equivalent representation. + /// Converts the specified value to its byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the encoding behavior. + /// A byte array that represents . /// - /// cannot be null. + /// is . /// /// - /// was initialized with an invalid . + /// configures an invalid value for . /// - /// will be initialized with and . + /// + /// is initialized with and + /// . + /// public static byte[] GetBytes(string input, Action setup = null) { Validator.ThrowIfNull(input); @@ -372,11 +388,11 @@ public static byte[] GetBytes(string input, Action setup = null } /// - /// Returns the specified as a . + /// Converts the specified value to its underlying byte array representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The value to convert. + /// The delegate that configures the byte order. + /// A byte array that represents the underlying numeric value of . public static byte[] GetBytes(Enum input, Action setup = null) { var tc = input.GetTypeCode(); @@ -417,18 +433,22 @@ public static byte[] GetBytes(Enum input, Action setup = null) } /// - /// Returns the specified as its equivalent representation. + /// Converts the specified byte array to its string representation. /// - /// The to convert. - /// The which may be configured. - /// A that is equivalent to . + /// The byte array to convert. + /// The delegate that configures the encoding behavior. + /// A string that represents . /// - /// cannot be null. + /// is . /// /// - /// was initialized with an invalid . + /// configures an invalid value for . /// - /// will be initialized with and . + /// + /// is initialized with and + /// . + /// If the configured encoding is the default encoding, the encoding is detected from the byte order mark when possible. + /// public static string ToString(byte[] input, Action setup = null) { Validator.ThrowIfNull(input); @@ -448,11 +468,13 @@ public static string ToString(byte[] input, Action setup = null } /// - /// Reverse the endianness of the specified . + /// Reverses the byte order of the specified byte array when required by the configured endianness. /// - /// The to reverse. - /// The which may be configured. - /// A that, depending on the , is either equal or a reversed value of . + /// The byte array whose byte order to reverse. + /// The delegate that configures the desired byte order. + /// + /// , either unchanged or reversed to match the configured byte order. + /// public static byte[] ReverseEndianness(byte[] input, Action setup = null) { var options = Patterns.Configure(setup); diff --git a/src/Cuemon.Core/ConvertibleConverterDictionary.cs b/src/Cuemon.Kernel/ConvertibleConverterDictionary.cs similarity index 51% rename from src/Cuemon.Core/ConvertibleConverterDictionary.cs rename to src/Cuemon.Kernel/ConvertibleConverterDictionary.cs index a35707a4a..87074c8d9 100644 --- a/src/Cuemon.Core/ConvertibleConverterDictionary.cs +++ b/src/Cuemon.Kernel/ConvertibleConverterDictionary.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using Cuemon.Collections.Generic; @@ -6,18 +6,18 @@ namespace Cuemon { /// - /// Represents a collection of function delegates that converts an implementation to its equivalent. + /// Represents a collection of converters that map implementations to byte arrays. /// public class ConvertibleConverterDictionary : IReadOnlyDictionary> { private readonly Dictionary> _converters = new(); /// - /// Adds the function delegate that converts an implementation to its equivalent to the specified . + /// Adds a converter for the specified . /// /// The type that implements . - /// The function delegate that converts an implementation to its equivalent. - /// An that can be used to further configure other converters. + /// The delegate that converts an instance of to a byte array. + /// This instance so that additional converters can be configured. /// /// does not implement . /// @@ -29,13 +29,13 @@ public ConvertibleConverterDictionary Add(Func converter) where T } /// - /// Adds the function delegate that converts an implementation to its equivalent to the specified . + /// Adds a converter for the specified . /// /// The type that implements . - /// The function delegate that converts an implementation to its equivalent. - /// An that can be used to further configure other converters. + /// The delegate that converts an instance to a byte array. + /// This instance so that additional converters can be configured. /// - /// is null. + /// is . /// /// /// does not implement . @@ -48,23 +48,26 @@ public ConvertibleConverterDictionary Add(Type type, Func } /// - /// Determines whether the dictionary contains an element that has the specified key. + /// Determines whether this dictionary contains a converter for the specified . /// - /// The key to locate. - /// true if the dictionary contains an element that has the specified key; otherwise, false. + /// The type to locate. + /// if this dictionary contains a converter for ; otherwise, . public bool ContainsKey(Type key) { return _converters.ContainsKey(key); } /// - /// Gets the value that is associated with the specified key. + /// Gets the converter associated with the specified . /// - /// The key to locate. - /// When this method returns, the value associated with the specified key, if the key is found; otherwise, the default value for the type of the value parameter. This parameter is passed uninitialized. - /// true if the dictionary contains an element that has the specified key; otherwise, false. + /// The type whose associated converter to retrieve. + /// + /// When this method returns, contains the converter associated with the specified , + /// if the key is found; otherwise, the default value for the type of the parameter. + /// + /// if this dictionary contains a converter for ; otherwise, . /// - /// is null. + /// is . /// public bool TryGetValue(Type key, out Func value) { @@ -72,10 +75,13 @@ public bool TryGetValue(Type key, out Func value) } /// - /// Gets the function delegate that converts an implementation to its equivalent from the specified . + /// Gets the converter associated with the specified . /// - /// The type that implements . - /// The function delegate associated with the specified ; null if no association exists. + /// The type whose associated converter to retrieve. + /// + /// The converter associated with , or if no converter is registered + /// for the specified type. + /// public Func this[Type type] { get @@ -86,27 +92,27 @@ public Func this[Type type] } /// - /// Gets an enumerable collection that contains the keys in the dictionary. + /// Gets the collection of types for which converters are registered. /// - /// An enumerable collection that contains the keys in the dictionary. + /// A collection that contains the registered converter types. public IEnumerable Keys => _converters.Keys; /// - /// Gets an enumerable collection that contains the values in the dictionary. + /// Gets the collection of registered converters. /// - /// An enumerable collection that contains the values in the dictionary. + /// A collection that contains the registered converters. public IEnumerable> Values => _converters.Values; /// /// Gets the number of converters contained in this instance. /// - /// The number of converters contained in this instance. + /// The number of registered converters. public int Count => _converters.Count; /// - /// Returns an enumerator that iterates through the collection. + /// Returns an enumerator that iterates through the registered converters. /// - /// An enumerator that can be used to iterate through the collection. + /// An enumerator that can be used to iterate through the registered converters. public IEnumerator>> GetEnumerator() { return _converters.GetEnumerator(); @@ -117,4 +123,4 @@ IEnumerator IEnumerable.GetEnumerator() return GetEnumerator(); } } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/ConvertibleOptions.cs b/src/Cuemon.Kernel/ConvertibleOptions.cs similarity index 100% rename from src/Cuemon.Core/ConvertibleOptions.cs rename to src/Cuemon.Kernel/ConvertibleOptions.cs diff --git a/src/Cuemon.Kernel/Cuemon.Kernel.csproj b/src/Cuemon.Kernel/Cuemon.Kernel.csproj new file mode 100644 index 000000000..d88e6359d --- /dev/null +++ b/src/Cuemon.Kernel/Cuemon.Kernel.csproj @@ -0,0 +1,13 @@ + + + + Cuemon + Cuemon.Kernel + Cuemon.Kernel + Cuemon.Kernel + Cuemon.Kernel provides the essential Cuemon programming substrate, including validators, conditions, decorators, configuration abstractions, asynchronous option types, disposable patterns, and core text encoding helpers. It is the minimal foundational layer for the Cuemon ecosystem and an addition to the System namespace. + arguments async-options awaiter bom byte-order-mark condition conditional-value configurable configure configure-exchange configure-revert decorator disposable encoding-options endianness enum-string fallback-encoding finalize-disposable guard options-pattern parameter-object parser patterns preamble-sequence protocol-relative-uri safe-invoke safe-invoke-async text-encoding uri-string validator + Cuemon.Kernel + + + diff --git a/src/Cuemon.Core/Decorator.cs b/src/Cuemon.Kernel/Decorator.cs similarity index 100% rename from src/Cuemon.Core/Decorator.cs rename to src/Cuemon.Kernel/Decorator.cs diff --git a/src/Cuemon.Core/Disposable.cs b/src/Cuemon.Kernel/Disposable.cs similarity index 100% rename from src/Cuemon.Core/Disposable.cs rename to src/Cuemon.Kernel/Disposable.cs diff --git a/src/Cuemon.Core/DisposableOptions.cs b/src/Cuemon.Kernel/DisposableOptions.cs similarity index 100% rename from src/Cuemon.Core/DisposableOptions.cs rename to src/Cuemon.Kernel/DisposableOptions.cs diff --git a/src/Cuemon.Core/EndianOptions.cs b/src/Cuemon.Kernel/EndianOptions.cs similarity index 100% rename from src/Cuemon.Core/EndianOptions.cs rename to src/Cuemon.Kernel/EndianOptions.cs diff --git a/src/Cuemon.Core/Endianness.cs b/src/Cuemon.Kernel/Endianness.cs similarity index 100% rename from src/Cuemon.Core/Endianness.cs rename to src/Cuemon.Kernel/Endianness.cs diff --git a/src/Cuemon.Core/ExceptionCondition.cs b/src/Cuemon.Kernel/ExceptionCondition.cs similarity index 100% rename from src/Cuemon.Core/ExceptionCondition.cs rename to src/Cuemon.Kernel/ExceptionCondition.cs diff --git a/src/Cuemon.Core/Extensions/IO/StreamDecoratorExtensions.cs b/src/Cuemon.Kernel/Extensions/IO/StreamDecoratorExtensions.cs similarity index 66% rename from src/Cuemon.Core/Extensions/IO/StreamDecoratorExtensions.cs rename to src/Cuemon.Kernel/Extensions/IO/StreamDecoratorExtensions.cs index bfd217a4c..677284ad6 100644 --- a/src/Cuemon.Core/Extensions/IO/StreamDecoratorExtensions.cs +++ b/src/Cuemon.Kernel/Extensions/IO/StreamDecoratorExtensions.cs @@ -1,25 +1,28 @@ -using System; +using System; using System.IO; namespace Cuemon.IO { /// /// Extension methods for the class hidden behind the interface. - /// This API supports the product infrastructure and is not intended to be used directly from your code. + /// This API supports the product infrastructure and is not intended to be used directly from application code. /// /// /// public static class StreamDecoratorExtensions { /// - /// Reads the bytes from the enclosed of the specified and writes them to the . + /// Copies the contents of the enclosed to the specified . /// - /// The to extend. - /// The to which the contents of the current stream will be copied. - /// The size of the buffer. This value must be greater than zero. The default size is 81920. - /// if true, the enclosed of the specified will temporarily have its position changed to 0; otherwise the position is left untouched. + /// The that wraps the source stream. + /// The destination stream to which the contents of the source stream are copied. + /// The size of the buffer, in bytes. The value must be greater than zero. The default is 81920. + /// + /// to temporarily reset the position of the enclosed stream to the beginning before copying; + /// otherwise, to preserve the current position. + /// /// - /// cannot be null. + /// is . /// public static void CopyStream(this IDecorator decorator, Stream destination, int bufferSize = 81920, bool changePosition = true) { @@ -41,14 +44,21 @@ public static void CopyStream(this IDecorator decorator, Stream destinat } /// - /// Converts the enclosed of the specified to its equivalent representation. Not intended to be used directly from your code. + /// Converts the enclosed to its byte array representation. /// - /// The to extend. - /// The size of the buffer. This value must be greater than zero. The default size is 81920. - /// if true, the object is being left open; otherwise it is being closed and disposed. + /// The that wraps the source stream. + /// The size of the buffer, in bytes. The value must be greater than zero. The default is 81920. + /// to leave the enclosed stream open; otherwise, . + /// A byte array containing the contents of the enclosed . /// - /// cannot be null. + /// is . /// + /// + /// The enclosed does not support reading. + /// + /// + /// This API supports the product infrastructure and is not intended to be used directly from application code. + /// public static byte[] InvokeToByteArray(this IDecorator decorator, int bufferSize = 81920, bool leaveOpen = false) { Validator.ThrowIfNull(decorator); diff --git a/src/Cuemon.Core/FinalizeDisposable.cs b/src/Cuemon.Kernel/FinalizeDisposable.cs similarity index 100% rename from src/Cuemon.Core/FinalizeDisposable.cs rename to src/Cuemon.Kernel/FinalizeDisposable.cs diff --git a/src/Cuemon.Core/GuidFormats.cs b/src/Cuemon.Kernel/GuidFormats.cs similarity index 100% rename from src/Cuemon.Core/GuidFormats.cs rename to src/Cuemon.Kernel/GuidFormats.cs diff --git a/src/Cuemon.Core/IDecorator.cs b/src/Cuemon.Kernel/IDecorator.cs similarity index 100% rename from src/Cuemon.Core/IDecorator.cs rename to src/Cuemon.Kernel/IDecorator.cs diff --git a/src/Cuemon.Core/Patterns.cs b/src/Cuemon.Kernel/Patterns.cs similarity index 83% rename from src/Cuemon.Core/Patterns.cs rename to src/Cuemon.Kernel/Patterns.cs index 3c0041187..b2affed9e 100644 --- a/src/Cuemon.Core/Patterns.cs +++ b/src/Cuemon.Kernel/Patterns.cs @@ -149,28 +149,31 @@ public static Action ConfigureExchange(Action + if (initializer == null) { - var match = false; - var typeOfInput = typeof(TSource); - var typeOfOutput = typeof(TResult); - var ips = typeOfInput.GetProperties().Where(pi => pi.CanRead && pi.CanWrite).ToList(); - var ops = typeOfOutput.GetProperties().Where(pi => pi.CanRead && pi.CanWrite).ToList(); - foreach (var ip in ips) + initializer = (i, o) => { - var op = ops.SingleOrDefault(opi => opi.Name == ip.Name && opi.PropertyType == ip.PropertyType); - if (op != null) + var match = false; + var typeOfInput = typeof(TSource); + var typeOfOutput = typeof(TResult); + var ips = typeOfInput.GetProperties().Where(pi => pi.CanRead && pi.CanWrite).ToList(); + var ops = typeOfOutput.GetProperties().Where(pi => pi.CanRead && pi.CanWrite).ToList(); + foreach (var ip in ips) { - op.SetValue(o, ip.GetValue(i)); - match = true; + var op = ops.SingleOrDefault(opi => opi.Name == ip.Name && opi.PropertyType == ip.PropertyType); + if (op != null) + { + op.SetValue(o, ip.GetValue(i)); + match = true; + } } - } - if (!match) - { - throw new InvalidOperationException(FormattableString.Invariant($"Unable to use default converter for exchange of {nameof(TSource)} ({DelimitedString.Create(ips)}) with {nameof(TResult)} ({DelimitedString.Create(ops)}); no match on public read-write properties.")); - } - }; + if (!match) + { + throw new InvalidOperationException(FormattableString.Invariant($"Unable to use default converter for exchange of {nameof(TSource)} ({string.Join(", ", ips.Select(pi => pi.Name))}) with {nameof(TResult)} ({string.Join(", ", ops.Select(pi => pi.Name))}); no match on public read-write properties.")); + } + }; + } return oo => initializer(io, oo); } @@ -225,9 +228,7 @@ public static TResult SafeInvoke(Func initializer, Func, TResult>(tuple => tester(tuple.Arg1), new MutableTuple(default), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1), new MutableTuple(default), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, tester, catcher); } /// @@ -244,9 +245,7 @@ public static TResult SafeInvoke(Func initializer, Func, TResult>(tuple => tester(tuple.Arg1, tuple.Arg2), new MutableTuple(default, arg), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1, tuple.Arg2), new MutableTuple(default, arg), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, result => tester(result, arg), catcher == null ? null : e => catcher(e, arg)); } /// @@ -265,9 +264,7 @@ public static TResult SafeInvoke(Func initializer, Fun { Validator.ThrowIfNull(initializer); Validator.ThrowIfNull(tester); - var f1 = new FuncFactory, TResult>(tuple => tester(tuple.Arg1, tuple.Arg2, tuple.Arg3), new MutableTuple(default, arg1, arg2), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1, tuple.Arg2, tuple.Arg3), new MutableTuple(default, arg1, arg2), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, result => tester(result, arg1, arg2), catcher == null ? null : e => catcher(e, arg1, arg2)); } /// @@ -288,9 +285,7 @@ public static TResult SafeInvoke(Func initializer, { Validator.ThrowIfNull(initializer); Validator.ThrowIfNull(tester); - var f1 = new FuncFactory, TResult>(tuple => tester(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4), new MutableTuple(default, arg1, arg2, arg3), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4), new MutableTuple(default, arg1, arg2, arg3), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, result => tester(result, arg1, arg2, arg3), catcher == null ? null : e => catcher(e, arg1, arg2, arg3)); } /// @@ -313,9 +308,7 @@ public static TResult SafeInvoke(Func initiali { Validator.ThrowIfNull(initializer); Validator.ThrowIfNull(tester); - var f1 = new FuncFactory, TResult>(tuple => tester(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4, tuple.Arg5), new MutableTuple(default, arg1, arg2, arg3, arg4), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4, tuple.Arg5), new MutableTuple(default, arg1, arg2, arg3, arg4), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, result => tester(result, arg1, arg2, arg3, arg4), catcher == null ? null : e => catcher(e, arg1, arg2, arg3, arg4)); } /// @@ -340,39 +333,32 @@ public static TResult SafeInvoke(Func init { Validator.ThrowIfNull(initializer); Validator.ThrowIfNull(tester); - var f1 = new FuncFactory, TResult>(tuple => tester(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4, tuple.Arg5, tuple.Arg6), new MutableTuple(default, arg1, arg2, arg3, arg4, arg5), tester); - var f2 = new ActionFactory>(tuple => catcher?.Invoke(tuple.Arg1, tuple.Arg2, tuple.Arg3, tuple.Arg4, tuple.Arg5, tuple.Arg6), new MutableTuple(default, arg1, arg2, arg3, arg4, arg5), catcher); - return SafeInvokeCore(f1, initializer, f2); + return SafeInvokeCore(initializer, result => tester(result, arg1, arg2, arg3, arg4, arg5), catcher == null ? null : e => catcher(e, arg1, arg2, arg3, arg4, arg5)); } - private static TResult SafeInvokeCore(FuncFactory testerFactory, Func initializer, ActionFactory catcherFactory) + private static TResult SafeInvokeCore(Func initializer, Func tester, Action catcher) where TResult : class, IDisposable - where TTester : MutableTuple - where TCatcher : MutableTuple { TResult result = null; + TResult initialized = null; try { - testerFactory.GenericArguments.Arg1 = initializer(); - testerFactory.GenericArguments.Arg1 = testerFactory.ExecuteMethod(); - result = testerFactory.GenericArguments.Arg1; - testerFactory.GenericArguments.Arg1 = null; + initialized = initializer(); + result = tester(initialized); + initialized = null; } catch (Exception e) { - if (!catcherFactory.HasDelegate) + if (catcher == null) { throw; } - else - { - catcherFactory.GenericArguments.Arg1 = e; - catcherFactory.ExecuteMethod(); - } + + catcher(e); } finally { - testerFactory.GenericArguments.Arg1?.Dispose(); + initialized?.Dispose(); } return result; } diff --git a/src/Cuemon.Core/Runtime/CompilerServices/CallerArgumentExpressionAttribute.cs b/src/Cuemon.Kernel/Runtime/CompilerServices/CallerArgumentExpressionAttribute.cs similarity index 100% rename from src/Cuemon.Core/Runtime/CompilerServices/CallerArgumentExpressionAttribute.cs rename to src/Cuemon.Kernel/Runtime/CompilerServices/CallerArgumentExpressionAttribute.cs diff --git a/src/Cuemon.Core/SuccessfulValue.cs b/src/Cuemon.Kernel/SuccessfulValue.cs similarity index 100% rename from src/Cuemon.Core/SuccessfulValue.cs rename to src/Cuemon.Kernel/SuccessfulValue.cs diff --git a/src/Cuemon.Core/TesterFunc.cs b/src/Cuemon.Kernel/TesterFunc.cs similarity index 100% rename from src/Cuemon.Core/TesterFunc.cs rename to src/Cuemon.Kernel/TesterFunc.cs diff --git a/src/Cuemon.Kernel/Text/ByteOrderMark.cs b/src/Cuemon.Kernel/Text/ByteOrderMark.cs new file mode 100644 index 000000000..058614545 --- /dev/null +++ b/src/Cuemon.Kernel/Text/ByteOrderMark.cs @@ -0,0 +1,213 @@ +using System; +using System.IO; +using System.Text; +using Cuemon.IO; + +namespace Cuemon.Text +{ + /// + /// Provides static helper methods for detecting, decoding, and removing Unicode byte order marks (BOMs). + /// + public static class ByteOrderMark + { + /// + /// Decodes the byte order mark (BOM) in the specified byte array to its corresponding . + /// + /// The byte array that contains the BOM to decode. + /// The represented by the BOM in . + /// + /// is . + /// + /// + /// does not contain a recognizable byte order mark. + /// + public static Encoding Decode(byte[] bytes) + { + Validator.ThrowIfNull(bytes); + if (BomIsUtf8(bytes)) { return Encoding.GetEncoding("UTF-8"); } + if (BomIsUtf32BigEndian(bytes)) { return Encoding.GetEncoding("UTF-32BE"); } + if (BomIsUtf32(bytes)) { return Encoding.GetEncoding("UTF-32"); } + if (BomIsUtf16BigEndian(bytes)) { return Encoding.GetEncoding("UNICODEFFFE"); } + if (BomIsUtf16(bytes)) { return Encoding.GetEncoding("UTF-16"); } + throw new ArgumentException("Unable to locate and decode BOM.", nameof(bytes)); + } + + private static bool BomIsUtf8(byte[] bytes) + { + return bytes.Length >= 3 && + bytes[0] == 0xEF && + bytes[1] == 0xBB && + bytes[2] == 0xBF; + } + + private static bool BomIsUtf32BigEndian(byte[] bytes) + { + return bytes.Length >= 4 && + bytes[0] == 0x00 && + bytes[1] == 0x00 && + bytes[2] == 0xFE && + bytes[3] == 0xFF; + } + + private static bool BomIsUtf32(byte[] bytes) + { + return bytes.Length >= 4 && + bytes[0] == 0xFF && + bytes[1] == 0xFE && + bytes[2] == 0x00 && + bytes[3] == 0x00; + } + + private static bool BomIsUtf16BigEndian(byte[] bytes) + { + return bytes.Length >= 2 && + bytes[0] == 0xFE && + bytes[1] == 0xFF; + } + + private static bool BomIsUtf16(byte[] bytes) + { + return bytes.Length >= 2 && + bytes[0] == 0xFF && + bytes[1] == 0xFE; + } + + /// + /// Detects the encoding of the specified byte array, or returns a fallback encoding if detection fails. + /// + /// The byte array to inspect. + /// The encoding to return when detection fails. + /// + /// The detected encoding of , or if detection fails. + /// If is , is returned. + /// + public static Encoding DetectEncodingOrDefault(byte[] input, Encoding fallbackEncoding) + { + if (TryDetectEncoding(input, out var result)) + { + return result; + } + return fallbackEncoding ?? EncodingOptions.DefaultEncoding; + } + + /// + /// Detects the encoding of the specified stream, or returns a fallback encoding if detection fails. + /// + /// The stream to inspect. + /// The encoding to return when detection fails. + /// + /// The detected encoding of , or if detection fails. + /// + public static Encoding DetectEncodingOrDefault(Stream value, Encoding fallbackEncoding) + { + if (TryDetectEncoding(value, out var result)) + { + return result; + } + return fallbackEncoding; + } + + /// + /// Tries to detect the encoding represented by the byte order mark in the specified byte array. + /// + /// The byte array to inspect. + /// + /// When this method returns, contains the detected if detection succeeds; + /// otherwise, . + /// + /// if an encoding was detected; otherwise, . + public static bool TryDetectEncoding(byte[] input, out Encoding result) + { + return Patterns.TryInvoke(() => Decode(input), out result); + } + + /// + /// Tries to detect the encoding represented by the byte order mark in the specified stream. + /// + /// The stream to inspect. + /// + /// When this method returns, contains the detected if detection succeeds; + /// otherwise, . + /// + /// if an encoding was detected; otherwise, . + /// + /// This method reads up to the first four bytes of and restores the original stream position + /// before returning. The stream must support seeking. + /// + public static bool TryDetectEncoding(Stream value, out Encoding result) + { + if (value == null || !value.CanSeek) + { + result = null; + return false; + } + + byte[] byteOrderMarks = { 0, 0, 0, 0 }; + var startingPosition = value.Position; + value.Position = 0; + var bytesRead = value.Read(byteOrderMarks, 0, 4); // only read the first 4 bytes + value.Seek(startingPosition, SeekOrigin.Begin); // reset to original position + + if (bytesRead < byteOrderMarks.Length) + { + var resizedByteOrderMarks = new byte[bytesRead]; + Array.Copy(byteOrderMarks, resizedByteOrderMarks, bytesRead); + byteOrderMarks = resizedByteOrderMarks; + } + + return TryDetectEncoding(byteOrderMarks, out result); + } + + /// + /// Removes the preamble, if present, from the specified stream. + /// + /// The stream to process. + /// The encoding used to determine which preamble to remove. + /// The delegate that configures disposable behavior. + /// A stream whose content does not include the detected preamble. + /// + /// or is . + /// + public static Stream Remove(Stream value, Encoding encoding, Action setup = null) + { + Validator.ThrowIfNull(value); + Validator.ThrowIfNull(encoding); + + var option = Patterns.Configure(setup); + var bytes = Decorator.Enclose(value).InvokeToByteArray(leaveOpen: option.LeaveOpen); + bytes = Remove(bytes, encoding); + return Patterns.SafeInvoke(() => new MemoryStream(bytes.Length), ms => + { + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + return ms; + }); + } + + /// + /// Removes the preamble, if present, from the specified byte array. + /// + /// The byte array to process. + /// The encoding used to determine which preamble to remove. + /// A byte array whose content does not include the detected preamble. + /// + /// or is . + /// + public static byte[] Remove(byte[] bytes, Encoding encoding) + { + Validator.ThrowIfNull(bytes); + Validator.ThrowIfNull(encoding); + if (bytes.Length <= 1) { return bytes; } + var preamble = encoding.GetPreamble(); + if (preamble.Length == 0 || bytes.Length < preamble.Length) { return bytes; } + for (var i = 0; i < preamble.Length; i++) + { + if (preamble[i] != bytes[i]) { return bytes; } + } + var bytesToRead = bytes.Length - preamble.Length; + var bytesWithNoPreamble = new byte[bytesToRead]; + Array.Copy(bytes, preamble.Length, bytesWithNoPreamble, 0, bytesToRead); + return bytesWithNoPreamble; + } + } +} diff --git a/src/Cuemon.Core/Text/EncodingOptions.cs b/src/Cuemon.Kernel/Text/EncodingOptions.cs similarity index 99% rename from src/Cuemon.Core/Text/EncodingOptions.cs rename to src/Cuemon.Kernel/Text/EncodingOptions.cs index 4eab96347..d8b770541 100644 --- a/src/Cuemon.Core/Text/EncodingOptions.cs +++ b/src/Cuemon.Kernel/Text/EncodingOptions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; using Cuemon.Configuration; diff --git a/src/Cuemon.Core/Text/EnumStringOptions.cs b/src/Cuemon.Kernel/Text/EnumStringOptions.cs similarity index 84% rename from src/Cuemon.Core/Text/EnumStringOptions.cs rename to src/Cuemon.Kernel/Text/EnumStringOptions.cs index 7edb4e998..2806a45bb 100644 --- a/src/Cuemon.Core/Text/EnumStringOptions.cs +++ b/src/Cuemon.Kernel/Text/EnumStringOptions.cs @@ -1,9 +1,10 @@ -using Cuemon.Configuration; +using System; +using Cuemon.Configuration; namespace Cuemon.Text { /// - /// Configuration options for . + /// Configuration options for concrete implementations of that is related to parsing an from a . /// /// public class EnumStringOptions : IParameterObject diff --git a/src/Cuemon.Core/Text/FallbackEncodingOptions.cs b/src/Cuemon.Kernel/Text/FallbackEncodingOptions.cs similarity index 100% rename from src/Cuemon.Core/Text/FallbackEncodingOptions.cs rename to src/Cuemon.Kernel/Text/FallbackEncodingOptions.cs diff --git a/src/Cuemon.Core/Text/IConfigurableParser.cs b/src/Cuemon.Kernel/Text/IConfigurableParser.cs similarity index 99% rename from src/Cuemon.Core/Text/IConfigurableParser.cs rename to src/Cuemon.Kernel/Text/IConfigurableParser.cs index aea1266d5..5799ca017 100644 --- a/src/Cuemon.Core/Text/IConfigurableParser.cs +++ b/src/Cuemon.Kernel/Text/IConfigurableParser.cs @@ -1,4 +1,4 @@ -using System; +using System; using Cuemon.Configuration; namespace Cuemon.Text @@ -73,4 +73,4 @@ namespace Cuemon.Text /// true if was converted successfully; otherwise, false. bool TryParse(string input, out TResult result, Action setup = null); } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/Text/IEncodingOptions.cs b/src/Cuemon.Kernel/Text/IEncodingOptions.cs similarity index 100% rename from src/Cuemon.Core/Text/IEncodingOptions.cs rename to src/Cuemon.Kernel/Text/IEncodingOptions.cs diff --git a/src/Cuemon.Core/Text/IParser.cs b/src/Cuemon.Kernel/Text/IParser.cs similarity index 99% rename from src/Cuemon.Core/Text/IParser.cs rename to src/Cuemon.Kernel/Text/IParser.cs index f134e8b52..2abb7fb95 100644 --- a/src/Cuemon.Core/Text/IParser.cs +++ b/src/Cuemon.Kernel/Text/IParser.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Cuemon.Text { @@ -63,4 +63,4 @@ public interface IParser /// true if was converted successfully; otherwise, false. bool TryParse(string input, out TResult result); } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/Text/PreambleSequence.cs b/src/Cuemon.Kernel/Text/PreambleSequence.cs similarity index 100% rename from src/Cuemon.Core/Text/PreambleSequence.cs rename to src/Cuemon.Kernel/Text/PreambleSequence.cs diff --git a/src/Cuemon.Core/Text/ProtocolRelativeUriStringOptions.cs b/src/Cuemon.Kernel/Text/ProtocolRelativeUriStringOptions.cs similarity index 92% rename from src/Cuemon.Core/Text/ProtocolRelativeUriStringOptions.cs rename to src/Cuemon.Kernel/Text/ProtocolRelativeUriStringOptions.cs index 55564502b..9a93e36c2 100644 --- a/src/Cuemon.Core/Text/ProtocolRelativeUriStringOptions.cs +++ b/src/Cuemon.Kernel/Text/ProtocolRelativeUriStringOptions.cs @@ -1,10 +1,10 @@ -using System; +using System; using Cuemon.Configuration; namespace Cuemon.Text { /// - /// Configuration options for . + /// Configuration options for concrete implementations of that is related to parsing a protocol relative URI from a . /// /// public class ProtocolRelativeUriStringOptions : IParameterObject diff --git a/src/Cuemon.Core/Text/UriStringOptions.cs b/src/Cuemon.Kernel/Text/UriStringOptions.cs similarity index 91% rename from src/Cuemon.Core/Text/UriStringOptions.cs rename to src/Cuemon.Kernel/Text/UriStringOptions.cs index d6d0ff241..7bf8762b1 100644 --- a/src/Cuemon.Core/Text/UriStringOptions.cs +++ b/src/Cuemon.Kernel/Text/UriStringOptions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Cuemon.Collections.Generic; using Cuemon.Configuration; @@ -6,8 +6,9 @@ namespace Cuemon.Text { /// - /// Configuration options for . + /// Configuration options for concrete implementations of that is related to parsing a from a . /// + /// . public class UriStringOptions : IValidatableParameterObject { /// diff --git a/src/Cuemon.Core/Threading/AsyncOptions.cs b/src/Cuemon.Kernel/Threading/AsyncOptions.cs similarity index 100% rename from src/Cuemon.Core/Threading/AsyncOptions.cs rename to src/Cuemon.Kernel/Threading/AsyncOptions.cs diff --git a/src/Cuemon.Core/Threading/AsyncRunOptions.cs b/src/Cuemon.Kernel/Threading/AsyncRunOptions.cs similarity index 100% rename from src/Cuemon.Core/Threading/AsyncRunOptions.cs rename to src/Cuemon.Kernel/Threading/AsyncRunOptions.cs diff --git a/src/Cuemon.Core/Threading/Awaiter.cs b/src/Cuemon.Kernel/Threading/Awaiter.cs similarity index 100% rename from src/Cuemon.Core/Threading/Awaiter.cs rename to src/Cuemon.Kernel/Threading/Awaiter.cs diff --git a/src/Cuemon.Core/Threading/IAsyncOptions.cs b/src/Cuemon.Kernel/Threading/IAsyncOptions.cs similarity index 94% rename from src/Cuemon.Core/Threading/IAsyncOptions.cs rename to src/Cuemon.Kernel/Threading/IAsyncOptions.cs index a9b2bd71b..bcd2d037e 100644 --- a/src/Cuemon.Core/Threading/IAsyncOptions.cs +++ b/src/Cuemon.Kernel/Threading/IAsyncOptions.cs @@ -1,4 +1,4 @@ -using System.Threading; +using System.Threading; namespace Cuemon.Threading { @@ -13,4 +13,4 @@ public interface IAsyncOptions /// The cancellation token of an asynchronous operations. CancellationToken CancellationToken { get; set; } } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/TypeArgumentException.cs b/src/Cuemon.Kernel/TypeArgumentException.cs similarity index 100% rename from src/Cuemon.Core/TypeArgumentException.cs rename to src/Cuemon.Kernel/TypeArgumentException.cs diff --git a/src/Cuemon.Core/TypeArgumentOutOfRangeException.cs b/src/Cuemon.Kernel/TypeArgumentOutOfRangeException.cs similarity index 100% rename from src/Cuemon.Core/TypeArgumentOutOfRangeException.cs rename to src/Cuemon.Kernel/TypeArgumentOutOfRangeException.cs diff --git a/src/Cuemon.Core/UnsuccessfulValue.cs b/src/Cuemon.Kernel/UnsuccessfulValue.cs similarity index 100% rename from src/Cuemon.Core/UnsuccessfulValue.cs rename to src/Cuemon.Kernel/UnsuccessfulValue.cs diff --git a/src/Cuemon.Core/UriScheme.cs b/src/Cuemon.Kernel/UriScheme.cs similarity index 99% rename from src/Cuemon.Core/UriScheme.cs rename to src/Cuemon.Kernel/UriScheme.cs index 323b15f59..4d0e25c47 100644 --- a/src/Cuemon.Core/UriScheme.cs +++ b/src/Cuemon.Kernel/UriScheme.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Cuemon { @@ -56,4 +56,4 @@ public enum UriScheme /// Sftp } -} \ No newline at end of file +} diff --git a/src/Cuemon.Core/Validator.cs b/src/Cuemon.Kernel/Validator.cs similarity index 94% rename from src/Cuemon.Core/Validator.cs rename to src/Cuemon.Kernel/Validator.cs index 9928ea153..45b69e415 100644 --- a/src/Cuemon.Core/Validator.cs +++ b/src/Cuemon.Kernel/Validator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Collections.Generic; using System.Globalization; @@ -97,7 +97,7 @@ public static TResult CheckParameter(Func validator) } catch (Exception e) { - if (message?.Equals("{0} are not in a valid state.", StringComparison.Ordinal) ?? false) { message = string.Format(CultureInfo.InvariantCulture, message, Patterns.InvokeOrDefault(() => Decorator.Enclose(typeof(TOptions)).ToFriendlyName(), "Options")); } + if (message?.Equals("{0} are not in a valid state.", StringComparison.Ordinal) ?? false) { message = string.Format(CultureInfo.InvariantCulture, message, Patterns.InvokeOrDefault(() => ToFriendlyTypeName(typeof(TOptions)), "Options")); } throw new ArgumentException(message, paramName, e); } } @@ -144,20 +144,7 @@ public static void ThrowIfDisposed(bool condition, object instance, string messa /// This guard should be called when performing an operation on a disposed object - not when validating arguments passed to a member. public static void ThrowIfDisposed(bool condition, Type type, string message = "Cannot access a disposed object.") { - if (condition) { throw new ObjectDisposedException(type == null ? null : Decorator.Enclose(type, false).ToFriendlyName(o => o.FullName = true), message); } - } - - /// - /// Validates and throws an (or a derived counterpart) from the specified delegate . - /// - /// The delegate that evaluates, creates and ultimately throws an (or a derived counterpart) from within a given scenario. - /// - /// is null. - /// - public static void ThrowWhen(Action> condition) - { - ThrowIfNull(condition); - Patterns.CreateInstance(condition); + if (condition) { throw new ObjectDisposedException(type == null ? null : ToFriendlyTypeName(type, true), message); } } /// @@ -202,7 +189,7 @@ public static void ThrowIfNotNumber(string argument, NumberStyles styles = Numbe /// The name of the parameter that caused the exception. /// /// cannot be null - or - - /// property of cannot be null. + /// property of cannot be null. /// public static void ThrowIfNull(IDecorator argument, out T inner, string message = "Value cannot be null.", [CallerArgumentExpression(nameof(argument))] string paramName = null) { @@ -688,7 +675,7 @@ public static void ThrowIfContainsInterface(string typeParamName, string mess { ThrowIfNull(types); ThrowIfFalse(types.All(type => type.IsInterface), nameof(types), $"At least one of the specified {nameof(types)} is not an interface."); - if (Decorator.Enclose(typeof(T)).HasInterfaces(types)) { throw new TypeArgumentOutOfRangeException(typeParamName, DelimitedString.Create(types), message); } + if (HasInterfaces(typeof(T), types)) { throw new TypeArgumentOutOfRangeException(typeParamName, CreateTypeList(types), message); } } /// @@ -713,7 +700,7 @@ public static void ThrowIfContainsInterface(Type argument, Type[] types, string ThrowIfNull(argument); ThrowIfNull(types); ThrowIfFalse(types.All(type => type.IsInterface), nameof(types), $"At least one of the specified {nameof(types)} is not an interface."); - if (Decorator.Enclose(argument).HasInterfaces(types)) { throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(types), message); } + if (HasInterfaces(argument, types)) { throw new ArgumentOutOfRangeException(paramName, CreateTypeList(types), message); } } /// @@ -754,7 +741,7 @@ public static void ThrowIfNotContainsInterface(string typeParamName, string m { ThrowIfNull(types); ThrowIfFalse(types.All(type => type.IsInterface), nameof(types), $"At least one of the specified {nameof(types)} is not an interface."); - if (!Decorator.Enclose(typeof(T)).HasInterfaces(types)) { throw new TypeArgumentOutOfRangeException(typeParamName, DelimitedString.Create(types), message); } + if (!HasInterfaces(typeof(T), types)) { throw new TypeArgumentOutOfRangeException(typeParamName, CreateTypeList(types), message); } } /// @@ -779,7 +766,7 @@ public static void ThrowIfNotContainsInterface(Type argument, Type[] types, stri ThrowIfNull(argument); ThrowIfNull(types); ThrowIfFalse(types.All(type => type.IsInterface), nameof(types), $"At least one of the specified {nameof(types)} is not an interface."); - if (!Decorator.Enclose(argument).HasInterfaces(types)) { throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(types), message); } + if (!HasInterfaces(argument, types)) { throw new ArgumentOutOfRangeException(paramName, CreateTypeList(types), message); } } /// @@ -819,7 +806,7 @@ public static void ThrowIfContainsType(Type argument, Type[] types, string messa { ThrowIfNull(argument); ThrowIfNull(types); - if (Decorator.Enclose(argument).HasTypes(types)) { throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(types), message); } + if (HasTypes(argument, types)) { throw new ArgumentOutOfRangeException(paramName, CreateTypeList(types), message); } } /// @@ -853,7 +840,7 @@ public static void ThrowIfContainsType(string typeParamName, params Type[] ty public static void ThrowIfContainsType(string typeParamName, string message, params Type[] types) { ThrowIfNull(types); - if (Decorator.Enclose(typeof(T)).HasTypes(types)) { throw new TypeArgumentOutOfRangeException(typeParamName, DelimitedString.Create(types), message); } + if (HasTypes(typeof(T), types)) { throw new TypeArgumentOutOfRangeException(typeParamName, CreateTypeList(types), message); } } /// @@ -874,7 +861,7 @@ public static void ThrowIfNotContainsType(Type argument, Type[] types, string me { ThrowIfNull(argument); ThrowIfNull(types); - if (!Decorator.Enclose(argument).HasTypes(types)) { throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(types), message); } + if (!HasTypes(argument, types)) { throw new ArgumentOutOfRangeException(paramName, CreateTypeList(types), message); } } /// @@ -927,7 +914,7 @@ public static void ThrowIfNotContainsType(string typeParamName, params Type[] public static void ThrowIfNotContainsType(string typeParamName, string message, params Type[] types) { ThrowIfNull(types); - if (!Decorator.Enclose(typeof(T)).HasTypes(types)) { throw new TypeArgumentOutOfRangeException(typeParamName, DelimitedString.Create(types), message); } + if (!HasTypes(typeof(T), types)) { throw new TypeArgumentOutOfRangeException(typeParamName, CreateTypeList(types), message); } } /// @@ -1124,9 +1111,10 @@ public static void ThrowIfNotDifferent(string first, string second, string param /// public static void ThrowIfContainsAny(string argument, char[] characters, StringComparison comparison = StringComparison.OrdinalIgnoreCase, string message = "One or more character matches were found.", [CallerArgumentExpression(nameof(argument))] string paramName = null) { - if (Decorator.Enclose(argument, false)?.ContainsAny(comparison, characters) ?? false) + ThrowIfNull(characters); + if (ContainsAny(argument, characters, comparison)) { - throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(argument.Where(characters.Contains).Distinct(), o => o.StringConverter = c => $"'{c}'"), message); + throw new ArgumentOutOfRangeException(paramName, CreateCharacterList(argument.Where(c => characters.Any(find => string.Equals(c.ToString(), find.ToString(), comparison))).Distinct()), message); } } @@ -1143,10 +1131,88 @@ public static void ThrowIfContainsAny(string argument, char[] characters, String /// public static void ThrowIfNotContainsAny(string argument, char[] characters, StringComparison comparison = StringComparison.OrdinalIgnoreCase, string message = "No matching characters were found.", [CallerArgumentExpression(nameof(argument))] string paramName = null) { - if (!Decorator.Enclose(argument, false)?.ContainsAny(comparison, characters) ?? true) + ThrowIfNull(characters); + if (!ContainsAny(argument, characters, comparison)) + { + throw new ArgumentOutOfRangeException(paramName, CreateCharacterList(characters.Distinct()), message); + } + } + + /// + /// Validates and throws an (or a derived counterpart) from the specified delegate . + /// + /// The delegate that evaluates, creates and ultimately throws an (or a derived counterpart) from within a given scenario. + /// + /// is null. + /// + public static void ThrowWhen(Action> condition) + { + ThrowIfNull(condition); + Patterns.CreateInstance(condition); + } + + private static bool ContainsAny(string argument, IEnumerable characters, StringComparison comparison) + { + if (argument == null) { return false; } + foreach (var character in characters) + { + if (argument.IndexOf(character.ToString(), comparison) >= 0) { return true; } + } + return false; + } + + private static string CreateCharacterList(IEnumerable characters) + { + return string.Join(",", characters.Select(c => $"'{c}'")); + } + + private static string CreateTypeList(IEnumerable types) + { + return string.Join(", ", types.Select(type => ToFriendlyTypeName(type, true))); + } + + private static bool HasInterfaces(Type source, IEnumerable interfaceTypes) + { + var implementedInterfaces = source.IsInterface ? Enumerable.Repeat(source, 1).Concat(source.GetInterfaces()).ToList() : source.GetInterfaces().ToList(); + foreach (var interfaceType in interfaceTypes.Where(type => type.IsInterface)) { - throw new ArgumentOutOfRangeException(paramName, DelimitedString.Create(characters.Distinct(), o => o.StringConverter = c => $"'{c}'"), message); + foreach (var implementedInterface in implementedInterfaces) + { + if (implementedInterface.IsGenericType && interfaceType == implementedInterface.GetGenericTypeDefinition()) { return true; } + if (interfaceType == implementedInterface) { return true; } + } } + return false; + } + + private static bool HasTypes(Type source, IEnumerable types) + { + foreach (var type in types) + { + var current = source; + while (current != null) + { + if (current.IsGenericType && type == current.GetGenericTypeDefinition()) { return true; } + if (current == type) { return true; } + current = current.BaseType; + } + } + return false; + } + + private static string ToFriendlyTypeName(Type type, bool fullName = false) + { + if (type.IsByRef) { return $"{ToFriendlyTypeName(type.GetElementType()!, fullName)}&"; } + if (type.IsPointer) { return $"{ToFriendlyTypeName(type.GetElementType()!, fullName)}*"; } + if (type.IsArray) { return $"{ToFriendlyTypeName(type.GetElementType()!, fullName)}[]"; } + if (!type.GetTypeInfo().IsGenericType) { return fullName ? type.FullName ?? type.Name : type.Name; } + + var genericType = type.IsGenericTypeDefinition ? type : type.GetGenericTypeDefinition(); + var genericTypeName = fullName ? genericType.FullName ?? genericType.Name : genericType.Name; + var arityIndex = genericTypeName.IndexOf('`'); + if (arityIndex > -1) { genericTypeName = genericTypeName.Substring(0, arityIndex); } + + return FormattableString.Invariant($"{genericTypeName}<{string.Join(",", type.GetGenericArguments().Select(argument => ToFriendlyTypeName(argument, fullName)))}>"); } } } diff --git a/test/Cuemon.Core.Tests/ConditionTest.cs b/test/Cuemon.Core.Tests/ConditionTest.cs deleted file mode 100644 index 8b888d135..000000000 --- a/test/Cuemon.Core.Tests/ConditionTest.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Codebelt.Extensions.Xunit; -using Xunit; - -namespace Cuemon -{ - public class ConditionTest : Test - { - public ConditionTest(ITestOutputHelper output) : base(output) - { - } - - - [Fact] - public void HasDifference_ShouldProvideDifferenceBetweenFirstAndSecond() - { - var sut1 = "Cuemon for .NET"; - var sut2 = "There once was a library named Cuemon for .NET; it is getting better by the day!"; - var sut3 = "XYZ Cuemon for .NET ÆØÅ"; - var sut5 = Condition.HasDifference(sut1, sut2, out var sut4); - var sut6 = Condition.HasDifference(sut1, sut1, out _); - var sut8 = Condition.HasDifference(sut1, sut3, out var sut7); - - TestOutput.WriteLine(sut4); - TestOutput.WriteLine(sut7); - - Assert.Equal("hcwaslibyd;tg!", sut4); - Assert.True(sut5); - Assert.False(sut6); - Assert.Equal("XYZÆØÅ", sut7); - Assert.True(sut8); - } - } -} diff --git a/test/Cuemon.Core.Tests/PatternsTest.cs b/test/Cuemon.Core.Tests/PatternsTest.cs deleted file mode 100644 index bcf4b3b06..000000000 --- a/test/Cuemon.Core.Tests/PatternsTest.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using Codebelt.Extensions.Xunit; -using Cuemon.Text; -using Cuemon.Threading; -using Xunit; - -namespace Cuemon -{ - public class PatternsTest : Test - { - public PatternsTest(ITestOutputHelper output) : base(output) - { - } - - [Fact] - public void Configure_ShouldInitializeDefaultInstance() - { - Action sut = null; - var ao = new AsyncOptions(); - - var options = Patterns.Configure(sut); - - Assert.NotNull(options); - Assert.IsType(options); - Assert.Equal(ao.CancellationToken, options.CancellationToken); - } - - [Fact] - public void ConfigureExchange_ShouldSwapOptions_VerifyDefaultValues() - { - Action sut1 = null; - var sut2 = Patterns.ConfigureExchange(sut1); - - var o1 = Patterns.Configure(sut1); - var o2 = Patterns.Configure(sut2); - - Assert.NotNull(o1); - Assert.NotNull(o2); - Assert.IsType(o1); - Assert.IsType(o2); - Assert.Equal(o1.Encoding, o2.Encoding); - Assert.Equal(o1.Preamble, o2.Preamble); - } - - [Fact] - public void ConfigureRevert_ShouldReturnDelegateThatProducesEquivalentOptions() - { - var original = Patterns.Configure(o => o.Encoding = Encoding.UTF32); - var revertDelegate = Patterns.ConfigureRevert(original); - var reverted = Patterns.Configure(revertDelegate); - - Assert.Equal(original.Encoding, reverted.Encoding); - Assert.Equal(original.Preamble, reverted.Preamble); - } - - [Fact] - public void ConfigureRevertExchange_ShouldExchangeAndRevertOptions() - { - var original = Patterns.Configure(o => o.Encoding = Encoding.UTF32); - var exchangeDelegate = Patterns.ConfigureRevertExchange(original); - var result = Patterns.Configure(exchangeDelegate); - - Assert.Equal(Encoding.UTF32, result.Encoding); - Assert.Equal(original.Preamble, result.Preamble); - } - - [Fact] - public void CreateInstance_ShouldInitializeWithFactory() - { - var sut = Patterns.CreateInstance(o => o.Encoding = Encoding.UTF32); - - Assert.NotNull(sut); - Assert.Equal(Encoding.UTF32, sut.Encoding); - } - - [Fact] - public void CreateInstance_ShouldCreateDefaultInstance_WhenFactoryIsNull() - { - var defaults = new AsyncEncodingOptions(); - var sut = Patterns.CreateInstance(null); - - Assert.NotNull(sut); - Assert.Equal(defaults.Encoding, sut.Encoding); - Assert.Equal(defaults.Preamble, sut.Preamble); - } - - [Fact] - public void TryInvoke_ShouldReturnTrue_WhenActionSucceeds() - { - var invoked = false; - - var result = Patterns.TryInvoke(() => { invoked = true; }); - - Assert.True(result); - Assert.True(invoked); - } - - [Fact] - public void TryInvoke_ShouldReturnFalse_WhenActionThrows() - { - var result = Patterns.TryInvoke(() => throw new InvalidOperationException()); - - Assert.False(result); - } - - [Fact] - public void TryInvoke_ShouldReturnTrueAndResult_WhenFuncSucceeds() - { - var result = Patterns.TryInvoke(() => 42, out var value); - - Assert.True(result); - Assert.Equal(42, value); - } - - [Fact] - public void TryInvoke_ShouldReturnFalseAndDefault_WhenFuncThrows() - { - var result = Patterns.TryInvoke(() => throw new InvalidOperationException(), out var value); - - Assert.False(result); - Assert.Equal(default, value); - } - - [Fact] - public void InvokeOrDefault_ShouldReturnResult_WhenMethodSucceeds() - { - var result = Patterns.InvokeOrDefault(() => 42); - - Assert.Equal(42, result); - } - - [Fact] - public void InvokeOrDefault_ShouldReturnFallback_WhenMethodThrows() - { - var result = Patterns.InvokeOrDefault(() => throw new InvalidOperationException(), -1); - - Assert.Equal(-1, result); - } - - [Fact] - public void IsFatalException_ShouldReturnTrue_WhenExceptionIsFatal() - { - Assert.True(Patterns.IsFatalException(new OutOfMemoryException())); - Assert.True(Patterns.IsFatalException(new StackOverflowException())); - Assert.True(Patterns.IsFatalException(new AccessViolationException())); - Assert.True(Patterns.IsFatalException(new SEHException())); - } - - [Fact] - public void IsFatalException_ShouldReturnFalse_WhenExceptionIsNotFatal() - { - Assert.False(Patterns.IsFatalException(new InvalidOperationException())); - Assert.False(Patterns.IsFatalException(new ArgumentNullException())); - Assert.False(Patterns.IsFatalException(new NotSupportedException())); - } - - [Fact] - public void IsRecoverableException_ShouldReturnTrue_WhenExceptionIsNotFatal() - { - Assert.True(Patterns.IsRecoverableException(new InvalidOperationException())); - Assert.True(Patterns.IsRecoverableException(new ArgumentNullException())); - Assert.True(Patterns.IsRecoverableException(new NotSupportedException())); - } - - [Fact] - public void IsRecoverableException_ShouldReturnFalse_WhenExceptionIsFatal() - { - Assert.False(Patterns.IsRecoverableException(new OutOfMemoryException())); - Assert.False(Patterns.IsRecoverableException(new StackOverflowException())); - Assert.False(Patterns.IsRecoverableException(new AccessViolationException())); - Assert.False(Patterns.IsRecoverableException(new SEHException())); - } - - [Fact] - public void SafeInvoke_ShouldReturnResult_WhenTesterSucceeds() - { - using var result = Patterns.SafeInvoke( - () => new MemoryStream(new byte[] { 1, 2, 3 }), - ms => ms); - - Assert.NotNull(result); - Assert.Equal(3, result.Length); - } - - [Fact] - public void SafeInvoke_ShouldReturnNull_AndInvokeCatcher_WhenTesterThrows() - { - Exception caught = null; - - var result = Patterns.SafeInvoke( - () => new MemoryStream(), - _ => throw new InvalidOperationException("tester failure"), - ex => caught = ex); - - Assert.Null(result); - Assert.NotNull(caught); - Assert.IsType(caught); - Assert.Equal("tester failure", caught.Message); - } - } -} diff --git a/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs b/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs index 6f515cac2..4eb0290c5 100644 --- a/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs +++ b/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Linq; using System.Reflection; @@ -28,7 +28,7 @@ public void IsDebugBuild_ShouldBeTrueForDebugOrFalseForRelease() [Fact] public void GetTypes_ShouldReturnAllTypesFromCuemonCore() { - var a = typeof(Disposable).Assembly; + var a = typeof(SystemSnapshots).Assembly; var allTypes = Decorator.Enclose(a).GetTypes(); var disposableTypes = Decorator.Enclose(a).GetTypes(typeFilter: typeof(Disposable)); @@ -39,10 +39,11 @@ public void GetTypes_ShouldReturnAllTypesFromCuemonCore() var configurationTypesCount = Decorator.Enclose(configurationTypes).Inner.Count(); TestOutput.WriteLine(disposableTypes.ToDelimitedString()); + TestOutput.WriteLine(configurationTypes.ToDelimitedString()); - Assert.InRange(allTypesCount, 325, 375); // range because of tooling on CI adding dynamic types and high range of refactoring - Assert.Equal(5, disposableTypesCount); - Assert.Equal(5, configurationTypesCount); + Assert.InRange(allTypesCount, 250, 300); // range because of tooling on CI adding dynamic types and high range of refactoring + Assert.Equal(3, disposableTypesCount); + Assert.Equal(2, configurationTypesCount); } [Fact] @@ -123,4 +124,4 @@ public void GetManifestResources_ShouldRetrieveCultureInfoSpecificCultures() Assert.True(erbev.Length > 0); } } -} \ No newline at end of file +} diff --git a/test/Cuemon.Core.Tests/Resilience/TransientFaultExceptionTest.cs b/test/Cuemon.Core.Tests/Resilience/TransientFaultExceptionTest.cs new file mode 100644 index 000000000..e654c2a99 --- /dev/null +++ b/test/Cuemon.Core.Tests/Resilience/TransientFaultExceptionTest.cs @@ -0,0 +1,53 @@ +using System; +using Cuemon.Reflection; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Resilience +{ + public class TransientFaultExceptionTest : Test + { + public TransientFaultExceptionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldAssignEvidence() + { + var evidence = new TransientFaultEvidence(3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3), new MethodSignature("Cuemon.Resilience.TransientFaultExceptionTest", "Ctor_ShouldAssignEvidence", null, null)); + var sut = new TransientFaultException("Failure.", evidence); + + Assert.Equal("Failure.", sut.Message); + Assert.Same(evidence, sut.Evidence); + Assert.Null(sut.InnerException); + } + + [Fact] + public void Ctor_ShouldAssignInnerExceptionAndEvidence() + { + var inner = new ArithmeticException(); + var evidence = new TransientFaultEvidence(3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3), new MethodSignature("Cuemon.Resilience.TransientFaultExceptionTest", "Ctor_ShouldAssignInnerExceptionAndEvidence", null, null)); + var sut = new TransientFaultException("Failure.", inner, evidence); + + Assert.Equal("Failure.", sut.Message); + Assert.Same(inner, sut.InnerException); + Assert.Same(evidence, sut.Evidence); + } + + [Fact] + public void Ctor_ShouldThrowArgumentNullExceptionWhenEvidenceIsNull() + { + Assert.Throws(() => new TransientFaultException("Failure.", (TransientFaultEvidence)null)); + Assert.Throws(() => new TransientFaultException("Failure.", new ArithmeticException(), null)); + } + + [Fact] + public void ToString_ShouldAppendEvidence() + { + var evidence = new TransientFaultEvidence(3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3), new MethodSignature("Cuemon.Resilience.TransientFaultExceptionTest", "ToString_ShouldAppendEvidence", null, null)); + var sut = new TransientFaultException("Failure.", evidence); + + Assert.Equal($"{typeof(TransientFaultException).FullName}: Failure. {evidence}", sut.ToString()); + } + } +} diff --git a/test/Cuemon.Core.Tests/TypeForwardingTest.cs b/test/Cuemon.Core.Tests/TypeForwardingTest.cs new file mode 100644 index 000000000..c5c8ed6b6 --- /dev/null +++ b/test/Cuemon.Core.Tests/TypeForwardingTest.cs @@ -0,0 +1,41 @@ +using System; +using System.Linq; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class TypeForwardingTest : Test + { + public TypeForwardingTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void CoreAssembly_ShouldTypeForwardAllPublicTypesFromKernelAssembly() + { + var coreAssembly = typeof(DateSpan).Assembly; + var kernelAssembly = typeof(ArgumentReservedKeywordException).Assembly; + + var forwardedTypeNames = kernelAssembly.GetExportedTypes() + .Select(type => coreAssembly.GetType(type.FullName ?? string.Empty, false)) + .Where(type => type != null && type.Assembly == kernelAssembly) + .Select(type => type.FullName) + .Where(name => name != null) + .ToHashSet(StringComparer.Ordinal); + + var missingForwardedTypeNames = kernelAssembly.GetExportedTypes() + .Select(type => type.FullName) + .Where(name => name != null && !forwardedTypeNames.Contains(name)) + .OrderBy(name => name) + .ToList(); + + if (missingForwardedTypeNames.Count > 0) + { + TestOutput.WriteLine(string.Join(Environment.NewLine, missingForwardedTypeNames)); + } + + Assert.Empty(missingForwardedTypeNames); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/ArgumentReservedKeywordExceptionTest.cs b/test/Cuemon.Kernel.Tests/ArgumentReservedKeywordExceptionTest.cs new file mode 100644 index 000000000..f2f6ddb61 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/ArgumentReservedKeywordExceptionTest.cs @@ -0,0 +1,50 @@ +using System; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class ArgumentReservedKeywordExceptionTest : Test + { + public ArgumentReservedKeywordExceptionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldUseParamName() + { + var sut = new ArgumentReservedKeywordException("value"); + + Assert.Equal("value", sut.ParamName); + } + + [Fact] + public void Ctor_ShouldUseCustomMessage() + { + var sut = new ArgumentReservedKeywordException("value", "Keyword was reserved."); + + Assert.Equal("value", sut.ParamName); + Assert.StartsWith("Keyword was reserved.", sut.Message); + } + + [Fact] + public void Ctor_ShouldAssignActualValueAndDefaultMessage() + { + var sut = new ArgumentReservedKeywordException("value", "select", null); + + Assert.Equal("value", sut.ParamName); + Assert.Equal("select", sut.ActualValue); + Assert.StartsWith("Specified argument is a reserved keyword.", sut.Message); + } + + [Fact] + public void Ctor_ShouldAssignInnerException() + { + var inner = new InvalidOperationException("boom"); + var sut = new ArgumentReservedKeywordException("Keyword was reserved.", inner); + + Assert.Equal("Keyword was reserved.", sut.Message); + Assert.Same(inner, sut.InnerException); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/Assets/AsyncEncodingOptions.cs b/test/Cuemon.Kernel.Tests/Assets/AsyncEncodingOptions.cs new file mode 100644 index 000000000..2bc04c811 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Assets/AsyncEncodingOptions.cs @@ -0,0 +1,39 @@ +using System.Threading; +using Cuemon.Text; +using Cuemon.Threading; + +namespace Cuemon.Assets +{ + /// + /// Specifies options that is related to the class. + /// + public sealed class AsyncEncodingOptions : EncodingOptions, IAsyncOptions + { + /// + /// Initializes a new instance of the class. + /// + /// + /// The following table shows the initial property values for an instance of . + /// + /// + /// Property + /// Initial Value + /// + /// + /// + /// default + /// + /// + /// + public AsyncEncodingOptions() + { + CancellationToken = default; + } + + /// + /// Gets or sets the cancellation token of an asynchronous operations. + /// + /// The cancellation token of an asynchronous operations. + public CancellationToken CancellationToken { get; set; } + } +} diff --git a/test/Cuemon.Kernel.Tests/Assets/DisposableTestDoubles.cs b/test/Cuemon.Kernel.Tests/Assets/DisposableTestDoubles.cs new file mode 100644 index 000000000..af7e5b3ad --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Assets/DisposableTestDoubles.cs @@ -0,0 +1,91 @@ +using System; +using System.Threading; + +namespace Cuemon.Assets +{ + public class ManagedOnlyDisposable : Disposable + { + public int ManagedDisposeCount { get; private set; } + + public void DisposeCore(bool disposing) + { + Dispose(disposing); + } + + protected override void OnDisposeManagedResources() + { + ManagedDisposeCount++; + } + } + + public class TrackingDisposable : Disposable + { + public int ManagedDisposeCount { get; private set; } + + public int UnmanagedDisposeCount { get; private set; } + + public void DisposeCore(bool disposing) + { + Dispose(disposing); + } + + protected override void OnDisposeManagedResources() + { + ManagedDisposeCount++; + } + + protected override void OnDisposeUnmanagedResources() + { + UnmanagedDisposeCount++; + } + } + + public sealed class BlockingDisposable : Disposable + { + public BlockingDisposable(ManualResetEventSlim managedStarted, ManualResetEventSlim continueDisposal) + { + ManagedStarted = managedStarted; + ContinueDisposal = continueDisposal; + } + + public ManualResetEventSlim ManagedStarted { get; } + + public ManualResetEventSlim ContinueDisposal { get; } + + public int ManagedDisposeCount { get; private set; } + + public int UnmanagedDisposeCount { get; private set; } + + protected override void OnDisposeManagedResources() + { + ManagedDisposeCount++; + ManagedStarted.Set(); + ContinueDisposal.Wait(TimeSpan.FromSeconds(5)); + } + + protected override void OnDisposeUnmanagedResources() + { + UnmanagedDisposeCount++; + } + } + + public class TrackingFinalizeDisposable : FinalizeDisposable + { + public static int UnmanagedDisposeCount; + + public void DisposeCore(bool disposing) + { + Dispose(disposing); + } + + public static void Reset() + { + UnmanagedDisposeCount = 0; + } + + protected override void OnDisposeUnmanagedResources() + { + Interlocked.Increment(ref UnmanagedDisposeCount); + } + } +} diff --git a/test/Cuemon.Core.Tests/Assets/EssentialOptions.cs b/test/Cuemon.Kernel.Tests/Assets/EssentialOptions.cs similarity index 100% rename from test/Cuemon.Core.Tests/Assets/EssentialOptions.cs rename to test/Cuemon.Kernel.Tests/Assets/EssentialOptions.cs diff --git a/test/Cuemon.Core.Tests/Assets/FailPostConfigurableOptions.cs b/test/Cuemon.Kernel.Tests/Assets/FailPostConfigurableOptions.cs similarity index 100% rename from test/Cuemon.Core.Tests/Assets/FailPostConfigurableOptions.cs rename to test/Cuemon.Kernel.Tests/Assets/FailPostConfigurableOptions.cs diff --git a/test/Cuemon.Core.Tests/Assets/PostConfigurableOptions.cs b/test/Cuemon.Kernel.Tests/Assets/PostConfigurableOptions.cs similarity index 100% rename from test/Cuemon.Core.Tests/Assets/PostConfigurableOptions.cs rename to test/Cuemon.Kernel.Tests/Assets/PostConfigurableOptions.cs diff --git a/test/Cuemon.Core.Tests/Assets/ValidatableOptions.cs b/test/Cuemon.Kernel.Tests/Assets/ValidatableOptions.cs similarity index 100% rename from test/Cuemon.Core.Tests/Assets/ValidatableOptions.cs rename to test/Cuemon.Kernel.Tests/Assets/ValidatableOptions.cs diff --git a/test/Cuemon.Kernel.Tests/Assets/VerticalDirection.cs b/test/Cuemon.Kernel.Tests/Assets/VerticalDirection.cs new file mode 100644 index 000000000..609254a44 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Assets/VerticalDirection.cs @@ -0,0 +1,8 @@ +namespace Cuemon.Assets +{ + public enum VerticalDirection + { + Down, + Up + } +} diff --git a/test/Cuemon.Kernel.Tests/Collections/Generic/ArgumentsTest.cs b/test/Cuemon.Kernel.Tests/Collections/Generic/ArgumentsTest.cs new file mode 100644 index 000000000..257081a63 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Collections/Generic/ArgumentsTest.cs @@ -0,0 +1,126 @@ +using System; +using System.Linq; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Collections.Generic +{ + public class ArgumentsTest : Test + { + public ArgumentsTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Concat_ShouldReturnEmptyArray_WhenFirstArrayIsNull() + { + var result = Arguments.Concat(null, new[] { 1, 2, 3 }); + + Assert.Empty(result); + } + + [Fact] + public void Concat_ShouldReturnFirstArray_WhenSecondArrayIsNull() + { + var args1 = new[] { 1, 2, 3 }; + + var result = Arguments.Concat(args1, null); + + Assert.Same(args1, result); + } + + [Fact] + public void Concat_ShouldReturnSecondArray_WhenFirstArrayIsEmpty() + { + var args1 = Array.Empty(); + var args2 = new[] { 1, 2, 3 }; + + var result = Arguments.Concat(args1, args2); + + Assert.Same(args2, result); + } + + [Fact] + public void Concat_ShouldReturnFirstArray_WhenSecondArrayIsEmpty() + { + var args1 = new[] { 1, 2, 3 }; + var args2 = Array.Empty(); + + var result = Arguments.Concat(args1, args2); + + Assert.Same(args1, result); + } + + [Fact] + public void Concat_ShouldAppendSecondArrayAfterFirstArray_WhenBothArraysContainValues() + { + var args1 = new[] { 1, 2, 3 }; + var args2 = new[] { 4, 5 }; + + var result = Arguments.Concat(args1, args2); + + Assert.Equal(new[] { 1, 2, 3, 4, 5 }, result); + Assert.NotSame(args1, result); + Assert.NotSame(args2, result); + } + + [Fact] + public void ToArrayOf_ShouldReturnSameArrayReference() + { + var args = new[] { "alpha", "beta" }; + + var result = Arguments.ToArrayOf(args); + + Assert.Same(args, result); + } + + [Fact] + public void ToArray_ShouldReturnSameArrayReference() + { + object[] args = ["alpha", 42, null]; + + var result = Arguments.ToArray(args); + + Assert.Same(args, result); + } + + [Fact] + public void ToEnumerableOf_ShouldExposeArrayAsEnumerable() + { + var args = new[] { "alpha", "beta" }; + + var result = Arguments.ToEnumerableOf(args); + + Assert.Same(args, result); + Assert.Equal(args, result); + } + + [Fact] + public void ToEnumerable_ShouldExposeArrayAsEnumerable() + { + object[] args = ["alpha", 42, null]; + + var result = Arguments.ToEnumerable(args); + + Assert.Same(args, result); + Assert.Equal(args, result); + } + + [Fact] + public void Yield_ShouldReturnSequenceContainingOnlySpecifiedArgument() + { + var result = Arguments.Yield("alpha"); + + Assert.Collection(result, item => Assert.Equal("alpha", item)); + } + + [Fact] + public void Yield_ShouldSupportRepeatedEnumeration() + { + var result = Arguments.Yield(42); + + Assert.Equal(new[] { 42 }, result.ToArray()); + Assert.Equal(new[] { 42 }, result.ToArray()); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/ConditionTest.cs b/test/Cuemon.Kernel.Tests/ConditionTest.cs new file mode 100644 index 000000000..25db80f8a --- /dev/null +++ b/test/Cuemon.Kernel.Tests/ConditionTest.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class ConditionTest : Test + { + public ConditionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void AreEqualAndReferenceComparisons_ShouldEvaluateExpectedResults() + { + var sameReference = new object(); + var differentReference = new object(); + + Assert.True(Condition.AreEqual(42, 42)); + Assert.False(Condition.AreEqual("alpha", "ALPHA")); + Assert.True(Condition.AreEqual("alpha", "ALPHA", StringComparer.OrdinalIgnoreCase)); + Assert.True(Condition.AreNotEqual("alpha", "ALPHA")); + Assert.False(Condition.AreNotEqual("alpha", "ALPHA", StringComparer.OrdinalIgnoreCase)); + Assert.True(Condition.AreSame(sameReference, sameReference)); + Assert.False(Condition.AreSame(sameReference, differentReference)); + Assert.True(Condition.AreNotSame(sameReference, differentReference)); + Assert.False(Condition.AreNotSame(sameReference, sameReference)); + + Assert.Throws(() => Condition.AreEqual("alpha", "ALPHA", null)); + Assert.Throws(() => Condition.AreNotEqual("alpha", "ALPHA", null)); + } + + [Fact] + public void FlipFlop_ShouldInvokeExpectedBranch_ForAllActionOverloads() + { + var calls = new List(); + + Condition.FlipFlop(true, () => calls.Add("0T"), () => calls.Add("0F")); + Condition.FlipFlop(false, () => calls.Add("0T"), () => calls.Add("0F")); + + Condition.FlipFlop(true, x => calls.Add($"1T:{x}"), x => calls.Add($"1F:{x}"), 1); + Condition.FlipFlop(false, x => calls.Add($"1T:{x}"), x => calls.Add($"1F:{x}"), 2); + + Condition.FlipFlop(true, (x, y) => calls.Add($"2T:{x + y}"), (x, y) => calls.Add($"2F:{x + y}"), 1, 2); + Condition.FlipFlop(false, (x, y) => calls.Add($"2T:{x + y}"), (x, y) => calls.Add($"2F:{x + y}"), 2, 3); + + Condition.FlipFlop(true, (x, y, z) => calls.Add($"3T:{x + y + z}"), (x, y, z) => calls.Add($"3F:{x + y + z}"), 1, 2, 3); + Condition.FlipFlop(false, (x, y, z) => calls.Add($"3T:{x + y + z}"), (x, y, z) => calls.Add($"3F:{x + y + z}"), 2, 3, 4); + + Condition.FlipFlop(true, (a, b, c, d) => calls.Add($"4T:{a + b + c + d}"), (a, b, c, d) => calls.Add($"4F:{a + b + c + d}"), 1, 2, 3, 4); + Condition.FlipFlop(false, (a, b, c, d) => calls.Add($"4T:{a + b + c + d}"), (a, b, c, d) => calls.Add($"4F:{a + b + c + d}"), 2, 3, 4, 5); + + Condition.FlipFlop(true, (a, b, c, d, e) => calls.Add($"5T:{a + b + c + d + e}"), (a, b, c, d, e) => calls.Add($"5F:{a + b + c + d + e}"), 1, 2, 3, 4, 5); + Condition.FlipFlop(false, (a, b, c, d, e) => calls.Add($"5T:{a + b + c + d + e}"), (a, b, c, d, e) => calls.Add($"5F:{a + b + c + d + e}"), 2, 3, 4, 5, 6); + + Assert.Equal(new[] + { + "0T", + "0F", + "1T:1", + "1F:2", + "2T:3", + "2F:5", + "3T:6", + "3F:9", + "4T:10", + "4F:14", + "5T:15", + "5F:20" + }, calls); + + Assert.Throws(() => Condition.FlipFlop(true, (Action)null, () => { })); + Assert.Throws(() => Condition.FlipFlop(true, () => { }, (Action)null)); + } + + [Fact] + public async Task FlipFlopAsync_ShouldInvokeExpectedBranch() + { + var calls = new List(); + + await Condition.FlipFlopAsync(true, + () => + { + calls.Add("async:true"); + return Task.CompletedTask; + }, + () => + { + calls.Add("async:false"); + return Task.CompletedTask; + }); + + await Condition.FlipFlopAsync(false, + () => + { + calls.Add("async:true"); + return Task.CompletedTask; + }, + () => + { + calls.Add("async:false"); + return Task.CompletedTask; + }); + + Assert.Equal(new[] { "async:true", "async:false" }, calls); + await Assert.ThrowsAsync(() => Condition.FlipFlopAsync(true, null, () => Task.CompletedTask)); + await Assert.ThrowsAsync(() => Condition.FlipFlopAsync(false, () => Task.CompletedTask, null)); + } + + [Fact] + public void HasConsecutiveCharacters_ShouldDetectSequences_ForBothOverloads() + { + Assert.True(Condition.HasConsecutiveCharacters("bookkeeper", new[] { 'o', 'k' })); + Assert.True(Condition.HasConsecutiveCharacters("bookkeeper", new[] { 'x', 'k' })); + Assert.False(Condition.HasConsecutiveCharacters("bookkeeper", new[] { 'x', 'y' })); + Assert.False(Condition.HasConsecutiveCharacters("a", new[] { 'a' })); + Assert.False(Condition.HasConsecutiveCharacters(" ", new[] { ' ' })); + Assert.False(Condition.HasConsecutiveCharacters(null, new[] { 'a' })); + Assert.False(Condition.HasConsecutiveCharacters("bookkeeper", (IEnumerable)null)); + + Assert.True(Condition.HasConsecutiveCharacters("baaad", 'a', 3)); + Assert.True(Condition.HasConsecutiveCharacters("committee", 'm')); + Assert.True(Condition.HasConsecutiveCharacters("bookkeeper", 'o', 1)); + Assert.False(Condition.HasConsecutiveCharacters("abcdef", 'a')); + Assert.False(Condition.HasConsecutiveCharacters("a", 'a')); + Assert.False(Condition.HasConsecutiveCharacters(null, 'a')); + } + + [Fact] + public void EncodingAndDigitChecks_ShouldReturnExpectedResults() + { + Assert.True(Condition.IsBase64("QQ==")); + Assert.False(Condition.IsBase64(null)); + Assert.False(Condition.IsBase64(string.Empty)); + + Assert.True(Condition.IsBinaryDigits("101010")); + Assert.False(Condition.IsBinaryDigits("102010")); + Assert.False(Condition.IsBinaryDigits(" ")); + + Assert.True(Condition.IsHex("0AFF")); + Assert.True(Condition.IsHex("0aff")); + Assert.False(Condition.IsHex("0AF")); + Assert.False(Condition.IsHex("0AGG")); + Assert.False(Condition.IsHex(string.Empty)); + Assert.True(Condition.IsHex('5')); + Assert.True(Condition.IsHex('F')); + Assert.True(Condition.IsHex('a')); + Assert.False(Condition.IsHex('G')); + Assert.False(Condition.IsHex('/')); + } + + [Fact] + public void IsCountableSequence_ShouldEvaluateIntegralAndCharacterSequences() + { + Assert.True(Condition.IsCountableSequence(new[] { 1, 3, 5, 7 })); + Assert.False(Condition.IsCountableSequence(new[] { 1, 3, 6, 7 })); + + Assert.True(Condition.IsCountableSequence(new long[] { 10, 7, 4, 1 })); + Assert.True(Condition.IsCountableSequence(new long[] { 10, 7 })); + Assert.False(Condition.IsCountableSequence(new long[] { 10, 7, 3, 1 })); + Assert.False(Condition.IsCountableSequence((IEnumerable)null)); + + Assert.True(Condition.IsCountableSequence("abcd")); + Assert.True(Condition.IsCountableSequence("dcba")); + Assert.False(Condition.IsCountableSequence("abda")); + Assert.False(Condition.IsCountableSequence("a")); + Assert.False(Condition.IsCountableSequence(string.Empty)); + Assert.False(Condition.IsCountableSequence((string)null)); + } + + [Fact] + public void DefaultNullAndStringChecks_ShouldReturnExpectedResults() + { + Assert.True(Condition.IsDefault(0)); + Assert.False(Condition.IsDefault(1)); + Assert.True(Condition.IsNotDefault(1)); + Assert.False(Condition.IsNotDefault(0)); + + Assert.True(Condition.IsEmpty(string.Empty)); + Assert.False(Condition.IsEmpty(null)); + Assert.False(Condition.IsEmpty(" ")); + + Assert.True(Condition.IsNull(null)); + Assert.False(Condition.IsNull("value")); + Assert.True(Condition.IsNotNull("value")); + Assert.False(Condition.IsNotNull(null)); + + Assert.True(Condition.IsWhiteSpace(" \t")); + Assert.False(Condition.IsWhiteSpace(" value ")); + Assert.False(Condition.IsWhiteSpace(null)); + } + + [Fact] + public void AddressEnumGuidAndUriChecks_ShouldReturnExpectedResults() + { + var guid = Guid.NewGuid(); + + Assert.True(Condition.IsEmailAddress("user@example.com")); + Assert.False(Condition.IsEmailAddress("invalid-email")); + Assert.False(Condition.IsEmailAddress(" ")); + + Assert.True(Condition.IsEnum("assembly")); + Assert.False(Condition.IsEnum("assembly", o => o.IgnoreCase = false)); + Assert.False(Condition.IsEnum("invalid")); + Assert.False(Condition.IsEnum(" ")); + Assert.False(Condition.IsEnum("1")); + + Assert.True(Condition.IsGuid(guid.ToString("D"))); + Assert.False(Condition.IsGuid(guid.ToString("N"))); + Assert.True(Condition.IsGuid(guid.ToString("N"), GuidFormats.N)); + Assert.True(Condition.IsGuid(guid.ToString("B"), GuidFormats.B)); + Assert.True(Condition.IsGuid(guid.ToString("P"), GuidFormats.P)); + Assert.True(Condition.IsGuid(guid.ToString("X"), GuidFormats.X)); + Assert.False(Condition.IsGuid("invalid", GuidFormats.Any)); + Assert.False(Condition.IsGuid(" ", GuidFormats.Any)); + + Assert.True(Condition.IsProtocolRelativeUrl("//www.cuemon.net/about")); + Assert.True(Condition.IsProtocolRelativeUrl("~www.cuemon.net/about", o => + { + o.RelativeReference = "~"; + o.Protocol = UriScheme.Http; + })); + Assert.False(Condition.IsProtocolRelativeUrl("https://www.cuemon.net/about")); + + Assert.True(Condition.IsUri("https://www.cuemon.net/")); + Assert.True(Condition.IsUri("/about", o => + { + o.Kind = UriKind.Relative; + o.Schemes.Clear(); + })); + Assert.False(Condition.IsUri("not a valid uri")); + } + + [Fact] + public void NumericAndRangeChecks_ShouldReturnExpectedResults() + { + Assert.True(Condition.IsEven(4)); + Assert.False(Condition.IsEven(3)); + Assert.True(Condition.IsOdd(3)); + Assert.False(Condition.IsOdd(4)); + + Assert.True(Condition.IsGreaterThan(5, 4)); + Assert.False(Condition.IsGreaterThan(4, 5)); + Assert.True(Condition.IsGreaterThanOrEqual(5, 5)); + Assert.True(Condition.IsGreaterThanOrEqual(6, 5)); + + Assert.True(Condition.IsLowerThan(4, 5)); + Assert.False(Condition.IsLowerThan(5, 4)); + Assert.True(Condition.IsLowerThanOrEqual(5, 5)); + Assert.True(Condition.IsLowerThanOrEqual(4, 5)); + + Assert.True(Condition.IsWithinRange(5, 1, 10)); + Assert.False(Condition.IsWithinRange(11, 1, 10)); + Assert.True(Condition.IsNotWithinRange(11, 1, 10)); + Assert.False(Condition.IsNotWithinRange(5, 1, 10)); + + Assert.True(Condition.IsNumeric("1,23", NumberStyles.Number, new CultureInfo("da-DK"))); + Assert.True(Condition.IsNumeric("123.45")); + Assert.False(Condition.IsNumeric("NaN")); + Assert.False(Condition.IsNumeric("nan")); + Assert.False(Condition.IsNumeric("Infinity")); + Assert.False(Condition.IsNumeric(" ")); + Assert.False(Condition.IsNumeric("abc")); + } + + [Fact] + public void BooleanAndPrimeChecks_ShouldReturnExpectedResults() + { + var trueCalls = 0; + var falseCalls = 0; + + Assert.True(Condition.IsTrue(true)); + Assert.False(Condition.IsTrue(false)); + Condition.IsTrue(true, () => trueCalls++); + Condition.IsTrue(false, () => trueCalls++); + Assert.Equal(1, trueCalls); + + Assert.True(Condition.IsFalse(false)); + Assert.False(Condition.IsFalse(true)); + Condition.IsFalse(false, () => falseCalls++); + Condition.IsFalse(true, () => falseCalls++); + Assert.Equal(1, falseCalls); + + Assert.Throws(() => Condition.IsTrue(true, null)); + Assert.Throws(() => Condition.IsFalse(false, null)); + + Assert.True(Condition.IsPrime(2)); + Assert.True(Condition.IsPrime(13)); + Assert.False(Condition.IsPrime(1)); + Assert.False(Condition.IsPrime(9)); + Assert.Throws(() => Condition.IsPrime(-1)); + } + + [Fact] + public void TernaryIf_ShouldReturnExpectedResult_ForAllOverloads() + { + Assert.Equal("first", Condition.TernaryIf(true, () => "first", () => "second")); + Assert.Equal("second", Condition.TernaryIf(false, () => "first", () => "second")); + Assert.Equal("value:10", Condition.TernaryIf(true, x => $"value:{x}", x => $"fallback:{x}", 10)); + Assert.Equal("sum:3", Condition.TernaryIf(true, (x, y) => $"sum:{x + y}", (x, y) => $"diff:{x - y}", 1, 2)); + Assert.Equal("mul:24", Condition.TernaryIf(true, (a, b, c) => $"mul:{a * b * c}", (a, b, c) => $"sum:{a + b + c}", 2, 3, 4)); + Assert.Equal("sum:10", Condition.TernaryIf(true, (a, b, c, d) => $"sum:{a + b + c + d}", (a, b, c, d) => $"sum:{a - b - c - d}", 1, 2, 3, 4)); + Assert.Equal("sum:15", Condition.TernaryIf(true, (a, b, c, d, e) => $"sum:{a + b + c + d + e}", (a, b, c, d, e) => $"sum:{a - b - c - d - e}", 1, 2, 3, 4, 5)); + + Assert.Throws(() => Condition.TernaryIf(true, (Func)null, () => "second")); + } + + [Fact] + public void HasDifference_ShouldProvideDifferenceBetweenFirstAndSecond() + { + var sut1 = "Cuemon for .NET"; + var sut2 = "There once was a library named Cuemon for .NET; it is getting better by the day!"; + var sut3 = "XYZ Cuemon for .NET ÆØÅ"; + var sut5 = Condition.HasDifference(sut1, sut2, out var sut4); + var sut6 = Condition.HasDifference(sut1, sut1, out _); + var sut8 = Condition.HasDifference(sut1, sut3, out var sut7); + + TestOutput.WriteLine(sut4); + TestOutput.WriteLine(sut7); + + Assert.Equal("hcwaslibyd;tg!", sut4); + Assert.True(sut5); + Assert.False(sut6); + Assert.Equal("XYZÆØÅ", sut7); + Assert.True(sut8); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/ConvertibleConverterDictionaryTest.cs b/test/Cuemon.Kernel.Tests/ConvertibleConverterDictionaryTest.cs new file mode 100644 index 000000000..b99c3d189 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/ConvertibleConverterDictionaryTest.cs @@ -0,0 +1,168 @@ +using System; +using System.Linq; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class ConvertibleConverterDictionaryTest : Test + { + public ConvertibleConverterDictionaryTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Add_Generic_ShouldRegisterConverter() + { + var sut = new ConvertibleConverterDictionary(); + + var result = sut.Add(i => BitConverter.GetBytes(i)); + var converter = sut[typeof(int)]; + + Assert.Same(sut, result); + Assert.True(sut.ContainsKey(typeof(int))); + Assert.NotNull(converter); + Assert.Equal(BitConverter.GetBytes(42), converter(42)); + } + + [Fact] + public void Add_Type_ShouldRegisterConverter() + { + var sut = new ConvertibleConverterDictionary(); + Func converter = c => BitConverter.GetBytes((double)c); + + var result = sut.Add(typeof(double), converter); + + Assert.Same(sut, result); + Assert.True(sut.ContainsKey(typeof(double))); + Assert.Same(converter, sut[typeof(double)]); + } + + [Fact] + public void Add_Type_ShouldThrowArgumentNullException_WhenTypeIsNull() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.Throws(() => sut.Add(null, _ => Array.Empty())); + } + + [Fact] + public void Add_Type_ShouldThrowArgumentOutOfRangeException_WhenTypeDoesNotImplementIConvertible() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.Throws(() => sut.Add(typeof(object), _ => Array.Empty())); + } + + [Fact] + public void Add_ShouldThrowArgumentException_WhenTypeAlreadyExists() + { + var sut = new ConvertibleConverterDictionary(); + sut.Add(i => BitConverter.GetBytes(i)); + + Assert.Throws(() => sut.Add(typeof(int), _ => Array.Empty())); + } + + [Fact] + public void ContainsKey_ShouldReturnFalse_WhenTypeIsNotRegistered() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.False(sut.ContainsKey(typeof(int))); + } + + [Fact] + public void ContainsKey_ShouldThrowArgumentNullException_WhenKeyIsNull() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.Throws(() => sut.ContainsKey(null)); + } + + [Fact] + public void TryGetValue_ShouldReturnTrueAndConverter_WhenTypeIsRegistered() + { + var sut = new ConvertibleConverterDictionary(); + Func converter = c => BitConverter.GetBytes((long)c); + sut.Add(typeof(long), converter); + + var found = sut.TryGetValue(typeof(long), out var value); + + Assert.True(found); + Assert.Same(converter, value); + } + + [Fact] + public void TryGetValue_ShouldReturnFalseAndNull_WhenTypeIsNotRegistered() + { + var sut = new ConvertibleConverterDictionary(); + + var found = sut.TryGetValue(typeof(long), out var value); + + Assert.False(found); + Assert.Null(value); + } + + [Fact] + public void TryGetValue_ShouldThrowArgumentNullException_WhenKeyIsNull() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.Throws(() => sut.TryGetValue(null, out _)); + } + + [Fact] + public void Indexer_ShouldReturnNull_WhenTypeIsNullOrMissing() + { + var sut = new ConvertibleConverterDictionary(); + + Assert.Null(sut[null]); + Assert.Null(sut[typeof(decimal)]); + } + + [Fact] + public void Keys_Values_And_Count_ShouldReflectRegisteredConverters() + { + var sut = new ConvertibleConverterDictionary() + .Add(i => BitConverter.GetBytes(i)) + .Add(typeof(string), c => c.ToString() == null ? Array.Empty() : System.Text.Encoding.UTF8.GetBytes(c.ToString())); + + Assert.Equal(2, sut.Count); + Assert.Equal(2, sut.Keys.Count()); + Assert.Equal(2, sut.Values.Count()); + Assert.Contains(typeof(int), sut.Keys); + Assert.Contains(typeof(string), sut.Keys); + Assert.All(sut.Values, value => Assert.NotNull(value)); + } + + [Fact] + public void GetEnumerator_ShouldIterateRegisteredConverters() + { + var sut = new ConvertibleConverterDictionary() + .Add(i => BitConverter.GetBytes(i)) + .Add(typeof(double), c => BitConverter.GetBytes((double)c)); + + var items = sut.ToList(); + + Assert.Equal(2, items.Count); + Assert.Contains(items, item => item.Key == typeof(int)); + Assert.Contains(items, item => item.Key == typeof(double)); + Assert.All(items, item => Assert.NotNull(item.Value)); + } + + [Fact] + public void IEnumerableGetEnumerator_ShouldIterateRegisteredConverters() + { + System.Collections.IEnumerable sut = new ConvertibleConverterDictionary() + .Add(i => BitConverter.GetBytes(i)); + + var enumerator = sut.GetEnumerator(); + + Assert.True(enumerator.MoveNext()); + var item = Assert.IsType>>(enumerator.Current); + Assert.Equal(typeof(int), item.Key); + Assert.NotNull(item.Value); + Assert.False(enumerator.MoveNext()); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/ConvertibleTest.cs b/test/Cuemon.Kernel.Tests/ConvertibleTest.cs new file mode 100644 index 000000000..f45051c71 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/ConvertibleTest.cs @@ -0,0 +1,371 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using Cuemon.Text; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class ConvertibleTest : Test + { + public ConvertibleTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Constants_ShouldHaveExpectedValues() + { + Assert.Equal(0, Convertible.NullValue); + Assert.Equal(8, Convertible.BitsPerByte); + Assert.Equal(4, Convertible.BitsPerNibble); + } + + [Fact] + public void RegisterConvertible_ShouldThrowArgumentNullException_WhenConverterIsNull() + { + Assert.Throws(() => Convertible.RegisterConvertible(null)); + } + + [Fact] + public void RegisterConvertible_ShouldUseRegisteredConverter() + { + ClearCustomConverters(); + try + { + Convertible.RegisterConvertible(input => Encoding.UTF8.GetBytes(input.Value)); + var sut = new RegisteredCustomConvertible("custom"); + + var result = Convertible.GetBytes((IConvertible)sut); + + Assert.Equal(Encoding.UTF8.GetBytes("custom"), result); + } + finally + { + ClearCustomConverters(); + } + } + + [Fact] + public void ReverseBits_ShouldReturnExpectedValues() + { + Assert.Equal((byte)0x80, Convertible.ReverseBits8(0x01)); + Assert.Equal((ushort)0x8000, Convertible.ReverseBits16(0x0001)); + Assert.Equal((uint)0x80000000, Convertible.ReverseBits32(0x00000001)); + Assert.Equal(0x8000000000000000UL, Convertible.ReverseBits64(0x0000000000000001UL)); + } + + [Fact] + public void ReverseEndianness_ShouldKeepInput_WhenRequestedByteOrderMatchesPlatform() + { + var bytes = new byte[] { 1, 2, 3, 4 }; + var expected = bytes.ToArray(); + var targetOrder = BitConverter.IsLittleEndian ? Endianness.LittleEndian : Endianness.BigEndian; + + var result = Convertible.ReverseEndianness(bytes, o => o.ByteOrder = targetOrder); + + Assert.Same(bytes, result); + Assert.Equal(expected, result); + } + + [Fact] + public void ReverseEndianness_ShouldReverseInput_WhenRequestedByteOrderDiffersFromPlatform() + { + var bytes = new byte[] { 1, 2, 3, 4 }; + var expected = new byte[] { 4, 3, 2, 1 }; + var targetOrder = BitConverter.IsLittleEndian ? Endianness.BigEndian : Endianness.LittleEndian; + + var result = Convertible.ReverseEndianness(bytes, o => o.ByteOrder = targetOrder); + + Assert.Same(bytes, result); + Assert.Equal(expected, result); + } + + [Fact] + public void GetBytes_IConvertible_ShouldReturnNullValueBytes_WhenInputIsNull() + { + Assert.Equal(BitConverter.GetBytes(Convertible.NullValue), Convertible.GetBytes((IConvertible)null)); + } + + [Fact] + public void GetBytes_IConvertible_ShouldUseLocalConverter_WhenConfigured() + { + var result = Convertible.GetBytes((IConvertible)42, o => o.Converters.Add(typeof(int), _ => new byte[] { 9, 8, 7 })); + + Assert.Equal(new byte[] { 9, 8, 7 }, result); + } + + [Fact] + public void GetBytes_IConvertible_ShouldUsePrimitiveConverter() + { + var input = 0x01020304; + var result = Convertible.GetBytes((IConvertible)input, o => o.ByteOrder = Endianness.BigEndian); + var expected = BitConverter.GetBytes(input); + if (BitConverter.IsLittleEndian) { Array.Reverse(expected); } + + Assert.Equal(expected, result); + } + + [Fact] + public void GetBytes_IConvertible_ShouldUseEnumConverter() + { + Enum input = UInt16Enum.One; + + var result = Convertible.GetBytes((IConvertible)input, o => o.ByteOrder = Endianness.BigEndian); + var expected = Convertible.GetBytes(input, o => o.ByteOrder = Endianness.BigEndian); + + Assert.Equal(expected, result); + } + + [Fact] + public void GetBytes_IConvertible_ShouldUseKnownNonPrimitiveConverters() + { + var dateTime = new DateTime(2024, 1, 2, 3, 4, 5, DateTimeKind.Utc); + const string text = "kernel"; + const decimal number = 12.34m; + + Assert.Equal(Convertible.GetBytes(text), Convertible.GetBytes((IConvertible)text)); + Assert.Equal(Convertible.GetBytes(dateTime), Convertible.GetBytes((IConvertible)dateTime)); + Assert.Equal(Convertible.GetBytes(number), Convertible.GetBytes((IConvertible)number)); + Assert.Equal(Convertible.GetBytes(DBNull.Value), Convertible.GetBytes((IConvertible)DBNull.Value)); + } + + [Fact] + public void GetBytes_IConvertible_ShouldThrowArgumentOutOfRangeException_WhenConverterIsUnknown() + { + ClearCustomConverters(); + var input = new UnregisteredCustomConvertible("unknown"); + + var ex = Assert.Throws(() => Convertible.GetBytes((IConvertible)input)); + + Assert.Equal("input", ex.ParamName); + Assert.Same(input, ex.ActualValue); + } + + [Fact] + public void GetBytes_Enumerable_ShouldAggregateAllValues() + { + IEnumerable input = new IConvertible[] { 1, "A", null, UInt16Enum.One }; + + var result = Convertible.GetBytes(input); + var expected = Convertible.GetBytes(1) + .Concat(Convertible.GetBytes("A")) + .Concat(BitConverter.GetBytes(Convertible.NullValue)) + .Concat(Convertible.GetBytes((Enum)UInt16Enum.One)) + .ToArray(); + + Assert.Equal(expected, result); + } + + [Fact] + public void GetBytes_PrimitiveOverloads_ShouldReturnExpectedBytes() + { + Assert.Equal(BitConverter.GetBytes(true), Convertible.GetBytes(true)); + Assert.Equal(new byte[] { 0x2A }, Convertible.GetBytes((byte)0x2A)); + Assert.Equal(BitConverter.GetBytes('K'), Convertible.GetBytes('K')); + Assert.Equal(BitConverter.GetBytes(123.456d), Convertible.GetBytes(123.456d)); + Assert.Equal(BitConverter.GetBytes((short)-1234), Convertible.GetBytes((short)-1234)); + Assert.Equal(BitConverter.GetBytes(123456), Convertible.GetBytes(123456)); + Assert.Equal(BitConverter.GetBytes(1234567890123L), Convertible.GetBytes(1234567890123L)); + Assert.NotEmpty(Convertible.GetBytes((sbyte)-12)); + Assert.Equal(BitConverter.GetBytes(3.14f), Convertible.GetBytes(3.14f)); + Assert.Equal(BitConverter.GetBytes((ushort)65000), Convertible.GetBytes((ushort)65000)); + Assert.Equal(BitConverter.GetBytes((uint)1234567890), Convertible.GetBytes((uint)1234567890)); + Assert.Equal(BitConverter.GetBytes((ulong)1234567890123456789), Convertible.GetBytes((ulong)1234567890123456789)); + } + + [Fact] + public void GetBytes_String_ShouldRespectPreambleConfiguration() + { + var text = "abc"; + + var keep = Convertible.GetBytes(text, o => + { + o.Encoding = Encoding.UTF8; + o.Preamble = PreambleSequence.Keep; + }); + var remove = Convertible.GetBytes(text, o => + { + o.Encoding = Encoding.UTF8; + o.Preamble = PreambleSequence.Remove; + }); + + Assert.Equal(Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes(text)).ToArray(), keep); + Assert.Equal(Encoding.UTF8.GetBytes(text), remove); + } + + [Fact] + public void GetBytes_String_ShouldThrowArgumentNullException_WhenInputIsNull() + { + Assert.Throws(() => Convertible.GetBytes((string)null)); + } + + [Fact] + public void GetBytes_String_ShouldThrowInvalidEnumArgumentException_WhenPreambleIsInvalid() + { + Assert.Throws(() => Convertible.GetBytes("abc", o => o.Preamble = (PreambleSequence)42)); + } + + [Fact] + public void GetBytes_DateTime_Decimal_AndDBNull_ShouldReturnExpectedBytes() + { + var dateTime = new DateTime(2024, 2, 3, 4, 5, 6, DateTimeKind.Utc); + var expectedDateTime = Encoding.ASCII.GetBytes(dateTime.ToString("u", CultureInfo.InvariantCulture)); + var expectedDecimal = Encoding.ASCII.GetBytes(12.34m.ToString(CultureInfo.InvariantCulture)); + + Assert.Equal(expectedDateTime, Convertible.GetBytes(dateTime)); + Assert.Equal(expectedDecimal, Convertible.GetBytes(12.34m)); + Assert.Equal(BitConverter.GetBytes(Convertible.NullValue), Convertible.GetBytes(DBNull.Value)); + } + + [Fact] + public void GetBytes_Enum_ShouldCoverUnderlyingTypeBranches() + { + Assert.Equal(Convertible.GetBytes((byte)1), Convertible.GetBytes((Enum)ByteEnum.One)); + Assert.Equal(Convertible.GetBytes((short)1), Convertible.GetBytes((Enum)Int16Enum.One)); + Assert.Equal(Convertible.GetBytes(1), Convertible.GetBytes((Enum)Int32Enum.One)); + Assert.Equal(Convertible.GetBytes((long)1), Convertible.GetBytes((Enum)Int64Enum.One)); + Assert.Equal(Convertible.GetBytes((sbyte)1), Convertible.GetBytes((Enum)SByteEnum.One)); + Assert.Equal(Convertible.GetBytes((ushort)1), Convertible.GetBytes((Enum)UInt16Enum.One)); + Assert.Equal(Convertible.GetBytes((uint)1), Convertible.GetBytes((Enum)UInt32Enum.One)); + Assert.Equal(Convertible.GetBytes((ulong)1), Convertible.GetBytes((Enum)UInt64Enum.One)); + } + + [Fact] + public void ToString_ShouldThrowArgumentNullException_WhenInputIsNull() + { + Assert.Throws(() => Convertible.ToString(null)); + } + + [Fact] + public void ToString_ShouldDetectEncodingAndRemovePreambleByDefault() + { + var expected = "hello world"; + var bytes = Encoding.Unicode.GetPreamble().Concat(Encoding.Unicode.GetBytes(expected)).ToArray(); + + var result = Convertible.ToString(bytes); + + Assert.Equal(expected, result); + } + + [Fact] + public void ToString_ShouldRespectPreambleConfiguration() + { + const string expected = "payload"; + var bytes = Encoding.UTF8.GetPreamble().Concat(Encoding.UTF8.GetBytes(expected)).ToArray(); + + var keep = Convertible.ToString(bytes, o => + { + o.Encoding = Encoding.UTF8; + o.Preamble = PreambleSequence.Keep; + }); + var remove = Convertible.ToString(bytes, o => + { + o.Encoding = Encoding.UTF8; + o.Preamble = PreambleSequence.Remove; + }); + + Assert.Equal("\uFEFF" + expected, keep); + Assert.Equal(expected, remove); + } + + [Fact] + public void ToString_ShouldThrowInvalidEnumArgumentException_WhenPreambleIsInvalid() + { + Assert.Throws(() => Convertible.ToString(Encoding.UTF8.GetBytes("abc"), o => o.Preamble = (PreambleSequence)42)); + } + + private sealed class RegisteredCustomConvertible : ConvertibleBase + { + public RegisteredCustomConvertible(string value) + { + Value = value; + } + + public string Value { get; } + } + + private sealed class UnregisteredCustomConvertible : ConvertibleBase + { + public UnregisteredCustomConvertible(string value) + { + Value = value; + } + + public string Value { get; } + } + + private abstract class ConvertibleBase : IConvertible + { + public virtual TypeCode GetTypeCode() => TypeCode.Object; + public virtual bool ToBoolean(IFormatProvider provider) => throw new NotImplementedException(); + public virtual byte ToByte(IFormatProvider provider) => throw new NotImplementedException(); + public virtual char ToChar(IFormatProvider provider) => throw new NotImplementedException(); + public virtual DateTime ToDateTime(IFormatProvider provider) => throw new NotImplementedException(); + public virtual decimal ToDecimal(IFormatProvider provider) => throw new NotImplementedException(); + public virtual double ToDouble(IFormatProvider provider) => throw new NotImplementedException(); + public virtual short ToInt16(IFormatProvider provider) => throw new NotImplementedException(); + public virtual int ToInt32(IFormatProvider provider) => throw new NotImplementedException(); + public virtual long ToInt64(IFormatProvider provider) => throw new NotImplementedException(); + public virtual sbyte ToSByte(IFormatProvider provider) => throw new NotImplementedException(); + public virtual float ToSingle(IFormatProvider provider) => throw new NotImplementedException(); + public virtual string ToString(IFormatProvider provider) => base.ToString(); + public virtual object ToType(Type conversionType, IFormatProvider provider) => throw new NotImplementedException(); + public virtual ushort ToUInt16(IFormatProvider provider) => throw new NotImplementedException(); + public virtual uint ToUInt32(IFormatProvider provider) => throw new NotImplementedException(); + public virtual ulong ToUInt64(IFormatProvider provider) => throw new NotImplementedException(); + } + + private enum ByteEnum : byte + { + One = 1 + } + + private enum Int16Enum : short + { + One = 1 + } + + private enum Int32Enum + { + One = 1 + } + + private enum Int64Enum : long + { + One = 1 + } + + private enum SByteEnum : sbyte + { + One = 1 + } + + private enum UInt16Enum : ushort + { + One = 1 + } + + private enum UInt32Enum : uint + { + One = 1 + } + + private enum UInt64Enum : ulong + { + One = 1 + } + + private static void ClearCustomConverters() + { + var field = typeof(Convertible).GetField("ByteArrayConverters", BindingFlags.Static | BindingFlags.NonPublic); + var converters = Assert.IsType>>(field?.GetValue(null)); + converters.Remove(typeof(RegisteredCustomConvertible)); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/Cuemon.Kernel.Tests.csproj b/test/Cuemon.Kernel.Tests/Cuemon.Kernel.Tests.csproj new file mode 100644 index 000000000..6658abe12 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Cuemon.Kernel.Tests.csproj @@ -0,0 +1,11 @@ + + + + Cuemon + + + + + + + diff --git a/test/Cuemon.Kernel.Tests/DecoratorTest.cs b/test/Cuemon.Kernel.Tests/DecoratorTest.cs new file mode 100644 index 000000000..40cae121c --- /dev/null +++ b/test/Cuemon.Kernel.Tests/DecoratorTest.cs @@ -0,0 +1,109 @@ +using System; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class DecoratorTest : Test + { + public DecoratorTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Enclose_ShouldWrapValue() + { + var value = "cuemon"; + + var sut = Decorator.Enclose(value); + + Assert.IsAssignableFrom>(sut); + Assert.Equal(value, sut.Inner); + Assert.Null(sut.ArgumentName); + } + + [Fact] + public void Enclose_ShouldThrowArgumentNullException_WhenInnerIsNull() + { + string value = null; + + var ex = Assert.Throws(() => Decorator.Enclose(value)); + + Assert.Equal("inner", ex.ParamName); + Assert.Contains("Value cannot be null.", ex.Message); + } + + [Fact] + public void Enclose_ShouldAllowNull_WhenThrowIfNullIsFalse() + { + string value = null; + + var sut = Decorator.Enclose(value, false); + + Assert.Null(sut.Inner); + Assert.Null(sut.ArgumentName); + } + + [Fact] + public void RawEnclose_ShouldWrapValueWithoutNullCheck() + { + string value = null; + + var sut = Decorator.RawEnclose(value); + + Assert.Null(sut.Inner); + Assert.Null(sut.ArgumentName); + } + + [Fact] + public void EncloseToExpose_ShouldCaptureArgumentName() + { + var value = "cuemon"; + + var sut = Decorator.EncloseToExpose(value); + + Assert.Equal(value, sut.Inner); + Assert.Equal(nameof(value), sut.ArgumentName); + } + + [Fact] + public void EncloseToExpose_ShouldThrowArgumentNullException_WithCapturedArgumentName() + { + string value = null; + + var ex = Assert.Throws(() => Decorator.EncloseToExpose(value)); + + Assert.Equal(nameof(value), ex.ParamName); + Assert.Contains("Value cannot be null.", ex.Message); + } + + [Fact] + public void EncloseToExpose_ShouldAllowNull_WhenThrowIfNullIsFalse() + { + string value = null; + + var sut = Decorator.EncloseToExpose(value, false); + + Assert.Null(sut.Inner); + Assert.Equal(nameof(value), sut.ArgumentName); + } + + [Fact] + public void Syntactic_ShouldReturnDecoratorWithDefaultInner() + { + var sut = Decorator.Syntactic(); + + Assert.Null(sut.Inner); + Assert.Null(sut.ArgumentName); + } + + [Fact] + public void Syntactic_ShouldReturnDecoratorWithDefaultValueTypeInner() + { + var sut = Decorator.Syntactic(); + + Assert.Equal(default, sut.Inner); + Assert.Null(sut.ArgumentName); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/DisposableOptionsTest.cs b/test/Cuemon.Kernel.Tests/DisposableOptionsTest.cs new file mode 100644 index 000000000..d0ee65e8c --- /dev/null +++ b/test/Cuemon.Kernel.Tests/DisposableOptionsTest.cs @@ -0,0 +1,33 @@ +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class DisposableOptionsTest : Test + { + public DisposableOptionsTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldSetLeaveOpenToFalse() + { + var sut = new DisposableOptions(); + + Assert.False(sut.LeaveOpen); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void LeaveOpen_ShouldBeSettable(bool value) + { + var sut = new DisposableOptions + { + LeaveOpen = value + }; + + Assert.Equal(value, sut.LeaveOpen); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/DisposableTest.cs b/test/Cuemon.Kernel.Tests/DisposableTest.cs new file mode 100644 index 000000000..d815e379b --- /dev/null +++ b/test/Cuemon.Kernel.Tests/DisposableTest.cs @@ -0,0 +1,74 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Cuemon.Assets; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class DisposableTest : Test + { + public DisposableTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Dispose_ShouldSetDisposedAndInvokeManagedResourcesOnce() + { + var sut = new ManagedOnlyDisposable(); + + Assert.False(sut.Disposed); + + sut.Dispose(); + sut.Dispose(); + + Assert.True(sut.Disposed); + Assert.Equal(1, sut.ManagedDisposeCount); + } + + [Fact] + public void DisposeCore_ShouldOnlyInvokeUnmanagedResourcesWhenDisposingIsFalse() + { + var sut = new TrackingDisposable(); + + sut.DisposeCore(false); + + Assert.True(sut.Disposed); + Assert.Equal(0, sut.ManagedDisposeCount); + Assert.Equal(1, sut.UnmanagedDisposeCount); + } + + [Fact] + public void Dispose_ShouldInvokeManagedAndUnmanagedResourcesWhenDisposingIsTrue() + { + var sut = new TrackingDisposable(); + + sut.Dispose(); + + Assert.True(sut.Disposed); + Assert.Equal(1, sut.ManagedDisposeCount); + Assert.Equal(1, sut.UnmanagedDisposeCount); + } + + [Fact] + public async Task Dispose_ShouldBeThreadSafeAndInvokeCallbacksOnce() + { + using var managedStarted = new ManualResetEventSlim(); + using var continueDisposal = new ManualResetEventSlim(); + var sut = new BlockingDisposable(managedStarted, continueDisposal); + + var first = Task.Run(() => sut.Dispose()); + Assert.True(managedStarted.Wait(TimeSpan.FromSeconds(5))); + + var second = Task.Run(() => sut.Dispose()); + continueDisposal.Set(); + + await Task.WhenAll(first, second); + + Assert.True(sut.Disposed); + Assert.Equal(1, sut.ManagedDisposeCount); + Assert.Equal(1, sut.UnmanagedDisposeCount); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/ExceptionConditionTest.cs b/test/Cuemon.Kernel.Tests/ExceptionConditionTest.cs new file mode 100644 index 000000000..69029ccf2 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/ExceptionConditionTest.cs @@ -0,0 +1,202 @@ +using System; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class ExceptionConditionTest : Test + { + public ExceptionConditionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void IsTrue_ShouldThrowArgumentNullException_WhenConditionIsNull() + { + var sut = new ExceptionCondition(); + + Assert.Throws(() => sut.IsTrue((Func)null)); + Assert.Throws(() => sut.IsTrue(null)); + } + + [Fact] + public void IsFalse_ShouldThrowArgumentNullException_WhenConditionIsNull() + { + var sut = new ExceptionCondition(); + + Assert.Throws(() => sut.IsFalse((Func)null)); + Assert.Throws(() => sut.IsFalse(null)); + } + + [Fact] + public void Create_ShouldThrowArgumentNullException_WhenHandlerIsNull() + { + var sut = new ExceptionCondition(); + TesterFunc condition = (out string result) => + { + result = "value"; + return true; + }; + + Assert.Throws(() => sut.IsTrue(() => true).Create(null)); + Assert.Throws(() => sut.IsTrue(condition).Create(null)); + } + + [Fact] + public void TryThrow_ShouldThrow_WhenIsTrueConditionMatchesExpectedValue() + { + var invoked = false; + var sut = new ExceptionCondition() + .IsTrue(() => true) + .Create(() => + { + invoked = true; + return new InvalidOperationException("boom"); + }); + + var ex = Assert.Throws(() => sut.TryThrow()); + + Assert.True(invoked); + Assert.Equal("boom", ex.Message); + } + + [Fact] + public void TryThrow_ShouldNotThrow_WhenIsTrueConditionDoesNotMatchExpectedValue() + { + var invoked = false; + var sut = new ExceptionCondition() + .IsTrue(() => false) + .Create(() => + { + invoked = true; + return new InvalidOperationException(); + }); + + sut.TryThrow(); + + Assert.False(invoked); + } + + [Fact] + public void TryThrow_ShouldThrow_WhenIsFalseConditionMatchesExpectedValue() + { + var invoked = false; + var sut = new ExceptionCondition() + .IsFalse(() => false) + .Create(() => + { + invoked = true; + return new ArgumentException("boom"); + }); + + var ex = Assert.Throws(() => sut.TryThrow()); + + Assert.True(invoked); + Assert.Equal("boom", ex.Message); + } + + [Fact] + public void TryThrow_ShouldNotThrow_WhenIsFalseConditionDoesNotMatchExpectedValue() + { + var invoked = false; + var sut = new ExceptionCondition() + .IsFalse(() => true) + .Create(() => + { + invoked = true; + return new ArgumentException(); + }); + + sut.TryThrow(); + + Assert.False(invoked); + } + + [Fact] + public void TryThrow_ShouldPassTesterResultToHandler_WhenIsTrueMatchesExpectedValue() + { + var invoked = false; + TesterFunc condition = (out string result) => + { + result = "value"; + return true; + }; + + var sut = new ExceptionCondition() + .IsTrue(condition) + .Create(result => + { + invoked = true; + return new InvalidOperationException(result); + }); + + var ex = Assert.Throws(() => sut.TryThrow()); + + Assert.True(invoked); + Assert.Equal("value", ex.Message); + } + + [Fact] + public void TryThrow_ShouldPassTesterResultToHandler_WhenIsFalseMatchesExpectedValue() + { + var invoked = false; + TesterFunc condition = (out string result) => + { + result = "value"; + return false; + }; + + var sut = new ExceptionCondition() + .IsFalse(condition) + .Create(result => + { + invoked = true; + return new InvalidOperationException(result); + }); + + var ex = Assert.Throws(() => sut.TryThrow()); + + Assert.True(invoked); + Assert.Equal("value", ex.Message); + } + + [Fact] + public void TryThrow_ShouldNotInvokeHandler_WhenTesterConditionDoesNotMatchExpectedValue() + { + var isTrueInvoked = false; + var isFalseInvoked = false; + TesterFunc isTrueCondition = (out string result) => + { + result = "value"; + return false; + }; + TesterFunc isFalseCondition = (out string result) => + { + result = "value"; + return true; + }; + + var isTrue = new ExceptionCondition() + .IsTrue(isTrueCondition) + .Create(result => + { + isTrueInvoked = true; + return new InvalidOperationException(result); + }); + + var isFalse = new ExceptionCondition() + .IsFalse(isFalseCondition) + .Create(result => + { + isFalseInvoked = true; + return new InvalidOperationException(result); + }); + + isTrue.TryThrow(); + isFalse.TryThrow(); + + Assert.False(isTrueInvoked); + Assert.False(isFalseInvoked); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/FinalizeDisposableTest.cs b/test/Cuemon.Kernel.Tests/FinalizeDisposableTest.cs new file mode 100644 index 000000000..8f74a28b8 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/FinalizeDisposableTest.cs @@ -0,0 +1,76 @@ +using System; +using System.Threading; +using Cuemon.Assets; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class FinalizeDisposableTest : Test + { + public FinalizeDisposableTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Dispose_ShouldSetDisposedAndInvokeUnmanagedResources() + { + TrackingFinalizeDisposable.Reset(); + var sut = new TrackingFinalizeDisposable(); + + sut.Dispose(); + + Assert.True(sut.Disposed); + Assert.Equal(1, TrackingFinalizeDisposable.UnmanagedDisposeCount); + } + + [Fact] + public void DisposeCore_ShouldSetDisposedAndInvokeUnmanagedResourcesWhenDisposingIsFalse() + { + TrackingFinalizeDisposable.Reset(); + var sut = new TrackingFinalizeDisposable(); + + sut.DisposeCore(false); + + Assert.True(sut.Disposed); + Assert.Equal(1, TrackingFinalizeDisposable.UnmanagedDisposeCount); + } + + [Fact] + public void Finalizer_ShouldInvokeUnmanagedResources() + { + TrackingFinalizeDisposable.Reset(); + CreateFinalizableInstance(); + + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + GC.WaitForPendingFinalizers(); + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + + Assert.True(SpinWait.SpinUntil(() => TrackingFinalizeDisposable.UnmanagedDisposeCount == 1, TimeSpan.FromSeconds(5))); + } + + [Fact] + public void Dispose_ShouldSuppressFinalizer() + { + TrackingFinalizeDisposable.Reset(); + CreateDisposedInstance(); + + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + GC.WaitForPendingFinalizers(); + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + + Assert.Equal(1, TrackingFinalizeDisposable.UnmanagedDisposeCount); + } + + private static void CreateFinalizableInstance() + { + _ = new TrackingFinalizeDisposable(); + } + + private static void CreateDisposedInstance() + { + var sut = new TrackingFinalizeDisposable(); + sut.Dispose(); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/PatternsTest.cs b/test/Cuemon.Kernel.Tests/PatternsTest.cs new file mode 100644 index 000000000..81dd3a5d1 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/PatternsTest.cs @@ -0,0 +1,398 @@ +using Codebelt.Extensions.Xunit; +using Cuemon.Assets; +using Cuemon.Configuration; +using Cuemon.Text; +using Cuemon.Threading; +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using Xunit; + +namespace Cuemon +{ + public class PatternsTest : Test + { + public PatternsTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Configure_ShouldInitializeDefaultInstance() + { + Action sut = null; + var ao = new AsyncOptions(); + + var options = Patterns.Configure(sut); + + Assert.NotNull(options); + Assert.IsType(options); + Assert.Equal(ao.CancellationToken, options.CancellationToken); + } + + [Fact] + public void Configure_ShouldInvokeInitializerSetupAndValidatorInOrder() + { + var calls = new System.Collections.Generic.List(); + + var options = Patterns.Configure( + setup => + { + calls.Add("setup"); + setup.CancellationTokenProvider = () => new System.Threading.CancellationToken(true); + }, + initializer => + { + calls.Add("initializer"); + initializer.CancellationToken = System.Threading.CancellationToken.None; + }, + validator => + { + calls.Add("validator"); + Assert.True(validator.CancellationToken.IsCancellationRequested); + }); + + Assert.Equal(new[] { "initializer", "setup", "validator" }, calls); + Assert.True(options.CancellationToken.IsCancellationRequested); + } + + [Fact] + public void ConfigureExchange_ShouldSwapOptions_VerifyDefaultValues() + { + Action sut1 = null; + var sut2 = Patterns.ConfigureExchange(sut1); + + var o1 = Patterns.Configure(sut1); + var o2 = Patterns.Configure(sut2); + + Assert.NotNull(o1); + Assert.NotNull(o2); + Assert.IsType(o1); + Assert.IsType(o2); + Assert.Equal(o1.Encoding, o2.Encoding); + Assert.Equal(o1.Preamble, o2.Preamble); + } + + [Fact] + public void ConfigureExchange_ShouldUseCustomInitializer_AndThrowWhenNoMatchingProperties() + { + var exchange = Patterns.ConfigureExchange( + setup => setup.Encoding = Encoding.UTF32, + (source, target) => + { + target.Name = source.Encoding.WebName; + target.Flag = source.Preamble == PreambleSequence.Remove; + }); + + var custom = new PatternsExchangeProbe(); + exchange(custom); + + Assert.Equal(Encoding.UTF32.WebName, custom.Name); + Assert.True(custom.Flag); + + var failingExchange = Patterns.ConfigureExchange(setup => { }); + + var ex = Assert.Throws(() => failingExchange(new PatternsNoMatchProbe())); + Assert.StartsWith("Unable to use default converter for exchange of TSource", ex.Message); + } + + [Fact] + public void ConfigureRevert_ShouldReturnDelegateThatProducesEquivalentOptions() + { + var original = Patterns.Configure(o => o.Encoding = Encoding.UTF32); + var revertDelegate = Patterns.ConfigureRevert(original); + var reverted = Patterns.Configure(revertDelegate); + + Assert.Equal(original.Encoding, reverted.Encoding); + Assert.Equal(original.Preamble, reverted.Preamble); + } + + [Fact] + public void ConfigureRevert_ShouldThrowArgumentNullException_WhenOptionsIsNull() + { + var ex = Assert.Throws(() => Patterns.ConfigureRevert(null)); + + Assert.Equal("options", ex.ParamName); + } + + [Fact] + public void ConfigureRevertExchange_ShouldExchangeAndRevertOptions() + { + var original = Patterns.Configure(o => o.Encoding = Encoding.UTF32); + var exchangeDelegate = Patterns.ConfigureRevertExchange(original); + var result = Patterns.Configure(exchangeDelegate); + + Assert.Equal(Encoding.UTF32, result.Encoding); + Assert.Equal(original.Preamble, result.Preamble); + } + + [Fact] + public void ConfigureRevertExchange_ShouldUseCustomInitializer_AndThrowArgumentNullException_WhenOptionsIsNull() + { + var original = Patterns.Configure(o => o.Encoding = Encoding.Unicode); + var exchangeDelegate = Patterns.ConfigureRevertExchange( + original, + (source, target) => target.Name = source.Encoding.WebName); + + var result = new PatternsExchangeProbe(); + exchangeDelegate(result); + + Assert.Equal(Encoding.Unicode.WebName, result.Name); + + var ex = Assert.Throws(() => Patterns.ConfigureRevertExchange(null)); + Assert.Equal("options", ex.ParamName); + } + + [Fact] + public void CreateInstance_ShouldInitializeWithFactory() + { + var sut = Patterns.CreateInstance(o => o.Encoding = Encoding.UTF32); + + Assert.NotNull(sut); + Assert.Equal(Encoding.UTF32, sut.Encoding); + } + + [Fact] + public void CreateInstance_ShouldCreateDefaultInstance_WhenFactoryIsNull() + { + var defaults = new AsyncEncodingOptions(); + var sut = Patterns.CreateInstance(null); + + Assert.NotNull(sut); + Assert.Equal(defaults.Encoding, sut.Encoding); + Assert.Equal(defaults.Preamble, sut.Preamble); + } + + [Fact] + public void TryInvoke_ShouldReturnTrue_WhenActionSucceeds() + { + var invoked = false; + + var result = Patterns.TryInvoke(() => { invoked = true; }); + + Assert.True(result); + Assert.True(invoked); + } + + [Fact] + public void TryInvoke_ShouldReturnFalse_WhenActionThrows() + { + var result = Patterns.TryInvoke(() => throw new InvalidOperationException()); + + Assert.False(result); + } + + [Fact] + public void TryInvoke_ShouldReturnFalse_WhenActionIsNull_AndRethrowFatalExceptions() + { + Assert.False(Patterns.TryInvoke(null)); + Assert.Throws(() => Patterns.TryInvoke(() => throw new OutOfMemoryException())); + } + + [Fact] + public void TryInvoke_ShouldReturnTrueAndResult_WhenFuncSucceeds() + { + var result = Patterns.TryInvoke(() => 42, out var value); + + Assert.True(result); + Assert.Equal(42, value); + } + + [Fact] + public void TryInvoke_ShouldReturnFalseAndDefault_WhenFuncThrows() + { + var result = Patterns.TryInvoke(() => throw new InvalidOperationException(), out var value); + + Assert.False(result); + Assert.Equal(default, value); + } + + [Fact] + public void TryInvoke_ShouldHandleNullFunc_AndRethrowFatalExceptions() + { + var nullResult = Patterns.TryInvoke(null, out var nullValue); + + Assert.False(nullResult); + Assert.Equal(default, nullValue); + + Assert.Throws(() => Patterns.TryInvoke(() => throw new OutOfMemoryException(), out _)); + } + + [Fact] + public void InvokeOrDefault_ShouldReturnResult_WhenMethodSucceeds() + { + var result = Patterns.InvokeOrDefault(() => 42); + + Assert.Equal(42, result); + } + + [Fact] + public void InvokeOrDefault_ShouldReturnFallback_WhenMethodThrows() + { + var result = Patterns.InvokeOrDefault(() => throw new InvalidOperationException(), -1); + + Assert.Equal(-1, result); + } + + [Fact] + public void InvokeOrDefault_ShouldReturnFallback_WhenMethodIsNull() + { + Assert.Equal(-1, Patterns.InvokeOrDefault(null, -1)); + } + + [Fact] + public void IsFatalException_ShouldReturnTrue_WhenExceptionIsFatal() + { + Assert.True(Patterns.IsFatalException(new OutOfMemoryException())); + Assert.True(Patterns.IsFatalException(new StackOverflowException())); + Assert.True(Patterns.IsFatalException(new AccessViolationException())); + Assert.True(Patterns.IsFatalException(new SEHException())); + Assert.True(Patterns.IsFatalException(new ThreadInterruptedException())); +#pragma warning disable CS0618 + Assert.True(Patterns.IsFatalException(new ExecutionEngineException())); +#pragma warning restore CS0618 + } + + [Fact] + public void IsFatalException_ShouldReturnFalse_WhenExceptionIsNotFatal() + { + Assert.False(Patterns.IsFatalException(new InvalidOperationException())); + Assert.False(Patterns.IsFatalException(new ArgumentNullException())); + Assert.False(Patterns.IsFatalException(new NotSupportedException())); + Assert.False(Patterns.IsFatalException(null)); + } + + [Fact] + public void IsRecoverableException_ShouldReturnTrue_WhenExceptionIsNotFatal() + { + Assert.True(Patterns.IsRecoverableException(new InvalidOperationException())); + Assert.True(Patterns.IsRecoverableException(new ArgumentNullException())); + Assert.True(Patterns.IsRecoverableException(new NotSupportedException())); + } + + [Fact] + public void IsRecoverableException_ShouldReturnFalse_WhenExceptionIsFatal() + { + Assert.False(Patterns.IsRecoverableException(new OutOfMemoryException())); + Assert.False(Patterns.IsRecoverableException(new StackOverflowException())); + Assert.False(Patterns.IsRecoverableException(new AccessViolationException())); + Assert.False(Patterns.IsRecoverableException(new SEHException())); + } + + [Fact] + public void Use_ShouldReturnSingletonInstance() + { + Assert.Same(Patterns.Use, Patterns.Use); + } + + [Fact] + public void SafeInvoke_ShouldReturnResult_WhenTesterSucceeds() + { + using var result = Patterns.SafeInvoke( + () => new MemoryStream(new byte[] { 1, 2, 3 }), + ms => ms); + + Assert.NotNull(result); + Assert.Equal(3, result.Length); + } + + [Fact] + public void SafeInvoke_ShouldReturnNull_AndInvokeCatcher_WhenTesterThrows() + { + Exception caught = null; + + var result = Patterns.SafeInvoke( + () => new MemoryStream(), + _ => throw new InvalidOperationException("tester failure"), + ex => caught = ex); + + Assert.Null(result); + Assert.NotNull(caught); + Assert.IsType(caught); + Assert.Equal("tester failure", caught.Message); + } + + [Fact] + public void SafeInvoke_ShouldValidateDelegates_AndRethrowWithoutCatcher() + { + Assert.Throws(() => Patterns.SafeInvoke(null, stream => stream)); + Assert.Throws(() => Patterns.SafeInvoke(() => new MemoryStream(), (Func)null)); + Assert.Throws(() => Patterns.SafeInvoke(() => new MemoryStream(), _ => throw new InvalidOperationException("boom"))); + } + + [Fact] + public void SafeInvoke_ShouldCoverGenericOverloads_WithSuccessAndCatcherPaths() + { + using var one = Patterns.SafeInvoke(() => new MemoryStream(), (stream, factor) => + { + stream.WriteByte((byte)factor); + stream.Position = 0; + return stream; + }, 2); + Assert.Equal(1, one.Length); + + using var two = Patterns.SafeInvoke(() => new MemoryStream(), (stream, a, b) => + { + stream.WriteByte((byte)(a + b)); + stream.Position = 0; + return stream; + }, 2, 3); + Assert.Equal(1, two.Length); + + using var three = Patterns.SafeInvoke(() => new MemoryStream(), (stream, a, b, c) => + { + stream.WriteByte((byte)(a + b + c)); + stream.Position = 0; + return stream; + }, 1, 2, 3); + Assert.Equal(1, three.Length); + + using var four = Patterns.SafeInvoke(() => new MemoryStream(), (stream, a, b, c, d) => + { + stream.WriteByte((byte)(a + b + c + d)); + stream.Position = 0; + return stream; + }, 1, 2, 3, 4); + Assert.Equal(1, four.Length); + + using var five = Patterns.SafeInvoke(() => new MemoryStream(), (stream, a, b, c, d, e) => + { + stream.WriteByte((byte)(a + b + c + d + e)); + stream.Position = 0; + return stream; + }, 1, 2, 3, 4, 5); + Assert.Equal(1, five.Length); + + Exception oneCaught = null; + Exception twoCaught = null; + Exception threeCaught = null; + Exception fourCaught = null; + Exception fiveCaught = null; + + Assert.Null(Patterns.SafeInvoke(() => new MemoryStream(), (MemoryStream stream, int arg) => throw new InvalidOperationException($"one:{arg}"), 7, (ex, arg) => oneCaught = new InvalidOperationException($"{ex.Message}:{arg}"))); + Assert.Null(Patterns.SafeInvoke(() => new MemoryStream(), (MemoryStream stream, int a, int b) => throw new InvalidOperationException($"two:{a + b}"), 2, 3, (ex, a, b) => twoCaught = new InvalidOperationException($"{ex.Message}:{a}:{b}"))); + Assert.Null(Patterns.SafeInvoke(() => new MemoryStream(), (MemoryStream stream, int a, int b, int c) => throw new InvalidOperationException($"three:{a + b + c}"), 1, 2, 3, (ex, a, b, c) => threeCaught = new InvalidOperationException($"{ex.Message}:{a}:{b}:{c}"))); + Assert.Null(Patterns.SafeInvoke(() => new MemoryStream(), (MemoryStream stream, int a, int b, int c, int d) => throw new InvalidOperationException($"four:{a + b + c + d}"), 1, 2, 3, 4, (ex, a, b, c, d) => fourCaught = new InvalidOperationException($"{ex.Message}:{a}:{b}:{c}:{d}"))); + Assert.Null(Patterns.SafeInvoke(() => new MemoryStream(), (MemoryStream stream, int a, int b, int c, int d, int e) => throw new InvalidOperationException($"five:{a + b + c + d + e}"), 1, 2, 3, 4, 5, (ex, a, b, c, d, e) => fiveCaught = new InvalidOperationException($"{ex.Message}:{a}:{b}:{c}:{d}:{e}"))); + + Assert.Equal("one:7:7", oneCaught.Message); + Assert.Equal("two:5:2:3", twoCaught.Message); + Assert.Equal("three:6:1:2:3", threeCaught.Message); + Assert.Equal("four:10:1:2:3:4", fourCaught.Message); + Assert.Equal("five:15:1:2:3:4:5", fiveCaught.Message); + } + + private sealed class PatternsExchangeProbe : IParameterObject + { + public string Name { get; set; } + + public bool Flag { get; set; } + } + + private sealed class PatternsNoMatchProbe : IParameterObject + { + public DateTime Timestamp { get; set; } + } + } +} diff --git a/test/Cuemon.Core.Tests/SuccessfulValueTest.cs b/test/Cuemon.Kernel.Tests/SuccessfulValueTest.cs similarity index 88% rename from test/Cuemon.Core.Tests/SuccessfulValueTest.cs rename to test/Cuemon.Kernel.Tests/SuccessfulValueTest.cs index c99712a21..8289eca94 100644 --- a/test/Cuemon.Core.Tests/SuccessfulValueTest.cs +++ b/test/Cuemon.Kernel.Tests/SuccessfulValueTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using Codebelt.Extensions.Xunit; using Xunit; @@ -14,7 +14,9 @@ public SuccessfulValueTest(ITestOutputHelper output) : base(output) public void Ctor_SucceededShouldBeTrue() { var sut = new SuccessfulValue(); + Assert.True(sut.Succeeded); + Assert.Null(sut.Failure); } [Fact] @@ -25,6 +27,7 @@ public void Ctor_SucceededShouldBeTrueWithExpectedResult() Assert.True(sut.Succeeded); Assert.Equal(value, sut.Result); + Assert.Null(sut.Failure); } } } diff --git a/test/Cuemon.Kernel.Tests/Text/ByteOrderMarkTest.cs b/test/Cuemon.Kernel.Tests/Text/ByteOrderMarkTest.cs new file mode 100644 index 000000000..310423242 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Text/ByteOrderMarkTest.cs @@ -0,0 +1,282 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Text +{ + public class ByteOrderMarkTest : Test + { + public static IEnumerable GetKnownByteOrderMarks() + { + yield return new object[] { Encoding.UTF8.GetPreamble(), Encoding.UTF8.CodePage, Encoding.UTF8.GetPreamble() }; + yield return new object[] { new UTF32Encoding(true, true).GetPreamble(), Encoding.GetEncoding("UTF-32BE").CodePage, new UTF32Encoding(true, true).GetPreamble() }; + yield return new object[] { Encoding.UTF32.GetPreamble(), Encoding.UTF32.CodePage, Encoding.UTF32.GetPreamble() }; + yield return new object[] { Encoding.BigEndianUnicode.GetPreamble(), Encoding.BigEndianUnicode.CodePage, Encoding.BigEndianUnicode.GetPreamble() }; + yield return new object[] { Encoding.Unicode.GetPreamble(), Encoding.Unicode.CodePage, Encoding.Unicode.GetPreamble() }; + } + + public static IEnumerable GetUnknownByteOrderMarks() + { + yield return new object[] { Array.Empty() }; + yield return new object[] { new byte[] { 0xEF, 0xBB } }; + yield return new object[] { new byte[] { 0x00, 0x00, 0xFE } }; + yield return new object[] { new byte[] { 0x01 } }; + yield return new object[] { new byte[] { 0xAA, 0xBB, 0xCC, 0xDD } }; + } + + [Theory] + [MemberData(nameof(GetKnownByteOrderMarks))] + public void Decode_ShouldReturnEncoding_WhenByteOrderMarkIsKnown(byte[] bytes, int expectedCodePage, byte[] expectedPreamble) + { + var result = ByteOrderMark.Decode(bytes); + + Assert.Equal(expectedCodePage, result.CodePage); + Assert.Equal(expectedPreamble, result.GetPreamble()); + } + + [Theory] + [MemberData(nameof(GetUnknownByteOrderMarks))] + public void Decode_ShouldThrowArgumentException_WhenByteOrderMarkIsUnknown(byte[] bytes) + { + Assert.Throws(() => ByteOrderMark.Decode(bytes)); + } + + [Fact] + public void Decode_ShouldThrowArgumentNullException_WhenBytesIsNull() + { + Assert.Throws(() => ByteOrderMark.Decode(null)); + } + + [Fact] + public void DetectEncodingOrDefault_ShouldReturnDetectedEncoding_WhenByteArrayContainsPreamble() + { + var result = ByteOrderMark.DetectEncodingOrDefault(Encoding.UTF8.GetPreamble(), Encoding.Unicode); + + Assert.Equal(Encoding.UTF8.CodePage, result.CodePage); + } + + [Fact] + public void DetectEncodingOrDefault_ShouldReturnFallbackEncoding_WhenByteArrayDoesNotContainPreamble() + { + var fallback = Encoding.BigEndianUnicode; + + var result = ByteOrderMark.DetectEncodingOrDefault(new byte[] { 0x01, 0x02, 0x03 }, fallback); + + Assert.Same(fallback, result); + } + + [Fact] + public void DetectEncodingOrDefault_ShouldReturnDefaultEncoding_WhenByteArrayDoesNotContainPreambleAndFallbackIsNull() + { + var result = ByteOrderMark.DetectEncodingOrDefault(new byte[] { 0x01, 0x02, 0x03 }, null); + + Assert.Same(EncodingOptions.DefaultEncoding, result); + } + + [Fact] + public void DetectEncodingOrDefault_ShouldReturnDetectedEncoding_WhenStreamContainsPreamble() + { + using var stream = new MemoryStream(Encoding.Unicode.GetPreamble()); + + var result = ByteOrderMark.DetectEncodingOrDefault(stream, Encoding.UTF8); + + Assert.Equal(Encoding.Unicode.CodePage, result.CodePage); + } + + [Fact] + public void DetectEncodingOrDefault_ShouldReturnFallbackEncoding_WhenStreamDoesNotContainPreamble() + { + var fallback = Encoding.UTF8; + using var stream = new MemoryStream(new byte[] { 0x01, 0x02, 0x03, 0x04 }); + + var result = ByteOrderMark.DetectEncodingOrDefault(stream, fallback); + + Assert.Same(fallback, result); + } + + [Fact] + public void TryDetectEncoding_ShouldReturnTrueAndEncoding_WhenByteArrayContainsPreamble() + { + var result = ByteOrderMark.TryDetectEncoding(Encoding.BigEndianUnicode.GetPreamble(), out var encoding); + + Assert.True(result); + Assert.NotNull(encoding); + Assert.Equal(Encoding.BigEndianUnicode.CodePage, encoding.CodePage); + } + + [Fact] + public void TryDetectEncoding_ShouldReturnFalseAndNull_WhenByteArrayDoesNotContainPreamble() + { + var result = ByteOrderMark.TryDetectEncoding(new byte[] { 0x01 }, out var encoding); + + Assert.False(result); + Assert.Null(encoding); + } + + [Fact] + public void TryDetectEncoding_ShouldReturnFalseAndNull_WhenStreamIsNull() + { + var result = ByteOrderMark.TryDetectEncoding((Stream)null, out var encoding); + + Assert.False(result); + Assert.Null(encoding); + } + + [Fact] + public void TryDetectEncoding_ShouldReturnFalseAndNull_WhenStreamCannotSeek() + { + using var stream = new NonSeekableMemoryStream(Encoding.UTF8.GetPreamble()); + + var result = ByteOrderMark.TryDetectEncoding(stream, out var encoding); + + Assert.False(result); + Assert.Null(encoding); + } + + [Fact] + public void TryDetectEncoding_ShouldPreserveStreamPosition_WhenStreamCanSeek() + { + var bytes = CreateByteArrayWithPreamble(Encoding.UTF8, 0x41, 0x42, 0x43); + using var stream = new MemoryStream(bytes); + stream.Position = 2; + + var result = ByteOrderMark.TryDetectEncoding(stream, out var encoding); + + Assert.True(result); + Assert.NotNull(encoding); + Assert.Equal(Encoding.UTF8.CodePage, encoding.CodePage); + Assert.Equal(2, stream.Position); + } + + [Fact] + public void Remove_ShouldThrowArgumentNullException_WhenStreamIsNull() + { + Assert.Throws(() => ByteOrderMark.Remove((Stream)null, Encoding.UTF8)); + } + + [Fact] + public void Remove_ShouldThrowArgumentNullException_WhenStreamEncodingIsNull() + { + using var stream = new MemoryStream(); + + Assert.Throws(() => ByteOrderMark.Remove(stream, null)); + } + + [Fact] + public void Remove_ShouldReturnMemoryStreamWithoutPreamble_AndDisposeInputByDefault() + { + var source = new MemoryStream(CreateByteArrayWithPreamble(Encoding.UTF8, 0x41, 0x42, 0x43)); + + using var result = ByteOrderMark.Remove(source, Encoding.UTF8); + + Assert.IsType(result); + Assert.Equal(0, result.Position); + Assert.Equal(new byte[] { 0x41, 0x42, 0x43 }, ReadAllBytes(result)); + Assert.Throws(() => source.ReadByte()); + } + + [Fact] + public void Remove_ShouldLeaveInputOpen_WhenConfiguredToDoSo() + { + using var source = new MemoryStream(CreateByteArrayWithPreamble(Encoding.UTF8, 0x41, 0x42)); + + using var result = ByteOrderMark.Remove(source, Encoding.UTF8, o => o.LeaveOpen = true); + + Assert.Equal(new byte[] { 0x41, 0x42 }, ReadAllBytes(result)); + Assert.True(source.CanRead); + source.Position = 0; + Assert.Equal(0xEF, source.ReadByte()); + } + + [Fact] + public void Remove_ShouldThrowArgumentNullException_WhenBytesIsNull() + { + Assert.Throws(() => ByteOrderMark.Remove((byte[])null, Encoding.UTF8)); + } + + [Fact] + public void Remove_ShouldThrowArgumentNullException_WhenByteArrayEncodingIsNull() + { + Assert.Throws(() => ByteOrderMark.Remove(new byte[] { 0x01 }, null)); + } + + [Fact] + public void Remove_ShouldReturnSameReference_WhenByteArrayLengthIsLessThanTwo() + { + var bytes = new byte[] { 0xEF }; + + var result = ByteOrderMark.Remove(bytes, Encoding.UTF8); + + Assert.Same(bytes, result); + } + + [Fact] + public void Remove_ShouldReturnSameReference_WhenEncodingHasNoPreamble() + { + var bytes = new byte[] { 0x41, 0x42, 0x43 }; + var encoding = new UTF8Encoding(false); + + var result = ByteOrderMark.Remove(bytes, encoding); + + Assert.Same(bytes, result); + } + + [Fact] + public void Remove_ShouldReturnSameReference_WhenByteArrayIsShorterThanPreamble() + { + var bytes = new byte[] { 0xEF, 0xBB }; + + var result = ByteOrderMark.Remove(bytes, Encoding.UTF8); + + Assert.Same(bytes, result); + } + + [Fact] + public void Remove_ShouldReturnSameReference_WhenByteArrayDoesNotStartWithExactPreamble() + { + var bytes = new byte[] { 0xBB, 0xEF, 0xBF, 0x41 }; + + var result = ByteOrderMark.Remove(bytes, Encoding.UTF8); + + Assert.Same(bytes, result); + } + + [Fact] + public void Remove_ShouldStripPreamble_WhenByteArrayStartsWithExactPreamble() + { + var bytes = CreateByteArrayWithPreamble(Encoding.UTF8, 0x41, 0x42, 0x43); + + var result = ByteOrderMark.Remove(bytes, Encoding.UTF8); + + Assert.Equal(new byte[] { 0x41, 0x42, 0x43 }, result); + } + + private static byte[] CreateByteArrayWithPreamble(Encoding encoding, params byte[] content) + { + var preamble = encoding.GetPreamble(); + var bytes = new byte[preamble.Length + content.Length]; + Array.Copy(preamble, 0, bytes, 0, preamble.Length); + Array.Copy(content, 0, bytes, preamble.Length, content.Length); + return bytes; + } + + private static byte[] ReadAllBytes(Stream stream) + { + using var copy = new MemoryStream(); + stream.CopyTo(copy); + return copy.ToArray(); + } + + private sealed class NonSeekableMemoryStream : MemoryStream + { + public NonSeekableMemoryStream(byte[] buffer) : base(buffer) + { + } + + public override bool CanSeek => false; + } + } +} diff --git a/test/Cuemon.Kernel.Tests/Threading/AsyncOptionsTest.cs b/test/Cuemon.Kernel.Tests/Threading/AsyncOptionsTest.cs new file mode 100644 index 000000000..03c4d1c61 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Threading/AsyncOptionsTest.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Threading +{ + public class AsyncOptionsTest : Test + { + public AsyncOptionsTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldInitializeCancellationTokenToDefault() + { + var sut = new AsyncOptions(); + + Assert.Equal(sut.CancellationToken, CancellationToken.None); + } + + [Fact] + public async Task AsyncOptions_ShouldThrow_OperationCanceledException() + { + var cts = new CancellationTokenSource(); + cts.CancelAfter(250); + await Assert.ThrowsAsync(async () => await SomeMethod(o => o.CancellationToken = cts.Token)); + } + + private async Task SomeMethod(Action setup) + { + var options = Patterns.Configure(setup); + while (!options.CancellationToken.IsCancellationRequested) + { + await Task.Delay(50); + } + options.CancellationToken.ThrowIfCancellationRequested(); + TestOutput.WriteLine(options.CancellationToken.IsCancellationRequested.ToString()); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs new file mode 100644 index 000000000..dcc434f1b --- /dev/null +++ b/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon.Threading +{ + public class AwaiterTest : Test + { + [Fact] + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnOnImmediateSuccess() + { + // Arrange + var callCount = 0; + Task Method() + { + callCount++; + return Task.FromResult(new SuccessfulValue()); + } + + // Act + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method); + + // Assert + Assert.True(result.Succeeded); + Assert.Equal(1, callCount); + } + + [Fact] + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldRetryUntilSuccess() + { + // Arrange + var callCount = 0; + Task Method() + { + callCount++; + if (callCount < 3) + return Task.FromResult(new UnsuccessfulValue()); + return Task.FromResult(new SuccessfulValue()); + } + + // Act + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromSeconds(2); + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.True(result.Succeeded); + Assert.Equal(3, callCount); + } + + [Fact] + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulOnTimeout_NoExceptions() + { + // Arrange + Task Method() => Task.FromResult(new UnsuccessfulValue()); + + // Act + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromMilliseconds(50); + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.False(result.Succeeded); + Assert.Null(result.Failure); + } + + [Fact] + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithSingleException() + { + // Arrange + var cts = new CancellationTokenSource(); + + cts.Cancel(); + + var ct = cts.Token; + + // Act + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(() => Task.FromResult(new UnsuccessfulValue()), o => + { + o.Timeout = TimeSpan.FromMilliseconds(10); + o.Delay = TimeSpan.FromMilliseconds(100); + o.CancellationToken = ct; + }); + + // Assert + Assert.False(result.Succeeded); + Assert.IsType(result.Failure); + } + + [Fact] + public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulWithAggregateException() + { + // Arrange + var exceptions = new List + { + new InvalidOperationException("fail1"), + new ArgumentException("fail2") + }; + var callCount = 0; + Task Method() + { + if (callCount < exceptions.Count) + { + throw exceptions[callCount++]; + } + // After throwing both exceptions, always return unsuccessful + return Task.FromResult(new UnsuccessfulValue()); + } + + // Act + var result = await Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => + { + o.Timeout = TimeSpan.FromSeconds(5); // Significantly longer to ensure both exceptions are thrown (CI is slow in GHA) + o.Delay = TimeSpan.FromMilliseconds(10); + }); + + // Assert + Assert.False(result.Succeeded); + Assert.IsType(result.Failure); + var agg = (AggregateException)result.Failure; + Assert.Contains(exceptions[0], agg.InnerExceptions); + Assert.Contains(exceptions[1], agg.InnerExceptions); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/TypeArgumentExceptionTest.cs b/test/Cuemon.Kernel.Tests/TypeArgumentExceptionTest.cs new file mode 100644 index 000000000..941ddbb84 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/TypeArgumentExceptionTest.cs @@ -0,0 +1,41 @@ +using System; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class TypeArgumentExceptionTest : Test + { + public TypeArgumentExceptionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldUseDefaultMessageAndParamName() + { + var sut = new TypeArgumentException("TValue"); + + Assert.Equal("TValue", sut.ParamName); + Assert.StartsWith("Value does not fall within the expected range.", sut.Message); + } + + [Fact] + public void Ctor_ShouldUseCustomMessageAndParamName() + { + var sut = new TypeArgumentException("TValue", "Invalid type argument."); + + Assert.Equal("TValue", sut.ParamName); + Assert.StartsWith("Invalid type argument.", sut.Message); + } + + [Fact] + public void Ctor_ShouldAssignInnerException() + { + var inner = new InvalidOperationException("boom"); + var sut = new TypeArgumentException("Invalid type argument.", inner); + + Assert.Equal("Invalid type argument.", sut.Message); + Assert.Same(inner, sut.InnerException); + } + } +} diff --git a/test/Cuemon.Kernel.Tests/TypeArgumentOutOfRangeExceptionTest.cs b/test/Cuemon.Kernel.Tests/TypeArgumentOutOfRangeExceptionTest.cs new file mode 100644 index 000000000..4580b1ce1 --- /dev/null +++ b/test/Cuemon.Kernel.Tests/TypeArgumentOutOfRangeExceptionTest.cs @@ -0,0 +1,51 @@ +using System; +using Codebelt.Extensions.Xunit; +using Xunit; + +namespace Cuemon +{ + public class TypeArgumentOutOfRangeExceptionTest : Test + { + public TypeArgumentOutOfRangeExceptionTest(ITestOutputHelper output) : base(output) + { + } + + [Fact] + public void Ctor_ShouldUseDefaultMessageAndParamName() + { + var sut = new TypeArgumentOutOfRangeException("TValue"); + + Assert.Equal("TValue", sut.ParamName); + Assert.StartsWith("Specified type argument was out of the range of valid values.", sut.Message); + } + + [Fact] + public void Ctor_ShouldUseCustomMessageAndParamName() + { + var sut = new TypeArgumentOutOfRangeException("TValue", "Type argument was invalid."); + + Assert.Equal("TValue", sut.ParamName); + Assert.StartsWith("Type argument was invalid.", sut.Message); + } + + [Fact] + public void Ctor_ShouldAssignActualValue() + { + var sut = new TypeArgumentOutOfRangeException("TValue", typeof(Guid), "Type argument was invalid."); + + Assert.Equal("TValue", sut.ParamName); + Assert.Equal(typeof(Guid), sut.ActualValue); + Assert.StartsWith("Type argument was invalid.", sut.Message); + } + + [Fact] + public void Ctor_ShouldAssignInnerException() + { + var inner = new InvalidOperationException("boom"); + var sut = new TypeArgumentOutOfRangeException("Type argument was invalid.", inner); + + Assert.Equal("Type argument was invalid.", sut.Message); + Assert.Same(inner, sut.InnerException); + } + } +} diff --git a/test/Cuemon.Core.Tests/UnsuccessfulValueTest.cs b/test/Cuemon.Kernel.Tests/UnsuccessfulValueTest.cs similarity index 90% rename from test/Cuemon.Core.Tests/UnsuccessfulValueTest.cs rename to test/Cuemon.Kernel.Tests/UnsuccessfulValueTest.cs index f9f1f082e..7ebbcac49 100644 --- a/test/Cuemon.Core.Tests/UnsuccessfulValueTest.cs +++ b/test/Cuemon.Kernel.Tests/UnsuccessfulValueTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using Codebelt.Extensions.Xunit; using Xunit; @@ -14,7 +14,9 @@ public UnsuccessfulValueTest(ITestOutputHelper output) : base(output) public void Ctor_SucceededShouldBeFalse() { var sut = new UnsuccessfulValue(); + Assert.False(sut.Succeeded); + Assert.Null(sut.Failure); } [Fact] @@ -24,6 +26,7 @@ public void Ctor_SucceededShouldBeFalseWithDefaultResult() Assert.False(sut.Succeeded); Assert.Equal(default, sut.Result); + Assert.Null(sut.Failure); } [Fact] @@ -44,6 +47,7 @@ public void Ctor_SucceededShouldBeFalseWithExpectedResult() Assert.False(sut.Succeeded); Assert.Equal(value, sut.Result); + Assert.Null(sut.Failure); } } } diff --git a/test/Cuemon.Core.Tests/ValidatorTest.cs b/test/Cuemon.Kernel.Tests/ValidatorTest.cs similarity index 69% rename from test/Cuemon.Core.Tests/ValidatorTest.cs rename to test/Cuemon.Kernel.Tests/ValidatorTest.cs index 9dd76e480..e3b1fe431 100644 --- a/test/Cuemon.Core.Tests/ValidatorTest.cs +++ b/test/Cuemon.Kernel.Tests/ValidatorTest.cs @@ -1,14 +1,10 @@ -using System; +using Codebelt.Extensions.Xunit; +using Cuemon.Assets; +using Cuemon.Collections.Generic; +using System; using System.Collections.Generic; using System.IO; using System.Linq; -using Cuemon.Assets; -using Cuemon.Extensions.Collections.Generic; -#if NET48_OR_GREATER -using Cuemon.Extensions; -#endif -using Codebelt.Extensions.Xunit; -using Cuemon.Extensions; using Xunit; namespace Cuemon @@ -210,6 +206,8 @@ public void ThrowIfInvalidOptions_ShouldThrowArgumentException_WithInnerNotImple Validator.ThrowIfInvalidOptions(paramName); }); + TestOutput.WriteLine(result.Message); + Assert.StartsWith($"{nameof(ValidatableOptions)} are not in a valid state.", result.Message); Assert.Contains(nameof(paramName), result.Message); Assert.IsType(result.InnerException); @@ -245,19 +243,121 @@ public void CheckParameter_ShouldThrowArgumentNullExceptionOrReturnString(string } } + [Fact] + public void CheckParameter_FuncShouldThrowArgumentNullExceptionOrReturnComputedResult() + { + var ex = Assert.Throws(() => + { + Validator.CheckParameter((Func)null); + }); + + Assert.Equal("validator", ex.ParamName); + Assert.Equal("cuemon:7", Validator.CheckParameter(() => "cuemon:7")); + } + + [Fact] + public void ThrowIfSingleton_ShouldReturnSameInstance() + { + Assert.Same(Validator.ThrowIf, Validator.ThrowIf); + } + + [Fact] + public void ThrowWhen_ShouldSupportNullGuardAndBothExceptionConditionStyles() + { + var nullEx = Assert.Throws(() => + { + Validator.ThrowWhen((Action>)null); + }); + + Assert.Equal("condition", nullEx.ParamName); + + ArgumentException trueEx = Assert.Throws(() => + { + Validator.ThrowWhen(condition => condition + .IsTrue(() => true) + .Create(() => new ArgumentException("custom", "paramName")) + .TryThrow()); + }); + + Assert.Equal("paramName", trueEx.ParamName); + Assert.StartsWith("custom", trueEx.Message); + + ArgumentException falseEx = Assert.Throws(() => + { + Validator.ThrowWhen(condition => condition + .IsFalse((out string result) => + { + result = "typed"; + return false; + }) + .Create(result => new ArgumentException(result, "typedParam")) + .TryThrow()); + }); + + Assert.Equal("typedParam", falseEx.ParamName); + Assert.StartsWith("typed", falseEx.Message); + + Validator.ThrowWhen(condition => condition + .IsTrue(() => false) + .Create(() => new ArgumentException("unused", "unused")) + .TryThrow()); + } + + [Fact] + public void ThrowIfInvalidState_ShouldSupportCustomMessageAndFalseCondition() + { + Validator.ThrowIfInvalidState(false, "custom message"); + + var ex = Assert.Throws(() => + { + Validator.ThrowIfInvalidState(true, "custom message"); + }); + + Assert.Equal("custom message (Expression 'true')", ex.Message); + } + + [Fact] + public void ThrowIfInvalidOptions_ShouldUseCustomMessageWhenValidationFails() + { + var ex = Assert.Throws(() => + { + Validator.ThrowIfInvalidOptions(new ValidatableOptions(), "custom options message", "optionsParam"); + }); + + Assert.Equal("optionsParam", ex.ParamName); + Assert.StartsWith("custom options message", ex.Message); + } + + [Fact] + public void ThrowIfContainsType_ShouldHandleNullAndNonMatchingTypes() + { + Assert.Throws(() => + { + Validator.ThrowIfContainsType((Type)null, new[] { typeof(Exception) }); + }); + + Assert.Throws(() => + { + Validator.ThrowIfContainsType(typeof(string), null); + }); + + Validator.ThrowIfContainsType(typeof(string), new[] { typeof(Stream) }); + Validator.ThrowIfContainsType("typeParamName", typeof(Stream)); + } + [Fact] public void ThrowIfContainsType_ShouldThrowArgumentOutOfRangeException() { var ex = Assert.Throws(() => { - Validator.ThrowIfContainsType(typeof(ArgumentNullException), typeof(ArgumentException).Yield().ToArray()); + Validator.ThrowIfContainsType(typeof(ArgumentNullException), Arguments.Yield(typeof(ArgumentException)).ToArray()); }); Assert.Equal(ex.ParamName, "typeof(ArgumentNullException)"); ex = Assert.Throws(() => { - Validator.ThrowIfContainsType(new ArgumentNullException(), typeof(ArgumentException).Yield().ToArray()); + Validator.ThrowIfContainsType(new ArgumentNullException(), Arguments.Yield(typeof(ArgumentException)).ToArray()); }); Assert.Equal(ex.ParamName, "new ArgumentNullException()"); @@ -277,12 +377,12 @@ public void ThrowIfNotContainsType_ShouldThrowArgumentOutOfRangeException() { Assert.Throws(() => { - Validator.ThrowIfNotContainsType(typeof(ArgumentNullException), typeof(OutOfMemoryException).Yield().ToArray()); + Validator.ThrowIfNotContainsType(typeof(ArgumentNullException), Arguments.Yield(typeof(OutOfMemoryException)).ToArray()); }); Assert.Throws(() => { - Validator.ThrowIfNotContainsType(new ArgumentNullException(), typeof(OutOfMemoryException).Yield().ToArray()); + Validator.ThrowIfNotContainsType(new ArgumentNullException(), Arguments.Yield(typeof(OutOfMemoryException)).ToArray()); }); } @@ -291,7 +391,7 @@ public void ThrowIfNotContainsInterface_ShouldThrowArgumentOutOfRangeException() { Assert.Throws(() => { - Validator.ThrowIfNotContainsInterface(typeof(Stream), typeof(IConvertible).Yield().ToArray()); + Validator.ThrowIfNotContainsInterface(typeof(Stream), Arguments.Yield(typeof(IConvertible)).ToArray()); }); } @@ -309,7 +409,7 @@ public void ThrowIfContainsInterface_ShouldThrowArgumentOutOfRangeException() { Assert.Throws(() => { - Validator.ThrowIfContainsInterface(typeof(string), typeof(IConvertible).Yield().ToArray()); + Validator.ThrowIfContainsInterface(typeof(string), Arguments.Yield(typeof(IConvertible)).ToArray()); }); } @@ -324,6 +424,23 @@ public void ThrowIfContainsInterface_ShouldThrowTypeArgumentOutOfRangeException< Assert.Equal(nameof(TBool), ex.ParamName); } + [Fact] + public void ThrowIfNotContainsType_ShouldHandleNullAndMatchingTypes() + { + Assert.Throws(() => + { + Validator.ThrowIfNotContainsType((Type)null, new[] { typeof(Exception) }); + }); + + Assert.Throws(() => + { + Validator.ThrowIfNotContainsType(typeof(string), null); + }); + + Validator.ThrowIfNotContainsType(typeof(ArgumentNullException), new[] { typeof(Exception) }); + Validator.ThrowIfNotContainsType("typeParamName", typeof(Exception)); + } + [Fact] public void ThrowIfNotContainsType_ShouldThrowTypeArgumentOutOfRangeException() { @@ -1067,5 +1184,165 @@ public void ThrowIfNotContainsAny_ShouldNotThrowAnyException() var characters = new[] { Alphanumeric.TabChar, ' ' }; Validator.ThrowIfNotContainsAny(argument, characters); } + + [Fact] + public void ThrowIfContainsInterfaceOverloads_ShouldCoverThrowAndNoThrowPaths() + { + Validator.ThrowIfContainsInterface("typeParamName", typeof(IConvertible)); + Validator.ThrowIfContainsInterface("typeParamName", "custom", typeof(IConvertible)); + Validator.ThrowIfContainsInterface(typeof(Stream), new[] { typeof(IConvertible) }, "custom", "typeParamName"); + + var generic = Assert.Throws(() => + { + Validator.ThrowIfContainsInterface("typeParamName", "custom", typeof(IConvertible)); + }); + + Assert.Equal("typeParamName", generic.ParamName); + Assert.StartsWith("custom", generic.Message); + + var nongeneric = Assert.Throws(() => + { + Validator.ThrowIfContainsInterface(typeof(string), new[] { typeof(IConvertible) }, "custom", "typeParamName"); + }); + + Assert.Equal("typeParamName", nongeneric.ParamName); + Assert.StartsWith("custom", nongeneric.Message); + } + + [Fact] + public void ThrowIfNotContainsInterfaceOverloads_ShouldCoverThrowAndNoThrowPaths() + { + Validator.ThrowIfNotContainsInterface("typeParamName", typeof(IConvertible)); + Validator.ThrowIfNotContainsInterface("typeParamName", "custom", typeof(IConvertible)); + Validator.ThrowIfNotContainsInterface(typeof(string), new[] { typeof(IConvertible) }, "custom", "typeParamName"); + + var generic = Assert.Throws(() => + { + Validator.ThrowIfNotContainsInterface("typeParamName", "custom", typeof(IConvertible)); + }); + + Assert.Equal("typeParamName", generic.ParamName); + Assert.StartsWith("custom", generic.Message); + + var nongeneric = Assert.Throws(() => + { + Validator.ThrowIfNotContainsInterface(typeof(Stream), new[] { typeof(IConvertible) }, "custom", "typeParamName"); + }); + + Assert.Equal("typeParamName", nongeneric.ParamName); + Assert.StartsWith("custom", nongeneric.Message); + } + + [Fact] + public void ThrowIfContainsTypeOverloads_ShouldCoverObjectGenericAndTypeBranches() + { + Validator.ThrowIfContainsType(new MemoryStream(), new[] { typeof(string) }, "custom", "objectParam"); + Validator.ThrowIfContainsType("typeParamName", typeof(string)); + Validator.ThrowIfContainsType("typeParamName", "custom", typeof(string)); + Validator.ThrowIfNotContainsType(new MemoryStream(), new[] { typeof(Stream) }, "custom", "objectParam"); + Validator.ThrowIfNotContainsType("typeParamName", typeof(Stream)); + Validator.ThrowIfNotContainsType("typeParamName", "custom", typeof(Stream)); + + var containsObject = Assert.Throws(() => + { + Validator.ThrowIfContainsType((object)"text", new[] { typeof(string) }, "custom", "objectParam"); + }); + + Assert.Equal("objectParam", containsObject.ParamName); + Assert.StartsWith("custom", containsObject.Message); + + var containsGeneric = Assert.Throws(() => + { + Validator.ThrowIfContainsType("typeParamName", "custom", typeof(Stream)); + }); + + Assert.Equal("typeParamName", containsGeneric.ParamName); + Assert.StartsWith("custom", containsGeneric.Message); + + var notContainsObject = Assert.Throws(() => + { + Validator.ThrowIfNotContainsType((object)"text", new[] { typeof(Stream) }, "custom", "objectParam"); + }); + + Assert.Equal("objectParam", notContainsObject.ParamName); + Assert.StartsWith("custom", notContainsObject.Message); + + var notContainsGeneric = Assert.Throws(() => + { + Validator.ThrowIfNotContainsType("typeParamName", "custom", typeof(string)); + }); + + Assert.Equal("typeParamName", notContainsGeneric.ParamName); + Assert.StartsWith("custom", notContainsGeneric.Message); + } + + [Fact] + public void ThrowIfScalarGuardOverloads_ShouldCoverExplicitOptionalParameterPaths() + { + var culture = new System.Globalization.CultureInfo("da-DK"); + var guid = Guid.NewGuid(); + var sameReference = TimeZoneInfo.Utc; + + Validator.ThrowIfNumber("abc", System.Globalization.NumberStyles.Number, culture, "custom", "numberParam"); + Validator.ThrowIfNotNumber("12,50", System.Globalization.NumberStyles.Number, culture, "custom", "numberParam"); + Validator.ThrowIfFalse(() => true, "paramName", "custom"); + Validator.ThrowIfTrue(false, "paramName", "custom"); + Validator.ThrowIfTrue(() => false, "paramName", "custom"); + Validator.ThrowIfSame(TimeZoneInfo.Utc, TimeZoneInfo.Local, "paramName", "custom"); + Validator.ThrowIfNotSame(sameReference, sameReference, "paramName", "custom"); + Validator.ThrowIfEqual("alpha", "ALPHA", "paramName", StringComparer.Ordinal, "custom"); + Validator.ThrowIfNotEqual("alpha", "ALPHA", "paramName", StringComparer.OrdinalIgnoreCase, "custom"); + Validator.ThrowIfGreaterThanOrEqual(1, 2, "paramName", "custom"); + Validator.ThrowIfLowerThan(2, 1, "paramName", "custom"); + Validator.ThrowIfLowerThanOrEqual(2, 1, "paramName", "custom"); + Validator.ThrowIfHex("not-hex", "custom", "paramName"); + Validator.ThrowIfNotHex("AAB0F3C1", "custom", "paramName"); + Validator.ThrowIfEmailAddress("not-an-email", "custom", "paramName"); + Validator.ThrowIfNotEmailAddress("user@example.com", "custom", "paramName"); + Validator.ThrowIfGuid("not-a-guid", GuidFormats.N, "custom", "paramName"); + Validator.ThrowIfNotGuid(guid.ToString("N"), GuidFormats.N, "custom", "paramName"); + Validator.ThrowIfEnumType((Type)null, "custom", "paramName"); + Validator.ThrowIfNotEnumType("typeParamName", "custom"); + Validator.ThrowIfNotBinaryDigits("101010", "custom", "paramName"); + Validator.ThrowIfNotBase64String("QQ==", "custom", "paramName"); + Validator.ThrowIfEnum("sideways", ignoreCase: false, message: "custom", paramName: "paramName"); + Validator.ThrowIfNotEnum("Up", ignoreCase: false, message: "custom", paramName: "paramName"); + + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNumber("12,50", System.Globalization.NumberStyles.Number, culture, "custom", "numberParam")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotNumber("abc", System.Globalization.NumberStyles.Number, culture, "custom", "numberParam")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfTrue(true, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfTrue(() => true, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfSame(sameReference, sameReference, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotSame(TimeZoneInfo.Utc, TimeZoneInfo.Local, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfGreaterThanOrEqual(2, 2, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfLowerThan(1, 2, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfLowerThanOrEqual(2, 2, "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfHex("AAB0F3C1", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotHex("olkiujhy", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfEmailAddress("user@example.com", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotEmailAddress("invalid", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfGuid(guid.ToString("N"), GuidFormats.N, "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotGuid("not-a-guid", GuidFormats.N, "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfEnumType(typeof(VerticalDirection), "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfEnumType("typeParamName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotEnumType("typeParamName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotBinaryDigits("1201", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotBase64String("invalid", "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfEnum("Up", ignoreCase: false, message: "custom", paramName: "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotEnum("up", ignoreCase: false, message: "custom", paramName: "paramName")).Message); + } + + [Fact] + public void ThrowIfDifferenceAndUriOverloads_ShouldCoverCustomMessageBranches() + { + Validator.ThrowIfDifferent("abc", "cba", "paramName", "custom"); + Validator.ThrowIfUri("not a valid uri", UriKind.Absolute, "custom", "paramName"); + Validator.ThrowIfNotUri("https://www.cuemon.net/", UriKind.Absolute, "custom", "paramName"); + + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotDifferent("abc", "cba", "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfDifferent("abc", "abcd", "paramName", "custom")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfUri("https://www.cuemon.net/", UriKind.Absolute, "custom", "paramName")).Message); + Assert.StartsWith("custom", Assert.Throws(() => Validator.ThrowIfNotUri("www.cuemon.net", UriKind.Absolute, "custom", "paramName")).Message); + } } } diff --git a/test/Cuemon.Resilience.Tests/TransientFaultExceptionTest.cs b/test/Cuemon.Resilience.Tests/TransientFaultExceptionTest.cs index 307e0a8d5..dd7521c6e 100644 --- a/test/Cuemon.Resilience.Tests/TransientFaultExceptionTest.cs +++ b/test/Cuemon.Resilience.Tests/TransientFaultExceptionTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using Cuemon.Extensions.IO; diff --git a/testenvironments.json b/testenvironments.json index 325127a3a..e49a8cd13 100644 --- a/testenvironments.json +++ b/testenvironments.json @@ -7,9 +7,14 @@ "wslDistribution": "Ubuntu-24.04" }, { - "name": "Docker-Ubuntu", + "name": "Docker-Ubuntu (net9)", "type": "docker", - "dockerImage": "codebeltnet/ubuntu-testrunner:net8.0.418-9.0.311-10.0.103" + "dockerImage": "codebeltnet/ubuntu-testrunner:9" + }, + { + "name": "Docker-Ubuntu (net10)", + "type": "docker", + "dockerImage": "codebeltnet/ubuntu-testrunner:10" } ] }