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:
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 {