Create CloudKitSync module and start moving files there.

This commit is contained in:
Brent Simmons 2024-04-06 23:10:54 -07:00
parent 057d35030b
commit 079392b6d8
9 changed files with 72 additions and 16 deletions

View File

@ -21,6 +21,7 @@ let package = Package(
.package(path: "../Core"), .package(path: "../Core"),
.package(path: "../CloudKitExtras"), .package(path: "../CloudKitExtras"),
.package(path: "../ReaderAPI"), .package(path: "../ReaderAPI"),
.package(path: "../CloudKitSync"),
.package(path: "../CommonErrors") .package(path: "../CommonErrors")
], ],
targets: [ targets: [
@ -37,6 +38,7 @@ let package = Package(
"Core", "Core",
"CloudKitExtras", "CloudKitExtras",
"ReaderAPI", "ReaderAPI",
"CloudKitSync",
"CommonErrors" "CommonErrors"
], ],
swiftSettings: [ swiftSettings: [

View File

@ -14,6 +14,7 @@ import CloudKit
import Articles import Articles
import SyncDatabase import SyncDatabase
import CloudKitExtras import CloudKitExtras
import CloudKitSync
final class CloudKitArticlesZone: CloudKitZone { final class CloudKitArticlesZone: CloudKitZone {

View File

@ -14,6 +14,7 @@ import SyncDatabase
import Database import Database
import Core import Core
import CloudKitExtras import CloudKitExtras
import CloudKitSync
class CloudKitSendStatusOperation: MainThreadOperation { class CloudKitSendStatusOperation: MainThreadOperation {

8
CloudKitSync/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
.DS_Store
/.build
/Packages
xcuserdata/
DerivedData/
.swiftpm/configuration/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc

View File

@ -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"]),
]
)

View File

@ -9,16 +9,16 @@
import Foundation import Foundation
import CloudKit import CloudKit
extension CKRecord { public extension CKRecord {
var externalID: String { var externalID: String {
return recordID.externalID return recordID.externalID
} }
} }
extension CKRecord.ID { public extension CKRecord.ID {
var externalID: String { var externalID: String {
return recordName return recordName
} }

View File

@ -10,20 +10,20 @@ import Foundation
import SyncDatabase import SyncDatabase
import Articles import Articles
struct CloudKitArticleStatusUpdate { public struct CloudKitArticleStatusUpdate {
enum Record { public enum Record: Sendable {
case all case all
case new case new
case statusOnly case statusOnly
case delete case delete
} }
var articleID: String public var articleID: String
var statuses: [SyncStatus] public var statuses: [SyncStatus]
var article: Article? public var article: Article?
init?(articleID: String, statuses: [SyncStatus], article: Article?) { public init?(articleID: String, statuses: [SyncStatus], article: Article?) {
self.articleID = articleID self.articleID = articleID
self.statuses = statuses self.statuses = statuses
self.article = article self.article = article
@ -35,7 +35,7 @@ struct CloudKitArticleStatusUpdate {
} }
} }
var record: Record { public var record: Record {
if statuses.contains(where: { $0.key == .deleted }) { if statuses.contains(where: { $0.key == .deleted }) {
return .delete return .delete
} }
@ -53,18 +53,17 @@ struct CloudKitArticleStatusUpdate {
return .statusOnly return .statusOnly
} }
var isRead: Bool { public var isRead: Bool {
if let article = article { if let article = article {
return article.status.read return article.status.read
} }
return true return true
} }
var isStarred: Bool { public var isStarred: Bool {
if let article = article { if let article = article {
return article.status.starred return article.status.starred
} }
return false return false
} }
} }

View File

@ -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
}
}

View File

@ -1337,6 +1337,7 @@
845B14A51FC2299E0013CF92 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; }; 845B14A51FC2299E0013CF92 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarredFeedDelegate.swift; sourceTree = "<group>"; }; 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarredFeedDelegate.swift; sourceTree = "<group>"; };
845EE7C01FC2488C00854A1F /* SmartFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeed.swift; sourceTree = "<group>"; }; 845EE7C01FC2488C00854A1F /* SmartFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeed.swift; sourceTree = "<group>"; };
845F3D2B2BC268FE00AEBB68 /* CloudKitSync */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = CloudKitSync; sourceTree = "<group>"; };
846799F42BBD120A000854CB /* Parser */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Parser; sourceTree = "<group>"; }; 846799F42BBD120A000854CB /* Parser */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Parser; sourceTree = "<group>"; };
84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkStatusCommand.swift; sourceTree = "<group>"; }; 84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkStatusCommand.swift; sourceTree = "<group>"; };
847120D62B8AE6AF00BBFC34 /* UTType+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UTType+Extensions.swift"; sourceTree = "<group>"; }; 847120D62B8AE6AF00BBFC34 /* UTType+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UTType+Extensions.swift"; sourceTree = "<group>"; };
@ -2357,10 +2358,11 @@
51C452B22265141B00C03939 /* Frameworks */, 51C452B22265141B00C03939 /* Frameworks */,
51CD32C624D2DEF9009ABAEF /* Account */, 51CD32C624D2DEF9009ABAEF /* Account */,
84CC98D92BC1DD25006A05C9 /* ReaderAPI */, 84CC98D92BC1DD25006A05C9 /* ReaderAPI */,
845F3D2B2BC268FE00AEBB68 /* CloudKitSync */,
8410C4A62BC221C900D4F799 /* CommonErrors */, 8410C4A62BC221C900D4F799 /* CommonErrors */,
51CD32C724D2E06C009ABAEF /* Secrets */,
51CD32C424D2CF1D009ABAEF /* Articles */, 51CD32C424D2CF1D009ABAEF /* Articles */,
51CD32C324D2CD57009ABAEF /* ArticlesDatabase */, 51CD32C324D2CD57009ABAEF /* ArticlesDatabase */,
51CD32C724D2E06C009ABAEF /* Secrets */,
51CD32A824D2CB25009ABAEF /* SyncDatabase */, 51CD32A824D2CB25009ABAEF /* SyncDatabase */,
841550F42B9E3F8000D4B345 /* Database */, 841550F42B9E3F8000D4B345 /* Database */,
841550F52B9E4D6800D4B345 /* FMDB */, 841550F52B9E4D6800D4B345 /* FMDB */,