From 1264abea2cd5d33601e72a23f2c5b605e8f8a4bc Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 15 Jan 2026 11:11:51 -0600 Subject: [PATCH] Update Helpers, Models and tests, config Summary: - Sources: update Helpers, Models - Tests: update tests for LocalDataTests.swift - Config: update Package Stats: - 6 files changed, 35 insertions(+), 33 deletions(-) --- Package.resolved | 23 -------------- Package.swift | 7 ++--- .../LocalData/Helpers/FileStorageHelper.swift | 4 +-- .../Models/KeychainAccessibility.swift | 2 ++ Sources/LocalData/Models/StorageError.swift | 30 +++++++++++++++++-- Tests/LocalDataTests/LocalDataTests.swift | 2 +- 6 files changed, 35 insertions(+), 33 deletions(-) delete mode 100644 Package.resolved diff --git a/Package.resolved b/Package.resolved deleted file mode 100644 index 24a2a81..0000000 --- a/Package.resolved +++ /dev/null @@ -1,23 +0,0 @@ -{ - "pins" : [ - { - "identity" : "swift-syntax", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-syntax.git", - "state" : { - "revision" : "0687f71944021d616d34d922343dcef086855920", - "version" : "600.0.1" - } - }, - { - "identity" : "swift-testing", - "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-testing.git", - "state" : { - "revision" : "399f76dcd91e4c688ca2301fa24a8cc6d9927211", - "version" : "0.99.0" - } - } - ], - "version" : 2 -} diff --git a/Package.swift b/Package.swift index 28da470..a11bb6e 100644 --- a/Package.swift +++ b/Package.swift @@ -15,9 +15,7 @@ let package = Package( targets: ["LocalData"] ), ], - dependencies: [ - .package(url: "https://github.com/apple/swift-testing.git", from: "0.7.0") - ], + dependencies: [], targets: [ .target( name: "LocalData" @@ -25,8 +23,7 @@ let package = Package( .testTarget( name: "LocalDataTests", dependencies: [ - "LocalData", - .product(name: "Testing", package: "swift-testing") + "LocalData" ] ), ] diff --git a/Sources/LocalData/Helpers/FileStorageHelper.swift b/Sources/LocalData/Helpers/FileStorageHelper.swift index 7fdaaf8..77be7ae 100644 --- a/Sources/LocalData/Helpers/FileStorageHelper.swift +++ b/Sources/LocalData/Helpers/FileStorageHelper.swift @@ -207,7 +207,7 @@ actor FileStorageHelper { ) } catch { Logger.error("Failed to create directory", error: error) - throw StorageError.fileError(error) + throw StorageError.fileError(error.localizedDescription) } } @@ -222,7 +222,7 @@ actor FileStorageHelper { Logger.debug("Successfully wrote \(data.count) bytes to \(url.lastPathComponent)") } catch { Logger.error("Failed to write to \(url.path)", error: error) - throw StorageError.fileError(error) + throw StorageError.fileError(error.localizedDescription) } } diff --git a/Sources/LocalData/Models/KeychainAccessibility.swift b/Sources/LocalData/Models/KeychainAccessibility.swift index edf2b6b..85801d3 100644 --- a/Sources/LocalData/Models/KeychainAccessibility.swift +++ b/Sources/LocalData/Models/KeychainAccessibility.swift @@ -22,9 +22,11 @@ public enum KeychainAccessibility: Sendable, CaseIterable { /// Item is always accessible, regardless of device lock state. /// Least secure - use only when absolutely necessary. + @available(iOS, deprecated: 12.0, message: "Use an accessibility level that provides some user protection, such as afterFirstUnlock") case always /// Item is always accessible but not migrated to new devices. + @available(iOS, deprecated: 12.0, message: "Use an accessibility level that provides some user protection, such as afterFirstUnlockThisDeviceOnly") case alwaysThisDeviceOnly /// Item is only accessible when the device has a passcode set. diff --git a/Sources/LocalData/Models/StorageError.swift b/Sources/LocalData/Models/StorageError.swift index ec8d3db..953fecd 100644 --- a/Sources/LocalData/Models/StorageError.swift +++ b/Sources/LocalData/Models/StorageError.swift @@ -1,10 +1,10 @@ import Foundation -public enum StorageError: Error { +public enum StorageError: Error, Equatable { case serializationFailed, deserializationFailed case securityApplicationFailed case keychainError(OSStatus) - case fileError(Error) + case fileError(String) // Changed from Error to String for easier Equatable conformance case phoneOnlyKeyAccessedOnWatch(String) case watchOnlyKeyAccessedOnPhone(String) case invalidUserDefaultsSuite(String) @@ -14,6 +14,32 @@ public enum StorageError: Error { case unregisteredKey(String) case duplicateRegisteredKeys([String]) case missingDescription(String) + + public static func == (lhs: StorageError, rhs: StorageError) -> Bool { + switch (lhs, rhs) { + case (.serializationFailed, .serializationFailed), + (.deserializationFailed, .deserializationFailed), + (.securityApplicationFailed, .securityApplicationFailed), + (.dataTooLargeForSync, .dataTooLargeForSync), + (.notFound, .notFound): + return true + case (.keychainError(let l), .keychainError(let r)): + return l == r + case (.fileError(let l), .fileError(let r)): + return l == r + case (.phoneOnlyKeyAccessedOnWatch(let l), .phoneOnlyKeyAccessedOnWatch(let r)), + (.watchOnlyKeyAccessedOnPhone(let l), .watchOnlyKeyAccessedOnPhone(let r)), + (.invalidUserDefaultsSuite(let l), .invalidUserDefaultsSuite(let r)), + (.invalidAppGroupIdentifier(let l), .invalidAppGroupIdentifier(let r)), + (.unregisteredKey(let l), .unregisteredKey(let r)), + (.missingDescription(let l), .missingDescription(let r)): + return l == r + case (.duplicateRegisteredKeys(let l), .duplicateRegisteredKeys(let r)): + return l == r + default: + return false + } + } } extension StorageError: @unchecked Sendable {} diff --git a/Tests/LocalDataTests/LocalDataTests.swift b/Tests/LocalDataTests/LocalDataTests.swift index 548b923..499f443 100644 --- a/Tests/LocalDataTests/LocalDataTests.swift +++ b/Tests/LocalDataTests/LocalDataTests.swift @@ -56,7 +56,7 @@ struct LocalDataTests { #expect(fetched == storedValue) try await StorageRouter.shared.remove(key) - await #expect(throws: StorageError.notFound) { + #expect(throws: StorageError.notFound) { _ = try await StorageRouter.shared.get(key) } }