Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion Airframe.sln
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".solution", ".solution", "{
NuGet.config = NuGet.config
README.md = README.md
stylecop.json = stylecop.json
packages.props = packages.props
.gitignore = .gitignore
.editorconfig = .editorconfig
.codecov.yml = .codecov.yml
Expand Down Expand Up @@ -90,6 +89,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Airframe.ViewModels.Tests",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicrosoftDependencyInjection.Tests", "test\MicrosoftDependencyInjection.Tests\MicrosoftDependencyInjection.Tests.csproj", "{6C3C3C73-C46B-4BF2-8F78-F417135D5D3E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Tests", "test\Core.Tests\Core.Tests.csproj", "{A250A99B-0225-4B5D-9753-ED1DF770D61D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -178,6 +179,10 @@ Global
{6C3C3C73-C46B-4BF2-8F78-F417135D5D3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C3C3C73-C46B-4BF2-8F78-F417135D5D3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C3C3C73-C46B-4BF2-8F78-F417135D5D3E}.Release|Any CPU.Build.0 = Release|Any CPU
{A250A99B-0225-4B5D-9753-ED1DF770D61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A250A99B-0225-4B5D-9753-ED1DF770D61D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A250A99B-0225-4B5D-9753-ED1DF770D61D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A250A99B-0225-4B5D-9753-ED1DF770D61D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -204,6 +209,7 @@ Global
{903C1B9D-F4F8-4540-8F46-E8EB8F15EAA5} = {843C3844-BA79-40AE-B102-F5AFA0F4AD77}
{64AEB8AB-619C-4AF3-BA3F-407A4FA9A305} = {843C3844-BA79-40AE-B102-F5AFA0F4AD77}
{6C3C3C73-C46B-4BF2-8F78-F417135D5D3E} = {843C3844-BA79-40AE-B102-F5AFA0F4AD77}
{A250A99B-0225-4B5D-9753-ED1DF770D61D} = {843C3844-BA79-40AE-B102-F5AFA0F4AD77}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8F0DF64A-C8D5-41DF-B4C9-5C70526644DF}
Expand Down
164 changes: 80 additions & 84 deletions directory.packages.props
Original file line number Diff line number Diff line change
@@ -1,86 +1,82 @@
<Project>
<ItemGroup>
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
<PackageVersion Include="Rocket.Surgery.Build.Metadata" Version="3.3.11" PrivateAssets="All" />
<PackageVersion Include="Rocket.Surgery.MSBuild.Metadata" Version="1.1.0" />
<PackageVersion Include="Rocket.Surgery.MSBuild.SourceLink" Version="1.1.1" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageVersion Include="Rocket.Surgery.MSBuild.CI" Version="1.1.1" />
<PackageVersion Include="Rocket.Surgery.MSBuild.GitVersion" Version="1.1.1" />
<PackageVersion Include="Rocket.Surgery.MSBuild.JetBrains.Annotations" Version="1.1.1" Condition="'$(MSBuildProjectName)'!='.build'" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="stylecop.analyzers" Version="1.2.0-beta.435" PrivateAssets="all" />
<PackageVersion Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.2" PrivateAssets="all" />
<PackageVersion Include="Roslynator.Analyzers" Version="4.2.0" PrivateAssets="All" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="GitVersion.Tool" Version="5.11.1" />
<PackageVersion Include="JetBrains.ReSharper.CommandLineTools" Version="2022.3.0" />
<PackageVersion Include="NuGet.CommandLine" Version="6.3.1" />
<PackageVersion Include="Nuke.Common" Version="6.2.1" />
<PackageVersion Include="ReportGenerator" Version="5.1.12" />
<PackageVersion Include="Rocket.Surgery.Nuke" Version="0.18.0" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="BenchmarkDotNet" Version="0.13.2" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="DynamicData" Version="7.12.11" />
<PackageVersion Include="GitVersion.CommandLine.DotNetCore" Version="5.11.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="3.1.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="3.1.10" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.10" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.2" />
<PackageVersion Include="ReactiveUI" Version="13.3.2" />
<PackageVersion Include="ReactiveUI.XamForms" Version="13.3.2" />
<PackageVersion Include="ReactiveMarbles.PropertyChanged" Version="2.0.27" />
<PackageVersion Include="Refit" Version="5.2.4" />
<PackageVersion Include="Rg.Plugins.Popup" Version="2.1.0" />
<PackageVersion Include="Rocket.Surgery.Xamarin.Essentials" Version="0.4.1" />
<PackageVersion Include="Rocket.Surgery.Xamarin.Essentials.Abstractions" Version="0.4.1" />
<PackageVersion Include="Serilog.Sinks.AppCenter.Crash" Version="1.2.1" />
<PackageVersion Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
<PackageVersion Include="Shiny" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Core" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Locations" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Notifications" Version="2.4.2.2996" />
<PackageVersion Include="Sextant" Version="2.11.1" />
<PackageVersion Include="Sextant.Plugins.Popup" Version="2.11.1" />
<PackageVersion Include="Splat" Version="11.1.1" />
<PackageVersion Include="Splat.Serilog" Version="11.1.1" />
<PackageVersion Include="Splat.DryIoc" Version="11.1.1" />
<PackageVersion Include="Splat.Microsoft.Extensions.Logging" Version="11.1.1" />
<PackageVersion Include="Splat.Microsoft.Extensions.DependencyInjection" Version="11.1.1" />
<PackageVersion Include="System.ComponentModel" Version="4.3.0" />
<PackageVersion Include="System.Collections.Immutable" Version="1.7.1" />
<PackageVersion Include="System.Interactive.Async.Providers" Version="6.0.1" />
<PackageVersion Include="System.Interactive.Providers" Version="6.0.1" />
<PackageVersion Include="System.Reactive" Version="5.0.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
<PackageVersion Include="Toast.iOS" Version="1.2.0" />
<PackageVersion Include="Xamarin.Forms" Version="5.0.0.2515" />
<PackageVersion Include="Xamarin.Essentials" Version="1.7.3" />
</ItemGroup>

