apple_kit

Apple-native services for Radroots iOS and macOS apps
git clone https://radroots.dev/git/apple_kit.git
Log | Files | Refs | README

commit 841700cf1121eb6ede62b5677755d54247ddc53e
parent 6933a6cdf18b0db3037f8528e7cffbf306e28b2d
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 02:42:55 -0700

kit: expose prepared export existence

Add a RadrootsFileAccess API for inspecting prepared export lifecycle state.

Update AppleKit tests to verify export release behavior through the shared file access boundary.

Diffstat:
MSources/RadrootsKit/RadrootsFileAccess.swift | 7+++++++
MTests/RadrootsKitTests/RadrootsAppleFileAccessTests.swift | 9++++++---
2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/Sources/RadrootsKit/RadrootsFileAccess.swift b/Sources/RadrootsKit/RadrootsFileAccess.swift @@ -134,6 +134,7 @@ public protocol RadrootsFileAccess { suggestedFilename: String? ) throws -> RadrootsImportedDocument @discardableResult func prepareExport(_ request: RadrootsExportDocumentRequest) throws -> RadrootsPreparedExportDocument + func preparedExportExists(_ preparedExport: RadrootsPreparedExportDocument) throws -> Bool func readStagedBlob(_ blob: RadrootsStagedBlobReference) throws -> Data func releaseStagedBlob(_ blob: RadrootsStagedBlobReference) throws func releasePreparedExport(_ preparedExport: RadrootsPreparedExportDocument) throws @@ -353,6 +354,12 @@ public final class RadrootsAppleFileAccess: RadrootsFileAccess { } } + public func preparedExportExists(_ preparedExport: RadrootsPreparedExportDocument) throws -> Bool { + let directoryURL = try preparedExportDirectoryURL(for: preparedExport) + return fileManager.fileExists(atPath: directoryURL.path) && + fileManager.fileExists(atPath: preparedExport.fileURL.path) + } + public func releasePreparedExport(_ preparedExport: RadrootsPreparedExportDocument) throws { let directoryURL = try preparedExportDirectoryURL(for: preparedExport) if fileManager.fileExists(atPath: directoryURL.path) { diff --git a/Tests/RadrootsKitTests/RadrootsAppleFileAccessTests.swift b/Tests/RadrootsKitTests/RadrootsAppleFileAccessTests.swift @@ -132,6 +132,9 @@ import Testing #expect(try Data(contentsOf: filePrepared.fileURL) == data) #expect(try Data(contentsOf: stagedPrepared.fileURL) == data) #expect(try Data(contentsOf: inlinePrepared.fileURL) == data) + #expect(try access.preparedExportExists(filePrepared)) + #expect(try access.preparedExportExists(stagedPrepared)) + #expect(try access.preparedExportExists(inlinePrepared)) #expect(filePrepared.sizeBytes == UInt64(data.count)) #expect(stagedPrepared.sizeBytes == UInt64(data.count)) #expect(inlinePrepared.sizeBytes == UInt64(data.count)) @@ -140,9 +143,9 @@ import Testing try access.releasePreparedExport(stagedPrepared) try access.releasePreparedExport(inlinePrepared) - #expect(!FileManager.default.fileExists(atPath: filePrepared.fileURL.path)) - #expect(!FileManager.default.fileExists(atPath: stagedPrepared.fileURL.path)) - #expect(!FileManager.default.fileExists(atPath: inlinePrepared.fileURL.path)) + #expect(!(try access.preparedExportExists(filePrepared))) + #expect(!(try access.preparedExportExists(stagedPrepared))) + #expect(!(try access.preparedExportExists(inlinePrepared))) } @Test func appleFileAccessKeepsSmallReadsInlineWhenLimitAllowsIt() throws {