From abb1706d870c212a6659359a7be633e433495bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= Date: Wed, 13 Feb 2019 16:32:00 +0100 Subject: [PATCH] Add support for including single Swift files via `// include: path/to/File.swift` --- Sources/BeakCore/BeakFile.swift | 36 +++++++++++++++++++++++++-------- Tests/BeakTests/BeakTests.swift | 5 +++-- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Sources/BeakCore/BeakFile.swift b/Sources/BeakCore/BeakFile.swift index 7b370da..091f5e5 100644 --- a/Sources/BeakCore/BeakFile.swift +++ b/Sources/BeakCore/BeakFile.swift @@ -3,10 +3,21 @@ import PathKit import SourceKittenFramework public struct BeakFile: Equatable { - public let contents: String - public let dependencies: [Dependency] - public let functions: [Function] + public let includedFiles: [BeakFile] + + private let ownDependencies: [Dependency] + private let ownFunctions: [Function] + + public var dependencies: [Dependency] { + let includedFilesDependencies: [Dependency] = includedFiles.reduce([]) { $0 + $1.dependencies } + return includedFilesDependencies + ownDependencies + } + + public var functions: [Function] { + let includedFilesFunctions: [Function] = includedFiles.reduce([]) { $0 + $1.functions } + return includedFilesFunctions + ownFunctions + } public init(path: Path) throws { guard path.exists else { @@ -22,8 +33,8 @@ public struct BeakFile: Equatable { public init(contents: String) throws { self.contents = contents - functions = try SwiftParser.parseFunctions(file: contents) - dependencies = contents + ownFunctions = try SwiftParser.parseFunctions(file: contents) + ownDependencies = contents .split(separator: "\n") .map(String.init) .filter { $0.hasPrefix("// beak:") } @@ -31,11 +42,20 @@ public struct BeakFile: Equatable { .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } .filter { !$0.isEmpty } .map(Dependency.init) + includedFiles = contents + .split(separator: "\n") + .map(String.init) + .filter { $0.hasPrefix("// include:") } + .map { $0.replacingOccurrences(of: "// include:", with: "") } + .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } + .filter { $0.hasSuffix(".swift") } + .compactMap { try? BeakFile(path: Path($0)) } } - public init(contents: String, dependencies: [Dependency], functions: [Function]) { + public init(contents: String, dependencies: [Dependency], functions: [Function], includedFiles: [BeakFile]) { self.contents = contents - self.dependencies = dependencies - self.functions = functions + self.ownDependencies = dependencies + self.ownFunctions = functions + self.includedFiles = includedFiles } } diff --git a/Tests/BeakTests/BeakTests.swift b/Tests/BeakTests/BeakTests.swift index a51aa96..57fac2d 100644 --- a/Tests/BeakTests/BeakTests.swift +++ b/Tests/BeakTests/BeakTests.swift @@ -214,7 +214,8 @@ class BeakTests: XCTestCase { throwing: true, docsDescription: "Releases a new version of Beak" ), - ] + ], + includedFiles: [] ) try expect(beakFile) == expectedBeakFile @@ -277,7 +278,7 @@ class BeakTests: XCTestCase { .init(name: "repo3", package: "https://github.com/name2/repo3.git", requirement: ".exact(\"4.3.0\")", libraries: ["repo3"]), ] - let beakFile = BeakFile(contents: "", dependencies: dependencies, functions: []) + let beakFile = BeakFile(contents: "", dependencies: dependencies, functions: [], includedFiles: []) let package = PackageManager.createPackage(name: "Test", beakFile: beakFile) let expectedPackage = """