From 086160c002a7ec1e38a76bfb1a4db19c1008ed62 Mon Sep 17 00:00:00 2001 From: Franco Meloni Date: Mon, 28 Oct 2019 22:39:30 +0000 Subject: [PATCH] Add checks parser --- Sources/RocketLib/Checks.swift | 14 ++++++++++ Sources/RocketLib/Checks/Check.swift | 4 +++ .../CleanGitStatusCheck.swift | 10 ++++++- .../PreReleaseChecks/PreReleaseCheck.swift | 3 --- .../RocketLib/PreReleaseChecksParser.swift | 21 +++++++++++++++ Tests/RocketTests/ChecksParserTests.swift | 26 +++++++++++++++++++ 6 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 Sources/RocketLib/Checks.swift create mode 100644 Sources/RocketLib/Checks/Check.swift rename Sources/RocketLib/{PreReleaseChecks => Checks}/CleanGitStatusCheck.swift (55%) delete mode 100644 Sources/RocketLib/PreReleaseChecks/PreReleaseCheck.swift create mode 100644 Sources/RocketLib/PreReleaseChecksParser.swift create mode 100644 Tests/RocketTests/ChecksParserTests.swift diff --git a/Sources/RocketLib/Checks.swift b/Sources/RocketLib/Checks.swift new file mode 100644 index 0000000..75b30e3 --- /dev/null +++ b/Sources/RocketLib/Checks.swift @@ -0,0 +1,14 @@ +enum PreReleseCheck: String { + case cleanGit = "clean_git" + + func check(dictionary _: [String: Any]?) -> Check { + return checkType.init() + } + + private var checkType: Check.Type { + switch self { + case .cleanGit: + return CleanGitStatusCheck.self + } + } +} diff --git a/Sources/RocketLib/Checks/Check.swift b/Sources/RocketLib/Checks/Check.swift new file mode 100644 index 0000000..8e4fe43 --- /dev/null +++ b/Sources/RocketLib/Checks/Check.swift @@ -0,0 +1,4 @@ +protocol Check { + init() + func check() -> Bool +} diff --git a/Sources/RocketLib/PreReleaseChecks/CleanGitStatusCheck.swift b/Sources/RocketLib/Checks/CleanGitStatusCheck.swift similarity index 55% rename from Sources/RocketLib/PreReleaseChecks/CleanGitStatusCheck.swift rename to Sources/RocketLib/Checks/CleanGitStatusCheck.swift index fed3934..6d066d9 100644 --- a/Sources/RocketLib/PreReleaseChecks/CleanGitStatusCheck.swift +++ b/Sources/RocketLib/Checks/CleanGitStatusCheck.swift @@ -1,8 +1,16 @@ import Foundation -struct CleanGitStatusCheck: PreReleaseCheck { +struct CleanGitStatusCheck: Check { let launcher: ScriptLaunching + init() { + self.init(launcher: ScriptLauncher()) + } + + init(launcher: ScriptLaunching) { + self.launcher = launcher + } + func check() -> Bool { let result = try? launcher.launchScript(withContent: "git diff --name-only", version: nil) diff --git a/Sources/RocketLib/PreReleaseChecks/PreReleaseCheck.swift b/Sources/RocketLib/PreReleaseChecks/PreReleaseCheck.swift deleted file mode 100644 index 3dbc736..0000000 --- a/Sources/RocketLib/PreReleaseChecks/PreReleaseCheck.swift +++ /dev/null @@ -1,3 +0,0 @@ -protocol PreReleaseCheck { - func check() -> Bool -} diff --git a/Sources/RocketLib/PreReleaseChecksParser.swift b/Sources/RocketLib/PreReleaseChecksParser.swift new file mode 100644 index 0000000..506647b --- /dev/null +++ b/Sources/RocketLib/PreReleaseChecksParser.swift @@ -0,0 +1,21 @@ +import Logger + +enum ChecksParser { + enum CodingKeys: String { + case preReleaseChecks = "pre_release_checks" + } + + public static func parsePreReleaseChecks(fromDictionary dictionary: [String: Any]) -> [Check] { + let checksArray: [Any] = dictionary[CodingKeys.preReleaseChecks] ?? [] + return checksArray.compactMap(parseElement) + } + + private static func parseElement(_ element: Any) -> Check? { + if let string = element as? String, + let check = PreReleseCheck(rawValue: string) { + return check.check(dictionary: nil) + } else { + return nil + } + } +} diff --git a/Tests/RocketTests/ChecksParserTests.swift b/Tests/RocketTests/ChecksParserTests.swift new file mode 100644 index 0000000..4751072 --- /dev/null +++ b/Tests/RocketTests/ChecksParserTests.swift @@ -0,0 +1,26 @@ +import Nimble +@testable import RocketLib +import XCTest + +final class ChecksParserTests: XCTestCase { + func testItParsesCorrectlyAValidDictionary() { + let dictionary = ["pre_release_checks": ["clean_git"]] + + let checks = ChecksParser.parsePreReleaseChecks(fromDictionary: dictionary) + + expect(checks.count) == 1 + expect(checks[0]).to(beAKindOf(CleanGitStatusCheck.self)) + } + + func testItIgnoresTheInvalidSteps() { + let dictionary = ["pre_release_checks": [ + "clean_git", + "invalid", + ]] + + let checks = ChecksParser.parsePreReleaseChecks(fromDictionary: dictionary) + + expect(checks.count) == 1 + expect(checks[0]).to(beAKindOf(CleanGitStatusCheck.self)) + } +}