<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="3.2.0" />
<PackageVersion Include="coverlet.msbuild" Version="3.2.0" IncludeAssets="all" PrivateAssets="runtime;build;native;contentfiles;analyzers" />
<PackageVersion Include="FluentAssertions" Version="6.8.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
<PackageVersion Include="Microsoft.Reactive.Testing" Version="5.0.0" />
<PackageVersion Include="NSubstitute" Version="4.4.0" />
<PackageVersion Include="ReactiveUI.Testing" Version="13.3.2" />
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.Fixtures" Version="7.1.4" />
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.NSubstitute" Version="7.1.4" />
<PackageVersion Include="xunit" Version="2.4.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.4.5" />
<PackageVersion Include="XunitXml.TestLogger" Version="3.0.70" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
<PackageVersion Include="Rocket.Surgery.Build.Metadata" Version="3.3.11" PrivateAssets="All" />
<PackageVersion Include="Rocket.Surgery.MSBuild.Metadata" Version="1.1.0" />
<PackageVersion Include="Rocket.Surgery.MSBuild.SourceLink" Version="1.1.1" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageVersion Include="Rocket.Surgery.MSBuild.CI" Version="1.1.1" />
<PackageVersion Include="Rocket.Surgery.MSBuild.GitVersion" Version="1.1.1" />
<PackageVersion Include="Rocket.Surgery.MSBuild.JetBrains.Annotations" Version="1.1.1" Condition="'$(MSBuildProjectName)'!='.build'" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="stylecop.analyzers" Version="1.2.0-beta.435" PrivateAssets="all" />
<PackageVersion Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.2" PrivateAssets="all" />
<PackageVersion Include="Roslynator.Analyzers" Version="4.2.0" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="GitVersion.Tool" Version="5.11.1" />
<PackageVersion Include="JetBrains.ReSharper.CommandLineTools" Version="2022.3.0" />
<PackageVersion Include="NuGet.CommandLine" Version="6.3.1" />
<PackageVersion Include="Nuke.Common" Version="6.2.1" />
<PackageVersion Include="ReportGenerator" Version="5.1.12" />
<PackageVersion Include="Rocket.Surgery.Nuke" Version="0.18.0" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="BenchmarkDotNet" Version="0.13.2" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="DynamicData" Version="7.12.11" />
<PackageVersion Include="GitVersion.CommandLine.DotNetCore" Version="5.11.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="3.1.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="3.1.10" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.3" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.1.10" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.2" />
<PackageVersion Include="ReactiveUI" Version="13.3.2" />
<PackageVersion Include="ReactiveUI.XamForms" Version="13.3.2" />
<PackageVersion Include="ReactiveMarbles.PropertyChanged" Version="2.0.27" />
<PackageVersion Include="Refit" Version="5.2.4" />
<PackageVersion Include="Rg.Plugins.Popup" Version="2.1.0" />
<PackageVersion Include="Rocket.Surgery.Xamarin.Essentials" Version="0.4.1" />
<PackageVersion Include="Rocket.Surgery.Xamarin.Essentials.Abstractions" Version="0.4.1" />
<PackageVersion Include="Serilog.Sinks.AppCenter.Crash" Version="1.2.1" />
<PackageVersion Include="Serilog.Sinks.Xamarin" Version="1.0.0" />
<PackageVersion Include="Shiny" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Core" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Locations" Version="2.4.2.2996" />
<PackageVersion Include="Shiny.Notifications" Version="2.4.2.2996" />
<PackageVersion Include="Sextant" Version="2.11.1" />
<PackageVersion Include="Sextant.Plugins.Popup" Version="2.11.1" />
<PackageVersion Include="Splat" Version="11.1.1" />
<PackageVersion Include="Splat.Serilog" Version="11.1.1" />
<PackageVersion Include="Splat.DryIoc" Version="11.1.1" />
<PackageVersion Include="Splat.Microsoft.Extensions.Logging" Version="11.1.1" />
<PackageVersion Include="Splat.Microsoft.Extensions.DependencyInjection" Version="11.1.1" />
<PackageVersion Include="System.ComponentModel" Version="4.3.0" />
<PackageVersion Include="System.Collections.Immutable" Version="1.7.1" />
<PackageVersion Include="System.Interactive.Async.Providers" Version="6.0.1" />
<PackageVersion Include="System.Interactive.Providers" Version="6.0.1" />
<PackageVersion Include="System.Reactive" Version="5.0.0" />
<PackageVersion Include="System.Reflection.Emit.Lightweight" Version="4.7.0" />
<PackageVersion Include="Toast.iOS" Version="1.2.0" />
<PackageVersion Include="Xamarin.Forms" Version="5.0.0.2515" />
<PackageVersion Include="Xamarin.Essentials" Version="1.7.3" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="3.2.0" />
<PackageVersion Include="coverlet.msbuild" Version="3.2.0" IncludeAssets="all" PrivateAssets="runtime;build;native;contentfiles;analyzers" />
<PackageVersion Include="FluentAssertions" Version="6.8.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
<PackageVersion Include="Microsoft.Reactive.Testing" Version="5.0.0" />
<PackageVersion Include="NSubstitute" Version="4.4.0" />
<PackageVersion Include="ReactiveUI.Testing" Version="13.3.2" />
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.Fixtures" Version="7.1.4" />
<PackageVersion Include="Rocket.Surgery.Extensions.Testing.NSubstitute" Version="7.1.4" />
<PackageVersion Include="xunit" Version="2.4.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.4.5" />
<PackageVersion Include="XunitXml.TestLogger" Version="3.0.70" />
</ItemGroup>
</Project>
24 changes: 8 additions & 16 deletions src/Core/AppStart/ApplicationStartup.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using Microsoft.Extensions.Logging;

