Dev #13

Merged
omegaleo merged 49 commits from dev into main 2026-02-13 14:28:46 +00:00
163 changed files with 1189 additions and 144 deletions
Showing only changes of commit e2069a938e - Show all commits
+15
View File
@@ -0,0 +1,15 @@
# These are supported funding model platforms
github: omegaleo # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: omegaleo # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
+38
View File
@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: bug
assignees: omegaleo
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
+20
View File
@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: omegaleo
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
Regular → Executable
+32 -12
View File
@@ -6,35 +6,55 @@ on:
description: 'Tag name:'
type: string
required: true
run-name: "Generating changelog for Release v${{github.event.inputs.tagName}}"
run-name: "Generating changelog and Creating Tag for Release v${{github.event.inputs.tagName}}"
jobs:
generate_changelog:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
ref: ${{ github.ref }}
token: ${{ secrets.TOKEN }}
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@v1
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Update Project Versions
dotnet-version: '9.0.x'
- name: Update OmegaLeo.HelperLib Version
run: sed -i "s/\(<Version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib/OmegaLeo.HelperLib.csproj"
- name: Update Project Versions
- name: Update OmegaLeo.HelperLib.Changelog Version
run: sed -i "s/\(<Version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib.Changelog/OmegaLeo.HelperLib.Changelog.csproj"
- name: Build and Run Changelog Generator
run: dotnet run --project "./OmegaLeo.HelperLib.ChangelogHandler/OmegaLeo.HelperLib.ChangelogHandler.csproj"
- name: Update OmegaLeo.HelperLib.Documentation Version
run: sed -i "s/\(<Version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib.Documentation/OmegaLeo.HelperLib.Documentation.csproj"
- name: Update OmegaLeo.HelperLib.Game Version
run: sed -i "s/\(<Version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib.Game/OmegaLeo.HelperLib.Game.csproj"
- name: Update OmegaLeo.HelperLib.Shared Version
run: sed -i "s/\(<Version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1${{github.event.inputs.tagName}}/" "./OmegaLeo.HelperLib.Shared/OmegaLeo.HelperLib.Shared.csproj"
- name: Build Solution
run: dotnet build --configuration Release
- name: Run Changelog Generator
run: dotnet run --project "./OmegaLeo.HelperLib.ChangelogHandler/OmegaLeo.HelperLib.ChangelogHandler.csproj" --configuration Release
env:
UNITYFLOW_SECRET: ${{ secrets.TOKEN }}
- name: Create Tag
TAG_VERSION: ${{ github.event.inputs.tagName }}
- name: Commit and Push Changes
run: |
git config --local user.email "nunodiogo@omegaleo.pt"
git config --local user.name "Nuno Diogo"
git add .
git commit -m "Automatically generated changelog for v${{github.event.inputs.tagName}}"
git diff --staged --quiet || git commit -m "chore: update changelog and version to v${{github.event.inputs.tagName}}"
git push origin ${{ github.ref }}
- name: Create and Push Tag
run: |
git tag -a "${{ github.event.inputs.tagName }}" -m "Release ${{ github.event.inputs.tagName }}"
git push origin "${{ github.event.inputs.tagName }}"
Regular → Executable
View File
+77
View File
@@ -0,0 +1,77 @@
name: Publish to GitHub Packages
on:
workflow_dispatch:
inputs:
tag_name:
description: 'Version tag (e.g., 1.0.0)'
required: true
type: string
run-name: "Publish version v${{ inputs.tag_name }} to GitHub Packages"
permissions:
contents: read
packages: write
jobs:
publish-helper-lib:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib/OmegaLeo.HelperLib.csproj" -c Release /p:Version=${{ inputs.tag_name }}
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib/bin/Release/OmegaLeo.HelperLib.${{ inputs.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
publish-changelog-lib:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Changelog/OmegaLeo.HelperLib.Changelog.csproj" -c Release /p:Version=${{ inputs.tag_name }}
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Changelog/bin/Release/OmegaLeo.HelperLib.Changelog.${{ inputs.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
publish-game-lib:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Game/OmegaLeo.HelperLib.Game.csproj" -c Release /p:Version=${{ inputs.tag_name }}
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Game/bin/Release/OmegaLeo.HelperLib.Game.${{ inputs.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
publish-doc-lib:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Documentation/OmegaLeo.HelperLib.Documentation.csproj" -c Release /p:Version=${{ inputs.tag_name }}
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Documentation/bin/Release/OmegaLeo.HelperLib.Documentation.${{ inputs.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
publish-shared-lib:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Shared/OmegaLeo.HelperLib.Shared.csproj" -c Release /p:Version=${{ inputs.tag_name }}
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Shared/bin/Release/OmegaLeo.HelperLib.Shared.${{ inputs.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
+58
View File
@@ -32,6 +32,8 @@ jobs:
run: dotnet pack "./OmegaLeo.HelperLib/OmegaLeo.HelperLib.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
- name: Publish Nuget Package
run: dotnet nuget push ./OmegaLeo.HelperLib/bin/Release/OmegaLeo.HelperLib.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib/bin/Release/OmegaLeo.HelperLib.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
- name: Upload assets to release
uses: actions/upload-release-asset@v1
env:
@@ -56,6 +58,8 @@ jobs:
run: dotnet pack "./OmegaLeo.HelperLib.Changelog/OmegaLeo.HelperLib.Changelog.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
- name: Publish Nuget Package
run: dotnet nuget push ./OmegaLeo.HelperLib.Changelog/bin/Release/OmegaLeo.HelperLib.Changelog.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Changelog/bin/Release/OmegaLeo.HelperLib.Changelog.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
- name: Upload assets to release
uses: actions/upload-release-asset@v1
env:
@@ -80,6 +84,8 @@ jobs:
run: dotnet pack "./OmegaLeo.HelperLib.Game/OmegaLeo.HelperLib.Game.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
- name: Publish Nuget Package
run: dotnet nuget push ./OmegaLeo.HelperLib.Game/bin/Release/OmegaLeo.HelperLib.Game.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Game/bin/Release/OmegaLeo.HelperLib.Game.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
- name: Upload assets to release
uses: actions/upload-release-asset@v1
env:
@@ -89,3 +95,55 @@ jobs:
asset_path: ./OmegaLeo.HelperLib.Game/bin/Release/OmegaLeo.HelperLib.Game.${{ github.event.release.tag_name }}.nupkg
asset_name: OmegaLeo.HelperLib.Game.${{ github.event.release.tag_name }}.nupkg
asset_content_type: application/zip
publish-doc-lib:
runs-on: ubuntu-latest
needs: [ get-release ]
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Update Project Version
run: sed -i "s/\(<Version>\([0-9]\+\.\)\{2\}\)\([0-9]\+\)/\1${{ github.event.release.tag_name }}/" "./OmegaLeo.HelperLib.Documentation/OmegaLeo.HelperLib.Documentation.csproj"
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Documentation/OmegaLeo.HelperLib.Documentation.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
- name: Publish Nuget Package
run: dotnet nuget push ./OmegaLeo.HelperLib.Documentation/bin/Release/OmegaLeo.HelperLib.Documentation.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Documentation/bin/Release/OmegaLeo.HelperLib.Documentation.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
- name: Upload assets to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
with:
upload_url: ${{ needs.get-release.outputs.upload_url }}
asset_path: ./OmegaLeo.HelperLib.Documentation/bin/Release/OmegaLeo.HelperLib.Documentation.${{ github.event.release.tag_name }}.nupkg
asset_name: OmegaLeo.HelperLib.Documentation.${{ github.event.release.tag_name }}.nupkg
asset_content_type: application/zip
publish-shared-lib:
runs-on: ubuntu-latest
needs: [ get-release ]
steps:
- uses: actions/checkout@v2
- name: Setup .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '8.0.x'
- name: Update Project Version
run: sed -i "s/\(<Version>\([0-9]\+\.\)\{2\}\)\([0-9]\+\)/\1${{ github.event.release.tag_name }}/" "./OmegaLeo.HelperLib.Shared/OmegaLeo.HelperLib.Shared.csproj"
- name: Create Nuget Package
run: dotnet pack "./OmegaLeo.HelperLib.Shared/OmegaLeo.HelperLib.Shared.csproj" -c Release /p:Version=${{ github.event.release.tag_name }} /p:PackageReleaseNotes="See https://github.com/omegaleo/OmegaLeo.HelperLib/releases/tag/${{ github.event.release.tag_name }}"
- name: Publish Nuget Package
run: dotnet nuget push ./OmegaLeo.HelperLib.Shared/bin/Release/OmegaLeo.HelperLib.Shared.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.nuget_api_key }} --source https://api.nuget.org/v3/index.json --skip-duplicate
- name: Publish to GitHub Packages
run: dotnet nuget push ./OmegaLeo.HelperLib.Shared/bin/Release/OmegaLeo.HelperLib.Shared.${{ github.event.release.tag_name }}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/omegaleo/index.json --skip-duplicate
- name: Upload assets to release
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
with:
upload_url: ${{ needs.get-release.outputs.upload_url }}
asset_path: ./OmegaLeo.HelperLib.Shared/bin/Release/OmegaLeo.HelperLib.Shared.${{ github.event.release.tag_name }}.nupkg
asset_name: OmegaLeo.HelperLib.Shared.${{ github.event.release.tag_name }}.nupkg
asset_content_type: application/zip
Regular → Executable
View File
Generated Regular → Executable
View File
Generated Regular → Executable
View File
Generated Regular → Executable
View File
View File
View File
View File
View File
View File
View File
Generated Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
@@ -1,20 +0,0 @@
using System;
using NetFlow.DocumentationHelper.Library.Attributes;
namespace OmegaLeo.HelperLib.Changelog.Attributes
{
[Changelog("v1.0.0", "Created ChangelogAttribute to be used to register changes in the code.")]
[Documentation(nameof(ChangelogAttribute), "Attribute to annotate classes, methods, or properties with changelog information.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
public class ChangelogAttribute : Attribute
{
public string Version { get; }
public string Description { get; }
public ChangelogAttribute(string version, string description)
{
Version = version;
Description = description;
}
}
}
+9 -3
View File
@@ -1,7 +1,13 @@
# Changelog
## Version 1.2.0
## Version v1.0.0
**OmegaLeo.HelperLib.Changelog.Helpers**
- **ChangelogHelper**:
- Created ChangelogHelper to generate markdown from changelog attributes.
- **Class: ChangelogTool**: Created the class ChangelogTool to extract changelogs via attributes
- **Class: ChangelogAttribute**: Created ChangelogAttribute to be used to register changes in the code.
## Version 1.0.0
**OmegaLeo.HelperLib.Changelog.Tools**
- **ChangelogTool**:
- Created the class ChangelogTool to extract changelogs via attributes
@@ -0,0 +1,114 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using OmegaLeo.HelperLib.Shared.Attributes;
namespace OmegaLeo.HelperLib.Changelog.Helpers
{
[Documentation(nameof(ChangelogHelper),
"Helper class to generate changelog markdown from ChangelogAttributes in the provided Assemblies.")]
[Changelog("1.2.0", "Created ChangelogHelper to generate markdown from changelog attributes.")]
public static class ChangelogHelper
{
[Documentation(nameof(GetChangelogMarkdown),
"Generates a markdown formatted changelog from the changelog attributes in the provided assemblies.")]
public static string GetChangelogMarkdown(IEnumerable<Assembly> assemblies)
{
var changelog = new StringBuilder();
var entriesByVersionDate =
new Dictionary<(string Version, string Date),
Dictionary<string, List<(string ClassName, string Description)>>>();
foreach (var assembly in assemblies)
{
try
{
foreach (var type in assembly.GetTypes())
{
// Get type-level changelog attributes
var typeAttrs = type.GetCustomAttributes<ChangelogAttribute>().ToList();
// Get member-level changelog attributes (methods, properties, fields, etc.)
var memberAttrs = type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Static | BindingFlags.Instance)
.SelectMany(m => m.GetCustomAttributes<ChangelogAttribute>()
.Select(attr => (Member: m, Attribute: attr)))
.ToList();
if (typeAttrs.Any() || memberAttrs.Any())
{
var namespaceName = type.Namespace ?? "Global";
var className = type.Name.Split('`')[0];
// Process type-level attributes
foreach (var attr in typeAttrs)
{
AddEntry(entriesByVersionDate, namespaceName, className, attr.Version, attr.Date,
attr.Description);
}
// Process member-level attributes
foreach (var (member, attr) in memberAttrs)
{
var memberName = $"{className}.{member.Name}";
AddEntry(entriesByVersionDate, namespaceName, memberName, attr.Version, attr.Date,
attr.Description);
}
}
}
}
catch (ReflectionTypeLoadException)
{
// Skip assemblies that can't be fully loaded
}
}
foreach (var versionGroup in entriesByVersionDate.OrderByDescending(x => x.Key.Version))
{
changelog.AppendLine($"## Version {versionGroup.Key.Version}");
if (!string.IsNullOrEmpty(versionGroup.Key.Date))
{
changelog.AppendLine($"### {versionGroup.Key.Date}");
}
changelog.AppendLine();
foreach (var namespaceGroup in versionGroup.Value.OrderBy(x => x.Key))
{
changelog.AppendLine($"**{namespaceGroup.Key}**");
foreach (var entry in namespaceGroup.Value.OrderBy(x => x.ClassName))
{
changelog.AppendLine($@"- **{entry.ClassName}**:
- {entry.Description}");
}
changelog.AppendLine();
}
}
return changelog.ToString();
}
private static void AddEntry(
Dictionary<(string Version, string Date), Dictionary<string, List<(string ClassName, string Description)>>>
entriesByVersionDate,
string namespaceName,
string className,
string version,
string date,
string description)
{
var key = (version, date ?? string.Empty);
if (!entriesByVersionDate.ContainsKey(key))
entriesByVersionDate[key] = new Dictionary<string, List<(string, string)>>();
if (!entriesByVersionDate[key].ContainsKey(namespaceName))
entriesByVersionDate[key][namespaceName] = new List<(string, string)>();
entriesByVersionDate[key][namespaceName].Add((className, description));
}
}
}
View File
View File
+12 -10
View File
@@ -4,6 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>1.2.1.1</Version>
<Title>Omega Leo's Helper Library - Changelog</Title>
<Authors>Nuno "Omega Leo" Diogo</Authors>
<Description>Package to help with Changelog generation</Description>
@@ -11,29 +12,30 @@
<PackageReadmeFile>README.md</PackageReadmeFile>
<RepositoryUrl>https://github.com/omegaleo/HelperLib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<PackageLicenseExpression>AGPL-3.0</PackageLicenseExpression>
<PackageLicenseExpression>AGPL-3.0-only</PackageLicenseExpression>
<PackageTags>csharp;dotnet;utility;helper;benchmark</PackageTags>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
<ItemGroup>
<None Include="README.md" Pack="true" PackagePath="\" />
<None Include="CHANGELOG.md" Pack="true" PackagePath="\" />
<None Include="README.md" Pack="true" PackagePath="\">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Include="CHANGELOG.md" Pack="true" PackagePath="\">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Include="LICENSE.md" Pack="true" PackagePath="\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
</ItemGroup>
<ItemGroup>
<Reference Include="NetFlow.DocumentationHelper.Library">
<HintPath>..\..\..\..\..\..\home\omegaleo\.nuget\packages\netflow.documentationhelper.library\1.1.2\lib\netstandard2.1\NetFlow.DocumentationHelper.Library.dll</HintPath>
<Reference Include="OmegaLeo.HelperLib.Documentation">
<HintPath>..\..\..\..\..\..\home\omegaleo\.nuget\packages\OmegaLeo.HelperLib.Documentation\1.1.2\lib\netstandard2.1\OmegaLeo.HelperLib.Documentation.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.2" />
<ProjectReference Include="..\OmegaLeo.HelperLib.Documentation\OmegaLeo.HelperLib.Documentation.csproj" />
<ProjectReference Include="..\OmegaLeo.HelperLib.Shared\OmegaLeo.HelperLib.Shared.csproj" />
</ItemGroup>
</Project>
+1 -1
View File
@@ -3,7 +3,7 @@ Package to help with Changelog generation by providing a new Changelog attribute
Example attribute usage:
```cs
[Changelog("v1.0.0", "This is a test")]
[Changelog("1.0.0", "This is a test")]
[Changelog("v1.0.1", "This is another test")]
public class Test
{
+2 -3
View File
@@ -2,12 +2,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Changelog.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
namespace OmegaLeo.HelperLib.Changelog.Tools
{
[Changelog("v1.0.0", "Created the class ChangelogTool to extract changelogs via attributes")]
[Changelog("1.0.0", "Created the class ChangelogTool to extract changelogs via attributes")]
[Documentation("ChangelogTool", "Provides methods to extract changelog information from assembly attributes.")]
public class ChangelogTool
{
+1 -5
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
@@ -13,8 +13,4 @@
<ProjectReference Include="..\OmegaLeo.HelperLib\OmegaLeo.HelperLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
</ItemGroup>
</Project>
+6 -2
View File
@@ -4,7 +4,8 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using GameDevLibrary.Helpers;
using OmegaLeo.HelperLib.Changelog.Helpers;
using OmegaLeo.HelperLib.Helpers;
using OmegaLeo.HelperLib.Changelog.Models;
using OmegaLeo.HelperLib.Changelog.Tools;
@@ -15,6 +16,8 @@ var changelogs = new Dictionary<string, Assembly>()
{Path.Join(root, "OmegaLeo.HelperLib.Changelog", "CHANGELOG.md"), typeof(Changelog).Assembly},
{Path.Join(root, "OmegaLeo.HelperLib", "CHANGELOG.md"), typeof(BenchmarkUtility).Assembly},
{Path.Join(root, "OmegaLeo.HelperLib.Game", "CHANGELOG.md"), typeof(OmegaLeo.HelperLib.Game.Models.ConsoleCommand).Assembly},
{Path.Join(root, "OmegaLeo.HelperLib.Documentation", "CHANGELOG.md"), typeof(OmegaLeo.HelperLib.Documentation.Helpers.DocumentationHelperTool).Assembly},
{Path.Join(root, "OmegaLeo.HelperLib.Shared", "CHANGELOG.md"), typeof(OmegaLeo.HelperLib.Shared.Attributes.ChangelogAttribute).Assembly},
};
foreach (var changelog in changelogs)
@@ -25,7 +28,8 @@ foreach (var changelog in changelogs)
void GenerateChangelog(string path, Assembly libraryAssembly)
{
var changelogMarkdown = ChangelogTool.GetMarkdown(libraryAssembly);
var changelogMarkdown = $@"# Changelog
{ChangelogHelper.GetChangelogMarkdown(new []{libraryAssembly})}";
File.WriteAllText(path,changelogMarkdown);
}
-4
View File
@@ -13,8 +13,4 @@
<ProjectReference Include="..\OmegaLeo.HelperLib\OmegaLeo.HelperLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
</ItemGroup>
</Project>
+2 -2
View File
@@ -3,8 +3,8 @@
// /media/omegaleo/Development/Library Dev/HelperLib
using System.Reflection;
using GameDevLibrary.Extensions;
using GameDevLibrary.Helpers;
using OmegaLeo.HelperLib.Extensions;
using OmegaLeo.HelperLib.Helpers;
using LibGit2Sharp;
using OmegaLeo.HelperLib.Changelog.Tools;
using OmegaLeo.HelperLib.Git;
@@ -1,10 +0,0 @@
using OmegaLeo.HelperLib.Changelog.Attributes;
namespace OmegaLeo.HelperLib.ConsoleApp;
[Changelog("v1.0.0", "Test")]
[Changelog("v1.0.1", "Test 1")]
public class TestClass
{
}
@@ -0,0 +1,8 @@
# Changelog
## Version 1.2.0
### January 26, 2026
**OmegaLeo.HelperLib.Documentation.Helpers**
- **DocumentationHelperTool**:
- Migrated DocumentationHelper library from NetFlow.DocumentationHelper.Library to it's own package in OmegaLeo.HelperLib
@@ -0,0 +1,193 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml;
using Microsoft.Extensions.DependencyModel;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Documentation.Models;
namespace OmegaLeo.HelperLib.Documentation.Helpers
{
[Changelog("1.2.0", "Migrated DocumentationHelper library from NetFlow.DocumentationHelper.Library to it's own package in OmegaLeo.HelperLib", "January 26, 2026")]
public static class DocumentationHelperTool
{
[Documentation("GenerateDocumentation (bool generateForPackageAssembly)",
@"Generates a List of objects of type DocumentationStructure that contain the following fields:
**AssemblyName**: Name of the main Assembly, used to identify the root namespace
**ClassName**: Name of the class, used to identify the upper level object
**Title**: Title what we're generating documentation for
**Description**: Description of what we're generating documentation for, this can contain usage examples and can use the args array to pass names(e.g.: This method uses this methodology)
**Args**: Array of strings that describe the parameters of the method or class
**CodeExample**: A code example of how to use the method or class
*Note: If generateForPackageAssembly is set to true, this will generate documentation for the library as well.*",
new []
{
"generateForPackageAssembly - Generate documentation for the DocumentationHelper library as well?"
},
@"```csharp
DocumentationHelperTool.GenerateDocumentation(true); // Generates documentation for all assemblies including the DocumentationHelper.Library package assembly
DocumentationHelperTool.GenerateDocumentation(false); // Generates documentation for all assemblies excluding the DocumentationHelper.Library package assembly
```")]
public static IEnumerable<DocumentationStructure> GenerateDocumentation(bool generateForPackageAssembly = false)
{
EnsureReferencedAssembliesLoaded();
var assemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => !a.IsDynamic)
.Select(a =>
new DocumentationAssembly()
{
AssemblyName = a.GetName(false)?.Name ?? nameof(a),
Types = GetTypesWithDocumentationAttribute(a)
}).Where(x => x.Types.Any()).ToList();
if (!generateForPackageAssembly)
{
assemblies =
assemblies.Where(x => x.AssemblyName != typeof(DocumentationHelperTool).Assembly.GetName().Name)
.ToList();
}
foreach (var assembly in assemblies)
{
foreach (var type in assembly.Types)
{
var doc = GetDocumentation(type, assembly.AssemblyName);
yield return doc;
}
}
}
static void EnsureReferencedAssembliesLoaded()
{
try
{
var loadedNames = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.GetName(false) != null)
.Select(a => a.GetName(false).Name)
.ToHashSet(StringComparer.OrdinalIgnoreCase);
var deps = DependencyContext.Default?.RuntimeLibraries;
if (deps == null) return;
foreach (var lib in deps)
{
if (!loadedNames.Contains(lib.Name))
{
try
{
Assembly.Load(new AssemblyName(lib.Name));
}
catch (Exception ex)
{
Console.Error.WriteLine($"warning OMEGA001: Failed to load assembly '{lib.Name}': {ex.Message}");
}
}
}
}
catch (Exception ex)
{
// best-effort only
Console.Error.WriteLine($"warning OMEGA001: EnsureReferencedAssembliesLoaded failed: {ex.Message}");
}
}
static IEnumerable<Type> GetTypesWithDocumentationAttribute(Assembly assembly)
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
types = ex.Types.Where(t => t != null).ToArray();
}
foreach (Type type in types)
{
if (type == null) continue;
var classHasDoc = type.GetCustomAttributes(typeof(DocumentationAttribute), true).Any();
var fieldsHaveDoc = type.GetFields()
.Any(f => f.GetCustomAttributes(typeof(DocumentationAttribute), true).Any());
var typesHaveDoc = type.GetProperties()
.Any(p => p.GetCustomAttributes(typeof(DocumentationAttribute), true).Any());
var methodsHaveDoc = type.GetMethods()
.Any(m => m.GetCustomAttributes(typeof(DocumentationAttribute), true).Any());
if (classHasDoc || fieldsHaveDoc || typesHaveDoc || methodsHaveDoc)
{
yield return type;
}
}
}
[Documentation(nameof(GetDocumentation), "Generates a DocumentationStructure object for the given Type and Assembly Name",
new []
{
"type - The Type to generate documentation for",
"assemblyName - The name of the assembly the Type belongs to"
},
@"```csharp
var doc = GetDocumentation(typeof(MyClass), ""MyAssembly"");
```")]
static DocumentationStructure GetDocumentation(Type type, string assemblyName)
{
var classDocs = type.GetCustomAttributes(typeof(DocumentationAttribute), true)
.Select(x => (DocumentationAttribute)x);
var fieldDocs = type.GetFields().SelectMany(f =>
f.GetCustomAttributes(typeof(DocumentationAttribute), true).Select(x => (DocumentationAttribute)x));
var propertyDocs = type.GetProperties().SelectMany(p =>
p.GetCustomAttributes(typeof(DocumentationAttribute), true).Select(x => (DocumentationAttribute)x));
var methodDocs = type.GetMethods().SelectMany(m =>
m.GetCustomAttributes(typeof(DocumentationAttribute), true).Select(x => (DocumentationAttribute)x));
var docStructure = new DocumentationStructure(assemblyName, type.Name);
foreach (var doc in classDocs)
{
docStructure.AddDescription(new DocumentationDescription(doc.Title, doc.Description, doc.Args, doc.CodeExample));
}
foreach (var doc in fieldDocs)
{
docStructure.AddDescription(new DocumentationDescription(doc.Title, doc.Description, doc.Args, doc.CodeExample));
}
foreach (var doc in propertyDocs)
{
docStructure.AddDescription(new DocumentationDescription(doc.Title, doc.Description, doc.Args, doc.CodeExample));
}
foreach (var doc in methodDocs)
{
docStructure.AddDescription(new DocumentationDescription(doc.Title, doc.Description, doc.Args, doc.CodeExample));
}
return docStructure;
}
static Dictionary<string, string> loadedXmlDocumentation =
new Dictionary<string, string>();
public static void LoadXmlDocumentation(string xmlDocumentation)
{
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlDocumentation)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "member")
{
string raw_name = xmlReader["name"];
loadedXmlDocumentation[raw_name] = xmlReader.ReadInnerXml();
}
}
}
}
}
}
@@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
namespace OmegaLeo.HelperLib.Documentation.Models
{
public class DocumentationAssembly
{
public string AssemblyName;
public IEnumerable<Type> Types;
}
}
@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using OmegaLeo.HelperLib.Shared.Attributes;
namespace OmegaLeo.HelperLib.Documentation.Models
{
public class DocumentationStructure
{
public string AssemblyName;
public string ClassName;
public List<DocumentationDescription> Descriptions;
public DocumentationStructure(string assemblyName, string className)
{
AssemblyName = assemblyName;
ClassName = className;
Descriptions = new List<DocumentationDescription>();
}
public void AddDescription(DocumentationDescription description)
{
Descriptions.Add(description);
}
}
public class DocumentationDescription
{
public string Title;
public string Description;
public string[] Parameters;
public string CodeExample = string.Empty;
[Documentation(nameof(DocumentationDescription), "Description of the current Documented object", new []
{
"title - Name of the object",
"description - Description of what the object does",
"parameters - The parameters for the object (in case of a method with parameters)",
"codeExample - Code example of how to use the object"
})]
public DocumentationDescription(string title, string description, string[] parameters = default, string codeExample = "")
{
Title = title;
Description = description;
Parameters = parameters ?? Array.Empty<string>();
CodeExample = codeExample;
}
}
}
@@ -0,0 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>OmegaLeo.HelperLib.Documentation</RootNamespace>
<Version>1.2.1.1</Version>
<Title>Omega Leo's Helper Library</Title>
<Authors>Nuno "Omega Leo" Diogo</Authors>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageProjectUrl>https://github.com/omegaleo/HelperLib</PackageProjectUrl>
<RepositoryUrl>https://github.com/omegaleo/HelperLib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<PackageLicenseExpression>AGPL-3.0-only</PackageLicenseExpression>
<PackageTags>csharp;dotnet;utility;helper;documentation;</PackageTags>
<RepositoryType>git</RepositoryType>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="10.0.2" />
</ItemGroup>
<ItemGroup>
<Folder Include="Attributes\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OmegaLeo.HelperLib.Shared\OmegaLeo.HelperLib.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="README.md" Pack="true" PackagePath="\" />
<None Include="CHANGELOG.md" Pack="true" PackagePath="\" />
<None Update="README.md">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="CHANGELOG.md">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
@@ -0,0 +1,30 @@
# Omega Leo's Helper Library - Documentation
Package to help with generating and managing documentation for your C# projects.
## Features
- Attribute-based documentation: Use custom attributes to annotate your classes, methods, and properties with documentation comments.
- Documentation extraction tool: A tool to extract and format documentation into various formats (Markdown, HTML, etc.).
- Integration with build processes: Easily integrate documentation generation into your CI/CD pipelines.
## Example attribute usage:
```cs
[Documentation("GenerateDocumentation (bool generateForPackageAssembly)",
@"Generates a List of objects of type DocumentationStructure that contain the following fields:
**AssemblyName**: Name of the main Assembly, used to identify the root namespace
**ClassName**: Name of the class, used to identify the upper level object
**Title**: Title what we're generating documentation for
**Description**: Description of what we're generating documentation for, this can contain usage examples and can use the args array to pass names(e.g.: This method uses this methodology)
**Args**: Array of strings that describe the parameters of the method or class
**CodeExample**: A code example of how to use the method or class
*Note: If generateForPackageAssembly is set to true, this will generate documentation for the library as well.*",
new []
{
"generateForPackageAssembly - Generate documentation for the DocumentationHelper library as well?"
},
@"```csharp
DocumentationHelperTool.GenerateDocumentation(true); // Generates documentation for all assemblies including the DocumentationHelper.Library package assembly
DocumentationHelperTool.GenerateDocumentation(false); // Generates documentation for all assemblies excluding the DocumentationHelper.Library package assembly
```")]
public static IEnumerable<DocumentationStructure> GenerateDocumentation(bool generateForPackageAssembly = false)
```
+1
View File
@@ -0,0 +1 @@
# Changelog
+1 -1
View File
@@ -1,5 +1,5 @@
using System.Collections.Generic;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Game.Models;
namespace OmegaLeo.HelperLib.Game.Extensions
+1 -1
View File
@@ -1,4 +1,4 @@
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Game.Models;
namespace OmegaLeo.HelperLib.Game.Handlers
View File
View File
View File
View File
View File
View File
View File
+11 -4
View File
@@ -4,13 +4,12 @@
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<Title>Omega Leo's Helper Library - Game Logic</Title>
<Version>0.0.2</Version>
<Version>1.2.1.1</Version>
<Authors>Nuno "Omega Leo" Diogo</Authors>
<PackageProjectUrl>https://github.com/omegaleo/HelperLib</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/omegaleo/HelperLib/blob/main/LICENSE</PackageLicenseUrl>
<RepositoryUrl>https://github.com/omegaleo/HelperLib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<PackageLicenseExpression>AGPL-3.0</PackageLicenseExpression>
<PackageLicenseExpression>AGPL-3.0-only</PackageLicenseExpression>
<PackageTags>csharp;dotnet;utility;helper;benchmark</PackageTags>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
@@ -20,8 +19,16 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>
<ItemGroup>
<None Update="README.md">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Update="CHANGELOG.md">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
View File
View File
View File
View File
-1
View File
@@ -1 +0,0 @@
# OmegaLeo's Helper Library - Game Logic
+8
View File
@@ -0,0 +1,8 @@
# OmegaLeo's Helper Library - Game Logic
Lightweight utility library for C# projects and game development helpers.
## Features
- Game development specific helpers and utilities
- Helpers for common game development tasks
- Easy to integrate into existing projects
- Open source under the AGPL v3 License
+1 -1
View File
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Game.Models;
namespace OmegaLeo.HelperLib.Game.Services
+1 -1
View File
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Game.Handlers;
using OmegaLeo.HelperLib.Game.Models;
+1 -1
View File
@@ -1,6 +1,6 @@
using System;
using System.IO;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using Newtonsoft.Json;
using OmegaLeo.HelperLib.Game.Interfaces;
View File
View File
+1 -1
View File
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using NetFlow.DocumentationHelper.Library.Attributes;
using OmegaLeo.HelperLib.Shared.Attributes;
using OmegaLeo.HelperLib.Game.Models;
namespace OmegaLeo.HelperLib.Game.Utilities
+1 -1
View File
@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using GameDevLibrary.Extensions;
using OmegaLeo.HelperLib.Extensions;
using LibGit2Sharp;
using OmegaLeo.HelperLib.Git.Models;
View File
+1 -2
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>GameDevLibrary.Git</RootNamespace>
<RootNamespace>OmegaLeo.HelperLib.Git</RootNamespace>
<Version>0.0.2</Version>
<Title>Omega Leo's Helper Library - LibGit2Sharp Implementation</Title>
<Authors>Nuno "Omega Leo" Diogo</Authors>
@@ -13,7 +13,6 @@
<ItemGroup>
<PackageReference Include="LibGit2Sharp" Version="0.30.0"/>
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
</ItemGroup>
<ItemGroup>
+32
View File
@@ -0,0 +1,32 @@
using System;
namespace OmegaLeo.HelperLib.Shared.Attributes
{
[Documentation(nameof(ChangelogAttribute), "Attribute to annotate classes, methods, or properties with changelog information.",
new []
{
"Version - Changelog version",
"Description - Description of what was changed",
"Date - Date of the changes (Optional)"
},
@"```cs
[Changelog(""1.0.0"", ""Created ChangelogAttribute to be used to register changes in the code."")]
public class ChangelogAttribute : Attribute" )]
[Changelog("1.0.0", "Created ChangelogAttribute to be used to register changes in the code.")]
[Changelog("1.2.1", "Created documentation for ChangelogAttribute.", "January 28, 2026")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
public class ChangelogAttribute : Attribute
{
public string Version { get; }
public string Description { get; }
public string Date { get; set; }
public ChangelogAttribute(string version, string description, string date = "")
{
Version = version;
Description = description;
Date = date;
}
}
}
@@ -0,0 +1,45 @@
using System;
namespace OmegaLeo.HelperLib.Shared.Attributes
{
[System.AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
[Changelog("1.2.1", "Created documentation for DocumentationAttribute.", "January 28, 2026")]
[Documentation("DocumentationAttribute",
"Attribute to annotate classes, methods, or properties with documentation information.",
new string[]
{
"title: The title of the documentation.",
"description: A brief description.",
"args: An array of argument descriptions.",
"codeExample: An optional code example."
},
@"```csharp
[Documentation(
""MyMethod"",
""This method does something important."",
new string[] { ""param1: The first parameter."", ""param2: The second parameter."" },
""MyMethod(param1, param2);""
)]
public void MyMethod(string param1, int param2)
{
// Method implementation
}
```
"
)]
public class DocumentationAttribute : Attribute
{
public string Title;
public string Description;
public string[] Args;
public string CodeExample = string.Empty;
public DocumentationAttribute(string title, string description, string[] args = null, string codeExample = "")
{
Title = title;
Description = description;
Args = args ?? Array.Empty<string>();
CodeExample = codeExample;
}
}
}
+16
View File
@@ -0,0 +1,16 @@
# Changelog
## Version 1.2.1
### January 28, 2026
**OmegaLeo.HelperLib.Shared.Attributes**
- **ChangelogAttribute**:
- Created documentation for ChangelogAttribute.
- **DocumentationAttribute**:
- Created documentation for DocumentationAttribute.
## Version 1.0.0
**OmegaLeo.HelperLib.Shared.Attributes**
- **ChangelogAttribute**:
- Created ChangelogAttribute to be used to register changes in the code.
@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>OmegaLeo.HelperLib.Shared</RootNamespace>
<Version>1.2.1.1</Version>
<Title>Omega Leo's Helper Library - Shared Components</Title>
<Authors>Nuno "Omega Leo" Diogo</Authors>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageProjectUrl>https://github.com/omegaleo/HelperLib</PackageProjectUrl>
<RepositoryUrl>https://github.com/omegaleo/HelperLib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<PackageLicenseExpression>AGPL-3.0-only</PackageLicenseExpression>
<PackageTags>csharp;dotnet;</PackageTags>
<RepositoryType>git</RepositoryType>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Include="README.md" Pack="true" PackagePath="\">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
<None Include="CHANGELOG.md" Pack="true" PackagePath="\">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
+4
View File
@@ -0,0 +1,4 @@
# Omega Leo's Helper Library - Shared Components
Lightweight utility library for C# projects.
This library contains shared components and utilities that are used by other packages in the Omega Leo's Helper Library suite.
+28 -12
View File
@@ -3,10 +3,11 @@
using System.Diagnostics;
using System.Reflection;
using System.Runtime.ExceptionServices;
using GameDevLibrary.Helpers;
using OmegaLeo.HelperLib.Helpers;
using Microsoft.AspNetCore.Mvc;
using NetFlow.DocumentationHelper.Library.Helpers;
using NetFlow.DocumentationHelper.Library.Models;
using OmegaLeo.HelperLib.Changelog.Helpers;
using OmegaLeo.HelperLib.Documentation.Helpers;
using OmegaLeo.HelperLib.Documentation.Models;
using OmegaLeo.HelperLib.Changelog.Tools;
using OmegaLeo.HelperLib.Web.Models;
@@ -52,7 +53,22 @@ public class HomeController : Controller
"Game Development Library",
"Game development utilities for Unity and Godot",
"OmegaLeo.HelperLib.Game"
)
),
["documentation"] = GenerateLibraryDocs(
typeof(OmegaLeo.HelperLib.Documentation.Helpers.DocumentationHelperTool).Assembly,
Path.Combine(root, "changelogs", "OmegaLeo.HelperLib.Documentation.CHANGELOG.md"),
"Documentation Library",
"Tools for generating documentation from code attributes",
"OmegaLeo.HelperLib.Documentation",
true
),
["shared"] = GenerateLibraryDocs(
typeof(OmegaLeo.HelperLib.Shared.Attributes.ChangelogAttribute).Assembly,
Path.Combine(root, "shared", "OmegaLeo.HelperLib.Shared.CHANGELOG.md"),
"Shared Library",
"Library of shared attributes and utilities used across other OmegaLeo.HelperLib packages",
"OmegaLeo.HelperLib.Shared"
),
};
_logger.LogInformation("Initialized {Count} libraries", _libraryCache.Count);
@@ -99,11 +115,11 @@ public class HomeController : Controller
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var target = assemblies.FirstOrDefault(a =>
a.GetName().Name.Equals("NetFlow.DocumentationHelper.Library", StringComparison.OrdinalIgnoreCase));
a.GetName().Name.Equals("OmegaLeo.HelperLib.Documentation", StringComparison.OrdinalIgnoreCase));
if (target == null)
{
_logger.LogWarning("NetFlow.DocumentationHelper.Library not loaded. Loaded assemblies ({Count}):",
_logger.LogWarning("OmegaLeo.HelperLib.Documentation not loaded. Loaded assemblies ({Count}):",
assemblies.Length);
foreach (var a in assemblies.OrderBy(a => a.GetName().Name))
{
@@ -120,7 +136,7 @@ public class HomeController : Controller
Type attrType = null;
try
{
attrType = target.GetType("NetFlow.DocumentationHelper.Library.Attributes.DocumentationAttribute",
attrType = target.GetType("OmegaLeo.HelperLib.Documentation.Attributes.DocumentationAttribute",
false, true);
}
catch (Exception ex)
@@ -238,7 +254,7 @@ public class HomeController : Controller
}
private LibraryDocumentationViewModel GenerateLibraryDocs(Assembly assembly, string changelogPath,
string displayName, string description, string nugetPackageId)
string displayName, string description, string nugetPackageId, bool generateForDocumentationAssembly = false)
{
_logger.LogInformation("=== Starting GenerateLibraryDocs for {Assembly} ===", assembly.GetName().Name);
_logger.LogInformation("Assembly location: {Location}", assembly.Location ?? "<in-memory>");
@@ -278,7 +294,7 @@ public class HomeController : Controller
try
{
// Pass the specific assembly to only scan that assembly
var result = DocumentationHelperTool.GenerateDocumentation();
var result = DocumentationHelperTool.GenerateDocumentation(generateForDocumentationAssembly);
allDocumentation = result?
.Where(d => d.AssemblyName?.Equals(assembly.GetName().Name ,StringComparison.OrdinalIgnoreCase) == true)
.ToList() ?? Enumerable.Empty<DocumentationStructure>();
@@ -307,7 +323,7 @@ public class HomeController : Controller
throw;
}
var changelogMarkdown = string.Empty;
/*var changelogMarkdown = string.Empty;
if (System.IO.File.Exists(changelogPath))
{
try
@@ -324,14 +340,14 @@ public class HomeController : Controller
else
{
_logger.LogWarning("Changelog file not found at {Path}", changelogPath);
}
}*/
var viewModel = new LibraryDocumentationViewModel
{
LibraryName = displayName,
Description = description,
NuGetPackageId = nugetPackageId,
ChangelogMarkdown = changelogMarkdown,
ChangelogMarkdown = ChangelogHelper.GetChangelogMarkdown(new []{assembly}),
Documentation = allDocumentation.ToList()
};
View File
+1 -1
View File
@@ -1,5 +1,5 @@
// File: `OmegaLeo.HelperLib.Web/Models/LibraryDocumentationViewModel.cs`
using NetFlow.DocumentationHelper.Library.Models;
using OmegaLeo.HelperLib.Documentation.Models;
namespace OmegaLeo.HelperLib.Web.Models
{
-1
View File
@@ -16,7 +16,6 @@
<ItemGroup>
<PackageReference Include="Markdig" Version="0.40.0" />
<PackageReference Include="MarkdigExtensions.SyntaxHighlighting" Version="1.0.3" />
<PackageReference Include="NetFlow.DocumentationHelper.Library" Version="1.1.3" />
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
View File
View File
View File
+2 -2
View File
@@ -1,6 +1,6 @@
@* File: `OmegaLeo.HelperLib.Web/Views/Home/Library.cshtml` *@
@using ColorCode.Styling
@using GameDevLibrary.Extensions
@using OmegaLeo.HelperLib.Extensions
@using Markdig
@model OmegaLeo.HelperLib.Web.Models.LibraryDocumentationViewModel
@{
@@ -83,7 +83,7 @@
{
<tr>
<td><code>@desc.Title</code></td>
<td>@Html.Raw(desc.Description)<br/>
<td>@Html.Raw(Markdig.Markdown.ToHtml(desc.Description))<br/>
@if (desc.CodeExample.IsNotNullOrEmpty())
{
<strong>Example:</strong><br/>
View File
View File
+6
View File
@@ -33,6 +33,12 @@
<li class="nav-item">
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Library" asp-route-id="game">Game Dev</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Library" asp-route-id="documentation">Documentation</a>
</li>
<li class="nav-item">
<a class="nav-link" asp-area="" asp-controller="Home" asp-action="Library" asp-route-id="shared">Shared Components</a>
</li>
</ul>
<ul class="navbar-nav ms-auto">
View File
View File
View File
View File
View File
View File
View File
View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File
View File
View File
View File
View File
View File
View File
View File
View File

Some files were not shown because too many files have changed in this diff Show More