From 555b5536a6e6da30da520a89d463ce5fbe67d9ab Mon Sep 17 00:00:00 2001 From: "codebelt-aicia[bot]" Date: Wed, 22 Jul 2026 22:11:17 +0000 Subject: [PATCH 1/7] V1.0.6/service update --- .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ .../PackageReleaseNotes.txt | 6 +++ CHANGELOG.md | 4 ++ Directory.Packages.props | 46 +++++++++---------- 7 files changed, 57 insertions(+), 23 deletions(-) diff --git a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Newtonsoft.Json/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Newtonsoft.Json/PackageReleaseNotes.txt index 964101f..7bfb931 100644 --- a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Newtonsoft.Json/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Newtonsoft.Json/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 1.0.6 +Availability: .NET 10 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 1.0.5 Availability: .NET 10 diff --git a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Json/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Json/PackageReleaseNotes.txt index fb7af4d..a4e5086 100644 --- a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Json/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Json/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 1.0.6 +Availability: .NET 10 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 1.0.5 Availability: .NET 10 diff --git a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Yaml/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Yaml/PackageReleaseNotes.txt index 6d8117b..1a566f7 100644 --- a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Yaml/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Text.Yaml/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 1.0.6 +Availability: .NET 10 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 1.0.5 Availability: .NET 10 diff --git a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Xml/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Xml/PackageReleaseNotes.txt index 20153f6..9570c86 100644 --- a/.nuget/Codebelt.Extensions.Carter.AspNetCore.Xml/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.Carter.AspNetCore.Xml/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 1.0.6 +Availability: .NET 10 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 1.0.5 Availability: .NET 10 diff --git a/.nuget/Codebelt.Extensions.Carter/PackageReleaseNotes.txt b/.nuget/Codebelt.Extensions.Carter/PackageReleaseNotes.txt index b71ff37..0833676 100644 --- a/.nuget/Codebelt.Extensions.Carter/PackageReleaseNotes.txt +++ b/.nuget/Codebelt.Extensions.Carter/PackageReleaseNotes.txt @@ -1,3 +1,9 @@ +Version: 1.0.6 +Availability: .NET 10 + +# ALM +- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs) + Version: 1.0.5 Availability: .NET 10 diff --git a/CHANGELOG.md b/CHANGELOG.md index 933c606..6ba95ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ 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. +## [1.0.6] - 2026-07-22 + +This is a service update that focuses on package dependencies. + ## [1.0.5] - 2026-07-01 This is a patch service update that refreshes shared package baselines, hardens the DocFX publishing pipeline with new per-type usage examples, and tightens CI deployment gating so skipped optional jobs no longer suppress package publishing. diff --git a/Directory.Packages.props b/Directory.Packages.props index bd97563..1c0abed 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,24 +1,24 @@ - - - true - - - - - - - - - - - - - - - - - - - - + + + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 29e518977f434082a13d4ec4439bd3abd6d4393a Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Fri, 24 Jul 2026 13:59:09 +0200 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=91=B7=20update=20docfx=20base=20imag?= =?UTF-8?q?e=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update NGINX base image from 1.31.2-alpine to 1.31-alpine. This relaxes the patch version constraint to allow more flexibility in the specific NGINX release used while maintaining the minor version. --- .docfx/Dockerfile.docfx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docfx/Dockerfile.docfx b/.docfx/Dockerfile.docfx index 465ff57..f4064e2 100644 --- a/.docfx/Dockerfile.docfx +++ b/.docfx/Dockerfile.docfx @@ -1,4 +1,4 @@ -ARG NGINX_VERSION=1.31.2-alpine +ARG NGINX_VERSION=1.31-alpine FROM --platform=$BUILDPLATFORM nginx:${NGINX_VERSION} AS base RUN rm -rf /usr/share/nginx/html/* From c4b7c01205045cfc8aba612e06498b306da49326 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Fri, 24 Jul 2026 13:59:18 +0200 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=94=A8=20enhance=20package=20bumping?= =?UTF-8?q?=20automation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactored the NuGet package bumping script to support intelligent version management. Triggered packages are set to the specified version, while other Codebelt-related packages are fetched from NuGet to their latest stable versions. Added support for additional package mappings, NuGet API lookups with caching, improved encoding handling, and enhanced output messaging. --- .github/scripts/bump-nuget.py | 94 ++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 23 deletions(-) diff --git a/.github/scripts/bump-nuget.py b/.github/scripts/bump-nuget.py index 4ccdcb1..190f2c1 100644 --- a/.github/scripts/bump-nuget.py +++ b/.github/scripts/bump-nuget.py @@ -1,26 +1,30 @@ #!/usr/bin/env python3 """ -Simplified package bumping for Codebelt service updates (Option B). +Package bumping for Codebelt service updates. -Only updates packages published by the triggering source repo. +Updates packages published by the triggering source repo to the specified version. +Additionally fetches the latest stable version from NuGet for all other Codebelt-related +packages and updates them as well. Does NOT update Microsoft.Extensions.*, BenchmarkDotNet, or other third-party packages. -Does NOT parse TFM conditions - only bumps Codebelt/Cuemon/Savvyio packages to the triggering version. Usage: TRIGGER_SOURCE=cuemon TRIGGER_VERSION=10.3.0 python3 bump-nuget.py Behavior: - If TRIGGER_SOURCE is "cuemon" and TRIGGER_VERSION is "10.3.0": - - Cuemon.Core: 10.2.1 → 10.3.0 - - Cuemon.Extensions.IO: 10.2.1 → 10.3.0 + - Cuemon.Core: 10.2.1 → 10.3.0 (triggered source, set to given version) + - Cuemon.Extensions.IO: 10.2.1 → 10.3.0 (triggered source, set to given version) + - Codebelt.Extensions.BenchmarkDotNet.*: 1.2.3 → (other Codebelt) - Microsoft.Extensions.Hosting: 9.0.13 → UNCHANGED (not a Codebelt package) - BenchmarkDotNet: 0.15.8 → UNCHANGED (not a Codebelt package) """ +import json import re import os import sys -from typing import Dict, List +import urllib.request +from typing import Dict, List, Optional TRIGGER_SOURCE = os.environ.get("TRIGGER_SOURCE", "") TRIGGER_VERSION = os.environ.get("TRIGGER_VERSION", "") @@ -31,22 +35,24 @@ "xunit": ["Codebelt.Extensions.Xunit"], "benchmarkdotnet": ["Codebelt.Extensions.BenchmarkDotNet"], "bootstrapper": ["Codebelt.Bootstrapper"], + "carter": ["Codebelt.Extensions.Carter"], "newtonsoft-json": [ "Codebelt.Extensions.Newtonsoft.Json", "Codebelt.Extensions.AspNetCore.Newtonsoft.Json", + "Codebelt.Extensions.AspNetCore.Mvc.Formatters.Newtonsoft", ], "aws-signature-v4": ["Codebelt.Extensions.AspNetCore.Authentication.AwsSignature"], "unitify": ["Codebelt.Unitify"], "yamldotnet": [ "Codebelt.Extensions.YamlDotNet", "Codebelt.Extensions.AspNetCore.Text.Yaml", + "Codebelt.Extensions.AspNetCore.Mvc.Formatters.Text.Yaml", ], "globalization": ["Codebelt.Extensions.Globalization"], "asp-versioning": ["Codebelt.Extensions.Asp.Versioning"], "swashbuckle-aspnetcore": ["Codebelt.Extensions.Swashbuckle"], "savvyio": ["Savvyio."], - "shared-kernel": [], - "carter": ["Codebelt.Extensions.Carter"], + "shared-kernel": ["Codebelt.SharedKernel"], } @@ -58,6 +64,38 @@ def is_triggered_package(package_name: str) -> bool: return any(package_name.startswith(prefix) for prefix in prefixes) +def is_codebelt_package(package_name: str) -> bool: + """Check if package belongs to any Codebelt repo (regardless of trigger source).""" + for repo_prefixes in SOURCE_PACKAGE_MAP.values(): + if any(package_name.startswith(prefix) for prefix in repo_prefixes if prefix): + return True + return False + + +_nuget_version_cache: Dict[str, Optional[str]] = {} + + +def get_latest_nuget_version(package_name: str) -> Optional[str]: + """Fetch the latest stable version of a package from NuGet.""" + if package_name in _nuget_version_cache: + return _nuget_version_cache[package_name] + + url = f"https://api.nuget.org/v3-flatcontainer/{package_name.lower()}/index.json" + try: + with urllib.request.urlopen(url, timeout=15) as response: + data = json.loads(response.read()) + versions = data.get("versions", []) + # Stable versions have no hyphen (no pre-release suffix) + stable = [v for v in versions if "-" not in v] + result = stable[-1] if stable else (versions[-1] if versions else None) + except Exception as exc: + print(f" Warning: Could not fetch latest version for {package_name}: {exc}") + result = None + + _nuget_version_cache[package_name] = result + return result + + def main(): if not TRIGGER_SOURCE or not TRIGGER_VERSION: print( @@ -71,11 +109,13 @@ def main(): target_version = TRIGGER_VERSION.lstrip("v") print(f"Trigger: {TRIGGER_SOURCE} @ {target_version}") - print(f"Only updating packages from: {TRIGGER_SOURCE}") + print( + f"Triggered packages set to {target_version}; other Codebelt packages fetched from NuGet." + ) print() try: - with open("Directory.Packages.props", "r") as f: + with open("Directory.Packages.props", "r", encoding="utf-8") as f: content = f.read() except FileNotFoundError: print("Error: Directory.Packages.props not found") @@ -88,16 +128,24 @@ def replace_version(m: re.Match) -> str: pkg = m.group(1) current = m.group(2) - if not is_triggered_package(pkg): - skipped_third_party.append(f" {pkg} (skipped - not from {TRIGGER_SOURCE})") + if is_triggered_package(pkg): + if target_version != current: + changes.append(f" {pkg}: {current} -> {target_version}") + return m.group(0).replace( + f'Version="{current}"', f'Version="{target_version}"' + ) return m.group(0) - if target_version != current: - changes.append(f" {pkg}: {current} → {target_version}") - return m.group(0).replace( - f'Version="{current}"', f'Version="{target_version}"' - ) + if is_codebelt_package(pkg): + latest = get_latest_nuget_version(pkg) + if latest and latest != current: + changes.append(f" {pkg}: {current} -> {latest} (latest from NuGet)") + return m.group(0).replace( + f'Version="{current}"', f'Version="{latest}"' + ) + return m.group(0) + skipped_third_party.append(f" {pkg} (skipped - not a Codebelt package)") return m.group(0) # Match PackageVersion elements (handles multiline) @@ -110,12 +158,15 @@ def replace_version(m: re.Match) -> str: ) new_content = pattern.sub(replace_version, content) + with open("Directory.Packages.props", "w", encoding="utf-8", newline="\n") as f: + f.write(new_content) + # Show results if changes: - print(f"Updated {len(changes)} package(s) from {TRIGGER_SOURCE}:") + print(f"Updated {len(changes)} package(s):") print("\n".join(changes)) else: - print(f"No packages from {TRIGGER_SOURCE} needed updating.") + print("No Codebelt packages needed updating.") if skipped_third_party: print() @@ -124,10 +175,7 @@ def replace_version(m: re.Match) -> str: if len(skipped_third_party) > 5: print(f" ... and {len(skipped_third_party) - 5} more") - with open("Directory.Packages.props", "w") as f: - f.write(new_content) - - return 0 if changes else 0 # Return 0 even if no changes (not an error) + return 0 if __name__ == "__main__": From a29e8122d022222f53491a43565085c8a08d2571 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Fri, 24 Jul 2026 13:59:23 +0200 Subject: [PATCH 4/7] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20upgrade=20dependencies?= =?UTF-8?q?=20to=20latest=20stable=20versions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update central package version manifest with latest stable releases: Codebelt.Extensions.AspNetCore.Newtonsoft.Json 10.1.6, Codebelt.Extensions.Xunit.App 11.1.2, Cuemon packages 10.5.5, and Microsoft.NET.Test.Sdk 18.8.1. Also normalize line endings to LF format. --- Directory.Packages.props | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1c0abed..2fb9a09 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,24 +1,24 @@ - - - true - - - - - - - - - - - - - - - - - - - - + + + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ac63835d16fc4c40bf9f24f4dac595271ac23c28 Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Fri, 24 Jul 2026 14:00:37 +0200 Subject: [PATCH 5/7] =?UTF-8?q?=F0=9F=94=A7=20correct=20build=20property?= =?UTF-8?q?=20name=20in=20directory=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change AnalysisLevel property to AnalysisMode in Directory.Build.props. This property name is the correct MSBuild property for controlling the analysis mode during builds. --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 841b128..5bb0e3e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -63,7 +63,7 @@ false false true - none + none NU1701,NU1902,NU1903 false false From 7e0419c18a9e2655cc95cc696ab273570365727f Mon Sep 17 00:00:00 2001 From: "aicia[bot]" Date: Fri, 24 Jul 2026 14:00:38 +0200 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=8E=A8=20reformat=20xmlresponsenegoti?= =?UTF-8?q?ator=20to=20file-scoped=20namespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert XmlResponseNegotiator from traditional namespace declaration with nested class indentation to modern file-scoped namespace syntax. Adjust class and member indentation to align with codebase style conventions. --- .../XmlResponseNegotiator.cs | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/Codebelt.Extensions.Carter.AspNetCore.Xml/XmlResponseNegotiator.cs b/src/Codebelt.Extensions.Carter.AspNetCore.Xml/XmlResponseNegotiator.cs index 0420b18..8fe09dc 100644 --- a/src/Codebelt.Extensions.Carter.AspNetCore.Xml/XmlResponseNegotiator.cs +++ b/src/Codebelt.Extensions.Carter.AspNetCore.Xml/XmlResponseNegotiator.cs @@ -4,35 +4,34 @@ using System.Text; using Cuemon.Runtime.Serialization.Formatters; -namespace Codebelt.Extensions.Carter.AspNetCore.Xml +namespace Codebelt.Extensions.Carter.AspNetCore.Xml; + +/// +/// Provides an XML response negotiator for Carter, capable of serializing response models to XML format. +/// +/// + public class XmlResponseNegotiator : ConfigurableResponseNegotiator { /// - /// Provides an XML response negotiator for Carter, capable of serializing response models to XML format. + /// Initializes a new instance of the class. /// - /// - public class XmlResponseNegotiator : ConfigurableResponseNegotiator + /// The used to configure XML serialization and supported media types. + public XmlResponseNegotiator(IOptions options) : base(options.Value) { - /// - /// Initializes a new instance of the class. - /// - /// The used to configure XML serialization and supported media types. - public XmlResponseNegotiator(IOptions options) : base(options.Value) - { - } + } - /// - /// Returns the character encoding specified by the writer settings. - /// - /// The default for this negotiator. - protected override Encoding GetDefaultEncoding() => Options.Settings.Writer.Encoding; + /// + /// Returns the character encoding specified by the writer settings. + /// + /// The default for this negotiator. + protected override Encoding GetDefaultEncoding() => Options.Settings.Writer.Encoding; - /// - /// Returns a new configured with the current . - /// - /// A instance configured with the current . - public override StreamFormatter GetFormatter() - { - return new XmlFormatter(Options); - } + /// + /// Returns a new configured with the current . + /// + /// A instance configured with the current . + public override StreamFormatter GetFormatter() + { + return new XmlFormatter(Options); } } From b75f99235224a6ce18f75cfef8d468aafb690b2e Mon Sep 17 00:00:00 2001 From: gimlichael Date: Fri, 24 Jul 2026 14:03:03 +0200 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=94=A7=20update=20changelog=20for=20v?= =?UTF-8?q?ersion=201.0.6=20with=20dependency=20upgrades=20and=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ba95ed..2a9a33b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,27 @@ 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. -## [1.0.6] - 2026-07-22 +## [1.0.6] - 2026-07-24 -This is a service update that focuses on package dependencies. +This is a patch release that updates Cuemon and Codebelt shared dependencies to their latest stable versions, improves build configuration, enhances CI/CD automation, and modernizes code formatting. + +### Changed + +- Codebelt.Extensions.AspNetCore.Newtonsoft.Json upgraded to 10.1.6, +- Codebelt.Extensions.AspNetCore.Text.Yaml upgraded to 10.1.6, +- Codebelt.Extensions.Xunit.App upgraded to 11.1.2, +- Cuemon.Core upgraded to 10.5.5, +- Cuemon.Extensions.AspNetCore.Text.Json upgraded to 10.5.5, +- Cuemon.Extensions.AspNetCore.Xml upgraded to 10.5.5, +- Cuemon.Extensions.IO upgraded to 10.5.5, +- Microsoft.NET.Test.Sdk upgraded to 18.8.1, +- Enhanced the NuGet package bumping script with intelligent version management, NuGet API lookups with caching, and improved output messaging, +- Refreshed the DocFX site container's NGINX base image to 1.31-alpine to allow more flexibility in the specific NGINX release, +- Modernized XmlResponseNegotiator code formatting by adopting file-scoped namespace syntax. + +### Fixed + +- Corrected the AnalysisMode property name in Directory.Build.props to use the correct MSBuild property. ## [1.0.5] - 2026-07-01 @@ -73,7 +91,7 @@ This is the initial stable release of the `Codebelt.Extensions.Carter`, `Codebel - `YamlResponseNegotiator` class in the Codebelt.Extensions.Carter.AspNetCore.Text.Yaml namespace that provides a YAML response negotiator for Carter, capable of serializing response models to YAML format using `YamlDotNet`, - `XmlResponseNegotiator` class in the Codebelt.Extensions.Carter.AspNetCore.Xml namespace that provides an XML response negotiator for Carter, capable of serializing response models to XML format using `System.Xml.XmlWriter`. -[Unreleased]: https://github.com/codebeltnet/carter/compare/v1.0.5...HEAD +[1.0.6]: https://github.com/codebeltnet/carter/compare/v1.0.5...v1.0.6 [1.0.5]: https://github.com/codebeltnet/carter/compare/v1.0.4...v1.0.5 [1.0.4]: https://github.com/codebeltnet/carter/compare/v1.0.3...v1.0.4 [1.0.3]: https://github.com/codebeltnet/carter/compare/v1.0.2...v1.0.3