Skip to content

Commit ef27e1e

Browse files
authored
Merge branch 'main' into feature/data-backing
2 parents 94ff2f2 + 45a7a19 commit ef27e1e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2097
-599
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ jobs:
1414
name: macOS
1515
strategy:
1616
matrix:
17-
xcode: ['16.4']
17+
xcode: ['26.1']
1818
config: ['debug', 'release']
19-
runs-on: macos-15
19+
runs-on: macos-26
2020
steps:
21-
- uses: actions/checkout@v4
21+
- uses: actions/checkout@v5
2222
- name: Select Xcode ${{ matrix.xcode }}
2323
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
2424
- name: Run ${{ matrix.config }} tests
@@ -28,13 +28,13 @@ jobs:
2828
name: Examples
2929
strategy:
3030
matrix:
31-
xcode: ['16.4']
31+
xcode: ['26.1']
3232
config: ['debug']
3333
scheme: ['Reminders', 'CaseStudies', 'SyncUps']
34-
runs-on: macos-15
34+
runs-on: macos-26
3535
continue-on-error: true
3636
steps:
37-
- uses: actions/checkout@v4
37+
- uses: actions/checkout@v5
3838
- name: Select Xcode ${{ matrix.xcode }}
3939
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
4040
- name: List devices available

Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 41 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Examples/Reminders/ReminderForm.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ struct ReminderFormView: View {
122122
}
123123
.task(id: reminder.remindersListID) {
124124
await withErrorReporting {
125-
try await $remindersList.load(RemindersList.find(reminder.remindersListID))
125+
try await $remindersList.load(RemindersList.find(reminder.remindersListID)).task
126126
}
127127
}
128128
}

