Swift extensions and DSLs for filesystem testing, scripting, and inspection.
This package contains two products:
- FileManagerKit – high-level extensions for FileManager
- FileManagerKitBuilder – a DSL for creating filesystem layouts (ideal for tests)
Note: This repository is a work in progress. Expect breaking changes before v1.0.0.
Add the package to your Package.swift
:
.package(url: "https://github.com/binarybirds/file-manager-kit", .upToNextMinor(from: "0.2.0")),
Then declare the product you want to use in your target dependencies:
.product(name: "FileManagerKit", package: "file-manager-kit")
.product(name: "FileManagerKitBuilder", package: "file-manager-kit")
A set of ergonomic, safe extensions for working with FileManager.
let fileURL = URL(filePath: "/path/to/file")
if fileManager.exists(at: fileURL) {
print("Exists!")
}
let dirURL = URL(filePath: "/path/to/new-dir")
try fileManager.createDirectory(at: dirURL)
let fileURL = URL(filePath: "/path/to/file.txt")
let data = "Hello".data(using: .utf8)
try fileManager.createFile(at: fileURL, contents: data)
let targetURL = URL(filePath: "/path/to/delete")
try fileManager.delete(at: targetURL)
let contents = fileManager.listDirectory(at: URL(filePath: "/path/to/dir"))
print(contents)
try fileManager.copy(from: URL(filePath: "/from"), to: URL(filePath: "/to"))
try fileManager.move(from: URL(filePath: "/from"), to: URL(filePath: "/to"))
let size = try fileManager.size(at: URL(filePath: "/path/to/file"))
print("\(size) bytes")
A Swift DSL to declaratively build, inspect, and tear down file system structures — great for testing.
To use FileManagerKitBuilder, add this line to your dependencies:
.product(name: "FileManagerKitBuilder", package: "file-manager-kit")
Create and clean up a file structure:
import FileManagerKitBuilder
let playground = FileManagerPlayground {
Directory(name: "foo") {
File(name: "bar.txt", string: "Hello, world!")
}
}
let _ = try playground.build()
try playground.remove()
Use a BuildableItem to generate structured files (e.g., JSON).
public struct JSON<T: Encodable>: BuildableItem {
public let name: String
public let contents: T
public func buildItem() -> FileManagerPlayground.Item {
let data = try! JSONEncoder().encode(contents)
let string = String(data: data, encoding: .utf8)!
return .file(File(name: "\(name).json", string: string))
}
}
struct User: Codable { let name: String }
let playground = FileManagerPlayground {
Directory(name: "data") {
JSON(name: "user", contents: User(name: "Deku"))
}
}
try playground.build()
Use .test
to run assertions in a temporary sandbox:
try FileManagerPlayground {
Directory(name: "foo") {
"bar.txt"
}
}
.test { fileManager, rootUrl in
let fileURL = rootUrl.appendingPathComponent("foo/bar.txt")
#expect(fileManager.fileExists(at: fileURL))
}