diff --git a/DangerfileExtensions/ChangelogCheck.swift b/DangerfileExtensions/ChangelogCheck.swift index d17c7da9..ccc657d3 100644 --- a/DangerfileExtensions/ChangelogCheck.swift +++ b/DangerfileExtensions/ChangelogCheck.swift @@ -1,3 +1,5 @@ +import Danger + func checkChangelog() { let allSourceFiles = danger.git.modifiedFiles + danger.git.createdFiles diff --git a/Sources/RunnerLib/Files Import/DangerFileGenerator.swift b/Sources/RunnerLib/Files Import/DangerFileGenerator.swift index 632d3e80..2bc20834 100644 --- a/Sources/RunnerLib/Files Import/DangerFileGenerator.swift +++ b/Sources/RunnerLib/Files Import/DangerFileGenerator.swift @@ -25,6 +25,25 @@ public final class DangerFileGenerator { dangerContent.replaceSubrange(replacementRange, with: fileContent) }) + mergeImports(in: &dangerContent) + try dangerContent.write(toFile: fileName, atomically: false, encoding: .utf8) } } + +private extension DangerFileGenerator { + func mergeImports(in content: inout String) { + var lines = content + .split(separator: "\n", + omittingEmptySubsequences: false) + .map(String.init) + + let imports = Set( + lines.map { $0.trimmingCharacters(in: .whitespaces) } + .filter { $0.hasPrefix("import ") } + ) + lines.removeAll { imports.contains($0.trimmingCharacters(in: .whitespaces)) } + lines.insert(contentsOf: imports.sorted(), at: 0) + content = lines.joined(separator: "\n") + } +} diff --git a/Tests/RunnerLibTests/DangerFileGeneratorTests.swift b/Tests/RunnerLibTests/DangerFileGeneratorTests.swift index 2bbc661a..dfc7fe87 100644 --- a/Tests/RunnerLibTests/DangerFileGeneratorTests.swift +++ b/Tests/RunnerLibTests/DangerFileGeneratorTests.swift @@ -43,7 +43,11 @@ final class DangerFileGeneratorTests: XCTestCase { } func testItGeneratesTheCorrectFileWhenThereAreNoImports() throws { - try generator.generateDangerFile(fromContent: contentWithoutImports, fileName: generatedFilePath, logger: logger) + try generator.generateDangerFile( + fromContent: headerForContentWithoutImports + contentWithoutImports, + fileName: generatedFilePath, + logger: logger + ) try assertSnapshot(matching: generatedContent(), as: .lines) } @@ -83,9 +87,29 @@ final class DangerFileGeneratorTests: XCTestCase { try assertSnapshot(matching: generatedContent(), as: .lines) } + + func testItGeneratesTheCorrectFileWhenThereIsAreImportsWithIndent() throws { + try? file2Content.write(toFile: file2Path, atomically: true, encoding: .utf8) + try? file3Content.write(toFile: file3Path, atomically: true, encoding: .utf8) + + createdFiles.append(file2Path) + createdFiles.append(file3Path) + + try generator.generateDangerFile(fromContent: contentWithImportsWithIndent, fileName: generatedFilePath, logger: logger) + + try assertSnapshot(matching: generatedContent(), as: .lines) + } } extension DangerFileGeneratorTests { + private var headerForContentWithoutImports: String { + """ + import Danger + + let danger = Danger() + """ + "\n\n" + } + private var contentWithoutImports: String { """ message("Text") @@ -94,12 +118,25 @@ extension DangerFileGeneratorTests { } private var contentWithOneImport: String { - "// fileImport: " + file1Path + "\n" + contentWithoutImports + headerForContentWithoutImports + + "// fileImport: " + file1Path + "\n" + + contentWithoutImports } private var contentWithMultipleImports: String { - "// fileImport: " + file2Path + "\n\n" + - "// fileImport: " + file3Path + "\n" + contentWithOneImport + "// fileImport: " + file2Path + "\n\n" + + "// fileImport: " + file3Path + "\n" + + contentWithOneImport + } + + private var contentWithImportsWithIndent: String { + headerForContentWithoutImports + + "if flag {\n" + + " // fileImport: " + file2Path + "\n" + + "} else {\n" + + " // fileImport: " + file3Path + "\n" + + "}\n" + + contentWithoutImports } private var file1Content: String { @@ -111,12 +148,17 @@ extension DangerFileGeneratorTests { private var file2Content: String { """ + import Danger + file2Content ⚠️ """ } private var file3Content: String { """ + import Danger + import Foundation + file3Content 👩‍👩‍👦‍👦 secondLine really really really really really really really really really really really really \ diff --git a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenOneOfTheImportedFilesIsMissing.1.txt b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenOneOfTheImportedFilesIsMissing.1.txt index a0323262..2069fa4f 100644 --- a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenOneOfTheImportedFilesIsMissing.1.txt +++ b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenOneOfTheImportedFilesIsMissing.1.txt @@ -1,6 +1,11 @@ +import Danger + file2Content ⚠️ // fileImport: GeneratedTestFile3.swift + +let danger = Danger() + file1Content 👍🏻 secondLine message("Text") diff --git a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereAreNoImports.1.txt b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereAreNoImports.1.txt index 9a29625b..117d3cea 100644 --- a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereAreNoImports.1.txt +++ b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereAreNoImports.1.txt @@ -1,2 +1,6 @@ +import Danger + +let danger = Danger() + message("Text") message("Another Text") \ No newline at end of file diff --git a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsASingleImport.1.txt b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsASingleImport.1.txt index ed92390e..1503398e 100644 --- a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsASingleImport.1.txt +++ b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsASingleImport.1.txt @@ -1,3 +1,7 @@ +import Danger + +let danger = Danger() + file1Content 👍🏻 secondLine message("Text") diff --git a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreImportsWithIndent.1.txt b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreImportsWithIndent.1.txt new file mode 100644 index 00000000..a400ab9a --- /dev/null +++ b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreImportsWithIndent.1.txt @@ -0,0 +1,16 @@ +import Danger +import Foundation + +let danger = Danger() + +if flag { + +file2Content ⚠️ +} else { + +file3Content 👩‍👩‍👦‍👦 +secondLine +really really really really really really really really really really really really really really really really really really really really really really long text +} +message("Text") +message("Another Text") \ No newline at end of file diff --git a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreMultipleImports.1.txt b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreMultipleImports.1.txt index 90316515..8eb6ab7e 100644 --- a/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreMultipleImports.1.txt +++ b/Tests/RunnerLibTests/__Snapshots__/DangerFileGeneratorTests/testItGeneratesTheCorrectFileWhenThereIsAreMultipleImports.1.txt @@ -1,8 +1,15 @@ +import Danger +import Foundation + file2Content ⚠️ + file3Content 👩‍👩‍👦‍👦 secondLine really really really really really really really really really really really really really really really really really really really really really really long text + +let danger = Danger() + file1Content 👍🏻 secondLine message("Text")