From 079392b6d8fa31ffe5ba6fafbb66e84da9e05545 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 6 Apr 2024 23:10:54 -0700 Subject: [PATCH] Create CloudKitSync module and start moving files there. --- Account/Package.swift | 2 ++ .../CloudKit/CloudKitArticlesZone.swift | 1 + .../CloudKitSendStatusOperation.swift | 1 + CloudKitSync/.gitignore | 8 +++++ CloudKitSync/Package.swift | 31 +++++++++++++++++++ .../CloudKitSync}/CKRecord+Extensions.swift | 8 ++--- .../CloudKitArticleStatusUpdate.swift | 21 ++++++------- .../CloudKitSyncTests/CloudKitSyncTests.swift | 12 +++++++ NetNewsWire.xcodeproj/project.pbxproj | 4 ++- 9 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 CloudKitSync/.gitignore create mode 100644 CloudKitSync/Package.swift rename {Account/Sources/Account/CloudKit => CloudKitSync/Sources/CloudKitSync}/CKRecord+Extensions.swift (83%) rename {Account/Sources/Account/CloudKit => CloudKitSync/Sources/CloudKitSync}/CloudKitArticleStatusUpdate.swift (75%) create mode 100644 CloudKitSync/Tests/CloudKitSyncTests/CloudKitSyncTests.swift diff --git a/Account/Package.swift b/Account/Package.swift index 0b2dea2dd..bb97fb862 100644 --- a/Account/Package.swift +++ b/Account/Package.swift @@ -21,6 +21,7 @@ let package = Package( .package(path: "../Core"), .package(path: "../CloudKitExtras"), .package(path: "../ReaderAPI"), + .package(path: "../CloudKitSync"), .package(path: "../CommonErrors") ], targets: [ @@ -37,6 +38,7 @@ let package = Package( "Core", "CloudKitExtras", "ReaderAPI", + "CloudKitSync", "CommonErrors" ], swiftSettings: [ diff --git a/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift b/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift index 798c2979a..116198500 100644 --- a/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift +++ b/Account/Sources/Account/CloudKit/CloudKitArticlesZone.swift @@ -14,6 +14,7 @@ import CloudKit import Articles import SyncDatabase import CloudKitExtras +import CloudKitSync final class CloudKitArticlesZone: CloudKitZone { diff --git a/Account/Sources/Account/CloudKit/CloudKitSendStatusOperation.swift b/Account/Sources/Account/CloudKit/CloudKitSendStatusOperation.swift index d5b5843bf..84ae63033 100644 --- a/Account/Sources/Account/CloudKit/CloudKitSendStatusOperation.swift +++ b/Account/Sources/Account/CloudKit/CloudKitSendStatusOperation.swift @@ -14,6 +14,7 @@ import SyncDatabase import Database import Core import CloudKitExtras +import CloudKitSync class CloudKitSendStatusOperation: MainThreadOperation { diff --git a/CloudKitSync/.gitignore b/CloudKitSync/.gitignore new file mode 100644 index 000000000..0023a5340 --- /dev/null +++ b/CloudKitSync/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/CloudKitSync/Package.swift b/CloudKitSync/Package.swift new file mode 100644 index 000000000..0cb443e0e --- /dev/null +++ b/CloudKitSync/Package.swift @@ -0,0 +1,31 @@ +// swift-tools-version: 5.10 + +import PackageDescription + +let package = Package( + name: "CloudKitSync", + platforms: [.macOS(.v14), .iOS(.v17)], + products: [ + .library( + name: "CloudKitSync", + targets: ["CloudKitSync"]), + ], + dependencies: [ + .package(path: "../CloudKitExtras"), + .package(path: "../SyncDatabase"), + .package(path: "../Articles") + ], + targets: [ + .target( + name: "CloudKitSync", + dependencies: [ + "CloudKitExtras", + "SyncDatabase", + "Articles" + ] + ), + .testTarget( + name: "CloudKitSyncTests", + dependencies: ["CloudKitSync"]), + ] +) diff --git a/Account/Sources/Account/CloudKit/CKRecord+Extensions.swift b/CloudKitSync/Sources/CloudKitSync/CKRecord+Extensions.swift similarity index 83% rename from Account/Sources/Account/CloudKit/CKRecord+Extensions.swift rename to CloudKitSync/Sources/CloudKitSync/CKRecord+Extensions.swift index fc97d2dd7..91906415e 100644 --- a/Account/Sources/Account/CloudKit/CKRecord+Extensions.swift +++ b/CloudKitSync/Sources/CloudKitSync/CKRecord+Extensions.swift @@ -9,16 +9,16 @@ import Foundation import CloudKit -extension CKRecord { - +public extension CKRecord { + var externalID: String { return recordID.externalID } } -extension CKRecord.ID { - +public extension CKRecord.ID { + var externalID: String { return recordName } diff --git a/Account/Sources/Account/CloudKit/CloudKitArticleStatusUpdate.swift b/CloudKitSync/Sources/CloudKitSync/CloudKitArticleStatusUpdate.swift similarity index 75% rename from Account/Sources/Account/CloudKit/CloudKitArticleStatusUpdate.swift rename to CloudKitSync/Sources/CloudKitSync/CloudKitArticleStatusUpdate.swift index 9bad6d6d0..ddbe0f268 100644 --- a/Account/Sources/Account/CloudKit/CloudKitArticleStatusUpdate.swift +++ b/CloudKitSync/Sources/CloudKitSync/CloudKitArticleStatusUpdate.swift @@ -10,20 +10,20 @@ import Foundation import SyncDatabase import Articles -struct CloudKitArticleStatusUpdate { +public struct CloudKitArticleStatusUpdate { - enum Record { + public enum Record: Sendable { case all case new case statusOnly case delete } - var articleID: String - var statuses: [SyncStatus] - var article: Article? - - init?(articleID: String, statuses: [SyncStatus], article: Article?) { + public var articleID: String + public var statuses: [SyncStatus] + public var article: Article? + + public init?(articleID: String, statuses: [SyncStatus], article: Article?) { self.articleID = articleID self.statuses = statuses self.article = article @@ -35,7 +35,7 @@ struct CloudKitArticleStatusUpdate { } } - var record: Record { + public var record: Record { if statuses.contains(where: { $0.key == .deleted }) { return .delete } @@ -53,18 +53,17 @@ struct CloudKitArticleStatusUpdate { return .statusOnly } - var isRead: Bool { + public var isRead: Bool { if let article = article { return article.status.read } return true } - var isStarred: Bool { + public var isStarred: Bool { if let article = article { return article.status.starred } return false } - } diff --git a/CloudKitSync/Tests/CloudKitSyncTests/CloudKitSyncTests.swift b/CloudKitSync/Tests/CloudKitSyncTests/CloudKitSyncTests.swift new file mode 100644 index 000000000..6be419edd --- /dev/null +++ b/CloudKitSync/Tests/CloudKitSyncTests/CloudKitSyncTests.swift @@ -0,0 +1,12 @@ +import XCTest +@testable import CloudKitSync + +final class CloudKitSyncTests: XCTestCase { + func testExample() throws { + // XCTest Documentation + // https://developer.apple.com/documentation/xctest + + // Defining Test Cases and Test Methods + // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods + } +} diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index d51305485..e4fa709d3 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -1337,6 +1337,7 @@ 845B14A51FC2299E0013CF92 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarredFeedDelegate.swift; sourceTree = ""; }; 845EE7C01FC2488C00854A1F /* SmartFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeed.swift; sourceTree = ""; }; + 845F3D2B2BC268FE00AEBB68 /* CloudKitSync */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = CloudKitSync; sourceTree = ""; }; 846799F42BBD120A000854CB /* Parser */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Parser; sourceTree = ""; }; 84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkStatusCommand.swift; sourceTree = ""; }; 847120D62B8AE6AF00BBFC34 /* UTType+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UTType+Extensions.swift"; sourceTree = ""; }; @@ -2357,10 +2358,11 @@ 51C452B22265141B00C03939 /* Frameworks */, 51CD32C624D2DEF9009ABAEF /* Account */, 84CC98D92BC1DD25006A05C9 /* ReaderAPI */, + 845F3D2B2BC268FE00AEBB68 /* CloudKitSync */, 8410C4A62BC221C900D4F799 /* CommonErrors */, + 51CD32C724D2E06C009ABAEF /* Secrets */, 51CD32C424D2CF1D009ABAEF /* Articles */, 51CD32C324D2CD57009ABAEF /* ArticlesDatabase */, - 51CD32C724D2E06C009ABAEF /* Secrets */, 51CD32A824D2CB25009ABAEF /* SyncDatabase */, 841550F42B9E3F8000D4B345 /* Database */, 841550F52B9E4D6800D4B345 /* FMDB */,