From f5766a4cd87874a9942e2cdd1873f441518dafcb Mon Sep 17 00:00:00 2001 From: Paulo Andrade Date: Sun, 7 Dec 2025 09:37:26 +0000 Subject: [PATCH 1/3] Added swift-log dependency guarded by a trait "SQLiteDataSwiftLog" --- Package.resolved | 11 ++++++++++- Package.swift | 12 +++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index 419fc30f..fcaf7a35 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "41f93013537f670f4fe1a235c318bee33b54528c76e4b1dd2a7675bea6c0bcde", + "originHash" : "689004ea81f8d83f337f36beeeaf888f8a4a77ce72511ace43e25fcca2d75645", "pins" : [ { "identity" : "combine-schedulers", @@ -91,6 +91,15 @@ "version" : "1.1.1" } }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log", + "state" : { + "revision" : "b1fa4ef41fe21b13120c034854042d12c43f66b2", + "version" : "1.7.1" + } + }, { "identity" : "swift-perception", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 8e87eb48..5519a927 100644 --- a/Package.swift +++ b/Package.swift @@ -24,7 +24,11 @@ let package = Package( .trait( name: "SQLiteDataTagged", description: "Introduce SQLiteData conformances to the swift-tagged package." - ) + ), + .trait( + name: "SQLiteDataSwiftLog", + description: "Use swift-log instead of OSLog for logging." + ), ], dependencies: [ .package(url: "https://github.com/apple/swift-collections", from: "1.0.0"), @@ -44,6 +48,7 @@ let package = Package( ), .package(url: "https://github.com/pointfreeco/swift-tagged", from: "0.10.0"), .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.5.0"), + .package(url: "https://github.com/apple/swift-log", from: "1.7.0") ], targets: [ .target( @@ -62,6 +67,11 @@ let package = Package( package: "swift-tagged", condition: .when(traits: ["SQLiteDataTagged"]) ), + .product( + name: "Logging", + package: "swift-log", + condition: .when(traits: ["SQLiteDataSwiftLog"]) + ) ] ), .target( From fa18358dedd7262aa26d0468ca96feb50bac6975 Mon Sep 17 00:00:00 2001 From: Paulo Andrade Date: Tue, 9 Dec 2025 11:26:18 +0000 Subject: [PATCH 2/3] SyncEngine now uses a "type aliased" Logger based on the SQLiteDataSwiftLog trait. --- .../CloudKit/Internal/Logging.swift | 63 ++++++++++++++++++- Sources/SQLiteData/CloudKit/SyncEngine.swift | 4 +- .../Internal/BaseCloudKitTests.swift | 2 +- 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/Sources/SQLiteData/CloudKit/Internal/Logging.swift b/Sources/SQLiteData/CloudKit/Internal/Logging.swift index b7d4b214..9701475f 100644 --- a/Sources/SQLiteData/CloudKit/Internal/Logging.swift +++ b/Sources/SQLiteData/CloudKit/Internal/Logging.swift @@ -1,10 +1,47 @@ -#if DEBUG && canImport(CloudKit) +#if canImport(CloudKit) + +#if SQLiteDataSwiftLog + @_exported import struct Logging.Logger + import protocol Logging.LogHandler + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine { + public typealias Logger = Logging.Logger + } + + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine.Logger { + public static var `default`: SyncEngine.Logger { + .init(label: "SQLiteData") + } + public static var disabled: SyncEngine.Logger { + .init(label: "SQLiteData") { _ in DisabledLogHandler() } + } + } +#else + @_exported import struct os.Logger + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine { + public typealias Logger = os.Logger + } + @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) + extension SyncEngine.Logger { + public static var `default`: SyncEngine.Logger { + .init(subsystem: "SQLiteData", category: "CloudKit") + } + public static var disabled: SyncEngine.Logger { + .init(.disabled) + } + } +#endif + +#if DEBUG import CloudKit import TabularData import os @available(iOS 17, macOS 14, tvOS 17, watchOS 10, *) - extension Logger { + extension SyncEngine.Logger { func log(_ event: SyncEngine.Event, syncEngine: any SyncEngineProtocol) { let prefix = "SQLiteData (\(syncEngine.database.databaseScope.label).db)" var actions: [String] = [] @@ -302,3 +339,25 @@ } } #endif + +#if SQLiteDataSwiftLog + struct DisabledLogHandler: Logging.LogHandler { + var logLevel: Logging.Logger.Level = .info + var metadata: Logging.Logger.Metadata = [:] + subscript(metadataKey key: String) -> Logging.Logger.Metadata.Value? { + get { self.metadata[key] } + set { self.metadata[key] = newValue } + } + func log( + level: Logging.Logger.Level, + message: Logging.Logger.Message, + metadata: Logging.Logger.Metadata?, + source: String, + file: String, + function: String, + line: UInt + ) {} + } +#endif + +#endif diff --git a/Sources/SQLiteData/CloudKit/SyncEngine.swift b/Sources/SQLiteData/CloudKit/SyncEngine.swift index 72595053..2926308b 100644 --- a/Sources/SQLiteData/CloudKit/SyncEngine.swift +++ b/Sources/SQLiteData/CloudKit/SyncEngine.swift @@ -3,7 +3,6 @@ import ConcurrencyExtras import Dependencies import OrderedCollections - import OSLog import Observation import StructuredQueriesCore import SwiftData @@ -90,8 +89,7 @@ defaultZone: CKRecordZone = CKRecordZone(zoneName: "co.pointfree.SQLiteData.defaultZone"), startImmediately: Bool = true, delegate: (any SyncEngineDelegate)? = nil, - logger: Logger = isTesting - ? Logger(.disabled) : Logger(subsystem: "SQLiteData", category: "CloudKit") + logger: Logger = isTesting ? Logger.disabled : Logger.default ) throws where repeat (each T1).PrimaryKey.QueryOutput: IdentifierStringConvertible, diff --git a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift index 4aec1bc8..e828f0e4 100644 --- a/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift +++ b/Tests/SQLiteDataTests/Internal/BaseCloudKitTests.swift @@ -218,7 +218,7 @@ extension SyncEngine { ) }, userDatabase: userDatabase, - logger: Logger(.disabled), + logger: Logger.disabled, delegate: delegate, tables: tables, privateTables: privateTables From f3ab6b32b74dcb38ab361a69141764d947999b37 Mon Sep 17 00:00:00 2001 From: Paulo Andrade Date: Wed, 10 Dec 2025 10:09:17 +0000 Subject: [PATCH 3/3] Relaxing swift-log version requirement to last minor. --- Package.resolved | 11 +---------- Package.swift | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Package.resolved b/Package.resolved index fcaf7a35..9f0890bf 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "689004ea81f8d83f337f36beeeaf888f8a4a77ce72511ace43e25fcca2d75645", + "originHash" : "304d466276246f5a92193f48a820d92e6955bc27033dd7e4d0d55170643acec5", "pins" : [ { "identity" : "combine-schedulers", @@ -91,15 +91,6 @@ "version" : "1.1.1" } }, - { - "identity" : "swift-log", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-log", - "state" : { - "revision" : "b1fa4ef41fe21b13120c034854042d12c43f66b2", - "version" : "1.7.1" - } - }, { "identity" : "swift-perception", "kind" : "remoteSourceControl", diff --git a/Package.swift b/Package.swift index 5519a927..a17c1054 100644 --- a/Package.swift +++ b/Package.swift @@ -48,7 +48,7 @@ let package = Package( ), .package(url: "https://github.com/pointfreeco/swift-tagged", from: "0.10.0"), .package(url: "https://github.com/pointfreeco/xctest-dynamic-overlay", from: "1.5.0"), - .package(url: "https://github.com/apple/swift-log", from: "1.7.0") + .package(url: "https://github.com/apple/swift-log", from: "1.6.0") ], targets: [ .target(