Skip to content

Commit 6552701

Browse files
author
Alex da Franca
committed
Refactor code
1 parent 2e62561 commit 6552701

17 files changed

Lines changed: 214 additions & 345 deletions

.swiftpm/xcode/xcshareddata/xcschemes/xcresultparser.xcscheme

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
</CommandLineArgument>
8585
<CommandLineArgument
8686
argument = "/Users/alex/Work/__OwnProjects/myGithub/xcresultparser/Tests/XcresultparserTests/TestAssets/parametrized.xcresult"
87-
isEnabled = "NO">
87+
isEnabled = "YES">
8888
</CommandLineArgument>
8989
<CommandLineArgument
9090
argument = "-d"
@@ -124,7 +124,7 @@
124124
</CommandLineArgument>
125125
<CommandLineArgument
126126
argument = "-o html"
127-
isEnabled = "NO">
127+
isEnabled = "YES">
128128
</CommandLineArgument>
129129
<CommandLineArgument
130130
argument = "-t FRBNetworking"
@@ -148,7 +148,7 @@
148148
</CommandLineArgument>
149149
<CommandLineArgument
150150
argument = "-h"
151-
isEnabled = "YES">
151+
isEnabled = "NO">
152152
</CommandLineArgument>
153153
<CommandLineArgument
154154
argument = "-o md"

CommandlineTool/main.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,11 @@ struct xcresultparser: ParsableCommand {
115115
}
116116

117117
private func outputIssuesJSON(for xcresult: String, format: OutputFormat) throws {
118-
guard let converter = IssuesJSON(
118+
let converter = try IssuesJSON(
119119
with: URL(fileURLWithPath: xcresult),
120120
projectRoot: projectRoot ?? "",
121121
excludedPaths: excludedPaths
122-
) else {
123-
throw ParseError.argumentError
124-
}
122+
)
125123
let rslt = try converter.jsonString(format: format, quiet: quiet == 1)
126124
writeToStdOut(rslt)
127125
}
@@ -140,27 +138,23 @@ struct xcresultparser: ParsableCommand {
140138
for xcresult: String,
141139
with format: TestReportFormat
142140
) throws {
143-
guard let junitXML = JunitXML(
141+
let junitXML = try JunitXML(
144142
with: URL(fileURLWithPath: xcresult),
145143
projectRoot: projectRoot ?? "",
146144
format: format
147-
) else {
148-
throw ParseError.argumentError
149-
}
145+
)
150146
writeToStdOut(junitXML.xmlString)
151147
}
152148

