Skip to content

Commit 068c404

Browse files
committed
Release 0.9.0. See release notes or expand full commit message.
[Breaking] Inherited and implemented breaking changes from OwlCore.Nomad 0.9.0. NomadFile and NomadFolder now have empty constructors. [New] Added missing overload NomadFolder{TContentPointer, TEventStream, TEventStreamEntry}.ApplyFolderUpdateAsync(DeleteFromFolderEvent updateEvent). NomadFolder{TContentPointer, TEventStream, TEventStreamEntry}.Parent is now of type IFolder instead of the full NomadFolder{TContentPointer, TEventStream, TEventStreamEntry} class. [Improvements] Added TargetFrameworks for net8.0 and net9.0.
1 parent 51d67d0 commit 068c404

6 files changed

Lines changed: 59 additions & 55 deletions

File tree

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- name: Setup .NET
2323
uses: actions/setup-dotnet@v2
2424
with:
25-
dotnet-version: 8.0.x
25+
dotnet-version: 9.0.x
2626

2727
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
2828
- name: Checkout Repository

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
- name: Setup .NET
1717
uses: actions/setup-dotnet@v2
1818
with:
19-
dotnet-version: 8.0.x
19+
dotnet-version: 9.0.x
2020

2121
- name: Restore dependencies
2222
run: dotnet restore

src/NomadFile.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,13 @@
99
namespace OwlCore.Nomad.Storage;
1010

