Skip to content

Commit

Permalink
Use the Swift template for the Swift swift-package-manager samples.
Browse files Browse the repository at this point in the history
  • Loading branch information
adammurdoch committed Dec 29, 2017
1 parent 89ab56f commit 9b56ff7
Show file tree
Hide file tree
Showing 18 changed files with 350 additions and 92 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ Hello, World!

## Application with static library dependencies (static-library)

This build demonstrates building and static libraries.
This build demonstrates building and using static libraries.

```
> cd static-library
Expand Down
139 changes: 95 additions & 44 deletions samples-dev/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@ task cleanSamples {
doLast {
def toDelete = []
[file("../swift"), file("../cpp")]*.eachFileRecurse(FileType.DIRECTORIES) { def dir ->
if ([/repo/, /build/, /\.gradle/, /.+\.xcworkspace/, /.+\.xcodeproj/].any { dir.name ==~ it }) {
if ([/repo/, /build/, /\.gradle/, /\.build/, /.+\.xcworkspace/, /.+\.xcodeproj/].any { dir.name ==~ it }) {
toDelete << dir
}
}
toDelete.each { it.deleteDir() }
}
}

clean.dependsOn cleanSamples
clean.dependsOn cleanSamples, cleanRepo

task configureNightlyWrapper {
doLast {
Expand Down Expand Up @@ -145,9 +145,9 @@ task cppStaticLibrary(type: SourceCopyTask) {
task cppSwiftPackageManager(type: SourceCopyTask) {
sampleDir = file("../cpp/swift-package-manager")

swiftPMProject("Sources/App").fromTemplate("cpp-app")
swiftPMProject("Sources/Utilities").fromTemplate("cpp-lib-with-api-dep")
swiftPMProject("Sources/List").fromTemplate("cpp-lib")
swiftPMProject(".", "App").fromTemplate("cpp-app")
swiftPMProject(".", "Utilities").fromTemplate("cpp-lib-with-api-dep")
swiftPMProject(".", "List").fromTemplate("cpp-lib")
}

def swiftUtilsLib = SwiftLibraryTemplate.of("swift-lib-with-api-dep", "Utilities")
Expand Down Expand Up @@ -215,6 +215,14 @@ task swiftCppDependencies(type: SourceCopyTask) {
appProject("app").fromTemplate("swift-app")
}

task swiftSwiftPackageManager(type: SourceCopyTask) {
sampleDir = file("../swift/swift-package-manager")

swiftPMProject(".", "App").fromTemplate("swift-app")
swiftPMProject(".", "Utilities").fromTemplate(swiftUtilsLib)
swiftPMProject(".", "List").fromTemplate(swiftListLib)
}

task generateCppRepos(type: GitRepoTask) {
sampleDir = file("../cpp/source-dependencies/repos")
}
Expand All @@ -232,34 +240,30 @@ class SourceCopyTask extends DefaultTask {
def go() {
def cleaned = new HashSet()
projects.values().each { p ->
def projectDir = sampleDir.dir(p.projectDir).get().asFile
def modules = p.includedModules.collect { "import $it" as String }
def testModules = p.includedModules.collect { "@testable import $it" as String }
p.templates.each { t ->
def templateBaseDir = templatesDir.dir(t.templateName).get().asFile
p.visitDirs { s, d ->
def srcDir = new File(templateBaseDir, s)
if (!srcDir.directory) {
return
}
def destDir = new File(projectDir, d)
println "copy $srcDir to $destDir"
if (cleaned.add(destDir)) {
// TODO - generate the test main.swift
project.delete project.fileTree(destDir, { exclude '**/main.swift' })
}
project.copy {
from srcDir
into destDir
filter { line ->
if (modules.contains(line)) {
return null
}
if (testModules.contains(line)) {
return "@testable import " + p.module
}
line
p.visitDirs { src, dest->
def srcDir = templatesDir.dir(src).get().asFile
if (!srcDir.directory) {
return
}
def destDir = sampleDir.dir(dest).get().asFile
println "copy $srcDir to $destDir"
if (cleaned.add(destDir)) {
// TODO - generate the test main.swift
project.delete project.fileTree(destDir, { exclude '**/main.swift' })
}
project.copy {
from srcDir
into destDir
filter { line ->
if (modules.contains(line)) {
return null
}
if (testModules.contains(line)) {
return "@testable import " + p.module
}
line
}
}
}
Expand All @@ -274,15 +278,15 @@ class SourceCopyTask extends DefaultTask {
return add(new LibTarget(projectDir))
}

SwiftPmTarget swiftPMProject(String projectDir) {
return add(new SwiftPmTarget(projectDir))
SwiftPmTarget swiftPMProject(String projectDir, String targetName) {
return add(new SwiftPmTarget(projectDir, targetName))
}

private def add(TemplateTarget target) {
if (projects.containsKey(target.projectDir)) {
if (projects.containsKey(target.key)) {
return projects.get(target.projectDir)
}
projects.put(target.projectDir, target)
projects.put(target.key, target)
return target
}

Expand Down Expand Up @@ -313,10 +317,42 @@ class SourceCopyTask extends DefaultTask {
return libs.collect { it.module }
}

abstract String getKey()

/**
* Visits each src, dest directory pair for this project.
* @param cl
*/
abstract void visitDirs(Closure cl)
}

static class AppTarget extends TemplateTarget {
static abstract class GradleTarget extends TemplateTarget {
GradleTarget(String projectDir) {
super(projectDir)
}

@Override
String getKey() {
return projectDir
}

@Override
void visitDirs(Closure cl) {
templates.each { template ->
visitDirMappings { src, dest ->
cl.call("${template.templateName}/${src}", "${projectDir}/${dest}")
}
}
}

/**
* Visits each candidate src, dest directory pair for this project.
* @param cl
*/
abstract void visitDirMappings(Closure cl)
}

static class AppTarget extends GradleTarget {
AppTarget(String projectDir) {
super(projectDir)
}
Expand All @@ -327,7 +363,7 @@ class SourceCopyTask extends DefaultTask {
}

@Override
void visitDirs(Closure cl) {
void visitDirMappings(Closure cl) {
cl.call("src/main/cpp", "src/main/cpp")
cl.call("src/main/headers", "src/main/headers")
cl.call("src/main/public", "src/main/headers")
Expand All @@ -336,13 +372,13 @@ class SourceCopyTask extends DefaultTask {
}
}

static class LibTarget extends TemplateTarget {
static class LibTarget extends GradleTarget {
LibTarget(String projectDir) {
super(projectDir)
}

@Override
void visitDirs(Closure cl) {
void visitDirMappings(Closure cl) {
cl.call("src/main/cpp", "src/main/cpp")
cl.call("src/main/headers", "src/main/headers")
cl.call("src/main/public", "src/main/public")
Expand All @@ -352,17 +388,32 @@ class SourceCopyTask extends DefaultTask {
}

static class SwiftPmTarget extends TemplateTarget {
SwiftPmTarget(String projectDir) {
final String targetName

SwiftPmTarget(String projectDir, String targetName) {
super(projectDir)
this.targetName = targetName
}

@java.lang.Override
String getModule() {
return targetName
}

@java.lang.Override
String getKey() {
return "$projectDir:$targetName"
}

@Override
void visitDirs(Closure cl) {
cl.call("src/main/cpp", ".")
cl.call("src/main/headers", "include")
cl.call("src/main/public", "include")
cl.call("src/main/swift", ".")
cl.call("src/test/swift", "Test")
templates.each { template ->
cl.call("${template.templateName}/src/main/cpp", "${projectDir}/Sources/${targetName}")
cl.call("${template.templateName}/src/main/headers", "${projectDir}/Sources/${targetName}/include")
cl.call("${template.templateName}/src/main/public", "${projectDir}/Sources/${targetName}/include")
cl.call("${template.templateName}/src/main/swift", "${projectDir}/Sources/${targetName}")
cl.call("${template.templateName}/src/test/swift", "${projectDir}/Tests/${targetName}Tests")
}
}
}
}
Expand Down
9 changes: 5 additions & 4 deletions swift/swift-package-manager/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import PackageDescription
let package = Package(
name: "App",
targets: [
Target(name: "Greeter"),
Target(name: "App", dependencies: ["Greeter"]),
Target(name: "AppTests"),
Target(name: "GreeterTests")
Target(name: "List"),
Target(name: "Utilities", dependencies: ["List"]),
Target(name: "App", dependencies: ["Utilities"]),
Target(name: "ListTests"),
Target(name: "UtilitiesTests")
]
)
9 changes: 6 additions & 3 deletions swift/swift-package-manager/Sources/App/main.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import Greeter
/*
* A simple hello world application. Uses a library to tokenize and join a string and prints the result.
*/
import Utilities

let greeter = Greeter()
greeter.sayHello()
let tokens = Util.split("Hello, World!")
print(Util.join(tokens))
6 changes: 0 additions & 6 deletions swift/swift-package-manager/Sources/Greeter/greeter.swift

This file was deleted.

51 changes: 51 additions & 0 deletions swift/swift-package-manager/Sources/List/LinkedList.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* A linked list implementation.
*/

public class LinkedList {
var head: Node?
var tail: Node?

public init() {
}

/*
* Adds the given string to this list.
*/
public func add(_ s: String) {
let n = Node(data: s)
if (head == nil) {
head = n
tail = head
} else {
tail!.next = n
tail = n
}
}

/*
* Returns the string at the given index.
*/
public func get(_ i: Int) -> String {
var n = head
var c = i
while (c > 0 && n != nil) {
n = n!.next
c = c - 1
}
return n!.data
}

/*
* Returns the size of this list.
*/
public func size() -> Int {
var c = 0
var n = head
while (n != nil) {
c = c + 1
n = n!.next
}
return c
}
}
9 changes: 9 additions & 0 deletions swift/swift-package-manager/Sources/List/Node.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// A linked list node
class Node {
let data: String
var next: Node?

init(data: String) {
self.data = data
}
}
49 changes: 49 additions & 0 deletions swift/swift-package-manager/Sources/Utilities/Util.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* A class that provides several string utility functions.
*/
import List

public class Util {
/*
* Splits the given string into a list of tokens. Tokens are separated by one or more whitespace characters.
*/
public class func split(_ s: String) -> LinkedList {
let l = LinkedList()
var pos = s.startIndex
var current = String()
while (pos < s.endIndex) {
if (s[pos] != " ") {
current.append(s[pos])
pos = s.index(after: pos)
} else {
if (!current.isEmpty) {
l.add(current)
}
current = String()
repeat {
pos = s.index(after: pos)
} while (pos < s.endIndex && s[pos] == " ")
}
}
if (!current.isEmpty) {
l.add(current)
}
return l
}

/*
* Joins the list of tokens into a string, separated by space characters.
*/
public class func join(_ l: LinkedList) -> String {
var i = 0
var formatted = ""
while (i < l.size()) {
if (i > 0) {
formatted.append(" ")
}
formatted.append(l.get(i))
i = i + 1
}
return formatted
}
}
12 changes: 0 additions & 12 deletions swift/swift-package-manager/Tests/AppTests/AppTests.swift

This file was deleted.

Loading

0 comments on commit 9b56ff7

Please sign in to comment.