diff --git a/.editorconfig b/.editorconfig index 8f3fc7e5..94c5e855 100644 --- a/.editorconfig +++ b/.editorconfig @@ -104,4 +104,8 @@ dotnet_naming_symbols.static_fields.required_modifiers = static dotnet_naming_symbols.static_fields.applicable_accessibilities = internal, private, protected, protected_internal, private_protected dotnet_naming_style.static_field_style.capitalization = camel_case -dotnet_naming_style.static_field_style.required_prefix = \ No newline at end of file +dotnet_naming_style.static_field_style.required_prefix = + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:error \ No newline at end of file diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bf4c0f6d..87d80a67 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -5,7 +5,8 @@ variables: NugetPackageVersion: '$(CurrentSemanticVersion)' NET_VERSION: '6.0.x' RunPoliCheck: false - PathToSolution: 'src/CommunityToolkit.Maui.Markup.sln' + PathToLibrarySolution: 'src/CommunityToolkit.Maui.Markup.sln' + PathToSamplesSolution: 'samples/CommunityToolkit.Maui.Markup.Sample.sln' PathToCommunityToolkitCsproj: 'src/CommunityToolkit.Maui.Markup/CommunityToolkit.Maui.Markup.csproj' PathToCommunityToolkitSampleCsproj: 'samples/CommunityToolkit.Maui.Markup.Sample/CommunityToolkit.Maui.Markup.Sample.csproj' PathToCommunityToolkitUnitTestCsproj: 'src/CommunityToolkit.Maui.Markup.UnitTests/CommunityToolkit.Maui.Markup.UnitTests.csproj' @@ -118,10 +119,10 @@ jobs: # check vulnerabilities - powershell: | - dotnet list $(PathToSolution) package --vulnerable --include-transitive | findstr /S /c:"has the following vulnerable packages"; + dotnet list $(PathToLibrarySolution) package --vulnerable --include-transitive | findstr /S /c:"has the following vulnerable packages"; if ($LastExitCode -ne 1) { - dotnet list $(PathToSolution) package --vulnerable --include-transitive; + dotnet list $(PathToLibrarySolution) package --vulnerable --include-transitive; exit 1; } @@ -157,6 +158,33 @@ jobs: artifactName: nuget pathToPublish: '$(Build.ArtifactStagingDirectory)' + - job: verify_formatting_windows + displayName: Verify Code Formatting on Windows + pool: + vmImage: windows-latest + steps: + - task: UseDotNet@2 + displayName: 'Install Latest .NET SDK' + inputs: + packageType: 'sdk' + version: '$(NET_VERSION)' + + - powershell: dotnet workload install maui + displayName: Install Latest .NET MAUI Workload + + - task: Bash@3 + displayName: 'Verify Formatting' + env: + PathToSamplesSolution: $(PathToSamplesSolution) + inputs: + targetType: 'inline' + script: | + dotnet format $PathToSamplesSolution --verify-no-changes --exclude-diagnostics CA1416 + status=$? + [ $status -eq 0 ] && echo "No errors found" + [ $status -ne 0 ] && echo "Formatting errors found. In the Windows Command Line, please run \`dotnet format $PathToSamplesSolution\`, then commit + push the newly formatted code" + exit $status + - job: build_macos displayName: Build macOS Library pool: @@ -209,4 +237,4 @@ jobs: - task: CmdLine@2 displayName: 'Pack CommunityToolkit NuGets' inputs: - script: 'dotnet pack -c Release $(PathToCommunityToolkitCsproj) -p:PackageVersion=$(NugetPackageVersion) --output $(Build.ArtifactStagingDirectory)/nuget -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg' + script: 'dotnet pack -c Release $(PathToCommunityToolkitCsproj) -p:PackageVersion=$(NugetPackageVersion) --output $(Build.ArtifactStagingDirectory)/nuget -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg' \ No newline at end of file diff --git a/samples/CommunityToolkit.Maui.Markup.Sample/AppShell.cs b/samples/CommunityToolkit.Maui.Markup.Sample/AppShell.cs index 9ca97805..61b6339e 100644 --- a/samples/CommunityToolkit.Maui.Markup.Sample/AppShell.cs +++ b/samples/CommunityToolkit.Maui.Markup.Sample/AppShell.cs @@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.Markup.Sample; class AppShell : Shell { - readonly static IReadOnlyDictionary pageRouteMappingDictionary = new Dictionary(new[] + static readonly IReadOnlyDictionary pageRouteMappingDictionary = new Dictionary(new[] { CreateRoutePageMapping(), CreateRoutePageMapping(), diff --git a/samples/CommunityToolkit.Maui.Markup.Sample/MauiProgram.cs b/samples/CommunityToolkit.Maui.Markup.Sample/MauiProgram.cs index 826aba0c..f65b4a91 100644 --- a/samples/CommunityToolkit.Maui.Markup.Sample/MauiProgram.cs +++ b/samples/CommunityToolkit.Maui.Markup.Sample/MauiProgram.cs @@ -12,23 +12,23 @@ public static MauiApp CreateMauiApp() var builder = MauiApp.CreateBuilder() .UseMauiApp() .UseMauiCommunityToolkit() - .UseMauiCommunityToolkitMarkup(); - - // Fonts - builder.ConfigureFonts(fonts => fonts.AddFont("FontAwesome.otf", "FontAwesome")); - - // App Shell - builder.Services.AddTransient(); - - // Services + .UseMauiCommunityToolkitMarkup(); + + // Fonts + builder.ConfigureFonts(fonts => fonts.AddFont("FontAwesome.otf", "FontAwesome")); + + // App Shell + builder.Services.AddTransient(); + + // Services builder.Services.AddSingleton(); builder.Services.AddSingleton(Browser.Default); builder.Services.AddSingleton(); builder.Services.AddSingleton(Preferences.Default); builder.Services.AddSingleton(); - builder.Services.AddSingleton(RestService.For("https://hacker-news.firebaseio.com/v0")); - - // Pages + View Models + builder.Services.AddSingleton(RestService.For("https://hacker-news.firebaseio.com/v0")); + + // Pages + View Models builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); diff --git a/src/CommunityToolkit.Maui.Markup.UnitTests/Mocks/MockDispatcherProvider.cs b/src/CommunityToolkit.Maui.Markup.UnitTests/Mocks/MockDispatcherProvider.cs index 7b23a8fc..21fd3a98 100644 --- a/src/CommunityToolkit.Maui.Markup.UnitTests/Mocks/MockDispatcherProvider.cs +++ b/src/CommunityToolkit.Maui.Markup.UnitTests/Mocks/MockDispatcherProvider.cs @@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.Markup.UnitTests.Mocks; // Inspired by https://github.com/dotnet/maui/blob/main/src/Core/tests/UnitTests/TestClasses/DispatcherStub.cs sealed class MockDispatcherProvider : IDispatcherProvider, IDisposable { - readonly static DispatcherMock dispatcherMock = new(); + static readonly DispatcherMock dispatcherMock = new(); readonly ThreadLocal dispatcherInstance = new(() => dispatcherMock); diff --git a/src/CommunityToolkit.Maui.Markup/DynamicResourceHandlerExtensions.cs b/src/CommunityToolkit.Maui.Markup/DynamicResourceHandlerExtensions.cs index af1ae0d9..d3cf8ac6 100644 --- a/src/CommunityToolkit.Maui.Markup/DynamicResourceHandlerExtensions.cs +++ b/src/CommunityToolkit.Maui.Markup/DynamicResourceHandlerExtensions.cs @@ -1,12 +1,12 @@ using Microsoft.Maui.Controls.Internals; -namespace CommunityToolkit.Maui.Markup; - +namespace CommunityToolkit.Maui.Markup; + /// /// Extension Methods for IDynamicResourceHandler /// public static class DynamicResourceHandlerExtensions -{ +{ /// /// Set Dynamic Resource /// @@ -21,8 +21,8 @@ public static TDynamicResourceHandler DynamicResource(t dynamicResourceHandler.SetDynamicResource(property, key); return dynamicResourceHandler; - } - + } + /// /// Set Dynamic Resource /// diff --git a/src/CommunityToolkit.Maui.Markup/ImageExtensions.cs b/src/CommunityToolkit.Maui.Markup/ImageExtensions.cs index 23b71e7b..5e1abcce 100644 --- a/src/CommunityToolkit.Maui.Markup/ImageExtensions.cs +++ b/src/CommunityToolkit.Maui.Markup/ImageExtensions.cs @@ -1,10 +1,10 @@ -namespace CommunityToolkit.Maui.Markup; - +namespace CommunityToolkit.Maui.Markup; + /// /// Extension methods for IImage /// public static class ImageExtensions -{ +{ /// /// Sets the Property/> /// @@ -16,8 +16,8 @@ public static TBindable Source(this TBindable bindable, ImageSource? { bindable.SetValue(ImageElement.SourceProperty, imageSource); return bindable; - } - + } + /// /// Sets the Property/> /// @@ -29,8 +29,8 @@ public static TBindable Aspect(this TBindable bindable, Aspect aspect { bindable.SetValue(ImageElement.AspectProperty, aspect); return bindable; - } - + } + /// /// Sets the Property/> /// diff --git a/src/CommunityToolkit.Maui.Markup/ItemsViewExtensions.cs b/src/CommunityToolkit.Maui.Markup/ItemsViewExtensions.cs index 2d811abf..c47e8ef9 100644 --- a/src/CommunityToolkit.Maui.Markup/ItemsViewExtensions.cs +++ b/src/CommunityToolkit.Maui.Markup/ItemsViewExtensions.cs @@ -1,13 +1,13 @@ using System.Collections; using System.Windows.Input; -namespace CommunityToolkit.Maui.Markup; - +namespace CommunityToolkit.Maui.Markup; + /// /// Fluent extension methods for /// public static class ItemsViewExtensions -{ +{ /// /// Assigns the property /// @@ -19,8 +19,8 @@ public static TItemsView EmptyView(this TItemsView itemsView, object { itemsView.EmptyView = view; return itemsView; - } - + } + /// /// Assigns the property /// @@ -32,8 +32,8 @@ public static TItemsView EmptyViewTemplate(this TItemsView itemsView { itemsView.EmptyViewTemplate = view; return itemsView; - } - + } + /// /// Assigns the property /// @@ -45,8 +45,8 @@ public static TItemsView ItemsSource(this TItemsView itemsView, IEnu { itemsView.ItemsSource = itemsSource; return itemsView; - } - + } + /// /// Assigns the property /// @@ -58,8 +58,8 @@ public static TItemsView HorizontalScrollBarVisibility(this TItemsVi { itemsView.HorizontalScrollBarVisibility = visibility; return itemsView; - } - + } + /// /// Assigns the property /// @@ -71,8 +71,8 @@ public static TItemsView VerticalScrollBarVisibility(this TItemsView { itemsView.VerticalScrollBarVisibility = visibility; return itemsView; - } - + } + /// /// Assigns the and properties /// @@ -83,8 +83,8 @@ public static TItemsView VerticalScrollBarVisibility(this TItemsView public static TItemsView ScrollBarVisibility(this TItemsView itemsView, ScrollBarVisibility visibility) where TItemsView : ItemsView { return itemsView.HorizontalScrollBarVisibility(visibility).VerticalScrollBarVisibility(visibility); - } - + } + /// /// Assigns the property /// @@ -96,8 +96,8 @@ public static TItemsView RemainingItemsThreshold(this TItemsView ite { itemsView.RemainingItemsThreshold = threshold; return itemsView; - } - + } + /// /// Assigns the ans properties /// @@ -109,8 +109,8 @@ public static TItemsView RemainingItemsThreshold(this TItemsView ite public static TItemsView RemainingItemsThresholdReachedCommand(this TItemsView itemsView, ICommand command, object? parameter) where TItemsView : ItemsView { return itemsView.RemainingItemsThresholdReachedCommand(command).RemainingItemsThresholdReachedCommandParameter(parameter); - } - + } + /// /// Assigns the property /// @@ -122,8 +122,8 @@ public static TItemsView RemainingItemsThresholdReachedCommand(this { itemsView.RemainingItemsThresholdReachedCommand = command; return itemsView; - } - + } + /// /// Assigns the property /// @@ -135,8 +135,8 @@ public static TItemsView RemainingItemsThresholdReachedCommandParameter /// Assigns the property /// @@ -148,8 +148,8 @@ public static TItemsView ItemTemplate(this TItemsView itemsView, Dat { itemsView.ItemTemplate = template; return itemsView; - } - + } + /// /// Assigns the property /// diff --git a/src/CommunityToolkit.Maui.Markup/LabelExtensions.cs b/src/CommunityToolkit.Maui.Markup/LabelExtensions.cs index a3e60c81..7af6316b 100644 --- a/src/CommunityToolkit.Maui.Markup/LabelExtensions.cs +++ b/src/CommunityToolkit.Maui.Markup/LabelExtensions.cs @@ -1,10 +1,10 @@ -namespace CommunityToolkit.Maui.Markup; - +namespace CommunityToolkit.Maui.Markup; + /// /// Extension Methods for Label /// public static class LabelExtensions -{ +{ /// /// Sets Formatted Text /// diff --git a/src/CommunityToolkit.Maui.Markup/PlaceholderExtensions.cs b/src/CommunityToolkit.Maui.Markup/PlaceholderExtensions.cs index d50ed79d..1cb41845 100644 --- a/src/CommunityToolkit.Maui.Markup/PlaceholderExtensions.cs +++ b/src/CommunityToolkit.Maui.Markup/PlaceholderExtensions.cs @@ -1,10 +1,10 @@ -namespace CommunityToolkit.Maui.Markup; - +namespace CommunityToolkit.Maui.Markup; + /// /// Extension Methods for /// public static class PlaceholderExtensions -{ +{ /// /// Sets the Property /// @@ -16,8 +16,8 @@ public static TBindable PlaceholderColor(this TBindable bindable, Col { bindable.SetValue(PlaceholderElement.PlaceholderColorProperty, textColor); return bindable; - } - + } + /// /// Sets the Property/> /// @@ -29,8 +29,8 @@ public static TBindable Placeholder(this TBindable bindable, string? { bindable.SetValue(PlaceholderElement.PlaceholderProperty, text); return bindable; - } - + } + /// /// Sets the and Properties/> ///