From 52035c415be27125e9e13c4b6e058bdf3a093fa8 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Thu, 18 Jan 2024 23:05:16 +0530 Subject: [PATCH 1/8] Add NuGet Package details to MsBuild project --- .../CleanArchitecture.Blazored.MsBuild.csproj | 58 ++++++++++++++++++- .../CleanArchitecture.Blazored.MsBuild.props | 21 +++++++ ...CleanArchitecture.Blazored.MsBuild.targets | 3 + 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props create mode 100644 src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.targets diff --git a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj index a6013d1..e103c75 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj +++ b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj @@ -6,9 +6,63 @@ enable + + + 1.0.0 + CleanArchitecture.Blazored.MsBuild + John + Generates a strongly typed setting class base on a txt file + MyTags + Copyright ©Contoso 2022 + + + true + $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage + + tasks + + NU5100 + embedded + true + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props b/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props new file mode 100644 index 0000000..83a1b86 --- /dev/null +++ b/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props @@ -0,0 +1,21 @@ + + + + + + $(MSBuildThisFileDirectory)..\tasks\net8.0 + + $(CustomTasksFolder)\$(MSBuildThisFileName).dll + + + + + + + + + \ No newline at end of file diff --git a/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.targets b/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.targets new file mode 100644 index 0000000..2d9c7e3 --- /dev/null +++ b/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file From f4d06b6a55569a2803bcf3c47ecc9684fd23afcc Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Thu, 18 Jan 2024 23:10:39 +0530 Subject: [PATCH 2/8] Change labels in pr workflows --- .github/workflows/pr.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4b703b3..7eaf57b 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -24,8 +24,10 @@ jobs: } if(RegExp(isChecked.source + "Template Enhancement").test(body)) { - labels.push("breaking change"); - console.log("PR type: breaking change."); + labels.push("enhancement"); + labels.push("management"); + console.log("PR type: enhancement."); + console.log("PR type: management."); } if(!pr.draft) { From f27f78abd18ad76191fa84e368153f86e1749ec2 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Thu, 18 Jan 2024 23:42:35 +0530 Subject: [PATCH 3/8] Add MsBuild Task to CleanArchitecture.Blazored as local nuget package Add MsBuild task as Nuget package --- .../CleanArchitecture.Blazored.Deploy.yml | 5 +-- .../CleanArchitecture.Blazored.Dev.yml | 16 +++++----- .../workflows/CleanArchitecture.Blazored.yml | 3 ++ .../CleanArchitecture.MudBlazored.yml | 5 ++- .gitignore | 2 +- CleanArchitecture.Blazored.restore.ps1 | 4 +++ artifacts/.gitkeep | 0 nuget.config | 9 ++++++ .../CleanArchitecture.Blazored.MsBuild.csproj | 4 --- src/CleanArchitecture.Blazored.csproj | 1 + src/TemplateItems/MsBuild/BuildSettings.props | 2 ++ .../CleanArchitecture.Blazored.Hepler.targets | 13 -------- .../CleanArchitecture.MudBlazored.targets | 31 +++++++++---------- .../CleanArchitecture.Package.targets | 6 ---- .../src/WebUi/WebUi/WebUi.csproj | 4 --- 15 files changed, 51 insertions(+), 54 deletions(-) create mode 100644 CleanArchitecture.Blazored.restore.ps1 create mode 100644 artifacts/.gitkeep create mode 100644 nuget.config delete mode 100644 src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Blazored.Hepler.targets diff --git a/.github/workflows/CleanArchitecture.Blazored.Deploy.yml b/.github/workflows/CleanArchitecture.Blazored.Deploy.yml index 950a5ff..7474573 100644 --- a/.github/workflows/CleanArchitecture.Blazored.Deploy.yml +++ b/.github/workflows/CleanArchitecture.Blazored.Deploy.yml @@ -21,8 +21,9 @@ jobs: uses: actions/setup-dotnet@v4.0.0 with: dotnet-version: 8.x - - name: Restore dependencies - run: dotnet restore src/CleanArchitecture.Blazored.csproj + - name: Build Generated Project + shell: pwsh + run: .\CleanArchitecture.Blazored.restore.ps1 - name: Build Project run: dotnet build --no-restore src/CleanArchitecture.Blazored.csproj -c Release - name: Get latest release tag diff --git a/.github/workflows/CleanArchitecture.Blazored.Dev.yml b/.github/workflows/CleanArchitecture.Blazored.Dev.yml index 6eef169..02c3e93 100644 --- a/.github/workflows/CleanArchitecture.Blazored.Dev.yml +++ b/.github/workflows/CleanArchitecture.Blazored.Dev.yml @@ -36,11 +36,12 @@ jobs: with: dotnet-version: 8.x - - name: Create Generated Project - run: dotnet restore src/CleanArchitecture.Blazored.csproj + - name: Build Generated Project + shell: pwsh + run: .\CleanArchitecture.Blazored.restore.ps1 - name: Restore dependencies - run: dotnet restore CleanArchitecture.Blazored.Dev.sln + run: dotnet restore CleanArchitecture.Blazored.Dev.sln --configfile ./nuget.config - name: Build solution run: dotnet build --no-restore CleanArchitecture.Blazored.Dev.sln -c Release @@ -87,12 +88,13 @@ jobs: uses: actions/setup-dotnet@v4.0.0 with: dotnet-version: 8.x - - - name: Create Generated Project - run: dotnet restore src/CleanArchitecture.Blazored.csproj + + - name: Build Generated Project + shell: pwsh + run: .\CleanArchitecture.Blazored.restore.ps1 - name: Restore dependencies - run: dotnet restore CleanArchitecture.Blazored.Dev.sln + run: dotnet restore CleanArchitecture.Blazored.Dev.sln --configfile ./nuget.config - name: Build solution run: dotnet build --no-restore CleanArchitecture.Blazored.Dev.sln -c Release diff --git a/.github/workflows/CleanArchitecture.Blazored.yml b/.github/workflows/CleanArchitecture.Blazored.yml index fd47ddb..82b35e2 100644 --- a/.github/workflows/CleanArchitecture.Blazored.yml +++ b/.github/workflows/CleanArchitecture.Blazored.yml @@ -35,6 +35,9 @@ jobs: uses: actions/setup-dotnet@v4.0.0 with: dotnet-version: 8.x + - name: Build Generated Project + shell: pwsh + run: .\CleanArchitecture.Blazored.restore.ps1 - name: Create Generated Project run: dotnet pack src/CleanArchitecture.Blazored.csproj - name: Install Project Template diff --git a/.github/workflows/CleanArchitecture.MudBlazored.yml b/.github/workflows/CleanArchitecture.MudBlazored.yml index 8437bda..d4da0ea 100644 --- a/.github/workflows/CleanArchitecture.MudBlazored.yml +++ b/.github/workflows/CleanArchitecture.MudBlazored.yml @@ -34,7 +34,10 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4.0.0 with: - dotnet-version: 8.x + dotnet-version: 8.x + - name: Build Generated Project + shell: pwsh + run: .\CleanArchitecture.Blazored.restore.ps1 - name: Create Generated Project run: dotnet pack src/CleanArchitecture.Blazored.csproj - name: Install Project Template diff --git a/.gitignore b/.gitignore index 6b95006..f1224fe 100644 --- a/.gitignore +++ b/.gitignore @@ -60,7 +60,7 @@ BenchmarkDotNet.Artifacts/ # .NET project.lock.json project.fragment.lock.json -artifacts/ +#artifacts/ # Tye .tye/ diff --git a/CleanArchitecture.Blazored.restore.ps1 b/CleanArchitecture.Blazored.restore.ps1 new file mode 100644 index 0000000..d9965ea --- /dev/null +++ b/CleanArchitecture.Blazored.restore.ps1 @@ -0,0 +1,4 @@ +dotnet pack ./src/CleanArchitecture.Blazored.MsBuild/ -o ./artifacts +dotnet nuget update source CleanArchitecture.Blazored.Dev --configfile ./nuget.config +dotnet restore ./src/CleanArchitecture.Blazored.csproj --configfile ./nuget.config +dotnet build ./src/CleanArchitecture.Blazored.csproj --no-restore -c Release \ No newline at end of file diff --git a/artifacts/.gitkeep b/artifacts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..825d25c --- /dev/null +++ b/nuget.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj index e103c75..0c90299 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj +++ b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj @@ -60,9 +60,5 @@ FinalOutputPath="$(ProjectDepsFilePath)" /> - - - - diff --git a/src/CleanArchitecture.Blazored.csproj b/src/CleanArchitecture.Blazored.csproj index 684bd4b..899259f 100644 --- a/src/CleanArchitecture.Blazored.csproj +++ b/src/CleanArchitecture.Blazored.csproj @@ -42,6 +42,7 @@ + diff --git a/src/TemplateItems/MsBuild/BuildSettings.props b/src/TemplateItems/MsBuild/BuildSettings.props index 9936df1..630c19c 100644 --- a/src/TemplateItems/MsBuild/BuildSettings.props +++ b/src/TemplateItems/MsBuild/BuildSettings.props @@ -13,5 +13,7 @@ + + \ No newline at end of file diff --git a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Blazored.Hepler.targets b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Blazored.Hepler.targets deleted file mode 100644 index 3cd09f1..0000000 --- a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Blazored.Hepler.targets +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.MudBlazored.targets b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.MudBlazored.targets index 27a5235..7baca6c 100644 --- a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.MudBlazored.targets +++ b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.MudBlazored.targets @@ -1,10 +1,13 @@ - - - - - - + + + + + + @@ -16,15 +19,11 @@ MatchExpression="\bCleanArchitecture\.Blazored\b" ReplacementText="$(MudBlazorProjectName)"/> - - - - - - + + + + + + - \ No newline at end of file diff --git a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets index 50c8537..f71557f 100644 --- a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets +++ b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets @@ -14,10 +14,4 @@ - - - - - - \ No newline at end of file diff --git a/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi/WebUi.csproj b/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi/WebUi.csproj index f3641fe..21dace5 100644 --- a/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi/WebUi.csproj +++ b/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi/WebUi.csproj @@ -1,7 +1,5 @@ - - net8.0 enable @@ -42,6 +40,4 @@ - - From fe3dd942dd016880316978e3df5446c29fc9d6c3 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Fri, 19 Jan 2024 03:02:28 +0530 Subject: [PATCH 4/8] Add Firts MsBuild Test --- CleanArchitecture.Blazored.Dev.sln | 9 + .../AppSettingStronglyTyped.cs | 183 +++++++++++++++ .../AppSettingStronglyTypedTest.cs | 185 +++++++++++++++ ...Architecture.Blazored.MsBuild.Tests.csproj | 212 ++++++++++++++++++ .../GlobalUsings.cs | 6 + .../bool-prop-class.txt | 8 + .../bool-prop.setting | 1 + .../complete-prop-class.txt | 12 + .../complete-prop.setting | 5 + .../empty-class.txt | 7 + .../error-prop.setting | 1 + .../guid-prop-class.txt | 8 + .../guid-prop.setting | 1 + .../int-prop-class.txt | 8 + .../int-prop.setting | 1 + .../long-prop-class.txt | 8 + .../long-prop.setting | 1 + .../notvalidtype-prop.setting | 1 + .../notvalidvalue-prop.setting | 1 + .../string-prop-class.txt | 8 + .../string-prop.setting | 1 + .../success-fluent-success-class.txt | 12 + .../testscript-fail.msbuild | 18 ++ .../testscript-success-class.txt | 12 + .../testscript-success.msbuild | 18 ++ 25 files changed, 727 insertions(+) create mode 100644 src/CleanArchitecture.Blazored.MsBuild/AppSettingStronglyTyped.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/AppSettingStronglyTypedTest.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/GlobalUsings.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/empty-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/error-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidtype-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidvalue-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop.setting create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/success-fluent-success-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-fail.msbuild create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success-class.txt create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success.msbuild diff --git a/CleanArchitecture.Blazored.Dev.sln b/CleanArchitecture.Blazored.Dev.sln index 4275739..ee057eb 100644 --- a/CleanArchitecture.Blazored.Dev.sln +++ b/CleanArchitecture.Blazored.Dev.sln @@ -95,6 +95,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{CEF1 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanArchitecture.Blazored.MsBuild", "src\CleanArchitecture.Blazored.MsBuild\CleanArchitecture.Blazored.MsBuild.csproj", "{5292A97C-C670-40AB-9554-E3C62C4A914C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{37B02AEB-075D-458B-B846-0CA70062B8F2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CleanArchitecture.Blazored.MsBuild.Tests", "tests\CleanArchitecture.Blazored.MsBuild.Tests\CleanArchitecture.Blazored.MsBuild.Tests.csproj", "{FD294DC5-2137-4293-AF0E-8A90759213E8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -189,6 +193,10 @@ Global {5292A97C-C670-40AB-9554-E3C62C4A914C}.Debug|Any CPU.Build.0 = Debug|Any CPU {5292A97C-C670-40AB-9554-E3C62C4A914C}.Release|Any CPU.ActiveCfg = Release|Any CPU {5292A97C-C670-40AB-9554-E3C62C4A914C}.Release|Any CPU.Build.0 = Release|Any CPU + {FD294DC5-2137-4293-AF0E-8A90759213E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD294DC5-2137-4293-AF0E-8A90759213E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD294DC5-2137-4293-AF0E-8A90759213E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD294DC5-2137-4293-AF0E-8A90759213E8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -229,6 +237,7 @@ Global {FF0A9EF0-5016-49D5-A185-A927E4599B9D} = {CEF17048-3644-48CA-B1BF-9362FCD75FB4} {2B0B5A20-5D73-435D-B4D1-4B313A80D322} = {CEF17048-3644-48CA-B1BF-9362FCD75FB4} {5292A97C-C670-40AB-9554-E3C62C4A914C} = {888F0530-A4BE-41CA-A040-82C4A693EFCD} + {FD294DC5-2137-4293-AF0E-8A90759213E8} = {37B02AEB-075D-458B-B846-0CA70062B8F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E21648D4-C532-447C-9233-32E2BE40946A} diff --git a/src/CleanArchitecture.Blazored.MsBuild/AppSettingStronglyTyped.cs b/src/CleanArchitecture.Blazored.MsBuild/AppSettingStronglyTyped.cs new file mode 100644 index 0000000..e8bc184 --- /dev/null +++ b/src/CleanArchitecture.Blazored.MsBuild/AppSettingStronglyTyped.cs @@ -0,0 +1,183 @@ +using System.Text; +using Microsoft.Build.Framework; +using Task = Microsoft.Build.Utilities.Task; + +namespace CleanArchitecture.Blazored.MsBuild; + +public class AppSettingStronglyTyped : Task +{ + //The name of the class which is going to be generated + [Required] public required string SettingClassName { get; set; } = string.Empty; + + //The name of the namespace where the class is going to be generated + [Required] public required string SettingNamespaceName { get; set; } = string.Empty; + + //List of files which we need to read with the defined format: 'propertyName:type:defaultValue' per line + [Required] public required ITaskItem[] SettingFiles { get; set; } = default!; + + //The filename where the class was generated + [Output] + public string ClassNameFile { get; set; } = string.Empty; + + public override bool Execute() + { + //Read the input files and return a IDictionary with the properties to be created. + //Any format error it will return not succeed and Log.LogError properly + var (success, settings) = ReadProjectSettingFiles(); + if (!success) + { + return !Log.HasLoggedErrors; + } + //Create the class based on the Dictionary + _ = CreateSettingClass(settings); + + return !Log.HasLoggedErrors; + } + + private (bool, IDictionary) ReadProjectSettingFiles() + { + var values = new Dictionary(); + foreach (var item in SettingFiles) + { + var lineNumber = 0; + + var settingFile = item.GetMetadata("FullPath"); + foreach (var line in File.ReadLines(settingFile)) + { + lineNumber++; + + var lineParse = line.Split(':'); + if (lineParse.Length != 3) + { + Log.LogError(subcategory: null, + errorCode: "APPS0001", + helpKeyword: null, + file: settingFile, + lineNumber: lineNumber, + columnNumber: 0, + endLineNumber: 0, + endColumnNumber: 0, + message: "Incorrect line format. Valid format prop:type:defaultvalue"); + return (false, null)!; + } + var value = GetValue(lineParse[1], lineParse[2]); + if (!value.Item1) + { + return (value.Item1, null)!; + } + + values[lineParse[0]] = value.Item2; + } + } + return (true, values); + } + + private (bool, object) GetValue(string type, string value) + { + try + { + // So far only few types are supported values. + if ("string".Equals(type)) + { + return (true, value); + } + if ("int".Equals(type)) + { + return (true, int.Parse(value)); + } + if ("long".Equals(type)) + { + return (true, long.Parse(value)); + } + if ("guid".Equals(type)) + { + return (true, Guid.Parse(value)); + } + if ("bool".Equals(type)) + { + return (true, bool.Parse(value)); + } + Log.LogError($"Type not supported -> {type}"); + return (false, null)!; + } + catch + { + Log.LogError($"It is not possible parse some value based on the type -> {type} - {value}"); + return (false, null)!; + } + } + + private bool CreateSettingClass(IDictionary settings) + { + try + { + ClassNameFile = $"{SettingClassName}.generated.cs"; + File.Delete(ClassNameFile); + var settingsClass = new StringBuilder(1024); + // open namespace + settingsClass.Append($@" using System; + namespace {SettingNamespaceName} {{ + + public class {SettingClassName} {{ +"); + //For each element in the dictionary create a static property + foreach (var keyValuePair in settings) + { + var typeName = GetTypeString(keyValuePair.Value.GetType().Name); + settingsClass.Append($" public readonly static {typeName} {keyValuePair.Key} = {GetValueString(keyValuePair, typeName)};\r\n"); + } + // close namespace and class + settingsClass.Append(@" } + +}"); + File.WriteAllText(ClassNameFile, settingsClass.ToString()); + + } + catch (Exception ex) + { + //This logging helper method is designed to capture and display information from arbitrary exceptions in a standard way. + Log.LogErrorFromException(ex, showStackTrace: true); + return false; + } + return true; + } + + private string GetTypeString(string typeName) + { + if ("String".Equals(typeName)) + { + return "string"; + } + if ("Boolean".Equals(typeName)) + { + return "bool"; + } + if ("Int32".Equals(typeName)) + { + return "int"; + } + if ("Int64".Equals(typeName)) + { + return "long"; + } + return typeName; + } + + private static object GetValueString(KeyValuePair keyValuePair, string typeName) + { + if ("Guid".Equals(typeName)) + { + return $"Guid.Parse(\"{keyValuePair.Value}\")"; + } + if ("string".Equals(typeName)) + { + return $"\"{keyValuePair.Value}\""; + } + if ("bool".Equals(typeName)) + { + return $"{keyValuePair.Value.ToString()?.ToLower()}"; + } + + return keyValuePair.Value; + } +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/AppSettingStronglyTypedTest.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/AppSettingStronglyTypedTest.cs new file mode 100644 index 0000000..2ff0a5c --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/AppSettingStronglyTypedTest.cs @@ -0,0 +1,185 @@ +namespace CleanArchitecture.Blazored.MsBuild.Tests; + +public class AppSettingStronglyTypedTest +{ + private readonly Mock _buildEngine = new(); + private readonly List _errors = []; + + public AppSettingStronglyTypedTest() + { + _buildEngine.Setup(x => x.LogErrorEvent(It.IsAny())) + .Callback(e => _errors.Add(e)); + } + + [Fact] + public void EmptySettingFileList_EmptyClassGenerated() + { + // Arrange + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = "MySettingEmpty", + SettingNamespaceName = "MyNamespace", + SettingFiles = Array.Empty() + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + var expectedFile = File.ReadLines($"Resources/{nameof(AppSettingStronglyTypedTest)}/empty-class.txt"); + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeTrue(); + _errors.Count.Should().Be(0); + appSettingStronglyTyped.ClassNameFile.Should().Be("MySettingEmpty.generated.cs"); + File.Exists(appSettingStronglyTyped.ClassNameFile).Should().BeTrue(); + File.ReadLines(appSettingStronglyTyped.ClassNameFile) + .SequenceEqual(expectedFile).Should().BeTrue(); + + // Cleanup + File.Delete(appSettingStronglyTyped.ClassNameFile); + } + + [Fact] + public void SettingFileBadFormat_NotSuccess() + { + // Arrange + var item = new Mock(); + item.Setup(x => x.GetMetadata("FullPath")) + .Returns($"Resources/{nameof(AppSettingStronglyTypedTest)}/error-prop.setting"); + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = "ErrorPropSetting", + SettingNamespaceName = "MyNamespace", + SettingFiles = new[] { item.Object } + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeFalse(); + _errors.Count.Should().Be(1); + appSettingStronglyTyped.ClassNameFile.Should().BeNullOrEmpty(); + + var error = _errors.First(); + error.Message.Should().Be("Incorrect line format. Valid format prop:type:defaultvalue"); + error.LineNumber.Should().Be(1); + } + + [Fact] + public void SettingInvalidType_NotSuccess() + { + // Arrange + var item = new Mock(); + item.Setup(x => x.GetMetadata("FullPath")) + .Returns($"Resources/{nameof(AppSettingStronglyTypedTest)}/notvalidtype-prop.setting"); + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = "ErrorPropSetting", + SettingNamespaceName = "MyNamespace", + SettingFiles = new[] { item.Object } + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeFalse(); + _errors.Count.Should().Be(1); + appSettingStronglyTyped.ClassNameFile.Should().BeNullOrEmpty(); + _errors.First().Message.Should().Be("Type not supported -> car"); + } + + [Fact] + public void SettingInvalidValue_NotSuccess() + { + // Arrange + var item = new Mock(); + item.Setup(x => x.GetMetadata("FullPath")) + .Returns($"Resources/{nameof(AppSettingStronglyTypedTest)}/notvalidvalue-prop.setting"); + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = "ErrorPropSetting", + SettingNamespaceName = "MyNamespace", + SettingFiles = new[] { item.Object } + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeFalse(); + _errors.Count.Should().Be(1); + appSettingStronglyTyped.ClassNameFile.Should().BeNullOrEmpty(); + _errors.First().Message.Should().Be("It is not possible parse some value based on the type -> bool - awsome"); + } + + [Theory] + [InlineData("string")] + [InlineData("int")] + [InlineData("bool")] + [InlineData("guid")] + [InlineData("long")] + public void SettingFileWithProperty_ClassGeneratedWithOneProperty(string value) + { + // Arrange + var item = new Mock(); + item.Setup(x => x.GetMetadata("FullPath")) + .Returns($"Resources/{nameof(AppSettingStronglyTypedTest)}/{value}-prop.setting"); + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = $"My{value}PropSetting", + SettingNamespaceName = "MyNamespace", + SettingFiles = new[] { item.Object } + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeTrue(); + _errors.Count.Should().Be(0); + appSettingStronglyTyped.ClassNameFile.Should().Be($"My{value}PropSetting.generated.cs"); + File.Exists(appSettingStronglyTyped.ClassNameFile).Should().BeTrue(); + File.ReadLines(appSettingStronglyTyped.ClassNameFile) + .SequenceEqual(File.ReadLines($"Resources/{nameof(AppSettingStronglyTypedTest)}/{value}-prop-class.txt")) + .Should().BeTrue(); + + // Cleanup + File.Delete(appSettingStronglyTyped.ClassNameFile); + } + + [Fact] + public void SettingFileWithMultipleProperty_ClassGeneratedWithMultipleProperty() + { + // Arrange + var item = new Mock(); + item.Setup(x => x.GetMetadata("FullPath")).Returns($"Resources/{nameof(AppSettingStronglyTypedTest)}/complete-prop.setting"); + var appSettingStronglyTyped = new AppSettingStronglyTyped + { + SettingClassName = $"MyCompletePropSetting", + SettingNamespaceName = "MyNamespace", + SettingFiles = new[] { item.Object } + }; + appSettingStronglyTyped.BuildEngine = _buildEngine.Object; + + // Act + var success = appSettingStronglyTyped.Execute(); + + // Assert + success.Should().BeTrue(); + _errors.Count.Should().Be(0); + appSettingStronglyTyped.ClassNameFile.Should().Be("MyCompletePropSetting.generated.cs"); + File.Exists(appSettingStronglyTyped.ClassNameFile).Should().BeTrue(); + File.ReadLines(appSettingStronglyTyped.ClassNameFile) + .SequenceEqual(File.ReadLines($"Resources/{nameof(AppSettingStronglyTypedTest)}/complete-prop-class.txt")) + .Should().BeTrue(); + + // Cleanup + File.Delete(appSettingStronglyTyped.ClassNameFile); + } +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj b/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj new file mode 100644 index 0000000..1e6c627 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj @@ -0,0 +1,212 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/GlobalUsings.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/GlobalUsings.cs new file mode 100644 index 0000000..fdb4605 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/GlobalUsings.cs @@ -0,0 +1,6 @@ +// Global using directives + +global using FluentAssertions; +global using Microsoft.Build.Framework; +global using Moq; +global using Xunit; \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop-class.txt new file mode 100644 index 0000000..72df183 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop-class.txt @@ -0,0 +1,8 @@ + using System; + namespace MyNamespace { + + public class MyboolPropSetting { + public readonly static bool IsNew = true; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop.setting new file mode 100644 index 0000000..7a4244a --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/bool-prop.setting @@ -0,0 +1 @@ +IsNew:bool:true \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop-class.txt new file mode 100644 index 0000000..42137f4 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop-class.txt @@ -0,0 +1,12 @@ + using System; + namespace MyNamespace { + + public class MyCompletePropSetting { + public readonly static string Prop1 = "Hello"; + public readonly static int Prop2 = 504; + public readonly static long Prop3 = 200000001; + public readonly static Guid Prop4 = Guid.Parse("79a107f3-0109-4425-aa16-81918663b4ed"); + public readonly static bool Prop5 = false; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop.setting new file mode 100644 index 0000000..462c29e --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/complete-prop.setting @@ -0,0 +1,5 @@ +Prop1:string:Hello +Prop2:int:504 +Prop3:long:200000001 +Prop4:guid:79a107f3-0109-4425-aa16-81918663b4ed +Prop5:bool:false \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/empty-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/empty-class.txt new file mode 100644 index 0000000..678af23 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/empty-class.txt @@ -0,0 +1,7 @@ + using System; + namespace MyNamespace { + + public class MySettingEmpty { + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/error-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/error-prop.setting new file mode 100644 index 0000000..a758d80 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/error-prop.setting @@ -0,0 +1 @@ +GrettingstringHello Word!! \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop-class.txt new file mode 100644 index 0000000..02a6bd0 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop-class.txt @@ -0,0 +1,8 @@ + using System; + namespace MyNamespace { + + public class MyguidPropSetting { + public readonly static Guid Id = Guid.Parse("79a107f3-0109-4425-aa16-81918663b4ed"); + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop.setting new file mode 100644 index 0000000..ce39b77 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/guid-prop.setting @@ -0,0 +1 @@ +Id:guid:79a107f3-0109-4425-aa16-81918663b4ed \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop-class.txt new file mode 100644 index 0000000..5f0aace --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop-class.txt @@ -0,0 +1,8 @@ + using System; + namespace MyNamespace { + + public class MyintPropSetting { + public readonly static int Age = 33; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop.setting new file mode 100644 index 0000000..48f467e --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/int-prop.setting @@ -0,0 +1 @@ +Age:int:33 \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop-class.txt new file mode 100644 index 0000000..cce7abd --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop-class.txt @@ -0,0 +1,8 @@ + using System; + namespace MyNamespace { + + public class MylongPropSetting { + public readonly static long Population = 200000001; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop.setting new file mode 100644 index 0000000..65c7a68 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/long-prop.setting @@ -0,0 +1 @@ +Population:long:200000001 \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidtype-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidtype-prop.setting new file mode 100644 index 0000000..b221a30 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidtype-prop.setting @@ -0,0 +1 @@ +IsNew:car:true \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidvalue-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidvalue-prop.setting new file mode 100644 index 0000000..97b15d1 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/notvalidvalue-prop.setting @@ -0,0 +1 @@ +IsNew:bool:awsome \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop-class.txt new file mode 100644 index 0000000..aa6a0b3 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop-class.txt @@ -0,0 +1,8 @@ + using System; + namespace MyNamespace { + + public class MystringPropSetting { + public readonly static string Gretting = "Hello Word!!"; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop.setting b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop.setting new file mode 100644 index 0000000..d945a8f --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/string-prop.setting @@ -0,0 +1 @@ +Gretting:string:Hello Word!! \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/success-fluent-success-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/success-fluent-success-class.txt new file mode 100644 index 0000000..8fa9bea --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/success-fluent-success-class.txt @@ -0,0 +1,12 @@ + using System; + namespace SettingSuccessFluent { + + public class SettingSuccessFluent { + public readonly static string Prop1 = "Hello"; + public readonly static int Prop2 = 504; + public readonly static long Prop3 = 200000001; + public readonly static Guid Prop4 = Guid.Parse("79a107f3-0109-4425-aa16-81918663b4ed"); + public readonly static bool Prop5 = false; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-fail.msbuild b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-fail.msbuild new file mode 100644 index 0000000..b53d292 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-fail.msbuild @@ -0,0 +1,18 @@ + + + + + MySettingFail + example + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success-class.txt b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success-class.txt new file mode 100644 index 0000000..39110ea --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success-class.txt @@ -0,0 +1,12 @@ + using System; + namespace example { + + public class MySettingSuccess { + public readonly static string Prop1 = "Hello"; + public readonly static int Prop2 = 504; + public readonly static long Prop3 = 200000001; + public readonly static Guid Prop4 = Guid.Parse("79a107f3-0109-4425-aa16-81918663b4ed"); + public readonly static bool Prop5 = false; + } + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success.msbuild b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success.msbuild new file mode 100644 index 0000000..3da3767 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/AppSettingStronglyTypedTest/testscript-success.msbuild @@ -0,0 +1,18 @@ + + + + + MySettingSuccess + example + + + + + + + + + + + + \ No newline at end of file From 665394a41452bc0c486dd075038f8e1e8dd932f4 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Fri, 19 Jan 2024 10:27:05 +0530 Subject: [PATCH 5/8] COver more MSBuild Task with tests --- .../ReplaceFilename.cs | 6 +- ...Architecture.Blazored.MsBuild.Tests.csproj | 11 +++ .../ReplaceFileTextTest.cs | 46 ++++++++++ .../ReplaceFilenameTest.cs | 92 +++++++++++++++++++ .../ExampleFile.Contains.cs | 6 ++ .../ReplaceFilenameTest/ExampleFile.Match.cs | 0 .../ExampleFile.Success.cs | 0 7 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFileTextTest.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFilenameTest.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFileTextTest/ExampleFile.Contains.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Match.cs create mode 100644 tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Success.cs diff --git a/src/CleanArchitecture.Blazored.MsBuild/ReplaceFilename.cs b/src/CleanArchitecture.Blazored.MsBuild/ReplaceFilename.cs index 9652272..6e93510 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/ReplaceFilename.cs +++ b/src/CleanArchitecture.Blazored.MsBuild/ReplaceFilename.cs @@ -17,7 +17,11 @@ public override bool Execute() if (!fileNameWithoutExtension.Contains(MatchExpression)) return true; var path = Path.GetDirectoryName(Filename); - ArgumentNullException.ThrowIfNull(path); + if (string.IsNullOrWhiteSpace(path)) + { + Log.LogError($"path variable cannot be null in {Filename}"); + return false; + } fileNameWithoutExtension = fileNameWithoutExtension.Replace(MatchExpression, ReplacementText); var extension = Path.GetExtension(Filename); var newFileName = Path.Combine(path, $"{fileNameWithoutExtension}{extension}"); diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj b/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj index 1e6c627..15166e9 100644 --- a/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/CleanArchitecture.Blazored.MsBuild.Tests.csproj @@ -207,6 +207,17 @@ Always + + Always + + + + Always + + + + Always + diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFileTextTest.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFileTextTest.cs new file mode 100644 index 0000000..13d173d --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFileTextTest.cs @@ -0,0 +1,46 @@ +namespace CleanArchitecture.Blazored.MsBuild.Tests; + +public class ReplaceFileTextTest +{ + private readonly Mock _buildEngine = new(); + private readonly List _errors = []; + private readonly List _messages = []; + + public ReplaceFileTextTest() + { + _buildEngine.Setup(x => x.LogErrorEvent(It.IsAny())) + .Callback(e => _errors.Add(e)); + _buildEngine.Setup(x => x.LogMessageEvent(It.IsAny())) + .Callback(e => _messages.Add(e)); + } + + [Theory] + [MemberData(nameof(ReplaceFileTextTestData))] + public void ReplaceFileText_ReplacesText_IfMatchFound(string fileName, string match, string replace, bool expected) + { + // Arrange + var oldContent = File.ReadAllText(fileName); + var replaceFileText = new ReplaceFileText + { + FileName = fileName, + MatchExpression = match, + ReplacementText = replace, + }; + replaceFileText.BuildEngine = _buildEngine.Object; + + // Act + var success = replaceFileText.Execute(); + + // Assert + success.Should().Be(expected); + _errors.Should().BeEmpty(); + var message = _messages.First(); + message.Message.Should().Be($"Replacing {match}->{replace} in {fileName}"); + } + + public static IEnumerable ReplaceFileTextTestData => + [ + [$"Resources/{nameof(ReplaceFileTextTest)}/ExampleFile.Contains.cs","Example_Contains","Example_Replace",true], + [$"Resources/{nameof(ReplaceFileTextTest)}/ExampleFile.Contains.cs","Example_NotContains","Example_Replace",true], + ]; +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFilenameTest.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFilenameTest.cs new file mode 100644 index 0000000..d6a49be --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/ReplaceFilenameTest.cs @@ -0,0 +1,92 @@ +namespace CleanArchitecture.Blazored.MsBuild.Tests; + +public class ReplaceFilenameTest +{ + private readonly Mock _buildEngine = new(); + private readonly List _errors = []; + private readonly List _messages = []; + + public ReplaceFilenameTest() + { + _buildEngine.Setup(x => x.LogErrorEvent(It.IsAny())) + .Callback(e => _errors.Add(e)); + _buildEngine.Setup(x => x.LogMessageEvent(It.IsAny())) + .Callback(e => _messages.Add(e)); + } + + [Fact] + public void ReplaceFilename_WhenFileNameDoesNotMatchExpression_Success() + { + // Arrange + var replaceFilename = new ReplaceFilename + { + Filename = $"Resources/{nameof(ReplaceFilenameTest)}/ExampleFile.Success.cs", + MatchExpression = "ExampleFile.Replace", + ReplacementText = "ExampleFile.NewText" + }; + replaceFilename.BuildEngine = _buildEngine.Object; + + // Act + var success = replaceFilename.Execute(); + + // Assert + success.Should().BeTrue(); + _errors.Count.Should().Be(0); + _messages.Count.Should().Be(0); + File.Exists($"Resources/{nameof(ReplaceFilenameTest)}/ExampleFile.NewText.cs") + .Should().BeFalse(); + } + + [Fact] + public void ReplaceFilename_WhenInvalidFilename_FailedWithError() + { + // Arrange + var replaceFilename = new ReplaceFilename + { + Filename = $"ExampleFile.Match.cs", + MatchExpression = "ExampleFile.Match", + ReplacementText = "ExampleFile.NewText" + }; + replaceFilename.BuildEngine = _buildEngine.Object; + + // Act + var success = replaceFilename.Execute(); + + // Assert + success.Should().BeFalse(); + _errors.First().Message.Should().Be($"path variable cannot be null in ExampleFile.Match.cs"); + _messages.Count.Should().Be(0); + } + + [Fact] + public void ReplaceFilename_WhenValidFilename_SuccessWithMessage() + { + // Arrange + const string oldFileName = $"Resources/{nameof(ReplaceFilenameTest)}/ExampleFile.Match.cs"; + const string newFileName = $"Resources\\{nameof(ReplaceFilenameTest)}\\ExampleFile.NewText.cs"; + var replaceFilename = new ReplaceFilename + { + Filename = oldFileName, + MatchExpression = "ExampleFile.Match", + ReplacementText = "ExampleFile.NewText" + }; + replaceFilename.BuildEngine = _buildEngine.Object; + + // Act + var success = replaceFilename.Execute(); + + // Assert + success.Should().BeTrue(); + _errors.Count.Should().Be(0); + var message = _messages.First(); + message.Message.Should().Be($"{oldFileName} -> {newFileName}"); + message.Importance.Should().Be(MessageImportance.High); + File.Exists(oldFileName) + .Should().BeFalse(); + File.Exists(newFileName) + .Should().BeTrue(); + + // Cleanup + File.Move(newFileName, oldFileName); + } +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFileTextTest/ExampleFile.Contains.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFileTextTest/ExampleFile.Contains.cs new file mode 100644 index 0000000..14b52f4 --- /dev/null +++ b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFileTextTest/ExampleFile.Contains.cs @@ -0,0 +1,6 @@ +namespace CleanArchitecture.Blazored.MsBuild.Tests.Resources.ReplaceFileTextTest.ExampleFile.Contains; + +public class ExampleFile_Contains +{ + +} \ No newline at end of file diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Match.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Match.cs new file mode 100644 index 0000000..e69de29 diff --git a/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Success.cs b/tests/CleanArchitecture.Blazored.MsBuild.Tests/Resources/ReplaceFilenameTest/ExampleFile.Success.cs new file mode 100644 index 0000000..e69de29 From 6495af06fccda2df1297e21c03f5c6ebd9414fdf Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Fri, 19 Jan 2024 12:04:52 +0530 Subject: [PATCH 6/8] Add thrid party nuget package support --- CleanArchitecture.Blazored.restore.ps1 | 3 ++- README.md | 4 ++-- .../CleanArchitecture.Blazored.MsBuild.csproj | 20 +++++++++++++++---- .../GenerateTemplateMarkDownFile.cs | 3 ++- .../CleanArchitecture.Package.targets | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/CleanArchitecture.Blazored.restore.ps1 b/CleanArchitecture.Blazored.restore.ps1 index d9965ea..cdaaf45 100644 --- a/CleanArchitecture.Blazored.restore.ps1 +++ b/CleanArchitecture.Blazored.restore.ps1 @@ -1,4 +1,5 @@ dotnet pack ./src/CleanArchitecture.Blazored.MsBuild/ -o ./artifacts dotnet nuget update source CleanArchitecture.Blazored.Dev --configfile ./nuget.config -dotnet restore ./src/CleanArchitecture.Blazored.csproj --configfile ./nuget.config +dotnet restore ./src/CleanArchitecture.Blazored.csproj --configfile ./nuget.config -f --no-cache +dotnet build ./src/CleanArchitecture.Blazored.csproj --no-restore -c Debug dotnet build ./src/CleanArchitecture.Blazored.csproj --no-restore -c Release \ No newline at end of file diff --git a/README.md b/README.md index 381f947..a6164de 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Refer documentation from each template ## Templates -* [CleanArchitecture.Blazored](src/content/CleanArchitecture.Blazored/README.md) -* [CleanArchitecture.MudBlazored](src/content/CleanArchitecture.MudBlazored/README.md) +* [Clean Architecture Blazored](src/content/CleanArchitecture.Blazored/README.md) +* [Clean Architecture Mud Blazored](src/content/CleanArchitecture.MudBlazored/README.md) ## Support diff --git a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj index 0c90299..c8cb029 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj +++ b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj @@ -24,19 +24,21 @@ NU5100 embedded true + true - - + + + - - + + @@ -60,5 +62,15 @@ FinalOutputPath="$(ProjectDepsFilePath)" /> + + + + <_PackageFiles Include="bin/$(Configuration)/*/Humanizer.Core.dll;"> + tasks/%(RecursiveDir) + false + Content + + + diff --git a/src/CleanArchitecture.Blazored.MsBuild/GenerateTemplateMarkDownFile.cs b/src/CleanArchitecture.Blazored.MsBuild/GenerateTemplateMarkDownFile.cs index 8e87e0d..8e2a445 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/GenerateTemplateMarkDownFile.cs +++ b/src/CleanArchitecture.Blazored.MsBuild/GenerateTemplateMarkDownFile.cs @@ -1,4 +1,5 @@ using System.Text; +using Humanizer; using Microsoft.Build.Framework; using Task = Microsoft.Build.Utilities.Task; @@ -32,7 +33,7 @@ public override bool Execute() projects.Add(new ProjectData { - Name = name, + Name = name.Humanize(LetterCasing.Title), Data = readMeFile }); } diff --git a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets index f71557f..3f705e7 100644 --- a/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets +++ b/src/TemplateItems/MsBuild/BuildSettings/CleanArchitecture.Package.targets @@ -1,6 +1,6 @@ - + From a3a0dab368af10709a9bc1204e188d7316d8da82 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Fri, 19 Jan 2024 15:19:38 +0530 Subject: [PATCH 7/8] Automate UsingTask properties --- .gitignore | 3 +- .../AddCustomTaskToTarget.cs | 57 +++++++++++++++++++ .../CleanArchitecture.Blazored.MsBuild.csproj | 54 ++++++++++++++++++ .../MyTask.cs | 14 ----- .../CleanArchitecture.Blazored.MsBuild.props | 21 ------- .../build/UsingTasks.props.template | 13 +++++ src/CleanArchitecture.Blazored.csproj | 5 -- 7 files changed, 126 insertions(+), 41 deletions(-) create mode 100644 src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs delete mode 100644 src/CleanArchitecture.Blazored.MsBuild/MyTask.cs delete mode 100644 src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props create mode 100644 src/CleanArchitecture.Blazored.MsBuild/build/UsingTasks.props.template diff --git a/.gitignore b/.gitignore index f1224fe..162242f 100644 --- a/.gitignore +++ b/.gitignore @@ -448,4 +448,5 @@ $RECYCLE.BIN/ ## Visual Studio Code ## .vscode/* -*.g.md \ No newline at end of file +*.g.md +CleanArchitecture.Blazored.MsBuild.props \ No newline at end of file diff --git a/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs b/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs new file mode 100644 index 0000000..8633716 --- /dev/null +++ b/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs @@ -0,0 +1,57 @@ +using System.CodeDom.Compiler; +using System.Text; +using Microsoft.Build.Framework; +using Task = Microsoft.Build.Utilities.Task; + +namespace CleanArchitecture.Blazored.MsBuild; + +public class AddCustomTaskToTarget : Task +{ + private const string FileName = "build/CleanArchitecture.Blazored.MsBuild.props"; + [Required] public required ITaskItem[] Files { get; set; } + + [Required] public required string Namespace { get; set; } + + [Required] public required string TaskAssembly { get; set; } + + public override bool Execute() + { + var tasks = GetAllTask(Files); + GenerateUsingTask(tasks); + return true; + } + + private IEnumerable GetAllTask(ITaskItem[] files) + { + return files.Where(item => item.GetMetadata("Extension") == ".cs") + .Select(item => item.GetMetadata("Filename")) + .Select(fileName => "$" + $"(MSBuildThisFileName).{fileName}"); + } + + private void GenerateUsingTask(IEnumerable tasks) + { + var baseTextWriter = new StringWriter(); + var indentWriter = new IndentedTextWriter(baseTextWriter); + indentWriter.Indent = 0; + foreach (var task in tasks) + { + indentWriter.WriteLine($$""" + + """); + } + + var template = File.ReadAllText("build/UsingTasks.props.template"); + + var replacingText = $$""" + + + {{baseTextWriter}} + + """; + + var newContent = template.Replace("", replacingText); + + File.WriteAllText(FileName, newContent); + } +} \ No newline at end of file diff --git a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj index c8cb029..d2e437e 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj +++ b/src/CleanArchitecture.Blazored.MsBuild/CleanArchitecture.Blazored.MsBuild.csproj @@ -72,5 +72,59 @@ + + + + + + + + + + + item.GetMetadata("Extension")==".cs").Select(item => item.GetMetadata("Filename")).Select(fileName => "$"+$"(MSBuildThisFileName).{fileName}"); + Log.LogMessage(MessageImportance.High, $"Count : {tasks.Count()}"); + var baseTextWriter = new StringWriter(); + var indentWriter = new IndentedTextWriter(baseTextWriter); + indentWriter.Indent = 0; + foreach (var task in tasks) + { + indentWriter.WriteLine($$""" + + """); + } + + var template = File.ReadAllText("build/UsingTasks.props.template"); + + var replacingText = $$""" + + + {{baseTextWriter}} + + """; + + var newContent = template.Replace("", replacingText); + + File.WriteAllText(FileName, newContent); + ]]> + + + + + + + + + + + + + diff --git a/src/CleanArchitecture.Blazored.MsBuild/MyTask.cs b/src/CleanArchitecture.Blazored.MsBuild/MyTask.cs deleted file mode 100644 index 33e5bbf..0000000 --- a/src/CleanArchitecture.Blazored.MsBuild/MyTask.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.Build.Framework; -using Task = Microsoft.Build.Utilities.Task; - -namespace CleanArchitecture.Blazored.MsBuild; - -public class MyTask : Task -{ - public string? MyProperty { get; set; } - public override bool Execute() - { - Log.LogMessage(MessageImportance.High, $"The task was passed {MyProperty}."); - return true; - } -} diff --git a/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props b/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props deleted file mode 100644 index 83a1b86..0000000 --- a/src/CleanArchitecture.Blazored.MsBuild/build/CleanArchitecture.Blazored.MsBuild.props +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - $(MSBuildThisFileDirectory)..\tasks\net8.0 - - $(CustomTasksFolder)\$(MSBuildThisFileName).dll - - - - - - - - - \ No newline at end of file diff --git a/src/CleanArchitecture.Blazored.MsBuild/build/UsingTasks.props.template b/src/CleanArchitecture.Blazored.MsBuild/build/UsingTasks.props.template new file mode 100644 index 0000000..86e2fd6 --- /dev/null +++ b/src/CleanArchitecture.Blazored.MsBuild/build/UsingTasks.props.template @@ -0,0 +1,13 @@ + + + + + + $(MSBuildThisFileDirectory)..\tasks\net8.0 + + $(CustomTasksFolder)\$(MSBuildThisFileName).dll + + + + + \ No newline at end of file diff --git a/src/CleanArchitecture.Blazored.csproj b/src/CleanArchitecture.Blazored.csproj index 899259f..279916e 100644 --- a/src/CleanArchitecture.Blazored.csproj +++ b/src/CleanArchitecture.Blazored.csproj @@ -68,11 +68,6 @@ - - - - - From 8cd09b31bc18f633fa1ed84ec61db753e16c2c25 Mon Sep 17 00:00:00 2001 From: Ubhaya Hettiarachchi Date: Fri, 19 Jan 2024 16:15:01 +0530 Subject: [PATCH 8/8] Clean up --- .../AddCustomTaskToTarget.cs | 1 - src/CleanArchitecture.Blazored.csproj | 2 +- src/TemplateItems/MsBuild/BuildSettings.props | 3 +-- src/TemplateItems/MsBuild/BuildSettings.targets | 4 +--- .../src/WebUi/WebUi/DependencyInjection/HealthServices.cs | 1 - .../WebUi.AcceptanceTests/Helpers/DockerComposeTestBase.cs | 3 --- .../tests/WebUi.AcceptanceTests/Helpers/WebUiDockerCompose.cs | 2 -- .../WebUi/WebUi.Client/Pages/Todo/ListCreateDialog.razor.cs | 1 - 8 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs b/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs index 8633716..bbe1ab9 100644 --- a/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs +++ b/src/CleanArchitecture.Blazored.MsBuild/AddCustomTaskToTarget.cs @@ -1,5 +1,4 @@ using System.CodeDom.Compiler; -using System.Text; using Microsoft.Build.Framework; using Task = Microsoft.Build.Utilities.Task; diff --git a/src/CleanArchitecture.Blazored.csproj b/src/CleanArchitecture.Blazored.csproj index 279916e..242347e 100644 --- a/src/CleanArchitecture.Blazored.csproj +++ b/src/CleanArchitecture.Blazored.csproj @@ -8,7 +8,7 @@ Clean Architecture Blazor Template Ubhaya Hettiarachchi Clean Architecture Blazor Template for .NET. - clean-architecture project template csharp dotnet blazor + clean-architecture project template csharp dotnet blazor mudblazor https://github.com/ubhaya/CleanArchitecture.Blazored.git https://github.com/ubhaya/CleanArchitecture.Blazored.git git diff --git a/src/TemplateItems/MsBuild/BuildSettings.props b/src/TemplateItems/MsBuild/BuildSettings.props index 630c19c..1294aee 100644 --- a/src/TemplateItems/MsBuild/BuildSettings.props +++ b/src/TemplateItems/MsBuild/BuildSettings.props @@ -1,6 +1,5 @@ - - + CleanArchitecture.Blazored diff --git a/src/TemplateItems/MsBuild/BuildSettings.targets b/src/TemplateItems/MsBuild/BuildSettings.targets index d3c3559..af190e4 100644 --- a/src/TemplateItems/MsBuild/BuildSettings.targets +++ b/src/TemplateItems/MsBuild/BuildSettings.targets @@ -1,5 +1,3 @@ - - - + \ No newline at end of file diff --git a/src/content/CleanArchitecture.Blazored/src/WebUi/WebUi/DependencyInjection/HealthServices.cs b/src/content/CleanArchitecture.Blazored/src/WebUi/WebUi/DependencyInjection/HealthServices.cs index 0daabc5..0a289d0 100644 --- a/src/content/CleanArchitecture.Blazored/src/WebUi/WebUi/DependencyInjection/HealthServices.cs +++ b/src/content/CleanArchitecture.Blazored/src/WebUi/WebUi/DependencyInjection/HealthServices.cs @@ -1,5 +1,4 @@ using CleanArchitecture.Blazored.Infrastructure.Data; -using Microsoft.AspNetCore.Diagnostics.HealthChecks; namespace CleanArchitecture.Blazored.WebUi.DependencyInjection; diff --git a/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/DockerComposeTestBase.cs b/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/DockerComposeTestBase.cs index 66a89b0..0e97b32 100644 --- a/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/DockerComposeTestBase.cs +++ b/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/DockerComposeTestBase.cs @@ -1,7 +1,4 @@ -using Ductus.FluentDocker.Builders; -using Ductus.FluentDocker.Common; using Ductus.FluentDocker.Services; -using Ductus.FluentDocker.Services.Extensions; using Ductus.FluentDocker.Services.Impl; namespace CleanArchitecture.Blazored.WebUi.AcceptanceTests.Helpers; diff --git a/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/WebUiDockerCompose.cs b/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/WebUiDockerCompose.cs index 38f14cd..409ee1e 100644 --- a/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/WebUiDockerCompose.cs +++ b/src/content/CleanArchitecture.Blazored/tests/WebUi.AcceptanceTests/Helpers/WebUiDockerCompose.cs @@ -1,10 +1,8 @@ using System.Net; using CleanArchitecture.Blazored.WebUi.AcceptanceTests.Helpers; -using Ductus.FluentDocker.Builders; using Ductus.FluentDocker.Common; using Ductus.FluentDocker.Extensions; using Ductus.FluentDocker.Model.Compose; -using Ductus.FluentDocker.Services; using Ductus.FluentDocker.Services.Extensions; using Ductus.FluentDocker.Services.Impl; diff --git a/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi.Client/Pages/Todo/ListCreateDialog.razor.cs b/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi.Client/Pages/Todo/ListCreateDialog.razor.cs index ec4c328..dc00e37 100644 --- a/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi.Client/Pages/Todo/ListCreateDialog.razor.cs +++ b/src/content/CleanArchitecture.MudBlazored/src/WebUi/WebUi.Client/Pages/Todo/ListCreateDialog.razor.cs @@ -2,7 +2,6 @@ using CleanArchitecture.MudBlazored.WebUi.Shared.TodoLists; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Mvc; -using Microsoft.JSInterop; using MudBlazor; using Newtonsoft.Json;