From 40b928e821b7b2ea49b56abac5d8799ac0a1cbd8 Mon Sep 17 00:00:00 2001 From: Aleksey Berezka Date: Wed, 20 Dec 2023 12:27:16 +0500 Subject: [PATCH] Target is executable --- Package.resolved | 14 ++++++ Package.swift | 29 +++++------ .../Formatters/DBXCTextFormatter.swift | 50 +++++++++++++------ .../Models/DBXCReportModel.swift | 2 +- .../DBXCTextFormatterTests.swift | 16 ++++-- 5 files changed, 74 insertions(+), 37 deletions(-) create mode 100644 Package.resolved diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..b1ff0a0 --- /dev/null +++ b/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser.git", + "state" : { + "revision" : "c8ed701b513cf5177118a175d85fbbbcd707ab41", + "version" : "1.3.0" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift index 538d041..03859bb 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.8 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -12,26 +12,23 @@ let package = Package( platforms: [ .macOS(.v10_15) ], - products: [ - // Products define the executables and libraries a package produces, and make them visible to other packages. - .library( - name: packageName, - targets: [packageName] - ), - .library( - name: packageTestHelpersName, - targets: [packageTestHelpersName] - ), - ], dependencies: [ - + .package( + url: "https://github.com/apple/swift-argument-parser.git", + .upToNextMajor(from: "1.0.0") + ), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. - .target( + .executableTarget( name: packageName, - dependencies: [] + dependencies: [ + .product( + name: "ArgumentParser", + package: "swift-argument-parser" + ) + ] ), .target( name: packageTestHelpersName, @@ -46,7 +43,7 @@ let package = Package( .init(stringLiteral: packageTestHelpersName) ], resources: [ - .process("Resources/DBXCResultParser.xcresult") + .copy("Resources/DBXCResultParser.xcresult") ] ), ] diff --git a/Sources/DBXCResultParser/Formatters/DBXCTextFormatter.swift b/Sources/DBXCResultParser/Formatters/DBXCTextFormatter.swift index 5fc8583..189b873 100644 --- a/Sources/DBXCResultParser/Formatters/DBXCTextFormatter.swift +++ b/Sources/DBXCResultParser/Formatters/DBXCTextFormatter.swift @@ -6,33 +6,39 @@ // import Foundation +import ArgumentParser extension DBXCTextFormatter { /// Output format options - public enum Format { + public enum Format: String, Decodable { case list // Outputs detailed list of test results case count // // Outputs a summary count of test results } } -public class DBXCTextFormatter { - /// The format style to use for output - public let format: Format +@main +public class DBXCTextFormatter: ParsableCommand { + public required init() { } + + @Option(help: "Path to .xcresult") + public var xcresultPath: String + + @Option(help: "Result format") + public var format: Format = .list /// /// The locale to use for formatting numbers and measurements - public let locale: Locale? + @Option(help: "Locale to use for numbers and measurements formatting (default: system)") + public var locale: Locale? - /// Initializes a new text formatter with the specified format and locale. - /// - /// - Parameters: - /// - format: The output format to use. - /// - locale: The locale for number and measurement formatting. Defaults to `nil`. - public init( - format: Format, - locale: Locale? = nil - ) { - self.format = format - self.locale = locale + @Option(help: "Test statutes to include in report, comma separated") + public var include: String = DBXCReportModel.Module.File.RepeatableTest.Test.Status.allCases.map { $0.rawValue }.joined(separator: ",") + + public func run() throws { + let xcresultPath = URL(fileURLWithPath: xcresultPath) + let report = try DBXCReportModel(xcresultPath: xcresultPath) + let includeTestResults = include.split(separator: ",").compactMap { DBXCReportModel.Module.File.RepeatableTest.Test.Status(rawValue: String($0)) } + let result = format(report, testResults: includeTestResults) + print(result) } /// Formats the test report data into a string based on the specified format. @@ -138,3 +144,15 @@ extension NumberFormatter { return formatter } } + +extension Locale: ExpressibleByArgument { + public init?(argument: String) { + self.init(identifier: argument) + } +} + +extension DBXCTextFormatter.Format: ExpressibleByArgument { + public init?(argument: String) { + self.init(rawValue: argument) + } +} diff --git a/Sources/DBXCResultParser/Models/DBXCReportModel.swift b/Sources/DBXCResultParser/Models/DBXCReportModel.swift index 3e4fe7b..d14b229 100644 --- a/Sources/DBXCResultParser/Models/DBXCReportModel.swift +++ b/Sources/DBXCResultParser/Models/DBXCReportModel.swift @@ -124,7 +124,7 @@ extension DBXCReportModel.Module.File.RepeatableTest { } extension DBXCReportModel.Module.File.RepeatableTest.Test { - public enum Status: Equatable, CaseIterable { + public enum Status: String, Equatable, CaseIterable { case success case failure case expectedFailure diff --git a/Tests/DBXCResultParserTests/DBXCTextFormatterTests.swift b/Tests/DBXCResultParserTests/DBXCTextFormatterTests.swift index 2643340..f7b83e7 100644 --- a/Tests/DBXCResultParserTests/DBXCTextFormatterTests.swift +++ b/Tests/DBXCResultParserTests/DBXCTextFormatterTests.swift @@ -15,7 +15,9 @@ final class DBXCTextFormatterTests: XCTestCase { } func test_testResult_any_list() { - let formatter = DBXCTextFormatter(format: .list, locale: locale) + let formatter = DBXCTextFormatter() + formatter.format = .list + formatter.locale = locale let result = formatter.format(.genericReport) XCTAssertEqual(result, @@ -38,7 +40,9 @@ NotificationsSetupServiceTests } func test_testResult_success_list() { - let formatter = DBXCTextFormatter(format: .list, locale: locale) + let formatter = DBXCTextFormatter() + formatter.format = .list + formatter.locale = locale let result = formatter.format(.genericReport, testResults: [.success]) XCTAssertEqual(result, @@ -52,14 +56,18 @@ NetworkSpec } func test_testResult_any_count() { - let formatter = DBXCTextFormatter(format: .count, locale: locale) + let formatter = DBXCTextFormatter() + formatter.format = .count + formatter.locale = locale let result = formatter.format(.genericReport) XCTAssertEqual(result, "7 (0 sec)") } func test_testResult_failure_count() { - let formatter = DBXCTextFormatter(format: .count, locale: locale) + let formatter = DBXCTextFormatter() + formatter.format = .count + formatter.locale = locale let result = formatter.format(.genericReport, testResults: [.failure]) XCTAssertEqual(result, "3 (0 sec)")