namespace Rocket.Surgery.Airframe
{
/// <summary>
/// Represents the application startup sequence.
/// </summary>
public sealed class ApplicationStartup : IApplicationStartup
public sealed class ApplicationStartup : LoggableApplicationStartup, IApplicationStartup
{
private readonly IEnumerable<IStartupOperation> _startupTasks;

/// <summary>
/// Initializes a new instance of the <see cref="ApplicationStartup"/> class.
/// </summary>
/// <param name="startupTasks">The startup tasks.</param>
public ApplicationStartup(IEnumerable<IStartupOperation> startupTasks) =>
_startupTasks = startupTasks;

/// <inheritdoc/>
public IObservable<Unit> Startup() => _startupTasks
.Where(x => x.CanExecute())
.Select(x => x.Start())
.Concat();
/// <param name="loggerFactory">The logger factory.</param>
/// <param name="startupOperations">The startup operations.</param>
public ApplicationStartup(ILoggerFactory loggerFactory, IEnumerable<IStartupOperation> startupOperations)
: base(loggerFactory, startupOperations)
{
}
}
}
18 changes: 18 additions & 0 deletions src/Core/AppStart/ApplicationStartupExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;
using System.Reactive;

namespace Rocket.Surgery.Airframe
{
/// <summary>
/// Future default interface implementations. Some call them mixins.
/// </summary>
public static class ApplicationStartupExtensions
{
/// <summary>
/// Starts the application life cycle.
/// </summary>
/// <param name="startup">The application startup.</param>
/// <returns>A completion notification.</returns>
public static IObservable<Unit> Startup(this IApplicationStartup startup) => startup.Startup(1);
}
}
12 changes: 11 additions & 1 deletion src/Core/AppStart/IApplicationStartup.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Reactive;
using System.Reactive.Concurrency;

