Template support for input parameters #4

Merged
javier merged 81 commits from feature/arguments-templating into main 2025-02-17 22:11:06 +00:00
6 changed files with 118 additions and 56 deletions
Showing only changes of commit f558465b62 - Show all commits

View File

@ -0,0 +1,41 @@
enum File: String {
case dockerIgnore = "docker_ignore"
case gitIgnore = "git_ignore"
case license
case package
case readme
}
// MARK: - Properties
extension File {
// MARK: Computed
var fileName: String {
switch self {
case .dockerIgnore: ".dockerignore"
case .gitIgnore: ".gitignore"
case .license: "LICENSE"
case .readme: "README.md"
case .package: "Package.swift"
}
}
var filePath: String {
switch self {
default: fileName
}
}
var resourcePath: String {
switch self {
default: "Resources/Files"
}
}
}
// MARK: - CaseIterable
extension File: CaseIterable {}

View File

@ -1,29 +0,0 @@
enum ResourceFile: String {
case dockerIgnore = "docker_ignore"
case gitIgnore = "git_ignore"
case license
case package
case readme
}
// MARK: - Properties
extension ResourceFile {
// MARK: Computed
var fileName: String {
switch self {
case .dockerIgnore: return ".dockerignore"
case .gitIgnore: return ".gitignore"
case .license: return "LICENSE"
case .readme: return "README.md"
case .package: return "Package.swift"
}
}
}
// MARK: - CaseIterable
extension ResourceFile: CaseIterable {}

View File

@ -20,17 +20,17 @@ public struct CopyFilesTask {
// MARK: Functions
public func callAsFunction(to rootFolder: URL) async throws (FileServiceError) {
for resource in ResourceFile.allCases {
for resource in File.allCases {
guard let source = bundleService.url(
forResource: resource.rawValue,
withExtension: nil,
subdirectory: "Resources/Files"
subdirectory: resource.resourcePath
) else {
assertionFailure("URL should have been initialized.")
return
}
let destination = rootFolder.appendingPath(resource.fileName)
let destination = rootFolder.appendingPath(resource.filePath)
try await fileService.copyFile(from: source, to: destination)
}

View File

@ -0,0 +1,70 @@
import Testing
@testable import ColibriLibrary
struct FileTests {
// MARK: Properties tests
@Test(arguments: zip(File.allCases, Expectation.fileNames))
func fileName(for file: File, expects fileName: String) async throws {
// GIVEN
// WHEN
let result = file.fileName
// THEN
#expect(result == fileName)
}
@Test(arguments: zip(File.allCases, Expectation.filePaths))
func filePath(for file: File, expects filePath: String) async throws {
// GIVEN
// WHEN
let result = file.filePath
// THEN
#expect(result == filePath)
}
@Test(arguments: zip(File.allCases, Expectation.resourcePaths))
func resourcePath(for file: File, expects resourcePath: String) async throws {
// GIVEN
// WHEN
let result = file.resourcePath
// THEN
#expect(result == resourcePath)
}
}
// MARK: - Expectations
private extension FileTests {
enum Expectation {
static let fileNames: [String] = [
".dockerignore",
".gitignore",
"LICENSE",
"Package.swift",
"README.md"
]
static let filePaths: [String] = [
".dockerignore",
".gitignore",
"LICENSE",
"Package.swift",
"README.md"
]
static let resourcePaths: [String] = [
"Resources/Files",
"Resources/Files",
"Resources/Files",
"Resources/Files",
"Resources/Files"
]
}
}

View File

@ -1,20 +0,0 @@
import Testing
@testable import ColibriLibrary
struct ResourceFileTests {
// MARK: Properties tests
@Test(arguments: zip(ResourceFile.allCases,
[".dockerignore", ".gitignore", "LICENSE", "Package.swift", "README.md"]))
func fileName(for resource: ResourceFile, expects fileName: String) async throws {
// GIVEN
// WHEN
let result = resource.fileName
// THEN
#expect(result == fileName)
}
}

View File

@ -16,7 +16,7 @@ struct CopyFilesTaskTests {
@Test func copyFiles() async throws {
// GIVEN
let files = files(of: ResourceFile.allCases)
let files = files(of: File.allCases)
let actions = files.map { FileServiceMock.Action.copyFile($0.source, $0.destination) }
let copyFiles = task(actions: actions)
@ -35,7 +35,7 @@ struct CopyFilesTaskTests {
@Test(arguments: [FileServiceError.itemAlreadyExists, .itemEmptyData, .itemNotCopied])
func copyFiles(throws error: FileServiceError) async throws {
// GIVEN
let files = files(of: Array(ResourceFile.allCases[0...2]))
let files = files(of: Array(File.allCases[0...2]))
let actions = files.map { FileServiceMock.Action.copyFile($0.source, $0.destination) }
let copyFiles = task(actions: actions + [.error(error)])
@ -61,11 +61,11 @@ private extension CopyFilesTaskTests {
// MARK: Type aliases
typealias File = (source: URL, destination: URL)
typealias FileURL = (source: URL, destination: URL)
// MARK: Functions
func files(of resourceFiles: [ResourceFile]) -> [File] {
func files(of resourceFiles: [File]) -> [FileURL] {
resourceFiles.map { (resourceFolder.appendingPath($0.rawValue), rootFolder.appendingPath($0.fileName)) }
}