Skip to content

Commit

Permalink
replace SwiftData with GRDB
Browse files Browse the repository at this point in the history
  • Loading branch information
vykut committed Dec 6, 2023
1 parent 7adfc29 commit bcbedca
Show file tree
Hide file tree
Showing 12 changed files with 149 additions and 276 deletions.
16 changes: 4 additions & 12 deletions FoodSpec.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,19 @@
EC2799902B1B390E00D9E4B0 /* FoodDetailsReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC27998F2B1B390E00D9E4B0 /* FoodDetailsReducer.swift */; };
EC43E55A2B175A140007CD40 /* FoodSpecApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC43E5592B175A140007CD40 /* FoodSpecApp.swift */; };
EC43E55C2B175A140007CD40 /* FoodList.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC43E55B2B175A140007CD40 /* FoodList.swift */; };
EC43E55E2B175A140007CD40 /* Food.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC43E55D2B175A140007CD40 /* Food.swift */; };
EC43E5602B175A160007CD40 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC43E55F2B175A160007CD40 /* Assets.xcassets */; };
EC43E5632B175A160007CD40 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EC43E5622B175A160007CD40 /* Preview Assets.xcassets */; };
EC4717A42B1B8474007B491C /* Quantity.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4717A32B1B8474007B491C /* Quantity.swift */; };
EC4717A62B1C4DD5007B491C /* FoodListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC4717A52B1C4DD5007B491C /* FoodListRow.swift */; };
EC7DC2872B1DC38100BC8FD5 /* UserDefaultsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2862B1DC38100BC8FD5 /* UserDefaultsClient.swift */; };
EC7DC2892B1DF22900BC8FD5 /* FoodListReducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2882B1DF22900BC8FD5 /* FoodListReducerTests.swift */; };
EC7DC28D2B1F32C400BC8FD5 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = EC7DC28C2B1F32C400BC8FD5 /* GRDB */; };
EC7DC2922B1F375100BC8FD5 /* GRDBFood.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2912B1F375100BC8FD5 /* GRDBFood.swift */; };
EC7DC2922B1F375100BC8FD5 /* Food.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2912B1F375100BC8FD5 /* Food.swift */; };
EC7DC2952B1F397D00BC8FD5 /* AppDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2932B1F397D00BC8FD5 /* AppDatabase.swift */; };
EC7DC2962B1F397D00BC8FD5 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2942B1F397D00BC8FD5 /* Persistence.swift */; };
EC7DC2982B1F669D00BC8FD5 /* GRDBDatabaseClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC7DC2972B1F669D00BC8FD5 /* GRDBDatabaseClient.swift */; };
EC9577B02B1869760082A0D1 /* FoodDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC9577AF2B1869760082A0D1 /* FoodDetails.swift */; };
EC9577B22B1872E60082A0D1 /* NutritionalValueCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC9577B12B1872E60082A0D1 /* NutritionalValueCard.swift */; };
ECA64C202B1C52970036EE4F /* DatabaseClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA64C1F2B1C52970036EE4F /* DatabaseClient.swift */; };
ECA64C232B1DB18E0036EE4F /* Energy.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA64C222B1DB18E0036EE4F /* Energy.swift */; };
ECCA83F82B177A1400C9EF4D /* FoodClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCA83F52B177A1400C9EF4D /* FoodClient.swift */; };
/* End PBXBuildFile section */
Expand All @@ -51,7 +49,6 @@
EC43E5562B175A140007CD40 /* FoodSpec.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FoodSpec.app; sourceTree = BUILT_PRODUCTS_DIR; };
EC43E5592B175A140007CD40 /* FoodSpecApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodSpecApp.swift; sourceTree = "<group>"; };
EC43E55B2B175A140007CD40 /* FoodList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodList.swift; sourceTree = "<group>"; };
EC43E55D2B175A140007CD40 /* Food.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Food.swift; sourceTree = "<group>"; };
EC43E55F2B175A160007CD40 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
EC43E5622B175A160007CD40 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
EC43E5642B175A160007CD40 /* FoodSpec.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FoodSpec.entitlements; sourceTree = "<group>"; };
Expand All @@ -62,13 +59,12 @@
EC7DC2862B1DC38100BC8FD5 /* UserDefaultsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsClient.swift; sourceTree = "<group>"; };
EC7DC2882B1DF22900BC8FD5 /* FoodListReducerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodListReducerTests.swift; sourceTree = "<group>"; };
EC7DC28A2B1E02B600BC8FD5 /* FoodSpec.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = FoodSpec.xctestplan; sourceTree = "<group>"; };
EC7DC2912B1F375100BC8FD5 /* GRDBFood.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GRDBFood.swift; sourceTree = "<group>"; };
EC7DC2912B1F375100BC8FD5 /* Food.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Food.swift; sourceTree = "<group>"; };
EC7DC2932B1F397D00BC8FD5 /* AppDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDatabase.swift; sourceTree = "<group>"; };
EC7DC2942B1F397D00BC8FD5 /* Persistence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = "<group>"; };
EC7DC2972B1F669D00BC8FD5 /* GRDBDatabaseClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GRDBDatabaseClient.swift; sourceTree = "<group>"; };
EC9577AF2B1869760082A0D1 /* FoodDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoodDetails.swift; sourceTree = "<group>"; };
EC9577B12B1872E60082A0D1 /* NutritionalValueCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NutritionalValueCard.swift; sourceTree = "<group>"; };
ECA64C1F2B1C52970036EE4F /* DatabaseClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseClient.swift; sourceTree = "<group>"; };
ECA64C222B1DB18E0036EE4F /* Energy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Energy.swift; sourceTree = "<group>"; };
ECCA83F52B177A1400C9EF4D /* FoodClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoodClient.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -178,8 +174,7 @@
EC4717A22B1B804B007B491C /* Food */ = {
isa = PBXGroup;
children = (
EC43E55D2B175A140007CD40 /* Food.swift */,
EC7DC2912B1F375100BC8FD5 /* GRDBFood.swift */,
EC7DC2912B1F375100BC8FD5 /* Food.swift */,
);
path = Food;
sourceTree = "<group>";
Expand All @@ -190,7 +185,6 @@
EC7DC2932B1F397D00BC8FD5 /* AppDatabase.swift */,
EC7DC2942B1F397D00BC8FD5 /* Persistence.swift */,
EC2799892B1B304900D9E4B0 /* ApiKeysClient.swift */,
ECA64C1F2B1C52970036EE4F /* DatabaseClient.swift */,
EC7DC2972B1F669D00BC8FD5 /* GRDBDatabaseClient.swift */,
ECCA83F52B177A1400C9EF4D /* FoodClient.swift */,
EC7DC2862B1DC38100BC8FD5 /* UserDefaultsClient.swift */,
Expand Down Expand Up @@ -310,18 +304,16 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
ECA64C202B1C52970036EE4F /* DatabaseClient.swift in Sources */,
EC43E55C2B175A140007CD40 /* FoodList.swift in Sources */,
EC7DC2962B1F397D00BC8FD5 /* Persistence.swift in Sources */,
EC7DC2952B1F397D00BC8FD5 /* AppDatabase.swift in Sources */,
EC43E55E2B175A140007CD40 /* Food.swift in Sources */,
EC9577B02B1869760082A0D1 /* FoodDetails.swift in Sources */,
EC7DC2872B1DC38100BC8FD5 /* UserDefaultsClient.swift in Sources */,
EC2799902B1B390E00D9E4B0 /* FoodDetailsReducer.swift in Sources */,
ECCA83F82B177A1400C9EF4D /* FoodClient.swift in Sources */,
EC43E55A2B175A140007CD40 /* FoodSpecApp.swift in Sources */,
EC9577B22B1872E60082A0D1 /* NutritionalValueCard.swift in Sources */,
EC7DC2922B1F375100BC8FD5 /* GRDBFood.swift in Sources */,
EC7DC2922B1F375100BC8FD5 /* Food.swift in Sources */,
EC7DC2982B1F669D00BC8FD5 /* GRDBDatabaseClient.swift in Sources */,
EC4717A62B1C4DD5007B491C /* FoodListRow.swift in Sources */,
EC4717A42B1B8474007B491C /* Quantity.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"location" : "https://github.com/pointfreeco/swift-composable-architecture",
"state" : {
"branch" : "observation-beta",
"revision" : "2ff4f0a24cc398b12c5447d0e644262c57710332"
"revision" : "b2dc36241005a5c62c68db6550a5218253f8cea7"
}
},
{
Expand Down
16 changes: 13 additions & 3 deletions FoodSpec/Clients/AppDatabase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ extension AppDatabase {
extension AppDatabase {
/// Saves (inserts or updates) a player. When the method returns, the
/// player is present in the database, and its id is not nil.
func saveFood(_ food: inout GRDBFood) async throws {
func saveFood(_ food: inout Food) async throws {
food = try await dbWriter.write { [food] db in
try food.saved(db)
}
Expand All @@ -137,14 +137,24 @@ extension AppDatabase {
/// Delete the specified players
func deleteFoods(ids: [Int64]) async throws {
try await dbWriter.write { db in
_ = try GRDBFood.deleteAll(db, keys: ids)
_ = try Food.deleteAll(db, keys: ids)
}
}

/// Delete all players
func deleteAllFoods() async throws {
try await dbWriter.write { db in
_ = try GRDBFood.deleteAll(db)
_ = try Food.deleteAll(db)
}
}
}

extension Column: Hashable {
public static func == (lhs: Column, rhs: Column) -> Bool {
lhs.name == rhs.name
}

public func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
}
79 changes: 0 additions & 79 deletions FoodSpec/Clients/DatabaseClient.swift

This file was deleted.

11 changes: 6 additions & 5 deletions FoodSpec/Clients/GRDBDatabaseClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,20 @@ import ComposableArchitecture

@DependencyClient
struct GRDBDatabaseClient {
var getRecentFoods: (_ sortedBy: Column, _ order: SortOrder) async throws -> [GRDBFood]
var insert: (_ food: GRDBFood) async throws -> GRDBFood
var delete: (_ food: GRDBFood) async throws -> Void
var getRecentFoods: (_ sortedBy: Food.SortingStrategy, _ order: SortOrder) async throws -> [Food]
var insert: (_ food: Food) async throws -> Food
var delete: (_ food: Food) async throws -> Void
}

extension GRDBDatabaseClient: DependencyKey {
static var liveValue: GRDBDatabaseClient = {
let db = AppDatabase.shared.dbWriter
return .init(
getRecentFoods: { sortedBy, order in
let column = sortedBy.column
return try await db.read {
try GRDBFood
.order(order == .forward ? sortedBy : sortedBy.desc)
try Food
.order(order == .forward ? column : column.desc)
.fetchAll($0)
}
},
Expand Down
13 changes: 9 additions & 4 deletions FoodSpec/Clients/UserDefaultsClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import XCTestDynamicOverlay

public struct UserDefaultsClient {
public var bool: @Sendable (_ key: String) -> Bool
public var string: @Sendable (_ key: String) -> String?
public var data: @Sendable (_ key: String) -> Data?
public var double: @Sendable (_ key: String) -> Double
public var integer: @Sendable (_ key: String) -> Int
Expand All @@ -23,6 +24,12 @@ public struct UserDefaultsClient {
return try? decoder.decode(T.self, from: data)
}

mutating func override(data: Data, forKey key: String) {
self.data = { [self] in $0 == key ? data : self.data($0) }
}
}

extension UserDefaultsClient {
var recentSearchesSortingStrategy: Food.SortingStrategy? {
get { object(key: recentSearchesSortingStrategyKey) }
nonmutating set {
Expand All @@ -44,10 +51,6 @@ public struct UserDefaultsClient {
}
}
}

mutating func override(data: Data, forKey key: String) {
self.data = { [self] in $0 == key ? data : self.data($0) }
}
}

private let recentSearchesSortingStrategyKey = "recentSearchesSortingStrategyKey"
Expand All @@ -58,6 +61,7 @@ extension UserDefaultsClient: DependencyKey {
let defaults = { UserDefaults(suiteName: "group.foodspec")! }
return Self(
bool: { defaults().bool(forKey: $0) },
string: { defaults().string(forKey: $0) },
data: { defaults().data(forKey: $0) },
double: { defaults().double(forKey: $0) },
integer: { defaults().integer(forKey: $0) },
Expand All @@ -72,6 +76,7 @@ extension UserDefaultsClient: DependencyKey {

static public var testValue: UserDefaultsClient = .init(
bool: unimplemented("\(Self.self).bool", placeholder: false),
string: unimplemented("\(Self.self).string", placeholder: nil),
data: unimplemented("\(Self.self).data", placeholder: nil),
double: unimplemented("\(Self.self).double", placeholder: .zero),
integer: unimplemented("\(Self.self).integer", placeholder: .zero),
Expand Down
Loading

0 comments on commit bcbedca

Please sign in to comment.