From 59922a04d8b9b4d8f02180d8065330e81dcd33f0 Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Thu, 12 Sep 2024 07:19:48 +0100 Subject: [PATCH] Update TFM's to remove Net 7.0 (#954) Fix Package Icon from Url to use local resource Include Readme in package Update code to use latest coding optimisations --- Images/logo.png | Bin 0 -> 32077 bytes src/Akavache.Core/BlobCache/CacheEntry.cs | 1 - src/Akavache.Core/BlobCache/IObjectWrapper.cs | 4 +- .../BlobCache/ISecureBlobCache.cs | 4 +- .../BlobCache/InMemoryBlobCache.cs | 28 +- src/Akavache.Core/IsExternalInit.cs | 4 +- src/Akavache.Sqlite3/IsExternalInit.cs | 4 +- .../BulkInvalidateByTypeSqliteOperation.cs | 4 +- .../BulkInvalidateSqliteOperation.cs | 2 +- .../BulkSelectByTypeSqliteOperation.cs | 4 +- .../Operations/BulkSelectSqliteOperation.cs | 4 +- src/Akavache.Sqlite3/Queues/OperationQueue.cs | 2 +- .../Queues/OperationQueueCoalescing.cs | 47 ++- .../SqlLiteCache/IObjectWrapper.cs | 4 +- .../SqlLiteCache/ObjectWrapper.cs | 5 +- .../SqlLiteCache/SqlRawPersistentBlobCache.cs | 26 +- ...lTests.AkavacheCore.DotNet8_0.verified.txt | 283 ++++++++++++++++++ ...sts.AkavacheDrawing.DotNet8_0.verified.txt | 21 ++ ...sts.AkavacheProject.DotNet8_0.verified.txt | 18 ++ src/Akavache.Tests/Akavache.Tests.csproj | 2 +- src/Akavache.sln | 3 +- src/Akavache/SQLitePersistentBlobCache.cs | 4 +- src/Directory.build.props | 12 +- version.json | 2 +- 24 files changed, 392 insertions(+), 96 deletions(-) create mode 100644 Images/logo.png create mode 100644 src/Akavache.Tests/API/ApiApprovalTests.AkavacheCore.DotNet8_0.verified.txt create mode 100644 src/Akavache.Tests/API/ApiApprovalTests.AkavacheDrawing.DotNet8_0.verified.txt create mode 100644 src/Akavache.Tests/API/ApiApprovalTests.AkavacheProject.DotNet8_0.verified.txt diff --git a/Images/logo.png b/Images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1c0b7b131d05da57b1bd8326bfdffc9bd897eb GIT binary patch literal 32077 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 Tu>)41|064@C{gxC-~WFBI|H-~ literal 0 HcmV?d00001 diff --git a/src/Akavache.Core/BlobCache/CacheEntry.cs b/src/Akavache.Core/BlobCache/CacheEntry.cs index de0f98b9..68ed2ae7 100644 --- a/src/Akavache.Core/BlobCache/CacheEntry.cs +++ b/src/Akavache.Core/BlobCache/CacheEntry.cs @@ -17,7 +17,6 @@ namespace Akavache; /// The date and time when the entry expires. public class CacheEntry(string? typeName, byte[] value, DateTimeOffset createdAt, DateTimeOffset? expiresAt) { - /// /// Gets or sets the date and time when the entry was created. /// diff --git a/src/Akavache.Core/BlobCache/IObjectWrapper.cs b/src/Akavache.Core/BlobCache/IObjectWrapper.cs index 40636a71..d3ad1fcc 100644 --- a/src/Akavache.Core/BlobCache/IObjectWrapper.cs +++ b/src/Akavache.Core/BlobCache/IObjectWrapper.cs @@ -8,6 +8,4 @@ namespace Akavache; /// /// A wrapper around a object. /// -internal interface IObjectWrapper -{ -} \ No newline at end of file +internal interface IObjectWrapper; \ No newline at end of file diff --git a/src/Akavache.Core/BlobCache/ISecureBlobCache.cs b/src/Akavache.Core/BlobCache/ISecureBlobCache.cs index 6535c4bb..83d5b4f6 100644 --- a/src/Akavache.Core/BlobCache/ISecureBlobCache.cs +++ b/src/Akavache.Core/BlobCache/ISecureBlobCache.cs @@ -15,6 +15,4 @@ namespace Akavache; /// saved to disk cannot be easily read by a third party. /// /// -public interface ISecureBlobCache : IBlobCache -{ -} +public interface ISecureBlobCache : IBlobCache; diff --git a/src/Akavache.Core/BlobCache/InMemoryBlobCache.cs b/src/Akavache.Core/BlobCache/InMemoryBlobCache.cs index d37a5604..c2b5875b 100644 --- a/src/Akavache.Core/BlobCache/InMemoryBlobCache.cs +++ b/src/Akavache.Core/BlobCache/InMemoryBlobCache.cs @@ -59,7 +59,7 @@ public InMemoryBlobCache(IEnumerable> initialConten public InMemoryBlobCache(IScheduler? scheduler, IEnumerable>? initialContents) { Scheduler = scheduler ?? CurrentThreadScheduler.Instance; - foreach (var item in initialContents ?? Enumerable.Empty>()) + foreach (var item in initialContents ?? []) { _cache[item.Key] = new(null, item.Value, Scheduler.Now, null); } @@ -155,7 +155,7 @@ public IObservable Insert(string key, byte[] data, DateTimeOffset? absolut { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } lock (_cache) @@ -168,7 +168,7 @@ public IObservable Insert(string key, byte[] data, DateTimeOffset? absolut /// public IObservable Flush() => _disposed ? - ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache") : + ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)) : Observable.Return(Unit.Default); /// @@ -176,7 +176,7 @@ public IObservable Get(string key) { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } CacheEntry? entry; @@ -211,7 +211,7 @@ public IObservable Get(string key) { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } CacheEntry? entry; @@ -233,7 +233,7 @@ public IObservable> GetAllKeys() { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException>("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException>(nameof(InMemoryBlobCache)); } lock (_cache) @@ -250,7 +250,7 @@ public IObservable Invalidate(string key) { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } lock (_cache) @@ -266,7 +266,7 @@ public IObservable InvalidateAll() { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } lock (_cache) @@ -282,7 +282,7 @@ public IObservable InsertObject(string key, T value, DateTimeOffset? ab { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } var data = SerializeObject(value); @@ -300,7 +300,7 @@ public IObservable GetObject(string key) { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } CacheEntry? entry; @@ -340,7 +340,7 @@ public IObservable> GetAllObjects() { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException>("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException>(nameof(InMemoryBlobCache)); } lock (_cache) @@ -356,7 +356,7 @@ public IObservable> GetAllObjects() /// public IObservable InvalidateObject(string key) => _disposed ? - ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache") : + ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)) : Invalidate(key); /// @@ -364,7 +364,7 @@ public IObservable InvalidateAllObjects() { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } lock (_cache) @@ -384,7 +384,7 @@ public IObservable Vacuum() { if (_disposed) { - return ExceptionHelper.ObservableThrowObjectDisposedException("InMemoryBlobCache"); + return ExceptionHelper.ObservableThrowObjectDisposedException(nameof(InMemoryBlobCache)); } lock (_cache) diff --git a/src/Akavache.Core/IsExternalInit.cs b/src/Akavache.Core/IsExternalInit.cs index 793e71a6..fccfb653 100644 --- a/src/Akavache.Core/IsExternalInit.cs +++ b/src/Akavache.Core/IsExternalInit.cs @@ -8,6 +8,4 @@ namespace System.Runtime.CompilerServices; [EditorBrowsable(EditorBrowsableState.Never)] -internal class IsExternalInit -{ -} +internal class IsExternalInit; diff --git a/src/Akavache.Sqlite3/IsExternalInit.cs b/src/Akavache.Sqlite3/IsExternalInit.cs index 793e71a6..fccfb653 100644 --- a/src/Akavache.Sqlite3/IsExternalInit.cs +++ b/src/Akavache.Sqlite3/IsExternalInit.cs @@ -8,6 +8,4 @@ namespace System.Runtime.CompilerServices; [EditorBrowsable(EditorBrowsableState.Never)] -internal class IsExternalInit -{ -} +internal class IsExternalInit; diff --git a/src/Akavache.Sqlite3/Operations/BulkInvalidateByTypeSqliteOperation.cs b/src/Akavache.Sqlite3/Operations/BulkInvalidateByTypeSqliteOperation.cs index 9a91e241..5dcf8cca 100644 --- a/src/Akavache.Sqlite3/Operations/BulkInvalidateByTypeSqliteOperation.cs +++ b/src/Akavache.Sqlite3/Operations/BulkInvalidateByTypeSqliteOperation.cs @@ -9,6 +9,4 @@ namespace Akavache.Sqlite3; // NB: This just makes OperationQueue's life easier by giving it a type // name. -internal class BulkInvalidateByTypeSqliteOperation(SQLiteConnection conn) : BulkInvalidateSqliteOperation(conn, true) -{ -} +internal class BulkInvalidateByTypeSqliteOperation(SQLiteConnection conn) : BulkInvalidateSqliteOperation(conn, true); diff --git a/src/Akavache.Sqlite3/Operations/BulkInvalidateSqliteOperation.cs b/src/Akavache.Sqlite3/Operations/BulkInvalidateSqliteOperation.cs index 1e3519b2..4b627ac2 100644 --- a/src/Akavache.Sqlite3/Operations/BulkInvalidateSqliteOperation.cs +++ b/src/Akavache.Sqlite3/Operations/BulkInvalidateSqliteOperation.cs @@ -47,7 +47,7 @@ public BulkInvalidateSqliteOperation(SQLiteConnection conn, bool useTypeInsteadO public Action PrepareToExecute(IEnumerable? toDelete) { - var deleteList = (toDelete ?? Array.Empty()).ToList(); + var deleteList = (toDelete ?? []).ToList(); if (deleteList.Count == 0) { return () => { }; diff --git a/src/Akavache.Sqlite3/Operations/BulkSelectByTypeSqliteOperation.cs b/src/Akavache.Sqlite3/Operations/BulkSelectByTypeSqliteOperation.cs index d0d7c696..19659c8c 100644 --- a/src/Akavache.Sqlite3/Operations/BulkSelectByTypeSqliteOperation.cs +++ b/src/Akavache.Sqlite3/Operations/BulkSelectByTypeSqliteOperation.cs @@ -7,6 +7,4 @@ namespace Akavache.Sqlite3; -internal class BulkSelectByTypeSqliteOperation(SQLiteConnection conn, IScheduler scheduler) : BulkSelectSqliteOperation(conn, true, scheduler) -{ -} +internal class BulkSelectByTypeSqliteOperation(SQLiteConnection conn, IScheduler scheduler) : BulkSelectSqliteOperation(conn, true, scheduler); diff --git a/src/Akavache.Sqlite3/Operations/BulkSelectSqliteOperation.cs b/src/Akavache.Sqlite3/Operations/BulkSelectSqliteOperation.cs index c9ecfae3..739d8ae5 100644 --- a/src/Akavache.Sqlite3/Operations/BulkSelectSqliteOperation.cs +++ b/src/Akavache.Sqlite3/Operations/BulkSelectSqliteOperation.cs @@ -50,10 +50,10 @@ public BulkSelectSqliteOperation(SQLiteConnection conn, bool useTypeInsteadOfKey public Func> PrepareToExecute(IEnumerable? toSelect) { - var selectList = (toSelect ?? Array.Empty()).ToList(); + var selectList = (toSelect ?? []).ToList(); if (selectList.Count == 0) { - return () => new List(); + return () => []; } var selectOp = _selectOps[selectList.Count - 1]; diff --git a/src/Akavache.Sqlite3/Queues/OperationQueue.cs b/src/Akavache.Sqlite3/Queues/OperationQueue.cs index 5ebb5b36..c63e7285 100644 --- a/src/Akavache.Sqlite3/Queues/OperationQueue.cs +++ b/src/Akavache.Sqlite3/Queues/OperationQueue.cs @@ -372,7 +372,7 @@ public void Dispose() _shouldQuit?.Dispose(); } - internal List DumpQueue() => _operationQueue.ToList(); + internal List DumpQueue() => [.. _operationQueue]; private static void MarshalCompletion(object completion, Action block, IObservable commitResult) { diff --git a/src/Akavache.Sqlite3/Queues/OperationQueueCoalescing.cs b/src/Akavache.Sqlite3/Queues/OperationQueueCoalescing.cs index b6178990..21fb8669 100644 --- a/src/Akavache.Sqlite3/Queues/OperationQueueCoalescing.cs +++ b/src/Akavache.Sqlite3/Queues/OperationQueueCoalescing.cs @@ -32,12 +32,13 @@ internal static List CoalesceOperations(List CoalesceUnrelatedItems(IEnumerabl items.GroupBy(x => x.OperationType) .SelectMany(group => group.Key switch { - OperationType.BulkSelectSqliteOperation => new[] { GroupUnrelatedSelects(group) }, - OperationType.BulkInsertSqliteOperation => new[] { GroupUnrelatedInserts(group) }, - OperationType.BulkInvalidateSqliteOperation => new[] { GroupUnrelatedDeletes(group) }, + OperationType.BulkSelectSqliteOperation => [GroupUnrelatedSelects(group)], + OperationType.BulkInsertSqliteOperation => [GroupUnrelatedInserts(group)], + OperationType.BulkInvalidateSqliteOperation => [GroupUnrelatedDeletes(group)], _ => (IEnumerable)group }); @@ -116,7 +117,7 @@ private static IEnumerable MultipleOpsTurnIntoSingleOp(IEnum { if (item.OperationType == opTypeToDedup) { - currentWrites ??= new(); + currentWrites ??= []; currentWrites.Add(item); continue; } @@ -185,9 +186,7 @@ private static OperationQueueItem GroupUnrelatedSelects(IEnumerable()); + elementMap[v].OnNext(resultMap.TryGetValue(v, out var value) ? EnumerableEx.Return(value) : []); elementMap[v].OnCompleted(); } @@ -228,7 +227,7 @@ private static OperationQueueItem GroupUnrelatedInserts(IEnumerable { subj.Subscribe(x.CompletionAsUnit); - return x.ParametersAsElements ?? Enumerable.Empty(); + return x.ParametersAsElements ?? []; }).ToList(); return OperationQueueItem.CreateInsert( @@ -259,7 +258,7 @@ private static OperationQueueItem GroupUnrelatedDeletes(IEnumerable { subj.Subscribe(x.CompletionAsUnit); - return x.ParametersAsKeys ?? Enumerable.Empty(); + return x.ParametersAsKeys ?? []; }).ToList(); return OperationQueueItem.CreateInvalidate( @@ -292,21 +291,17 @@ private static OperationQueueItem GroupUnrelatedDeletes(IEnumerable? subjects, OperationType opType) { - var subjectsList = (subjects ?? Enumerable.Empty()).ToList(); - switch (opType) + var subjectsList = (subjects ?? []).ToList(); + return opType switch { - case OperationType.BulkSelectSqliteOperation: - return CombineSubjects( - (AsyncSubject>)source, - subjectsList.Cast>>()); - case OperationType.BulkInsertSqliteOperation: - case OperationType.BulkInvalidateSqliteOperation: - return CombineSubjects( - (AsyncSubject)source, - subjectsList.Cast>()); - default: - throw new ArgumentException("Invalid operation type", nameof(opType)); - } + OperationType.BulkSelectSqliteOperation => CombineSubjects( + (AsyncSubject>)source, + subjectsList.Cast>>()), + OperationType.BulkInsertSqliteOperation or OperationType.BulkInvalidateSqliteOperation => CombineSubjects( + (AsyncSubject)source, + subjectsList.Cast>()), + _ => throw new ArgumentException("Invalid operation type", nameof(opType)), + }; } private static AsyncSubject CombineSubjects(AsyncSubject source, IEnumerable> subjs) diff --git a/src/Akavache.Sqlite3/SqlLiteCache/IObjectWrapper.cs b/src/Akavache.Sqlite3/SqlLiteCache/IObjectWrapper.cs index ddd9f88e..9d51280d 100644 --- a/src/Akavache.Sqlite3/SqlLiteCache/IObjectWrapper.cs +++ b/src/Akavache.Sqlite3/SqlLiteCache/IObjectWrapper.cs @@ -8,6 +8,4 @@ namespace Akavache.Sqlite3; /// /// A wrapper around a object. /// -internal interface IObjectWrapper -{ -} \ No newline at end of file +internal interface IObjectWrapper; diff --git a/src/Akavache.Sqlite3/SqlLiteCache/ObjectWrapper.cs b/src/Akavache.Sqlite3/SqlLiteCache/ObjectWrapper.cs index 5f2561c9..0eb7b65c 100755 --- a/src/Akavache.Sqlite3/SqlLiteCache/ObjectWrapper.cs +++ b/src/Akavache.Sqlite3/SqlLiteCache/ObjectWrapper.cs @@ -15,10 +15,7 @@ public ObjectWrapper() { } - public ObjectWrapper(T value) - { - Value = value; - } + public ObjectWrapper(T value) => Value = value; public T? Value { get; set; } } diff --git a/src/Akavache.Sqlite3/SqlLiteCache/SqlRawPersistentBlobCache.cs b/src/Akavache.Sqlite3/SqlLiteCache/SqlRawPersistentBlobCache.cs index cc7968b3..770d2170 100644 --- a/src/Akavache.Sqlite3/SqlLiteCache/SqlRawPersistentBlobCache.cs +++ b/src/Akavache.Sqlite3/SqlLiteCache/SqlRawPersistentBlobCache.cs @@ -101,8 +101,8 @@ public IObservable Insert(string key, byte[] data, DateTimeOffset? absolut return _initializer .SelectMany(_ => BeforeWriteToDiskFilter(data, Scheduler)) - .SelectMany(encData => _opQueue.Insert(new[] - { + .SelectMany(encData => _opQueue.Insert( + [ new CacheElement { Key = key, @@ -110,7 +110,7 @@ public IObservable Insert(string key, byte[] data, DateTimeOffset? absolut CreatedAt = createdAt, Expiration = exp, }, - })) + ])) .PublishLast().PermaRef(); } @@ -132,7 +132,7 @@ public IObservable Get(string key) return Observable.Throw(new InvalidOperationException("There is not a valid operation queue")); } - return _initializer.SelectMany(_ => _opQueue.Select(new[] { key })) + return _initializer.SelectMany(_ => _opQueue.Select([key])) .SelectMany(x => { var cacheElements = x.ToList(); @@ -179,7 +179,7 @@ public IObservable> GetAllKeys() return Observable.Throw(new InvalidOperationException("There is not a valid operation queue")); } - return _initializer.SelectMany(_ => _opQueue.Select(new[] { key })) + return _initializer.SelectMany(_ => _opQueue.Select([key])) .Select(x => { var cacheElements = x.ToList(); @@ -223,7 +223,7 @@ public IObservable Invalidate(string key) return Observable.Throw(new InvalidOperationException("There is not a valid operation queue")); } - return _initializer.SelectMany(_ => _opQueue.Invalidate(new[] { key })) + return _initializer.SelectMany(_ => _opQueue.Invalidate([key])) .PublishLast().PermaRef(); } @@ -268,8 +268,8 @@ public IObservable InsertObject(string key, T value, DateTimeOffset? ab return _initializer .SelectMany(_ => BeforeWriteToDiskFilter(data, Scheduler)) - .SelectMany(encData => _opQueue.Insert(new[] - { + .SelectMany(encData => _opQueue.Insert( + [ new CacheElement { Key = key, @@ -278,7 +278,7 @@ public IObservable InsertObject(string key, T value, DateTimeOffset? ab CreatedAt = createdAt, Expiration = exp, }, - })) + ])) .PublishLast().PermaRef(); } @@ -300,7 +300,7 @@ public IObservable InsertObject(string key, T value, DateTimeOffset? ab return Observable.Throw(new InvalidOperationException("There is not a valid operation queue")); } - return _initializer.SelectMany(_ => _opQueue.Select(new[] { key })) + return _initializer.SelectMany(_ => _opQueue.Select([key])) .SelectMany(x => { var cacheElements = x.ToList(); @@ -333,7 +333,7 @@ public IObservable> GetAllObjects() return Observable.Throw>(new InvalidOperationException("The generic type does not have a valid full name and is required")); } - return _initializer.SelectMany(_ => _opQueue.SelectTypes(new[] { typeFullName }) + return _initializer.SelectMany(_ => _opQueue.SelectTypes([typeFullName]) .SelectMany(x => x.ToObservable() .SelectMany(y => AfterReadFromDiskFilter(y.Value, Scheduler)) .SelectMany(DeserializeObject) @@ -367,7 +367,7 @@ public IObservable InvalidateAllObjects() return Observable.Throw(new InvalidOperationException("The generic type does not have a valid full name and is required")); } - return _initializer.SelectMany(_ => _opQueue.InvalidateTypes(new[] { typeFullName })) + return _initializer.SelectMany(_ => _opQueue.InvalidateTypes([typeFullName])) .PublishLast().PermaRef(); } @@ -779,9 +779,7 @@ private byte[] SerializeObject(T value) { try { -#pragma warning disable CS8602 // Dereference of a possibly null reference. var boxedVal = serializer.Deserialize>(reader).Value; -#pragma warning restore CS8602 // Dereference of a possibly null reference. return Observable.Return(boxedVal); } catch (Exception ex) diff --git a/src/Akavache.Tests/API/ApiApprovalTests.AkavacheCore.DotNet8_0.verified.txt b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheCore.DotNet8_0.verified.txt new file mode 100644 index 00000000..94eb6652 --- /dev/null +++ b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheCore.DotNet8_0.verified.txt @@ -0,0 +1,283 @@ +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Akavache")] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Akavache.Drawing")] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Akavache.Mobile")] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Akavache.Sqlite3")] +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Akavache.Tests")] +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")] +namespace Akavache +{ + public class AkavacheHttpMixin : Akavache.IAkavacheHttpMixin + { + public AkavacheHttpMixin() { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + } + public static class BlobCache + { + public static string ApplicationName { get; set; } + public static System.DateTimeKind? ForcedDateTimeKind { get; set; } + public static Akavache.ISecureBlobCache InMemory { get; set; } + public static Akavache.IBlobCache LocalMachine { get; set; } + public static Akavache.ISecureBlobCache Secure { get; set; } + public static System.Reactive.Concurrency.IScheduler TaskpoolScheduler { get; set; } + public static Akavache.IBlobCache UserAccount { get; set; } + public static void EnsureInitialized() { } + public static System.Threading.Tasks.Task Shutdown() { } + } + public static class BulkOperationsMixin + { + public static System.IObservable> Get(this Akavache.IBlobCache blobCache, System.Collections.Generic.IEnumerable keys) { } + public static System.IObservable> GetCreatedAt(this Akavache.IBlobCache blobCache, System.Collections.Generic.IEnumerable keys) { } + public static System.IObservable> GetObjects(this Akavache.IBlobCache blobCache, System.Collections.Generic.IEnumerable keys) { } + public static System.IObservable Insert(this Akavache.IBlobCache blobCache, System.Collections.Generic.IDictionary keyValuePairs, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable InsertObjects(this Akavache.IBlobCache blobCache, System.Collections.Generic.IDictionary keyValuePairs, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable Invalidate(this Akavache.IBlobCache blobCache, System.Collections.Generic.IEnumerable keys) { } + public static System.IObservable InvalidateObjects(this Akavache.IBlobCache blobCache, System.Collections.Generic.IEnumerable keys) { } + } + public class CacheEntry + { + public CacheEntry(string? typeName, byte[] value, System.DateTimeOffset createdAt, System.DateTimeOffset? expiresAt) { } + public System.DateTimeOffset CreatedAt { get; set; } + public System.DateTimeOffset? ExpiresAt { get; set; } + public string? TypeName { get; set; } + public byte[] Value { get; set; } + } + public enum DataProtectionScope + { + CurrentUser = 0, + } + public class DefaultAkavacheHttpClientFactory : Akavache.IAkavacheHttpClientFactory + { + public DefaultAkavacheHttpClientFactory() { } + public System.Net.Http.HttpClient CreateClient(string name) { } + } + public static class DependencyResolverMixin + { + public static void InitializeAkavache(this Splat.IMutableDependencyResolver resolver, Splat.IReadonlyDependencyResolver readonlyDependencyResolver) { } + } + public class EncryptionProvider : Akavache.IEncryptionProvider + { + public EncryptionProvider() { } + public System.IObservable DecryptBlock(byte[] block) { } + public System.IObservable EncryptBlock(byte[] block) { } + } + public static class HttpMixinExtensions + { + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default) { } + } + public interface IAkavacheHttpClientFactory + { + System.Net.Http.HttpClient CreateClient(string name); + } + public interface IAkavacheHttpMixin + { + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, string url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable DownloadUrl(Akavache.IBlobCache blobCache, System.Net.Http.HttpMethod method, string key, System.Uri url, System.Collections.Generic.IDictionary? headers = null, bool fetchAlways = false, System.DateTimeOffset? absoluteExpiration = default); + } + public interface IBlobCache : System.IDisposable + { + System.DateTimeKind? ForcedDateTimeKind { get; set; } + System.Reactive.Concurrency.IScheduler Scheduler { get; } + System.IObservable Shutdown { get; } + System.IObservable Flush(); + System.IObservable Get(string key); + System.IObservable> GetAllKeys(); + System.IObservable GetCreatedAt(string key); + System.IObservable Insert(string key, byte[] data, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable Invalidate(string key); + System.IObservable InvalidateAll(); + System.IObservable Vacuum(); + } + public interface IBulkBlobCache : Akavache.IBlobCache, System.IDisposable + { + System.IObservable> Get(System.Collections.Generic.IEnumerable keys); + System.IObservable> GetCreatedAt(System.Collections.Generic.IEnumerable keys); + System.IObservable Insert(System.Collections.Generic.IDictionary keyValuePairs, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable Invalidate(System.Collections.Generic.IEnumerable keys); + } + public interface IEncryptionProvider + { + System.IObservable DecryptBlock(byte[] block); + System.IObservable EncryptBlock(byte[] block); + } + public interface IFilesystemProvider + { + System.IObservable CreateRecursive(string path); + System.IObservable Delete(string path); + string? GetDefaultLocalMachineCacheDirectory(); + string? GetDefaultRoamingCacheDirectory(); + string? GetDefaultSecretCacheDirectory(); + System.IObservable OpenFileForReadAsync(string path, System.Reactive.Concurrency.IScheduler scheduler); + System.IObservable OpenFileForWriteAsync(string path, System.Reactive.Concurrency.IScheduler scheduler); + } + public interface IKeyedOperationQueue + { + System.IObservable EnqueueObservableOperation(string key, System.Func> asyncCalculationFunc); + System.IObservable EnqueueOperation(string key, System.Action action); + System.IObservable EnqueueOperation(string key, System.Func calculationFunc); + System.IObservable ShutdownQueue(); + } + public interface IObjectBlobCache : Akavache.IBlobCache, System.IDisposable + { + System.IObservable> GetAllObjects(); + System.IObservable GetObject(string key); + System.IObservable GetObjectCreatedAt(string key); + System.IObservable InsertObject(string key, T value, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable InvalidateAllObjects(); + System.IObservable InvalidateObject(string key); + } + public interface IObjectBulkBlobCache : Akavache.IBlobCache, Akavache.IBulkBlobCache, Akavache.IObjectBlobCache, System.IDisposable + { + System.IObservable> GetObjects(System.Collections.Generic.IEnumerable keys); + System.IObservable InsertObjects(System.Collections.Generic.IDictionary keyValuePairs, System.DateTimeOffset? absoluteExpiration = default); + System.IObservable InvalidateObjects(System.Collections.Generic.IEnumerable keys); + } + public interface ISecureBlobCache : Akavache.IBlobCache, System.IDisposable { } + public class InMemoryBlobCache : Akavache.IBlobCache, Akavache.IObjectBlobCache, Akavache.ISecureBlobCache, Splat.IEnableLogger, System.IDisposable + { + public InMemoryBlobCache() { } + public InMemoryBlobCache(System.Collections.Generic.IEnumerable> initialContents) { } + public InMemoryBlobCache(System.Reactive.Concurrency.IScheduler scheduler) { } + public InMemoryBlobCache(System.Reactive.Concurrency.IScheduler? scheduler, System.Collections.Generic.IEnumerable>? initialContents) { } + public System.DateTimeKind? ForcedDateTimeKind { get; set; } + public System.Reactive.Concurrency.IScheduler Scheduler { get; set; } + public System.IObservable Shutdown { get; } + public void Dispose() { } + protected virtual void Dispose(bool isDisposing) { } + public System.IObservable Flush() { } + public System.IObservable Get(string key) { } + public System.IObservable> GetAllKeys() { } + public System.IObservable> GetAllObjects() { } + public System.IObservable GetCreatedAt(string key) { } + public System.IObservable GetObject(string key) { } + public System.IObservable GetObjectCreatedAt(string key) { } + public System.IObservable Insert(string key, byte[] data, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable InsertObject(string key, T value, System.DateTimeOffset? absoluteExpiration = default) { } + public System.IObservable Invalidate(string key) { } + public System.IObservable InvalidateAll() { } + public System.IObservable InvalidateAllObjects() { } + public System.IObservable InvalidateObject(string key) { } + public System.IObservable Vacuum() { } + public static Akavache.InMemoryBlobCache OverrideGlobals(System.Collections.Generic.IDictionary initialContents, System.Reactive.Concurrency.IScheduler? scheduler = null) { } + public static Akavache.InMemoryBlobCache OverrideGlobals(System.Collections.Generic.IDictionary initialContents, System.Reactive.Concurrency.IScheduler? scheduler = null) { } + public static Akavache.InMemoryBlobCache OverrideGlobals(System.Reactive.Concurrency.IScheduler? scheduler = null, params System.Collections.Generic.KeyValuePair[] initialContents) { } + } + public static class JsonSerializationMixin + { + public static System.IObservable> GetAllObjects(this Akavache.IBlobCache blobCache) { } + public static System.IObservable GetAndFetchLatest(this Akavache.IBlobCache blobCache, string key, System.Func> fetchFunc, System.Func? fetchPredicate = null, System.DateTimeOffset? absoluteExpiration = default, bool shouldInvalidateOnError = false, System.Func? cacheValidationPredicate = null) { } + public static System.IObservable GetAndFetchLatest(this Akavache.IBlobCache blobCache, string key, System.Func> fetchFunc, System.Func? fetchPredicate = null, System.DateTimeOffset? absoluteExpiration = default, bool shouldInvalidateOnError = false, System.Func? cacheValidationPredicate = null) { } + public static System.IObservable GetObject(this Akavache.IBlobCache blobCache, string key) { } + public static System.IObservable GetObjectCreatedAt(this Akavache.IBlobCache blobCache, string key) { } + public static System.IObservable GetOrCreateObject(this Akavache.IBlobCache blobCache, string key, System.Func fetchFunc, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable GetOrFetchObject(this Akavache.IBlobCache blobCache, string key, System.Func> fetchFunc, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable GetOrFetchObject(this Akavache.IBlobCache blobCache, string key, System.Func> fetchFunc, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable InsertAllObjects(this Akavache.IBlobCache blobCache, System.Collections.Generic.IDictionary keyValuePairs, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable InsertObject(this Akavache.IBlobCache blobCache, string key, T value, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable InvalidateAllObjects(this Akavache.IBlobCache blobCache) { } + public static System.IObservable InvalidateObject(this Akavache.IBlobCache blobCache, string key) { } + } + public class KeyedOperationQueue : Akavache.IKeyedOperationQueue, Splat.IEnableLogger, System.IDisposable + { + public KeyedOperationQueue(System.Reactive.Concurrency.IScheduler? scheduler = null) { } + public void Dispose() { } + protected virtual void Dispose(bool disposing) { } + public System.IObservable EnqueueObservableOperation(string key, System.Func> asyncCalculationFunc) { } + public System.IObservable EnqueueOperation(string key, System.Action action) { } + public System.IObservable EnqueueOperation(string key, System.Func calculationFunc) { } + public System.IObservable ShutdownQueue() { } + } + public class LoginInfo + { + public LoginInfo(string username, string password) { } + public string Password { get; } + public string UserName { get; } + } + public static class LoginMixin + { + public static System.IObservable EraseLogin(this Akavache.ISecureBlobCache blobCache, string host = "default") { } + public static System.IObservable GetLoginAsync(this Akavache.ISecureBlobCache blobCache, string host = "default") { } + public static System.IObservable SaveLogin(this Akavache.ISecureBlobCache blobCache, string user, string password, string host = "default", System.DateTimeOffset? absoluteExpiration = default) { } + } + public static class ProtectedData + { + public static byte[] Protect(byte[] originalData, byte[]? entropy, Akavache.DataProtectionScope scope = 0) { } + public static byte[] Unprotect(byte[] originalData, byte[]? entropy, Akavache.DataProtectionScope scope = 0) { } + } + public static class RelativeTimeMixin + { + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, string url, System.TimeSpan expiration, System.Collections.Generic.Dictionary? headers = null, bool fetchAlways = false) { } + public static System.IObservable DownloadUrl(this Akavache.IBlobCache blobCache, System.Uri url, System.TimeSpan expiration, System.Collections.Generic.Dictionary? headers = null, bool fetchAlways = false) { } + public static System.IObservable Insert(this Akavache.IBlobCache blobCache, string key, byte[] data, System.TimeSpan expiration) { } + public static System.IObservable InsertObject(this Akavache.IBlobCache blobCache, string key, T value, System.TimeSpan expiration) { } + public static System.IObservable SaveLogin(this Akavache.ISecureBlobCache blobCache, string user, string password, string host, System.TimeSpan expiration) { } + } + public class SimpleFilesystemProvider : Akavache.IFilesystemProvider + { + public SimpleFilesystemProvider() { } + public System.IObservable CreateRecursive(string path) { } + public System.IObservable Delete(string path) { } + public string GetDefaultLocalMachineCacheDirectory() { } + public string GetDefaultRoamingCacheDirectory() { } + public string GetDefaultSecretCacheDirectory() { } + public System.IObservable OpenFileForReadAsync(string path, System.Reactive.Concurrency.IScheduler scheduler) { } + public System.IObservable OpenFileForWriteAsync(string path, System.Reactive.Concurrency.IScheduler scheduler) { } + protected static string GetAssemblyDirectoryName() { } + } +} +namespace Akavache.Core +{ + public class Registrations + { + public Registrations() { } + public void Register(Splat.IMutableDependencyResolver resolver, Splat.IReadonlyDependencyResolver readonlyDependencyResolver) { } + } +} +namespace Akavache.Internal +{ + [System.Flags] + public enum FileAccess + { + Read = 1, + Write = 2, + ReadWrite = 3, + } + public enum FileMode + { + CreateNew = 1, + Create = 2, + Open = 3, + OpenOrCreate = 4, + Truncate = 5, + Append = 6, + } + [System.Flags] + public enum FileShare + { + None = 0, + Read = 1, + Write = 2, + ReadWrite = 3, + Delete = 4, + Inheritable = 16, + } +} \ No newline at end of file diff --git a/src/Akavache.Tests/API/ApiApprovalTests.AkavacheDrawing.DotNet8_0.verified.txt b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheDrawing.DotNet8_0.verified.txt new file mode 100644 index 00000000..6aaa6bf7 --- /dev/null +++ b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheDrawing.DotNet8_0.verified.txt @@ -0,0 +1,21 @@ +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")] +namespace Akavache +{ + public static class BitmapImageMixin + { + public static System.IObservable LoadImage(this Akavache.IBlobCache blobCache, string key, float? desiredWidth = default, float? desiredHeight = default) { } + public static System.IObservable LoadImageFromUrl(this Akavache.IBlobCache blobCache, string url, bool fetchAlways = false, float? desiredWidth = default, float? desiredHeight = default, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable LoadImageFromUrl(this Akavache.IBlobCache blobCache, System.Uri url, bool fetchAlways = false, float? desiredWidth = default, float? desiredHeight = default, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable LoadImageFromUrl(this Akavache.IBlobCache blobCache, string key, string url, bool fetchAlways = false, float? desiredWidth = default, float? desiredHeight = default, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable LoadImageFromUrl(this Akavache.IBlobCache blobCache, string key, System.Uri url, bool fetchAlways = false, float? desiredWidth = default, float? desiredHeight = default, System.DateTimeOffset? absoluteExpiration = default) { } + public static System.IObservable ThrowOnBadImageBuffer(byte[] compressedImage) { } + } +} +namespace Akavache.Drawing +{ + public class Registrations + { + public Registrations() { } + public void Register(Splat.IMutableDependencyResolver resolver, Splat.IReadonlyDependencyResolver readonlyDependencyResolver) { } + } +} \ No newline at end of file diff --git a/src/Akavache.Tests/API/ApiApprovalTests.AkavacheProject.DotNet8_0.verified.txt b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheProject.DotNet8_0.verified.txt new file mode 100644 index 00000000..086e2eb0 --- /dev/null +++ b/src/Akavache.Tests/API/ApiApprovalTests.AkavacheProject.DotNet8_0.verified.txt @@ -0,0 +1,18 @@ +[assembly: System.Runtime.Versioning.TargetFramework(".NETCoreApp,Version=v8.0", FrameworkDisplayName=".NET 8.0")] +namespace Akavache +{ + public class Registrations + { + public Registrations() { } + public void Register(Splat.IMutableDependencyResolver resolver, Splat.IReadonlyDependencyResolver readonlyDependencyResolver) { } + public static void Start(string applicationName) { } + } +} +namespace Akavache.Sqlite3 +{ + public static class LinkerPreserve { } + public class SQLitePersistentBlobCache : Akavache.Sqlite3.SqlRawPersistentBlobCache + { + public SQLitePersistentBlobCache(string databaseFile, System.Reactive.Concurrency.IScheduler? scheduler = null) { } + } +} \ No newline at end of file diff --git a/src/Akavache.Tests/Akavache.Tests.csproj b/src/Akavache.Tests/Akavache.Tests.csproj index 15bedeed..2499c362 100644 --- a/src/Akavache.Tests/Akavache.Tests.csproj +++ b/src/Akavache.Tests/Akavache.Tests.csproj @@ -1,7 +1,7 @@  - net48;net6.0 + net48;net6.0;net8.0 $(NoWarn);CA1307;CA2000;CA1062 latest disable diff --git a/src/Akavache.sln b/src/Akavache.sln index f04ed739..0dc5ecf7 100644 --- a/src/Akavache.sln +++ b/src/Akavache.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 +# 17 VisualStudioVersion = 17.2.32616.157 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9407D902-E9CF-4CB6-B601-77CDF74B9475}" @@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Directory.build.props = Directory.build.props Directory.build.targets = Directory.build.targets global.json = global.json + ..\README.md = ..\README.md ..\.github\workflows\release.yml = ..\.github\workflows\release.yml stylecop.json = stylecop.json ..\version.json = ..\version.json diff --git a/src/Akavache/SQLitePersistentBlobCache.cs b/src/Akavache/SQLitePersistentBlobCache.cs index 416f0606..94f23772 100644 --- a/src/Akavache/SQLitePersistentBlobCache.cs +++ b/src/Akavache/SQLitePersistentBlobCache.cs @@ -21,6 +21,4 @@ namespace Akavache.Sqlite3; /// /// The location of the database file which to store the blobs in. /// Scheduler to use for contained observables. -public class SQLitePersistentBlobCache(string databaseFile, IScheduler? scheduler = null) : SqlRawPersistentBlobCache(databaseFile, scheduler) -{ -} +public class SQLitePersistentBlobCache(string databaseFile, IScheduler? scheduler = null) : SqlRawPersistentBlobCache(databaseFile, scheduler); diff --git a/src/Directory.build.props b/src/Directory.build.props index 2c4c1e03..574ef045 100644 --- a/src/Directory.build.props +++ b/src/Directory.build.props @@ -3,7 +3,8 @@ Copyright (c) .NET Foundation and Contributors MIT https://github.com/reactiveui/akavache/ - https://raw.githubusercontent.com/reactiveui/styleguide/master/logo_akavache/main.png + logo.png + README.md .NET Foundation and Contributors xanaisbettsx;ghuntley Akavache;Cache;Xamarin;Sqlite3;Magic @@ -27,12 +28,14 @@ enable preview IDE1006;SA1313;SA1010 - netstandard2.0;netstandard2.1;net6.0;net7.0;net7.0-android;net7.0-ios;net7.0-tvos;net7.0-macos;net7.0-maccatalyst;net8.0;net8.0-android;net8.0-ios;net8.0-tvos;net8.0-macos;net8.0-maccatalyst + netstandard2.0;netstandard2.1;net6.0;net8.0;net8.0-android;net8.0-ios;net8.0-tvos;net8.0-macos;net8.0-maccatalyst + + @@ -44,15 +47,12 @@ - - - - + diff --git a/version.json b/version.json index eb08515d..1b10f643 100644 --- a/version.json +++ b/version.json @@ -1,5 +1,5 @@ { - "version": "10.0", + "version": "10.1", "publicReleaseRefSpec": [ "^refs/heads/main$", // we release out of master "^refs/heads/develop$", // we release out of develop