namespace Rocket.Surgery.Airframe
{
Expand All @@ -11,7 +12,16 @@ public interface IApplicationStartup
/// <summary>
/// Starts the application life cycle.
/// </summary>
/// <param name="concurrentOperations">The maximum concurrent operations. </param>
/// <returns>A completion notification.</returns>
IObservable<Unit> Startup();
IObservable<Unit> Startup(int concurrentOperations);

/// <summary>
/// Starts the application life cycle.
/// </summary>
/// <param name="concurrentOperations">The maximum concurrent operations. </param>
/// <param name="scheduler">The scheduler.</param>
/// <returns>A completion notification.</returns>
IObservable<Unit> Startup(int concurrentOperations, IScheduler scheduler);
}
}
57 changes: 57 additions & 0 deletions src/Core/AppStart/LoggableApplicationStartup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using Microsoft.Extensions.Logging;

namespace Rocket.Surgery.Airframe
{
/// <summary>
/// Represents the application startup sequence.
/// </summary>
public abstract class LoggableApplicationStartup : IApplicationStartup
{
private readonly ILogger _logger;
private readonly IEnumerable<IStartupOperation> _startupOperations;

/// <summary>
/// Initializes a new instance of the <see cref="LoggableApplicationStartup"/> class.
/// </summary>
/// <param name="loggerFactory">The logger factory.</param>
/// <param name="startupOperations">The startup tasks.</param>
protected LoggableApplicationStartup(ILoggerFactory loggerFactory, IEnumerable<IStartupOperation> startupOperations)
{
_logger = loggerFactory.CreateLogger(GetType());
_startupOperations = startupOperations;
}

/// <inheritdoc/>
IObservable<Unit> IApplicationStartup.Startup(int concurrentOperations) => Startup(concurrentOperations)
.Finally(() => _logger.LogTrace("{Startup} completed", GetType().Name));

/// <inheritdoc/>
IObservable<Unit> IApplicationStartup.Startup(int concurrentOperations, IScheduler scheduler) => null;

/// <summary>
/// Executes the provided <see cref="IStartupOperation"/>.
/// </summary>
/// <param name="concurrentOperations">The maximum concurrent operations.</param>
/// <param name="scheduler">The scheduler.</param>
/// <returns>A completion notification of the startup operation execution.</returns>
protected virtual IObservable<Unit> Startup(int concurrentOperations, IScheduler scheduler) => _startupOperations
.Where(operation => operation.CanExecute())
.Select(operation => operation.Start())
.Merge(concurrentOperations, scheduler)
.PublishLast()
.RefCount();

/// <summary>
/// Executes the provided <see cref="IStartupOperation"/>.
/// </summary>
/// <param name="concurrentOperations">The maximum concurrent operations.</param>
/// <returns>A completion notification of the startup operation execution.</returns>
protected virtual IObservable<Unit> Startup(int concurrentOperations = 1) => Startup(concurrentOperations, CurrentThreadScheduler.Instance);
}
}
Loading