153149
private func outputDescription(for xcresult: String) throws {
154-
guard let resultParser = XCResultFormatter(
150+
let resultParser = try XCResultFormatter(
155151
with: URL(fileURLWithPath: xcresult),
156152
formatter: outputFormatter,
157153
coverageTargets: coverageTargets,
158154
failedTestsOnly: failedTestsOnly == 1,
159155
summaryFields: summaryFields ?? "errors|warnings|analyzerWarnings|tests|failed|skipped|duration|date",
160156
coverageReportFormat: CoverageReportFormat(string: coverageReportFormat)
161-
) else {
162-
throw ParseError.argumentError
163-
}
157+
)
164158
writeToStdOutLn(resultParser.documentPrefix(title: "XCResults"))
165159
writeToStdOutLn(resultParser.summary)
166160
if noTestResult == 0 {

Scripts/notarize.sh

100644100755
File mode changed.

Scripts/runSonar.sh

100644100755
File mode changed.

Scripts/testAndRunSonar.sh

100644100755
File mode changed.

Sources/xcresultparser/CoverageConverter.swift

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,42 @@ public class CoverageConverter {
5656
let xcresultToolClient: XCResultToolProviding
5757
let xccovClient: XCCovProviding
5858

59-
public init(
59+
public convenience init(
6060
with url: URL,
6161
projectRoot: String = "",
6262
coverageTargets: [String] = [],
6363
excludedPaths: [String] = [],
6464
strictPathnames: Bool
6565
) throws {
66-
let shell = DependencyFactory.createShell()
67-
let resolvedXCResultToolClient = DependencyFactory.createXCResultToolClient(shell)
68-
let resolvedXCCovClient = DependencyFactory.createXCCovClient(shell)
66+
try self.init(
67+
with: url,
68+
projectRoot: projectRoot,
69+
coverageTargets: coverageTargets,
70+
excludedPaths: excludedPaths,
71+
strictPathnames: strictPathnames,
72+
xcResultToolClient: XCResultToolClient(),
73+
xcCovClient: XCCovClient()
74+
)
75+
}
76+
77+
init(
78+
with url: URL,
79+
projectRoot: String = "",
80+
coverageTargets: [String] = [],
81+
excludedPaths: [String] = [],
82+
strictPathnames: Bool,
83+
xcResultToolClient: XCResultToolProviding,
84+
xcCovClient: XCCovProviding
85+
) throws {
6986
let report: CoverageReport
7087
do {
71-
report = try resolvedXCCovClient.getCoverageReport(path: url)
88+
report = try xcCovClient.getCoverageReport(path: url)
7289
} catch {
7390
throw CoverageConverterError.couldNotLoadCoverageReport
7491
}
7592

76-
xcresultToolClient = resolvedXCResultToolClient
77-
xccovClient = resolvedXCCovClient
93+
self.xcresultToolClient = xcResultToolClient
94+
xccovClient = xcCovClient
7895
resultFileURL = url
7996
coverageReport = report
8097
self.projectRoot = projectRoot
@@ -99,7 +116,7 @@ public class CoverageConverter {
99116
projectRoot: projectRoot
100117
)
101118
self.excludedPaths = Set(excludedPaths)
102-
startTime = if let summary = try? resolvedXCResultToolClient.getTestSummary(path: url) {
119+
startTime = if let summary = try? xcResultToolClient.getTestSummary(path: url) {
103120
summary.startTime
104121
} else {
105122
nil

Sources/xcresultparser/DataProviders/JunitXML/XCResultToolJunitXMLDataProvider.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,9 @@ struct XCResultToolJunitXMLDataProvider: JunitXMLDataProviding {
1111
private let summary: XCSummary
1212
private let tests: XCTests
1313

14-
init?(url: URL, client: XCResultToolClient = XCResultToolClient()) {
15-
guard let summary = try? client.getTestSummary(path: url),
16-
let tests = try? client.getTests(path: url) else {
17-
return nil
18-
}
19-
self.summary = summary
20-
self.tests = tests
14+
init(url: URL, client: XCResultToolProviding = XCResultToolClient()) throws {
15+
summary = try client.getTestSummary(path: url)
16+
tests = try client.getTests(path: url)
2117
}
2218

2319
var metrics: JunitInvocationMetrics {

Sources/xcresultparser/Extensions/String+MD5.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ import Foundation
99

1010
extension String {
1111
func md5() -> String {
12-
let digest = Insecure.MD5.hash(data: Data(utf8))
13-
return digest.map { String(format: "%02hhx", $0) }.joined()
12+
return Data(utf8).md5()
1413
}
1514

1615
func sha256() -> String {

Sources/xcresultparser/IssuesJSON.swift

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,28 @@ public struct IssuesJSON {
1717
let buildResults: XCBuildResults
1818
let excludedPaths: Set<String>
1919

20-
public init?(
20+
public init(
2121
with url: URL,
2222
projectRoot: String = "",
2323
excludedPaths: [String] = []
24-
) {
25-
let client = XCResultToolClient()
26-
guard let buildResults = try? client.getBuildResults(path: url),
27-
let checkdata = try? Data(contentsOf: url.appendingPathComponent("Info.plist")) else {
28-
return nil
29-
}
30-
self.buildResults = buildResults
31-
checkName = checkdata.md5()
24+
) throws {
25+
try self.init(
26+
with: url,
27+
projectRoot: projectRoot,
28+
excludedPaths: excludedPaths,
29+
xcResultToolClient: XCResultToolClient()
30+
)
31+
}
32+
33+
init(
34+
with url: URL,
35+
projectRoot: String = "",
36+
excludedPaths: [String] = [],
37+
xcResultToolClient: XCResultToolProviding
38+
) throws {
39+
buildResults = try xcResultToolClient.getBuildResults(path: url)
40+
let checkdata = try? Data(contentsOf: url.appendingPathComponent("Info.plist"))
41+
checkName = checkdata?.md5() ?? ""
3242
self.projectRoot = projectRoot
3343
self.excludedPaths = Set(excludedPaths)
3444
}

Sources/xcresultparser/JunitXML.swift

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public struct JunitXML: XmlSerializable {
5050
private let projectRoot: URL?
5151
private let testReportFormat: TestReportFormat
5252
private let relativePathNames: Bool
53+
private let shell: Commandline
5354

5455
private let nodeNames: NodeNames
5556

@@ -62,14 +63,13 @@ public struct JunitXML: XmlSerializable {
6263

6364
// MARK: - Initializer
6465

65-
public init?(
66+
public init(
6667
with url: URL,
6768
projectRoot: String = "",
6869
format: TestReportFormat = .junit,
6970
relativePathNames: Bool = true
70-
) {
71-
let dataProvider = XCResultToolJunitXMLDataProvider(url: url)
72-
guard let dataProvider else { return nil }
71+
) throws {
72+
let dataProvider = try XCResultToolJunitXMLDataProvider(url: url)
7373
self.init(
7474
dataProvider: dataProvider,
7575
projectRoot: projectRoot,
@@ -82,7 +82,8 @@ public struct JunitXML: XmlSerializable {
8282
dataProvider: JunitXMLDataProviding,
8383
projectRoot: String = "",
8484
format: TestReportFormat = .junit,
85-
relativePathNames: Bool = true
85+
relativePathNames: Bool = true,
86+
shell: Commandline = Shell()
8687
) {
8788
self.dataProvider = dataProvider
8889
var isDirectory: ObjCBool = false
@@ -100,6 +101,7 @@ public struct JunitXML: XmlSerializable {
100101
NodeNames.defaultNodeNames
101102
}
102103
self.relativePathNames = relativePathNames
104+
self.shell = shell
103105
}
104106

105107
func createRootElement() -> XMLElement {
@@ -206,7 +208,8 @@ public struct JunitXML: XmlSerializable {
206208
let node = subGroup.sonarFileXML(
207209
projectRoot: projectRoot,
208210
configurationName: configurationName,
209-
relativePathNames: relativePathNames
211+
relativePathNames: relativePathNames,
212+
shell: shell
210213
)
211214
let testcases = createTestCases(
212215
for: subGroup.nameString, tests: subGroup.subtests, failureSummaries: failureSummaries
@@ -239,7 +242,8 @@ public struct JunitXML: XmlSerializable {
239242
group.sonarFileXML(
240243
projectRoot: projectRoot,
241244
configurationName: configurationName,
242-
relativePathNames: relativePathNames
245+
relativePathNames: relativePathNames,
246+
shell: shell
243247
) : group.testSuiteXML(numFormatter: numFormatter)
244248

245249
for thisTest in tests {
@@ -372,11 +376,11 @@ private extension JunitTestGroup {
372376
return testsuite
373377
}
374378

375-
func sonarFileXML(projectRoot: URL?, configurationName: String, relativePathNames: Bool = true) -> XMLElement {
379+
func sonarFileXML(projectRoot: URL?, configurationName: String, relativePathNames: Bool = true, shell: Commandline) -> XMLElement {
376380
let testsuite = XMLElement(name: "file")
377381
testsuite.addAttribute(
378382
name: "path",
379-
stringValue: classPath(in: projectRoot, relativePathNames: relativePathNames)
383+
stringValue: classPath(in: projectRoot, relativePathNames: relativePathNames, shell: shell)
380384
)
381385
testsuite.addAttribute(name: "configuration", stringValue: configurationName)
382386
return testsuite
@@ -406,19 +410,19 @@ private extension JunitTestGroup {
406410

407411
// MARK: - Private interface
408412

409-
private func classPath(in projectRootUrl: URL?, relativePathNames: Bool = true) -> String {
413+
private func classPath(in projectRootUrl: URL?, relativePathNames: Bool = true, shell: Commandline) -> String {
410414
guard let projectRootUrl else {
411415
return identifierString
412416
}
413417
Self.cacheLock.lock()
414418
defer { Self.cacheLock.unlock() }
415419
if Self.cachedPathnames.isEmpty {
416-
cacheAllClassNames(in: projectRootUrl, relativePathNames: relativePathNames)
420+
cacheAllClassNames(in: projectRootUrl, relativePathNames: relativePathNames, shell: shell)
417421
}
418422
return Self.cachedPathnames[identifierString] ?? identifierString
419423
}
420424

421-
private func cacheAllClassNames(in projectRootUrl: URL, relativePathNames: Bool = true) {
425+
private func cacheAllClassNames(in projectRootUrl: URL, relativePathNames: Bool = true, shell: Commandline) {
422426
let program = "/usr/bin/grep"
423427
let grepPathArgument = relativePathNames ? "." : projectRootUrl.path
424428
let arguments = [
@@ -430,7 +434,7 @@ private extension JunitTestGroup {
430434
"^(?:public )?(?:final )?(?:public )?(?:(class|\\@implementation|struct) )[a-zA-Z0-9_]+",
431435
grepPathArgument
432436
]
433-
guard let filelistData = try? DependencyFactory.createShell().execute(program: program, with: arguments, at: projectRootUrl) else {
437+
guard let filelistData = try? shell.execute(program: program, with: arguments, at: projectRootUrl) else {
434438
return
435439
}
436440
let trimCharacterSet = CharacterSet.whitespacesAndNewlines.union(CharacterSet(charactersIn: ":"))

0 commit comments

Comments
 (0)