@@ -13,59 +13,151 @@ import func libc.fclose
13
13
import PackageType
14
14
import POSIX
15
15
16
- func initPackage( ) throws {
17
- let rootd = try POSIX . getcwd ( )
18
- let pkgname = rootd. basename
19
- let manifest = Path . join ( rootd, Manifest . filename)
20
- let gitignore = Path . join ( rootd, " .gitignore " )
21
- let sources = Path . join ( rootd, " Sources " )
22
- let tests = Path . join ( rootd, " Tests " )
23
- let main = Path . join ( sources, " main.swift " )
24
-
25
- guard !manifest. exists else {
26
- throw Error . ManifestAlreadyExists
16
+ final class InitPackage {
17
+
18
+ enum InitMode {
19
+ case Library
20
+ case Executable
21
+ }
22
+
23
+ let mode : InitMode
24
+ let pkgname : String
25
+ let rootd : String
26
+
27
+ init ( mode: InitMode ) throws {
28
+ self . mode = mode
29
+ rootd = try POSIX . getcwd ( )
30
+ pkgname = rootd. basename
27
31
}
28
32
29
- let packageFP = try fopen ( manifest, mode: . Write)
30
- defer {
31
- fclose ( packageFP)
33
+ func writePackageStructure( ) throws {
34
+ print ( " Creating \( mode) package: \( pkgname) " )
35
+
36
+ try writeManifestFile ( )
37
+ try writeGitIgnore ( )
38
+ try writeSources ( )
39
+ try writeTests ( )
32
40
}
33
41
34
- print ( " Creating \( Manifest . filename) " )
35
- // print the manifest file
36
- try fputs ( " import PackageDescription \n " , packageFP)
37
- try fputs ( " \n " , packageFP)
38
- try fputs ( " let package = Package( \n " , packageFP)
39
- try fputs ( " name: \" \( pkgname) \" \n " , packageFP)
40
- try fputs ( " ) \n " , packageFP)
42
+ private func writeManifestFile( ) throws {
43
+ let manifest = Path . join ( rootd, Manifest . filename)
44
+ guard manifest. exists == false else {
45
+ throw Error . ManifestAlreadyExists
46
+ }
47
+
48
+ let packageFP = try fopen ( manifest, mode: . Write)
49
+ defer {
50
+ fclose ( packageFP)
51
+ }
52
+ print ( " Creating \( Manifest . filename) " )
53
+ // print the manifest file
54
+ try fputs ( " import PackageDescription \n " , packageFP)
55
+ try fputs ( " \n " , packageFP)
56
+ try fputs ( " let package = Package( \n " , packageFP)
57
+ try fputs ( " name: \" \( pkgname) \" \n " , packageFP)
58
+ try fputs ( " ) \n " , packageFP)
59
+ }
41
60
42
- if !gitignore. exists {
61
+ private func writeGitIgnore( ) throws {
62
+ let gitignore = Path . join ( rootd, " .gitignore " )
63
+ guard gitignore. exists == false else {
64
+ return
65
+ }
43
66
let gitignoreFP = try fopen ( gitignore, mode: . Write)
44
67
defer {
45
68
fclose ( gitignoreFP)
46
69
}
47
-
70
+
48
71
print ( " Creating .gitignore " )
49
72
// print the .gitignore
50
73
try fputs ( " .DS_Store \n " , gitignoreFP)
51
74
try fputs ( " /.build \n " , gitignoreFP)
52
75
try fputs ( " /Packages \n " , gitignoreFP)
53
76
}
54
77
55
- if !sources. exists {
78
+ private func writeSources( ) throws {
79
+ let sources = Path . join ( rootd, " Sources " )
80
+ guard sources. exists == false else {
81
+ return
82
+ }
56
83
print ( " Creating Sources/ " )
57
84
try mkdir ( sources)
58
-
59
- let mainFP = try fopen ( main, mode: . Write)
85
+
86
+ let sourceFileName = ( mode == . Executable) ? " main.swift " : " \( pkgname) .swift "
87
+ let sourceFile = Path . join ( sources, sourceFileName)
88
+ let sourceFileFP = try fopen ( sourceFile, mode: . Write)
60
89
defer {
61
- fclose ( mainFP)
90
+ fclose ( sourceFileFP)
91
+ }
92
+ print ( " Creating Sources/ \( sourceFileName) " )
93
+ switch mode {
94
+ case . Library:
95
+ try fputs ( " struct \( pkgname) { \n \n " , sourceFileFP)
96
+ try fputs ( " } \n " , sourceFileFP)
97
+ case . Executable:
98
+ try fputs ( " print( \" Hello, world! \" ) \n " , sourceFileFP)
62
99
}
63
- print ( " Creating Sources/main.swift " )
64
- try fputs ( " print( \" Hello, world! \" ) \n " , mainFP)
65
100
}
66
101
67
- if !tests. exists {
102
+ private func writeTests( ) throws {
103
+ let tests = Path . join ( rootd, " Tests " )
104
+ guard tests. exists == false else {
105
+ return
106
+ }
68
107
print ( " Creating Tests/ " )
69
108
try mkdir ( tests)
109
+ ///Only libraries are testable for now
110
+ if mode == . Library {
111
+ try writeLinuxMain ( testsPath: tests)
112
+ try writeTestFileStubs ( testsPath: tests)
113
+ }
114
+ }
115
+
116
+ private func writeLinuxMain( testsPath testsPath: String ) throws {
117
+ let linuxMain = Path . join ( testsPath, " LinuxMain.swift " )
118
+ let linuxMainFP = try fopen ( linuxMain, mode: . Write)
119
+ defer {
120
+ fclose ( linuxMainFP)
121
+ }
122
+ print ( " Creating Tests/LinuxMain.swift " )
123
+ try fputs ( " import XCTest \n " , linuxMainFP)
124
+ try fputs ( " @testable import \( pkgname) test \n \n " , linuxMainFP)
125
+ try fputs ( " XCTMain([ \n " , linuxMainFP)
126
+ try fputs ( " \t \( pkgname) (), \n " , linuxMainFP)
127
+ try fputs ( " ]) \n " , linuxMainFP)
128
+ }
129
+
130
+ private func writeTestFileStubs( testsPath testsPath: String ) throws {
131
+ let testModule = Path . join ( testsPath, pkgname)
132
+ print ( " Creating Tests/ \( pkgname) / " )
133
+ try mkdir ( testModule)
134
+
135
+ let testsFile = Path . join ( testModule, " \( pkgname) .swift " )
136
+ print ( " Creating Tests/ \( pkgname) / \( pkgname) .swift " )
137
+ let testsFileFP = try fopen ( testsFile, mode: . Write)
138
+ defer {
139
+ fclose ( testsFileFP)
140
+ }
141
+ try fputs ( " import XCTest \n " , testsFileFP)
142
+ try fputs ( " @testable import \( pkgname) \n \n " , testsFileFP)
143
+
144
+ try fputs ( " class \( pkgname) : XCTestCase { \n \n " , testsFileFP)
145
+
146
+ try fputs ( " \t func testExample() { \n " , testsFileFP)
147
+ try fputs ( " \t \t // This is an example of a functional test case. \n " , testsFileFP)
148
+ try fputs ( " \t \t // Use XCTAssert and related functions to verify your tests produce the correct results. \n " , testsFileFP)
149
+ try fputs ( " \t } \n \n " , testsFileFP)
150
+
151
+ try fputs ( " } \n " , testsFileFP)
152
+
153
+ try fputs ( " \n #if os(Linux) \n " , testsFileFP)
154
+ try fputs ( " extension \( pkgname) : XCTestCaseProvider { \n " , testsFileFP)
155
+ try fputs ( " \t var allTests : [(String, () throws -> Void)] { \n " , testsFileFP)
156
+ try fputs ( " \t \t return [ \n " , testsFileFP)
157
+ try fputs ( " \t \t \t ( \" testExample \" , testExample), \n " , testsFileFP)
158
+ try fputs ( " \t \t ] \n " , testsFileFP)
159
+ try fputs ( " \t } \n " , testsFileFP)
160
+ try fputs ( " } \n " , testsFileFP)
161
+ try fputs ( " #endif \n " , testsFileFP)
70
162
}
71
- }
163
+ }
0 commit comments