Skip to content

Commit

Permalink
housekeeping: Updated C# 8 Nullability (#87)
Browse files Browse the repository at this point in the history
* housekeeping: Updated C# 8 Nullability

Updated package information
Updated analyzers
Updated PublicApiGenerator

* fixing API approval

* fixing net472 approvals
  • Loading branch information
RLittlesII committed Apr 28, 2020
1 parent 36eabe1 commit 0a0eef1
Show file tree
Hide file tree
Showing 13 changed files with 84 additions and 34 deletions.
13 changes: 10 additions & 3 deletions src/Directory.build.props
@@ -1,8 +1,15 @@
<Project>
<PropertyGroup>
<Copyright>Copyright (c) .NET Foundation and Contributors</Copyright>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/reactiveui/punchclock/</PackageProjectUrl>
<Authors>.NET Foundation and Contributors</Authors>
<Owners>xpaulbettsx;ghuntley</Owners>
<NoWarn>$(NoWarn);VSX1000</NoWarn>
<Platform>AnyCPU</Platform>
<IsTestProject>$(MSBuildProjectName.Contains('Tests'))</IsTestProject>
<Description>Make sure your asynchronous operations show up to work on time</Description>
<PackageReleaseNotes>https://github.com/reactiveui/punchclock/releases</PackageReleaseNotes>
<RepositoryUrl>https://github.com/reactiveui/punchclock</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)analyzers.ruleset</CodeAnalysisRuleSet>
Expand Down Expand Up @@ -31,7 +38,7 @@
<PackageReference Include="Xunit.StaFact" Version="0.3.18" />
<PackageReference Include="Shouldly" Version=" 3.0.2" />
<PackageReference Include="Microsoft.Reactive.Testing" Version="4.4.1" />
<PackageReference Include="PublicApiGenerator" Version="8.1.0" />
<PackageReference Include="PublicApiGenerator" Version="10.0.2" />
</ItemGroup>
<ItemGroup Condition="$(IsTestProject)">
<Compile Include="$(MSBuildThisFileDirectory)ApiGeneratorGlobalSuppressions.cs" />
Expand All @@ -50,7 +57,7 @@

<ItemGroup>
<PackageReference Include="stylecop.analyzers" Version="1.1.118" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.6.3" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0" PrivateAssets="all" />
<PackageReference Include="Roslynator.Analyzers" Version="2.3.0" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
Expand Down
@@ -1,25 +1,25 @@
[assembly: System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName="")]
[assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName="")]
namespace Punchclock
{
public class OperationQueue : System.IDisposable
{
public OperationQueue(int maximumConcurrent = 4) { }
public void Dispose() { }
protected virtual void Dispose(bool isDisposing) { }
public System.IObservable<T> EnqueueObservableOperation<T, TDontCare>(int priority, string key, System.IObservable<TDontCare> cancel, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, string key, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, string key, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T, TDontCare>(int priority, string key, System.IObservable<TDontCare> cancel, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IDisposable PauseQueue() { }
public void SetMaximumConcurrent(int maximumConcurrent) { }
public System.IObservable<System.Reactive.Unit> ShutdownQueue() { }
}
public class static OperationQueueExtensions
public static class OperationQueueExtensions
{
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation, System.Threading.CancellationToken token) { }
}
}
@@ -1,25 +1,25 @@
[assembly: System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName="")]
[assembly: System.Runtime.Versioning.TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName="")]
namespace Punchclock
{
public class OperationQueue : System.IDisposable
{
public OperationQueue(int maximumConcurrent = 4) { }
public void Dispose() { }
protected virtual void Dispose(bool isDisposing) { }
public System.IObservable<T> EnqueueObservableOperation<T, TDontCare>(int priority, string key, System.IObservable<TDontCare> cancel, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, string key, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T>(int priority, string key, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IObservable<T> EnqueueObservableOperation<T, TDontCare>(int priority, string key, System.IObservable<TDontCare> cancel, System.Func<System.IObservable<T>> asyncCalculationFunc) { }
public System.IDisposable PauseQueue() { }
public void SetMaximumConcurrent(int maximumConcurrent) { }
public System.IObservable<System.Reactive.Unit> ShutdownQueue() { }
}
public class static OperationQueueExtensions
public static class OperationQueueExtensions
{
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task> asyncOperation, System.Threading.CancellationToken token) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task Enqueue(this Punchclock.OperationQueue operationQueue, int priority, System.Func<System.Threading.Tasks.Task> asyncOperation) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation) { }
public static System.Threading.Tasks.Task<T> Enqueue<T>(this Punchclock.OperationQueue operationQueue, int priority, string key, System.Func<System.Threading.Tasks.Task<T>> asyncOperation, System.Threading.CancellationToken token) { }
}
}
2 changes: 1 addition & 1 deletion src/Punchclock.Tests/OperationQueueTests.cs
Expand Up @@ -40,7 +40,7 @@ public void ItemsShouldBeDispatchedByPriority()
// Alright, we've got the first two subjects taking up our two live
// slots, and 3,4,5 queued up. However, the order of completion should
// be "4,3,5" because of the priority.
Assert.True(outputs.All(x => x.Count() == 0));
Assert.True(outputs.All(x => x.Count == 0));