1111
/// <summary>
12-
/// A virtual file constructed by advancing an <see cref="IEventStreamHandler{TContentPointer, TEventStreamSource, TEventStreamEntry}.EventStreamPosition"/> using multiple <see cref="ISources{T}.Sources"/> in concert with other <see cref="ISharedEventStreamHandler{TContentPointer, TEventStreamSource, TEventStreamEntry, TListeningHandlers}.ListeningEventStreamHandlers"/>.
12+
/// A virtual file constructed by advancing an <see cref="IEventStreamHandler{TContentPointer, TEventStreamSource, TEventStreamEntry}.EventStreamPosition"/> using multiple <see cref="ISources{T}.Sources"/>.
1313
/// </summary>
14-
public abstract class NomadFile<TContentPointer, TEventStreamSource, TEventStreamEntry> : IFile, IChildFile, ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>, IDelegable<NomadFileData<TContentPointer>>
14+
public abstract class NomadFile<TContentPointer, TEventStreamSource, TEventStreamEntry> : IFile, IChildFile, IEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>, IDelegable<NomadFileData<TContentPointer>>
1515
where TEventStreamSource : EventStream<TContentPointer>
1616
where TEventStreamEntry : EventStreamEntry<TContentPointer>
1717
where TContentPointer : class
1818
{
19-
/// <summary>
20-
/// Creates a new instance of <see cref="NomadFile{TContentPointer,TEventStreamSource,TEventStreamEntry}"/>.
21-
/// </summary>
22-
/// <param name="listeningEventStreamHandlers">The shared collection of known nomad event streams participating in event seeking.</param>
23-
protected NomadFile(ICollection<ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>> listeningEventStreamHandlers)
24-
{
25-
listeningEventStreamHandlers.Add(this);
26-
ListeningEventStreamHandlers = listeningEventStreamHandlers;
27-
}
28-
29-
/// <inheritdoc />
30-
public ICollection<ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>> ListeningEventStreamHandlers { get; }
31-
3219
/// <inheritdoc cref="IStorable.Id" />
3320
public string Id => Inner.StorableItemId;
3421

@@ -41,7 +28,7 @@ protected NomadFile(ICollection<ISharedEventStreamHandler<TContentPointer, TEven
4128
/// <summary>
4229
/// The parent folder of this file.
4330
/// </summary>
44-
public required IFolder Parent { get; init; }
31+
public required IFolder? Parent { get; init; }
4532

4633
/// <inheritdoc />
4734
public required NomadFileData<TContentPointer> Inner { get; set; }
@@ -60,9 +47,6 @@ public virtual Task ResetEventStreamPositionAsync(CancellationToken cancellation
6047
/// <inheritdoc />
6148
public TEventStreamEntry? EventStreamPosition { get; set; }
6249

63-
/// <inheritdoc />
64-
public required ICollection<TEventStreamEntry> AllEventStreamEntries { get; set; }
65-
6650
/// <inheritdoc />
6751
public required ICollection<TContentPointer> Sources { get; init; }
6852

@@ -73,5 +57,5 @@ public virtual Task ResetEventStreamPositionAsync(CancellationToken cancellation
7357
public abstract Task AdvanceEventStreamAsync(TEventStreamEntry streamEntry, CancellationToken cancellationToken);
7458

7559
/// <inheritdoc />
76-
public Task<IFolder?> GetParentAsync(CancellationToken cancellationToken = default) => Task.FromResult<IFolder?>(Parent);
60+
public Task<IFolder?> GetParentAsync(CancellationToken cancellationToken = default) => Task.FromResult(Parent);
7761
}

src/NomadFolder.cs

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,21 @@
1212
namespace OwlCore.Nomad.Storage;
1313

1414
/// <summary>
15-
/// A virtual folder constructed by advancing an <see cref="IEventStreamHandler{TContentPointer, TEventStream, TEventStreamEntry}.EventStreamPosition"/> using multiple <see cref="ISources{T}.Sources"/> in concert with other <see cref="ISharedEventStreamHandler{TContentPointer, TEventStreamSource, TEventStreamEntry, TListeningHandlers}.ListeningEventStreamHandlers"/>.
15+
/// A virtual folder constructed by advancing an <see cref="IEventStreamHandler{TContentPointer, TEventStream, TEventStreamEntry}.EventStreamPosition"/> using multiple <see cref="ISources{T}.Sources"/>
1616
/// </summary>
17-
public abstract class NomadFolder<TContentPointer, TEventStreamSource, TEventStreamEntry> : ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>, IModifiableFolder, IMutableFolder, IChildFolder, IGetItem, IGetRoot, IGetFirstByName, IDelegable<NomadFolderData<TContentPointer>>
18-
where TEventStreamSource : EventStream<TContentPointer>
17+
public abstract class NomadFolder<TContentPointer, TEventStream, TEventStreamEntry> : IEventStreamHandler<TContentPointer, TEventStream, TEventStreamEntry>, IModifiableFolder, IMutableFolder, IChildFolder, IGetItem, IGetRoot, IGetFirstByName, IDelegable<NomadFolderData<TContentPointer>>
18+
where TEventStream : EventStream<TContentPointer>
1919
where TEventStreamEntry : EventStreamEntry<TContentPointer>
2020
where TContentPointer : class
2121
{
22-
/// <summary>
23-
/// Creates a new instance of <see cref="NomadFolder{TContentPointer,TEventStreamSource,TEventStreamEntry}"/>.
24-
/// </summary>
25-
/// <param name="listeningEventStreamHandlers">The shared list of known nomad event streams participating in event seeking.</param>
26-
protected NomadFolder(ICollection<ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>> listeningEventStreamHandlers)
27-
{
28-
listeningEventStreamHandlers.Add(this);
29-
ListeningEventStreamHandlers = listeningEventStreamHandlers;
30-
}
31-
32-
/// <inheritdoc />
33-
public virtual ICollection<ISharedEventStreamHandler<TContentPointer, TEventStreamSource, TEventStreamEntry>> ListeningEventStreamHandlers { get; }
34-
3522
/// <inheritdoc />
3623
public required string EventStreamHandlerId { get; init; }
3724

3825
/// <inheritdoc />
3926
public required ICollection<TContentPointer> Sources { get; init; }
4027

4128
/// <inheritdoc />
42-
public required ICollection<TEventStreamEntry> AllEventStreamEntries { get; set; }
43-
44-
/// <inheritdoc />
45-
public required TEventStreamSource LocalEventStream { get; set; }
29+
public required TEventStream LocalEventStream { get; set; }
4630

4731
/// <inheritdoc />
4832
public TEventStreamEntry? EventStreamPosition { get; set; }
@@ -160,7 +144,7 @@ public async Task<IChildFile> CreateFileAsync(string name, bool overwrite = fals
160144
// At least one parent is required for a root to exist
161145
// Crawl up and return where parent is null
162146
var current = this;
163-
while (current.Parent is NomadFolder<TContentPointer, TEventStreamSource, TEventStreamEntry> parent)
147+
while (current.Parent is NomadFolder<TContentPointer, TEventStream, TEventStreamEntry> parent)
164148
{
165149
current = parent;
166150
}
@@ -206,14 +190,14 @@ public virtual Task ResetEventStreamPositionAsync(CancellationToken cancellation
206190
/// </summary>
207191
/// <param name="fileData">The file data to transform.</param>
208192
/// <param name="cancellationToken">A token that can be used to cancel the ongoing operation.</param>
209-
protected abstract Task<NomadFile<TContentPointer, TEventStreamSource, TEventStreamEntry>> FileDataToInstanceAsync(NomadFileData<TContentPointer> fileData, CancellationToken cancellationToken);
193+
protected abstract Task<NomadFile<TContentPointer, TEventStream, TEventStreamEntry>> FileDataToInstanceAsync(NomadFileData<TContentPointer> fileData, CancellationToken cancellationToken);
210194

211195
/// <summary>
212196
/// Transforms folder data to a folder instance.
213197
/// </summary>
214198
/// <param name="folderData">The folder data to transform.</param>
215199
/// <param name="cancellationToken">A token that can be used to cancel the ongoing operation.</param>
216-
protected abstract Task<NomadFolder<TContentPointer, TEventStreamSource, TEventStreamEntry>> FolderDataToInstanceAsync(NomadFolderData<TContentPointer> folderData, CancellationToken cancellationToken);
200+
protected abstract Task<NomadFolder<TContentPointer, TEventStream, TEventStreamEntry>> FolderDataToInstanceAsync(NomadFolderData<TContentPointer> folderData, CancellationToken cancellationToken);
217201

218202
/// <summary>
219203
/// Applies the provided <paramref name="updateEvent"/>.
@@ -263,7 +247,7 @@ public virtual Task ResetEventStreamPositionAsync(CancellationToken cancellation
263247
x.StorableItemId == updateEvent.StorableItemId ||
264248
x.StorableItemName == updateEvent.StorableItemName);
265249

266-
if (updateEvent.Overwrite)
250+
if (updateEvent.Overwrite && existing is not null)
267251
{
268252
nomadFolder.Inner.Folders.Remove(existing);
269253
existing = null;
@@ -283,4 +267,29 @@ public virtual Task ResetEventStreamPositionAsync(CancellationToken cancellation
283267

284268
return Task.FromResult<NomadFolderData<TContentPointer>?>(nomadFolderData);
285269
}
270+
271+
/// <summary>
272+
/// Applies the provided <paramref name="updateEvent"/> in the folder.
273+
/// </summary>
274+
/// <param name="updateEvent">The event content to apply without side effects.</param>
275+
/// <param name="cancellationToken">A token that can be used to cancel the ongoing task.</param>
276+
public Task ApplyFolderUpdateAsync(DeleteFromFolderEvent updateEvent, CancellationToken cancellationToken)
277+
{
278+
cancellationToken.ThrowIfCancellationRequested();
279+
280+
// If deleted, it should already exist in the folder.
281+
// Remove the item if it exists.
282+
// If it doesn't exist, it may have been removed in another timeline (by another peer).
283+
// Folders
284+
var targetFolder = Inner.Folders.FirstOrDefault(x => x.StorableItemId == updateEvent.StorableItemId || x.StorableItemName == updateEvent.StorableItemName);
285+
if (targetFolder is not null)
286+
Inner.Folders.Remove(targetFolder);
287+
288+
// Files
289+
var targetFile = Inner.Files.FirstOrDefault(x=> x.StorableItemId == updateEvent.StorableItemId || updateEvent.StorableItemName == x.StorableItemName);
290+
if (targetFile is not null)
291+
Inner.Files.Remove(targetFile);
292+
293+
return Task.CompletedTask;
294+
}
286295
}

src/OwlCore.Nomad.Storage.csproj

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFramework>netstandard2.0</TargetFramework>
3+
<TargetFrameworks>netstandard2.0;net8.0;net9.0;</TargetFrameworks>
44
<Nullable>enable</Nullable>
55
<LangVersion>12.0</LangVersion>
66
<WarningsAsErrors>nullable</WarningsAsErrors>
@@ -14,13 +14,24 @@
1414
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
1515

1616
<Author>Arlo Godfrey</Author>
17-
<Version>0.8.1</Version>
17+
<Version>0.9.0</Version>
1818
<Product>OwlCore</Product>
1919
<Description></Description>
2020
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
2121
<PackageIcon>logo.png</PackageIcon>
2222
<PackageProjectUrl>https://github.com/Arlodotexe/OwlCore.Nomad.Storage</PackageProjectUrl>
2323
<PackageReleaseNotes>
24+
--- 0.9.0 ---
25+
[Breaking]
26+
Inherited and implemented breaking changes from OwlCore.Nomad 0.9.0. NomadFile and NomadFolder now have empty constructors.
27+
28+
[New]
29+
Added missing overload NomadFolder{TContentPointer, TEventStream, TEventStreamEntry}.ApplyFolderUpdateAsync(DeleteFromFolderEvent updateEvent).
30+
NomadFolder{TContentPointer, TEventStream, TEventStreamEntry}.Parent is now of type IFolder instead of the full NomadFolder{TContentPointer, TEventStream, TEventStreamEntry} class.
31+
32+
[Improvements]
33+
Added TargetFrameworks for net8.0 and net9.0.
34+
2435
--- 0.8.1 ---
2536
[Fixes]
2637
Inherited fixes from OwlCore.ComponentModel 0.9.1 via OwlCore.Nomad 0.8.1 and OwlCore.Extensions 0.9.1.
@@ -115,11 +126,11 @@ Initial release of OwlCore.Nomad.Storage.
115126
</ItemGroup>
116127

117128
<ItemGroup>
118-
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
129+
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.0" />
119130
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
120131
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
121132
<PackageReference Include="OwlCore.Extensions" Version="0.9.1" />
122-
<PackageReference Include="OwlCore.Nomad" Version="0.8.1" />
133+
<PackageReference Include="OwlCore.Nomad" Version="0.9.0" />
123134
<PackageReference Include="OwlCore.Storage" Version="0.12.0" />
124135
<PackageReference Include="PolySharp" Version="1.14.1">
125136
<PrivateAssets>all</PrivateAssets>
@@ -129,7 +140,7 @@ Initial release of OwlCore.Nomad.Storage.
129140
</ItemGroup>
130141

131142
<ItemGroup>
132-
<None Update="logo.png">
143+
<None Include="logo.png">
133144
<Pack>True</Pack>
134145
<PackagePath>\</PackagePath>
135146
</None>

tests/OwlCore.Nomad.Storage.Tests.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
13-
<PackageReference Include="MSTest.TestAdapter" Version="3.3.1" />
14-
<PackageReference Include="MSTest.TestFramework" Version="3.3.1" />
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
13+
<PackageReference Include="MSTest.TestAdapter" Version="3.6.3" />
14+
<PackageReference Include="MSTest.TestFramework" Version="3.6.3" />
1515
<PackageReference Include="coverlet.collector" Version="6.0.2" />
1616
</ItemGroup>
1717

0 commit comments

Comments
 (0)