Examples/Reminders/RemindersListForm.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ struct RemindersListForm: View {
7979
await withErrorReporting {
8080
try await database.write { db in
8181
let remindersListID =
82-
try RemindersList
82+
try RemindersList
8383
.upsert { remindersList }
8484
.returning(\.id)
8585
.fetchOne(db)

Examples/Reminders/Schema.swift

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,13 @@ func appDatabase() throws -> any DatabaseWriter {
140140
db.add(function: $handleReminderStatusUpdate)
141141
#if DEBUG
142142
db.trace(options: .profile) {
143-
if context == .live {
143+
switch context {
144+
case .live:
144145
logger.debug("\($0.expandedDescription)")
145-
} else {
146+
case .preview:
146147
print("\($0.expandedDescription)")
148+
case .test:
149+
break
147150
}
148151
}
149152
#endif
@@ -229,6 +232,30 @@ func appDatabase() throws -> any DatabaseWriter {
229232
.execute(db)
230233
}
231234

235+
migrator.registerMigration("Create foreign key indexes") { db in
236+
try #sql(
237+
"""
238+
CREATE INDEX IF NOT EXISTS "idx_reminders_remindersListID"
239+
ON "reminders"("remindersListID")
240+
"""
241+
)
242+
.execute(db)
243+
try #sql(
244+
"""
245+
CREATE INDEX IF NOT EXISTS "idx_remindersTags_reminderID"
246+
ON "remindersTags"("reminderID")
247+
"""
248+
)
249+
.execute(db)
250+
try #sql(
251+
"""
252+
CREATE INDEX IF NOT EXISTS "idx_remindersTags_tagID"
253+
ON "remindersTags"("tagID")
254+
"""
255+
)
256+
.execute(db)
257+
}
258+
232259
try migrator.migrate(database)
233260

234261
try database.write { db in
@@ -387,8 +414,14 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab
387414
func seedSampleData() throws {
388415
@Dependency(\.date.now) var now
389416
@Dependency(\.uuid) var uuid
390-
let remindersListIDs = (0...2).map { _ in uuid() }
391-
let reminderIDs = (0...10).map { _ in uuid() }
417+
var remindersListIDs: [UUID] = []
418+
for _ in 0...2 {
419+
remindersListIDs.append(uuid())
420+
}
421+
var reminderIDs: [UUID] = []
422+
for _ in 0...10 {
423+
reminderIDs.append(uuid())
424+
}
392425
try seed {
393426
RemindersList(
394427
id: remindersListIDs[0],

Examples/Reminders/SearchReminders.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,10 @@ class SearchRemindersModel {
6767
try database.write { db in
6868
try Reminder
6969
.where {
70-
$0.isCompleted && $0.id.in(
71-
baseQuery(searchText: searchText, searchTokens: searchTokens).select { $1.id }
72-
)
70+
$0.isCompleted
71+
&& $0.id.in(
72+
baseQuery(searchText: searchText, searchTokens: searchTokens).select { $1.id }
73+
)
7374
}
7475
.where {
7576
if let monthsAgo {
@@ -264,7 +265,7 @@ struct SearchRemindersView: View {
264265
}
265266
}
266267

267-
nonisolated fileprivate func baseQuery(
268+
nonisolated private func baseQuery(
268269
searchText: String,
269270
searchTokens: [SearchRemindersModel.Token]
270271
) -> SelectOf<ReminderText, Reminder> {

Examples/RemindersTests/Internal.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import Testing
1010
.dependency(\.continuousClock, ImmediateClock()),
1111
.dependency(\.date.now, Date(timeIntervalSince1970: 1_234_567_890)),
1212
.dependency(\.uuid, .incrementing),
13-
.dependencies { try $0.bootstrapDatabase() },
13+
.dependencies {
14+
try $0.bootstrapDatabase()
15+
try await $0.defaultSyncEngine.sendChanges()
16+
},
1417
.snapshots(record: .failed)
1518
)
1619
struct BaseTestSuite {}

Examples/RemindersTests/RemindersListsTests.swift

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import Dependencies
12
import DependenciesTestSupport
3+
import Foundation
24
import InlineSnapshotTesting
35
import SnapshotTestingCustomDump
46
import Testing
@@ -8,6 +10,9 @@ import Testing
810
extension BaseTestSuite {
911
@MainActor
1012
struct RemindersListsTests {
13+
@Dependency(\.defaultDatabase) var database
14+
@Dependency(\.defaultSyncEngine) var syncEngine
15+
1116
@Test func basics() async throws {
1217
let model = RemindersListsModel()
1318
try await model.$remindersLists.load()
@@ -100,5 +105,54 @@ extension BaseTestSuite {
100105
"""
101106
}
102107
}
108+
109+
@Test func share() async throws {
110+
let model = RemindersListsModel()
111+
112+
let personalRemindersList = try #require(
113+
try await database.read { db in
114+
try RemindersList.find(UUID(0)).fetchOne(db)
115+
}
116+
)
117+
let _ = try await syncEngine.share(record: personalRemindersList, configure: { _ in })
118+
119+
try await model.$remindersLists.load()
120+
assertInlineSnapshot(of: model.remindersLists, as: .customDump) {
121+
"""
122+
[
123+
[0]: RemindersListsModel.ReminderListState(
124+
remindersCount: 4,
125+
remindersList: RemindersList(
126+
id: UUID(00000000-0000-0000-0000-000000000000),
127+
color: 1218047999,
128+
position: 1,
129+
title: "Personal"
130+
),
131+
share: CKShare()
132+
),
133+
[1]: RemindersListsModel.ReminderListState(
134+
remindersCount: 2,
135+
remindersList: RemindersList(
136+
id: UUID(00000000-0000-0000-0000-000000000001),
137+
color: 3985191935,
138+
position: 2,
139+
title: "Family"
140+
),
141+
share: nil
142+
),
143+
[2]: RemindersListsModel.ReminderListState(
144+
remindersCount: 2,
145+
remindersList: RemindersList(
146+
id: UUID(00000000-0000-0000-0000-000000000002),
147+
color: 2992493567,
148+
position: 3,
149+
title: "Business"
150+
),
151+
share: nil
152+
)
153+
]
154+
"""
155+
}
156+
}
103157
}
104158
}

Examples/SyncUps/App.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AppModel {
3737
private func bind() {
3838
for destination in path {
3939
switch destination {
40-
case let .detail(detailModel):
40+
case .detail(let detailModel):
4141
bindDetail(model: detailModel)
4242

4343
case .meeting, .record:
@@ -64,11 +64,11 @@ struct AppView: View {
6464
SyncUpsList(model: model.syncUpsList)
6565
.navigationDestination(for: AppModel.Path.self) { path in
6666
switch path {
67-
case let .detail(model):
67+
case .detail(let model):
6868
SyncUpDetailView(model: model)
69-
case let .meeting(meeting, attendees: attendees):
69+
case .meeting(let meeting, attendees: let attendees):
7070
MeetingView(meeting: meeting, attendees: attendees)
71-
case let .record(model):
71+
case .record(let model):
7272
RecordMeetingView(model: model)
7373
}
7474
}

Examples/SyncUps/Dependencies/SpeechClient.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ private actor Speech {
154154
let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))!
155155
recognitionTask = speechRecognizer.recognitionTask(with: request) { result, error in
156156
switch (result, error) {
157-
case let (.some(result), _):
157+
case (.some(let result), _):
158158
continuation.yield(SpeechRecognitionResult(result))
159159
case (_, .some):
160160
continuation.finish(throwing: error)

0 commit comments

Comments
 (0)