Scaffold project structure
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.build
|
||||
87
Package.resolved
Normal file
87
Package.resolved
Normal file
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"originHash" : "db0ba74c125e968c67646390cbba012a5572a5c9c54171588ecbb73e370a448d",
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "noora",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/tuist/Noora",
|
||||
"state" : {
|
||||
"revision" : "70c6d1477a982f3e4cd46ed2d122e04e9d0a0b59",
|
||||
"version" : "0.56.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "path",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/tuist/path",
|
||||
"state" : {
|
||||
"revision" : "7c74ac435e03a927c3a73134c48b61e60221abcb",
|
||||
"version" : "0.3.8"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "rainbow",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/onevcat/Rainbow",
|
||||
"state" : {
|
||||
"revision" : "cdf146ae671b2624917648b61c908d1244b98ca1",
|
||||
"version" : "4.2.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-argument-parser",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-argument-parser",
|
||||
"state" : {
|
||||
"revision" : "c5d11a805e765f52ba34ec7284bd4fcd6ba68615",
|
||||
"version" : "1.7.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-async-algorithms",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-async-algorithms",
|
||||
"state" : {
|
||||
"revision" : "9d349bcc328ac3c31ce40e746b5882742a0d1272",
|
||||
"version" : "1.1.3"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-collections",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-collections.git",
|
||||
"state" : {
|
||||
"revision" : "8d9834a6189db730f6264db7556a7ffb751e99ee",
|
||||
"version" : "1.4.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-log",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-log",
|
||||
"state" : {
|
||||
"revision" : "bbd81b6725ae874c69e9b8c8804d462356b55523",
|
||||
"version" : "1.10.1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-subprocess",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/swiftlang/swift-subprocess.git",
|
||||
"state" : {
|
||||
"revision" : "ba5888ad7758cbcbe7abebac37860b1652af2d9c",
|
||||
"version" : "0.3.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "swift-system",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/apple/swift-system",
|
||||
"state" : {
|
||||
"revision" : "7c6ad0fc39d0763e0b699210e4124afd5041c5df",
|
||||
"version" : "1.6.4"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 3
|
||||
}
|
||||
46
Package.swift
Normal file
46
Package.swift
Normal file
@@ -0,0 +1,46 @@
|
||||
// swift-tools-version: 6.0
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "Inotify",
|
||||
platforms: [.macOS(.v13), .custom("Linux", versionString: "4.4.302")],
|
||||
products: [
|
||||
.library(
|
||||
name: "Inotify",
|
||||
targets: ["Inotify"]
|
||||
),
|
||||
.executable(
|
||||
name: "task",
|
||||
targets: ["TaskCLI"]
|
||||
)
|
||||
],
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.7.0"),
|
||||
.package(url: "https://github.com/apple/swift-async-algorithms", from: "1.1.3"),
|
||||
.package(url: "https://github.com/apple/swift-log", from: "1.10.1"),
|
||||
.package(url: "https://github.com/swiftlang/swift-subprocess.git", from: "0.3.0"),
|
||||
.package(url: "https://github.com/tuist/Noora", from: "0.55.1")
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "Inotify",
|
||||
dependencies: [
|
||||
.product(name: "Logging", package: "swift-log"),
|
||||
]
|
||||
),
|
||||
.testTarget(
|
||||
name: "InotifyIntegrationTests",
|
||||
dependencies: ["Inotify"],
|
||||
),
|
||||
.executableTarget(
|
||||
name: "TaskCLI",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
|
||||
.product(name: "Logging", package: "swift-log"),
|
||||
.product(name: "Subprocess", package: "swift-subprocess"),
|
||||
.product(name: "Noora", package: "Noora")
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
2
Sources/Inotify/Inotify.swift
Normal file
2
Sources/Inotify/Inotify.swift
Normal file
@@ -0,0 +1,2 @@
|
||||
actor Inotify {
|
||||
}
|
||||
9
Sources/TaskCLI/Command.swift
Normal file
9
Sources/TaskCLI/Command.swift
Normal file
@@ -0,0 +1,9 @@
|
||||
import ArgumentParser
|
||||
|
||||
@main
|
||||
struct Command: AsyncParsableCommand {
|
||||
static let configuration = CommandConfiguration(
|
||||
abstract: "Project tasks of Astzweig's Swift Inotify project.",
|
||||
subcommands: [TestCommand.self]
|
||||
)
|
||||
}
|
||||
25
Sources/TaskCLI/Global Options.swift
Normal file
25
Sources/TaskCLI/Global Options.swift
Normal file
@@ -0,0 +1,25 @@
|
||||
import ArgumentParser
|
||||
import Logging
|
||||
|
||||
struct GlobalOptions: ParsableArguments {
|
||||
@Flag(
|
||||
name: .short,
|
||||
help: "Increase logging verbosity. Use -v, -vv, or -vvv."
|
||||
)
|
||||
var verbose: Int
|
||||
|
||||
var logLevel: Logger.Level {
|
||||
switch verbose {
|
||||
case 0: return .notice
|
||||
case 1: return .info
|
||||
case 2: return .debug
|
||||
default: return .trace
|
||||
}
|
||||
}
|
||||
|
||||
func makeLogger(labeled label: String) -> Logger {
|
||||
var logger = Logger(label: label)
|
||||
logger.logLevel = logLevel
|
||||
return logger
|
||||
}
|
||||
}
|
||||
45
Sources/TaskCLI/Test Command.swift
Normal file
45
Sources/TaskCLI/Test Command.swift
Normal file
@@ -0,0 +1,45 @@
|
||||
import ArgumentParser
|
||||
import AsyncAlgorithms
|
||||
import Foundation
|
||||
import Subprocess
|
||||
import Noora
|
||||
|
||||
struct TestCommand: AsyncParsableCommand {
|
||||
static let configuration = CommandConfiguration(
|
||||
commandName: "test",
|
||||
abstract: "Run swift test in a linux container.",
|
||||
aliases: ["t"],
|
||||
)
|
||||
|
||||
@OptionGroup var global: GlobalOptions
|
||||
|
||||
// MARK: - Run
|
||||
|
||||
func run() async throws {
|
||||
let noora = Noora()
|
||||
let logger = global.makeLogger(labeled: "swift-inotify.cli.task.test")
|
||||
let currentDirectory = FileManager.default.currentDirectoryPath
|
||||
|
||||
noora.info("Running tests on Linux.")
|
||||
logger.debug("Current directory", metadata: ["current-directory": "\(currentDirectory)"])
|
||||
async let monitorResult = Subprocess.run(
|
||||
.name("docker"),
|
||||
arguments: ["run", "-v", "\(currentDirectory):/code", "--platform", "linux/arm64", "-w", "/code", "swift:latest", "swift", "test"],
|
||||
preferredBufferSize: 10,
|
||||
) { execution, standardInput, standardOutput, standardError in
|
||||
print("")
|
||||
let stdout = standardOutput.lines()
|
||||
let stderr = standardError.lines()
|
||||
for try await line in merge(stdout, stderr) {
|
||||
noora.passthrough("\(line)")
|
||||
}
|
||||
print("")
|
||||
}
|
||||
|
||||
if (try await monitorResult.terminationStatus.isSuccess) {
|
||||
noora.success("All tests completed successfully.")
|
||||
} else {
|
||||
noora.error("Not all tests completed successfully.")
|
||||
}
|
||||
}
|
||||
}
|
||||
9
Tests/InotifyIntegrationTests/InitialisationTests.swift
Normal file
9
Tests/InotifyIntegrationTests/InitialisationTests.swift
Normal file
@@ -0,0 +1,9 @@
|
||||
import Testing
|
||||
@testable import Inotify
|
||||
|
||||
@Suite("Initialisation")
|
||||
struct InitTests {
|
||||
@Test func createsCleanly() async throws {
|
||||
let _ = Inotify()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user