From a3b27632ddcf5f801b2358a031d28fc28ed5d9cb Mon Sep 17 00:00:00 2001 From: artyom Date: Thu, 20 Aug 2020 23:00:10 +0300 Subject: [PATCH 1/8] Add .Events projects --- global.json | 2 +- .../Avalonia.ReactiveUI.Events.csproj | 12 ++++++++++++ .../Avalonia.ReactiveUI.Events.UnitTests.csproj | 15 +++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj create mode 100644 tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj diff --git a/global.json b/global.json index a3fdca9bed..e26c2c7f2c 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "3.1.101" + "version": "3.1.401" }, "msbuild-sdks": { "Microsoft.Build.Traversal": "1.0.43", diff --git a/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj b/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj new file mode 100644 index 0000000000..b95c8946e2 --- /dev/null +++ b/src/Avalonia.ReactiveUI.Events/Avalonia.ReactiveUI.Events.csproj @@ -0,0 +1,12 @@ + + + netstandard2.0 + Avalonia.ReactiveUI + + + + + + + + diff --git a/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj b/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj new file mode 100644 index 0000000000..d162a2abe0 --- /dev/null +++ b/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj @@ -0,0 +1,15 @@ + + + netcoreapp3.1 + + + + + + + + + + + + From d683bbbffc019c57ed3de0e431172bfbbcb08fae Mon Sep 17 00:00:00 2001 From: artyom Date: Thu, 20 Aug 2020 23:36:42 +0300 Subject: [PATCH 2/8] Add Avalonia.ReactiveUI.Events based on Pharmacist --- Avalonia.sln | 26 ++++++++++++ nukebuild/Build.cs | 40 ++++++++++++++++++- nukebuild/_build.csproj | 1 + ...valonia.ReactiveUI.Events.UnitTests.csproj | 15 ------- 4 files changed, 66 insertions(+), 16 deletions(-) delete mode 100644 tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj diff --git a/Avalonia.sln b/Avalonia.sln index ffd7b4d4f4..71ed289241 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -224,6 +224,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Headless.Vnc", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Markup.Xaml.Loader", "src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj", "{909A8CBD-7D0E-42FD-B841-022AD8925820}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.ReactiveUI.Events", "src\Avalonia.ReactiveUI.Events\Avalonia.ReactiveUI.Events.csproj", "{28F18757-C3E6-4BBE-A37D-11BA2AB9177C}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -2035,6 +2037,30 @@ Global {909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhone.Build.0 = Release|Any CPU {909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU {909A8CBD-7D0E-42FD-B841-022AD8925820}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhone.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhone.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|Any CPU.Build.0 = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhone.ActiveCfg = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhone.Build.0 = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {28F18757-C3E6-4BBE-A37D-11BA2AB9177C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index fbfbf47e1b..8c40a2c45b 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading; +using System.Threading.Tasks; using System.Xml.Linq; using Nuke.Common; using Nuke.Common.Git; @@ -15,6 +16,7 @@ using Nuke.Common.Tools.MSBuild; using Nuke.Common.Tools.Npm; using Nuke.Common.Utilities; using Nuke.Common.Utilities.Collections; +using Pharmacist.Core; using static Nuke.Common.EnvironmentInfo; using static Nuke.Common.IO.FileSystemTasks; using static Nuke.Common.IO.PathConstruction; @@ -139,7 +141,7 @@ partial class Build : NukeBuild Target Compile => _ => _ .DependsOn(Clean) .DependsOn(CompileHtmlPreviewer) - .Executes(() => + .Executes(async () => { if (Parameters.IsRunningOnWindows) MsBuildCommon(Parameters.MSBuildSolution, c => c @@ -153,8 +155,44 @@ partial class Build : NukeBuild .AddProperty("PackageVersion", Parameters.Version) .SetConfiguration(Parameters.Configuration) ); + + await CompileReactiveEvents(); }); + async Task CompileReactiveEvents() + { + var avaloniaBuildOutput = Path.Combine(RootDirectory, "packages", "Avalonia", "bin", Parameters.Configuration); + var avaloniaAssemblies = GlobFiles(avaloniaBuildOutput, "**/Avalonia*.dll") + .Where(file => !file.Contains("Avalonia.Build.Tasks") && + !file.Contains("Avalonia.Remote.Protocol")); + + var eventsDirectory = GlobDirectories($"{RootDirectory}/src/**/Avalonia.ReactiveUI.Events").First(); + var eventsBuildFile = Path.Combine(eventsDirectory, "Events_Avalonia.cs"); + if (File.Exists(eventsBuildFile)) + File.Delete(eventsBuildFile); + + using (var stream = File.Create(eventsBuildFile)) + using (var writer = new StreamWriter(stream)) + { + await ObservablesForEventGenerator.ExtractEventsFromAssemblies( + writer, avaloniaAssemblies, new string[0], "netstandard2.0" + ); + } + + var eventsProject = Path.Combine(eventsDirectory, "Avalonia.ReactiveUI.Events.csproj"); + if (Parameters.IsRunningOnWindows) + MsBuildCommon(eventsProject, c => c + .SetArgumentConfigurator(a => a.Add("/r")) + .AddTargets("Build") + ); + else + DotNetBuild(c => c + .SetProjectFile(eventsProject) + .AddProperty("PackageVersion", Parameters.Version) + .SetConfiguration(Parameters.Configuration) + ); + } + void RunCoreTest(string projectName) { Information($"Running tests from {projectName}"); diff --git a/nukebuild/_build.csproj b/nukebuild/_build.csproj index 4c64d4ff93..b06e49f2eb 100644 --- a/nukebuild/_build.csproj +++ b/nukebuild/_build.csproj @@ -17,6 +17,7 @@ + diff --git a/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj b/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj deleted file mode 100644 index d162a2abe0..0000000000 --- a/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - netcoreapp3.1 - - - - - - - - - - - - From e3e001e12b174569c25b11353a1aecae5dc961bb Mon Sep 17 00:00:00 2001 From: artyom Date: Fri, 21 Aug 2020 13:56:24 +0300 Subject: [PATCH 3/8] Use latest SDK and runtime --- azure-pipelines.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 54645e461e..172fe9cb2b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,16 +35,16 @@ jobs: vmImage: 'macOS-10.14' steps: - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.101' + displayName: 'Use .NET Core SDK 3.1.401' inputs: packageType: sdk - version: 3.1.101 + version: 3.1.401 - task: UseDotNet@2 - displayName: 'Use .NET Core Runtime 3.1.1' + displayName: 'Use .NET Core Runtime 3.1.7' inputs: packageType: runtime - version: 3.1.1 + version: 3.1.7 - task: CmdLine@2 displayName: 'Install Mono 5.18' @@ -112,6 +112,18 @@ jobs: pool: vmImage: 'windows-2019' steps: + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK 3.1.401' + inputs: + packageType: sdk + version: 3.1.401 + + - task: UseDotNet@2 + displayName: 'Use .NET Core Runtime 3.1.7' + inputs: + packageType: runtime + version: 3.1.7 + - task: CmdLine@2 displayName: 'Install Nuke' inputs: From ded3a566c0e301bdbf871d3cedd7196c87f5d89d Mon Sep 17 00:00:00 2001 From: artyom Date: Fri, 21 Aug 2020 14:42:44 +0300 Subject: [PATCH 4/8] Apply DotNetCoreInstaller workaround --- azure-pipelines.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 172fe9cb2b..a267452ff4 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -112,18 +112,11 @@ jobs: pool: vmImage: 'windows-2019' steps: - - task: UseDotNet@2 + - task: DotNetCoreInstaller@0 displayName: 'Use .NET Core SDK 3.1.401' inputs: - packageType: sdk version: 3.1.401 - - task: UseDotNet@2 - displayName: 'Use .NET Core Runtime 3.1.7' - inputs: - packageType: runtime - version: 3.1.7 - - task: CmdLine@2 displayName: 'Install Nuke' inputs: From 9dd34660bf3b236eb7006d80498e790e4b6d95c1 Mon Sep 17 00:00:00 2001 From: artyom Date: Fri, 21 Aug 2020 15:15:26 +0300 Subject: [PATCH 5/8] Try using .NET Core 3.1.302 --- azure-pipelines.yml | 17 +++++------------ global.json | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index a267452ff4..20278ddc71 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -34,17 +34,10 @@ jobs: pool: vmImage: 'macOS-10.14' steps: - - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.401' - inputs: - packageType: sdk - version: 3.1.401 - - - task: UseDotNet@2 - displayName: 'Use .NET Core Runtime 3.1.7' + - task: DotNetCoreInstaller@0 + displayName: 'Use .NET Core SDK 3.1.302' inputs: - packageType: runtime - version: 3.1.7 + version: 3.1.302 - task: CmdLine@2 displayName: 'Install Mono 5.18' @@ -113,9 +106,9 @@ jobs: vmImage: 'windows-2019' steps: - task: DotNetCoreInstaller@0 - displayName: 'Use .NET Core SDK 3.1.401' + displayName: 'Use .NET Core SDK 3.1.302' inputs: - version: 3.1.401 + version: 3.1.302 - task: CmdLine@2 displayName: 'Install Nuke' diff --git a/global.json b/global.json index e26c2c7f2c..2f594d9596 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "3.1.401" + "version": "3.1.302" }, "msbuild-sdks": { "Microsoft.Build.Traversal": "1.0.43", From 59b0f81aad47b9bea2f32b23c754e6cb8eea8c7b Mon Sep 17 00:00:00 2001 From: artyom Date: Sat, 22 Aug 2020 21:56:59 +0300 Subject: [PATCH 6/8] Add a smoke test --- Avalonia.sln | 3 ++ dirs.proj | 1 + nukebuild/Build.cs | 1 + ...valonia.ReactiveUI.Events.UnitTests.csproj | 15 +++++++ .../BasicControlEventsTest.cs | 44 +++++++++++++++++++ 5 files changed, 64 insertions(+) create mode 100644 tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj create mode 100644 tests/Avalonia.ReactiveUI.Events.UnitTests/BasicControlEventsTest.cs diff --git a/Avalonia.sln b/Avalonia.sln index 71ed289241..551eb5925e 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -226,6 +226,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Markup.Xaml.Loader EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.ReactiveUI.Events", "src\Avalonia.ReactiveUI.Events\Avalonia.ReactiveUI.Events.csproj", "{28F18757-C3E6-4BBE-A37D-11BA2AB9177C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.ReactiveUI.Events.UnitTests", "tests\Avalonia.ReactiveUI.Events.UnitTests\Avalonia.ReactiveUI.Events.UnitTests.csproj", "{780AC0FE-8DD2-419F-A1DC-AC7E3EB393F7}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -2120,6 +2122,7 @@ Global {351337F5-D66F-461B-A957-4EF60BDB4BA6} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {3C84E04B-36CF-4D0D-B965-C26DD649D1F3} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9} {909A8CBD-7D0E-42FD-B841-022AD8925820} = {8B6A8209-894F-4BA1-B880-965FD453982C} + {780AC0FE-8DD2-419F-A1DC-AC7E3EB393F7} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A} diff --git a/dirs.proj b/dirs.proj index 26c8f54b23..086a22a77b 100644 --- a/dirs.proj +++ b/dirs.proj @@ -7,6 +7,7 @@ + diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index 8c40a2c45b..a46b55f6f3 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -240,6 +240,7 @@ partial class Build : NukeBuild RunCoreTest("Avalonia.Visuals.UnitTests"); RunCoreTest("Avalonia.Skia.UnitTests"); RunCoreTest("Avalonia.ReactiveUI.UnitTests"); + RunCoreTest("Avalonia.ReactiveUI.Events.UnitTests"); }); Target RunRenderTests => _ => _ diff --git a/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj b/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj new file mode 100644 index 0000000000..19a6fd138e --- /dev/null +++ b/tests/Avalonia.ReactiveUI.Events.UnitTests/Avalonia.ReactiveUI.Events.UnitTests.csproj @@ -0,0 +1,15 @@ + + + netcoreapp3.1 + + + + + + + + + + + + diff --git a/tests/Avalonia.ReactiveUI.Events.UnitTests/BasicControlEventsTest.cs b/tests/Avalonia.ReactiveUI.Events.UnitTests/BasicControlEventsTest.cs new file mode 100644 index 0000000000..1092c98246 --- /dev/null +++ b/tests/Avalonia.ReactiveUI.Events.UnitTests/BasicControlEventsTest.cs @@ -0,0 +1,44 @@ +using System; +using System.Reactive.Linq; +using Avalonia.Controls; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.ReactiveUI.Events.UnitTests +{ + public class BasicControlEventsTest + { + public class EventsControl : UserControl + { + public bool IsAttached { get; private set; } + + public EventsControl() + { + var attached = this + .Events() + .AttachedToVisualTree + .Select(args => true); + + this.Events() + .DetachedFromVisualTree + .Select(args => false) + .Merge(attached) + .Subscribe(marker => IsAttached = marker); + } + } + + [Fact] + public void Should_Generate_Events_Wrappers() + { + var root = new TestRoot(); + var control = new EventsControl(); + Assert.False(control.IsAttached); + + root.Child = control; + Assert.True(control.IsAttached); + + root.Child = null; + Assert.False(control.IsAttached); + } + } +} From f4b1b9dc958018b2b3c21d0c6e733e465cce9141 Mon Sep 17 00:00:00 2001 From: "Artyom V. Gorchakov" Date: Tue, 1 Sep 2020 20:30:56 +0300 Subject: [PATCH 7/8] UseDotNet@2 --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 20278ddc71..6652d1712a 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -34,7 +34,7 @@ jobs: pool: vmImage: 'macOS-10.14' steps: - - task: DotNetCoreInstaller@0 + - task: UseDotNet@2 displayName: 'Use .NET Core SDK 3.1.302' inputs: version: 3.1.302 @@ -105,7 +105,7 @@ jobs: pool: vmImage: 'windows-2019' steps: - - task: DotNetCoreInstaller@0 + - task: UseDotNet@2 displayName: 'Use .NET Core SDK 3.1.302' inputs: version: 3.1.302 From 21fc8620f204233268d6066bfb4714332ea4f6fd Mon Sep 17 00:00:00 2001 From: artyom Date: Tue, 1 Sep 2020 21:36:41 +0300 Subject: [PATCH 8/8] Try using 3.1.401 --- azure-pipelines.yml | 8 ++++---- global.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 6652d1712a..89504a498e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -35,9 +35,9 @@ jobs: vmImage: 'macOS-10.14' steps: - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.302' + displayName: 'Use .NET Core SDK 3.1.401' inputs: - version: 3.1.302 + version: 3.1.401 - task: CmdLine@2 displayName: 'Install Mono 5.18' @@ -106,9 +106,9 @@ jobs: vmImage: 'windows-2019' steps: - task: UseDotNet@2 - displayName: 'Use .NET Core SDK 3.1.302' + displayName: 'Use .NET Core SDK 3.1.401' inputs: - version: 3.1.302 + version: 3.1.401 - task: CmdLine@2 displayName: 'Install Nuke' diff --git a/global.json b/global.json index 3371f05a4d..b2b2da7c4f 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "3.1.302" + "version": "3.1.401" }, "msbuild-sdks": { "Microsoft.Build.Traversal": "1.0.43",