subjects[0].OnNext(42);
subjects[0].OnCompleted();
Expand Down
2 changes: 1 addition & 1 deletion src/Punchclock.Tests/Utilities/ApiApprovalBase.cs
Expand Up @@ -41,7 +41,7 @@ protected static void CheckApproval(Assembly assembly, [CallerMemberName]string
approvedPublicApi = File.ReadAllText(approvedFileName);
}

var receivedPublicApi = Filter(ApiGenerator.GeneratePublicApi(assembly));
var receivedPublicApi = Filter(ApiGenerator.GeneratePublicApi(assembly, null));

if (!string.Equals(receivedPublicApi, approvedPublicApi, StringComparison.InvariantCulture))
{
Expand Down
11 changes: 8 additions & 3 deletions src/Punchclock/KeyedOperation.cs
Expand Up @@ -24,9 +24,9 @@ internal abstract class KeyedOperation : IComparable<KeyedOperation>

public int Id { get; set; }

public string Key { get; set; }
public string? Key { get; set; }

public IObservable<Unit> CancelSignal { get; set; }
public IObservable<Unit>? CancelSignal { get; set; }

public bool KeyIsDefault => string.IsNullOrEmpty(Key) || Key == OperationQueue.DefaultKey;

Expand All @@ -49,12 +49,17 @@ public int CompareTo(KeyedOperation other)
[SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Generic implementation of same class name.")]
internal class KeyedOperation<T> : KeyedOperation
{
public Func<IObservable<T>> Func { get; set; }
public Func<IObservable<T>>? Func { get; set; }

public ReplaySubject<T> Result { get; } = new ReplaySubject<T>();

public override IObservable<Unit> EvaluateFunc()
{
if (Func == null)
{
return Observable.Empty<Unit>();
}

if (CancelledEarly)
{
return Observable.Empty<Unit>();
Expand Down
2 changes: 1 addition & 1 deletion src/Punchclock/OperationQueue.cs
Expand Up @@ -41,7 +41,7 @@ public class OperationQueue : IDisposable
private int _pauseRefCount;
private bool _isDisposed;

private AsyncSubject<Unit> _shutdownObs;
private AsyncSubject<Unit>? _shutdownObs;

/// <summary>
/// Initializes a new instance of the <see cref="OperationQueue"/> class.
Expand Down
30 changes: 30 additions & 0 deletions src/Punchclock/OperationQueueExtensions.cs
Expand Up @@ -33,6 +33,11 @@ public static class OperationQueueExtensions
/// <returns>A task to monitor the progress.</returns>
public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priority, string key, Func<Task<T>> asyncOperation, CancellationToken token)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, key, ConvertTokenToObservable(token), () => asyncOperation().ToObservable())
.ToTask(token);
}
Expand All @@ -48,6 +53,11 @@ public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priorit
/// <returns>A task to monitor the progress.</returns>
public static Task Enqueue(this OperationQueue operationQueue, int priority, string key, Func<Task> asyncOperation, CancellationToken token)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, key, ConvertTokenToObservable(token), () => asyncOperation().ToObservable())
.ToTask(token);
}
Expand All @@ -63,6 +73,11 @@ public static Task Enqueue(this OperationQueue operationQueue, int priority, str
/// <returns>A task to monitor the progress.</returns>
public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priority, string key, Func<Task<T>> asyncOperation)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, key, Observable.Never<Unit>(), () => asyncOperation().ToObservable())
.ToTask();
}
Expand All @@ -77,6 +92,11 @@ public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priorit
/// <returns>A task to monitor the progress.</returns>
public static Task Enqueue(this OperationQueue operationQueue, int priority, string key, Func<Task> asyncOperation)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, key, Observable.Never<Unit>(), () => asyncOperation().ToObservable())
.ToTask();
}
Expand All @@ -91,6 +111,11 @@ public static Task Enqueue(this OperationQueue operationQueue, int priority, str
/// <returns>A task to monitor the progress.</returns>
public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priority, Func<Task<T>> asyncOperation)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, () => asyncOperation().ToObservable())
.ToTask();
}
Expand All @@ -104,6 +129,11 @@ public static Task<T> Enqueue<T>(this OperationQueue operationQueue, int priorit
/// <returns>A task to monitor the progress.</returns>
public static Task Enqueue(this OperationQueue operationQueue, int priority, Func<Task> asyncOperation)
{
if (operationQueue == null)
{
throw new ArgumentNullException(nameof(operationQueue));
}

return operationQueue.EnqueueObservableOperation(priority, () => asyncOperation().ToObservable())
.ToTask();
}
Expand Down
10 changes: 5 additions & 5 deletions src/Punchclock/PrioritySemaphoreSubject.cs
Expand Up @@ -24,7 +24,7 @@ internal class PrioritySemaphoreSubject<T> : ISubject<T>
/// </summary>
/// <param name="maxCount">The maximum number of items to allow.</param>
/// <param name="sched">The scheduler to use when emitting the items.</param>
public PrioritySemaphoreSubject(int maxCount, IScheduler sched = null)
public PrioritySemaphoreSubject(int maxCount, IScheduler? sched = null)
{
_inner = sched != null ? (ISubject<T>)new ScheduledSubject<T>(sched) : new Subject<T>();
MaximumCount = maxCount;
Expand All @@ -46,7 +46,7 @@ public int MaximumCount
/// <inheritdoc />
public void OnNext(T value)
{
var queue = Interlocked.CompareExchange(ref _nextItems, null, null);
var queue = Interlocked.CompareExchange(ref _nextItems, null!, null!);
if (queue == null)
{
return;
Expand All @@ -72,7 +72,7 @@ public void Release()
/// <inheritdoc />
public void OnCompleted()
{
var queue = Interlocked.Exchange(ref _nextItems, null);
var queue = Interlocked.Exchange(ref _nextItems, null!);
if (queue == null)
{
return;
Expand All @@ -95,7 +95,7 @@ public void OnCompleted()
/// <inheritdoc />
public void OnError(Exception error)
{
Interlocked.Exchange(ref _nextItems, null);
Interlocked.Exchange(ref _nextItems, null!);
_inner.OnError(error);
}

Expand All @@ -107,7 +107,7 @@ public IDisposable Subscribe(IObserver<T> observer)

private void YieldUntilEmptyOrBlocked()
{
var queue = Interlocked.CompareExchange(ref _nextItems, null, null);
var queue = Interlocked.CompareExchange(ref _nextItems, null!, null!);

if (queue == null)
{
Expand Down
4 changes: 4 additions & 0 deletions src/Punchclock/Punchclock.csproj
@@ -1,6 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageId>Punchclock</PackageId>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<WarningsAsErrors>CS8625;CS8604;CS8600;CS8614;CS8603;CS8618;CS8619</WarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<Optimize>true</Optimize>
Expand Down
9 changes: 5 additions & 4 deletions src/Punchclock/ScheduledSubject.cs
Expand Up @@ -18,20 +18,20 @@ namespace Punchclock
/// <typeparam name="T">The type of item to emit.</typeparam>
internal class ScheduledSubject<T> : ISubject<T>, IDisposable
{
private readonly IObserver<T> _defaultObserver;
private readonly IObserver<T>? _defaultObserver;
private readonly IScheduler _scheduler;
private readonly Subject<T> _subject = new Subject<T>();

private int _observerRefCount;
private IDisposable _defaultObserverSub;
private IDisposable? _defaultObserverSub;
private bool _isDisposed;

/// <summary>
/// Initializes a new instance of the <see cref="ScheduledSubject{T}"/> class.
/// </summary>
/// <param name="scheduler">The scheduler to emit items on.</param>
/// <param name="defaultObserver">A default observable which will get values if no other subscribes.</param>
public ScheduledSubject(IScheduler scheduler, IObserver<T> defaultObserver = null)
public ScheduledSubject(IScheduler scheduler, IObserver<T>? defaultObserver = null)
{
_scheduler = scheduler;
_defaultObserver = defaultObserver;
Expand Down Expand Up @@ -61,7 +61,7 @@ public void OnNext(T value)
}

/// <inheritdoc />
public IDisposable Subscribe(IObserver<T> observer)
public IDisposable Subscribe(IObserver<T>? observer)
{
if (_defaultObserverSub != null)
{
Expand Down Expand Up @@ -103,6 +103,7 @@ protected virtual void Dispose(bool isDisposing)
if (isDisposing)
{
_subject?.Dispose();
_defaultObserverSub?.Dispose();
}

_isDisposed = true;
Expand Down

0 comments on commit 0a0eef1

Please sign in to comment.