From 74105d9c2991be77c284b357cd9f7245ca733844 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Mon, 9 Jul 2018 16:05:53 +0200
Subject: [PATCH 01/11] Cleanup and update project

---
 CSVImporter.xcodeproj/project.pbxproj         | 344 +++++++++---------
 .../xcschemes/CSVImporter OSX.xcscheme        |  16 +-
 .../xcschemes/CSVImporter iOS.xcscheme        |  16 +-
 .../xcschemes/CSVImporter tvOS.xcscheme       |  16 +-
 .../xcshareddata/IDEWorkspaceChecks.plist     |   8 +
 Cartfile.resolved                             |   6 +-
 .../Sources}/CSVImporter.swift                |   0
 .../Sources}/FileSource.swift                 |   0
 .../Code => Framework/Sources}/Source.swift   |   0
 .../Sources}/StringSource.swift               |   0
 .../Code => Framework/Sources}/TextFile.swift |   0
 .../SupportingFiles}/CSVImporter.h            |   0
 .../SupportingFiles}/Info.plist               |   0
 .../Info.plist                                |   0
 UsageExamples.playground/Contents.swift       |   8 +-
 15 files changed, 217 insertions(+), 197 deletions(-)
 create mode 100644 CSVImporter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
 rename {Sources/Code => Framework/Sources}/CSVImporter.swift (100%)
 rename {Sources/Code => Framework/Sources}/FileSource.swift (100%)
 rename {Sources/Code => Framework/Sources}/Source.swift (100%)
 rename {Sources/Code => Framework/Sources}/StringSource.swift (100%)
 rename {Sources/Code => Framework/Sources}/TextFile.swift (100%)
 rename {Sources/Supporting Files => Framework/SupportingFiles}/CSVImporter.h (100%)
 rename {Sources/Supporting Files => Framework/SupportingFiles}/Info.plist (100%)
 rename Tests/{Supporting Files => SupportingFiles}/Info.plist (100%)

diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index f5def2c..17d3399 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -7,24 +7,9 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		2EC505221FDDC1D800ACFBA4 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505211FDDC1D800ACFBA4 /* StringSource.swift */; };
-		2EC505231FDDC1D800ACFBA4 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505211FDDC1D800ACFBA4 /* StringSource.swift */; };
-		2EC505241FDDC1D800ACFBA4 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505211FDDC1D800ACFBA4 /* StringSource.swift */; };
-		2EC505261FDDC1FC00ACFBA4 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505251FDDC1FC00ACFBA4 /* FileSource.swift */; };
-		2EC505271FDDC1FC00ACFBA4 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505251FDDC1FC00ACFBA4 /* FileSource.swift */; };
-		2EC505281FDDC1FC00ACFBA4 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505251FDDC1FC00ACFBA4 /* FileSource.swift */; };
-		2EC5052A1FDDC21E00ACFBA4 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505291FDDC21E00ACFBA4 /* Source.swift */; };
-		2EC5052B1FDDC21E00ACFBA4 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505291FDDC21E00ACFBA4 /* Source.swift */; };
-		2EC5052C1FDDC21E00ACFBA4 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC505291FDDC21E00ACFBA4 /* Source.swift */; };
-		82239F4B1C4AF70500627674 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82239F4A1C4AF70500627674 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		82239F521C4AF70500627674 /* CSVImporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82239F471C4AF70500627674 /* CSVImporter.framework */; };
-		82239F711C4AFAA800627674 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82239F701C4AFAA800627674 /* CSVImporter.swift */; };
 		82239F811C4AFAFF00627674 /* CSVImporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82239F771C4AFAFF00627674 /* CSVImporter.framework */; };
 		82239F9D1C4AFB1000627674 /* CSVImporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82239F931C4AFB1000627674 /* CSVImporter.framework */; };
-		82239FAE1C4AFB3500627674 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82239F701C4AFAA800627674 /* CSVImporter.swift */; };
-		82239FAF1C4AFB3600627674 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82239F701C4AFAA800627674 /* CSVImporter.swift */; };
-		82239FB01C4AFB3900627674 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82239F4A1C4AF70500627674 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		82239FB11C4AFB3A00627674 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82239F4A1C4AF70500627674 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		82239FCF1C4AFC5100627674 /* AllstarFull.csv in Resources */ = {isa = PBXBuildFile; fileRef = 82239FB61C4AFC5100627674 /* AllstarFull.csv */; };
 		82239FD01C4AFC5100627674 /* AllstarFull.csv in Resources */ = {isa = PBXBuildFile; fileRef = 82239FB61C4AFC5100627674 /* AllstarFull.csv */; };
 		82239FD11C4AFC5100627674 /* AllstarFull.csv in Resources */ = {isa = PBXBuildFile; fileRef = 82239FB61C4AFC5100627674 /* AllstarFull.csv */; };
@@ -115,15 +100,30 @@
 		827A24B21D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B31D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B41D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
+		82C48C7620F3A0D80052FAE5 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C48C7420F3A0D30052FAE5 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		82C48C7720F3A0D90052FAE5 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C48C7420F3A0D30052FAE5 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		82C48C7820F3A0D90052FAE5 /* CSVImporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C48C7420F3A0D30052FAE5 /* CSVImporter.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		82C48C8820F3A1C40052FAE5 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8320F3A1C40052FAE5 /* Source.swift */; };
+		82C48C8920F3A1C40052FAE5 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8320F3A1C40052FAE5 /* Source.swift */; };
+		82C48C8A20F3A1C40052FAE5 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8320F3A1C40052FAE5 /* Source.swift */; };
+		82C48C8B20F3A1C40052FAE5 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */; };
+		82C48C8C20F3A1C40052FAE5 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */; };
+		82C48C8D20F3A1C40052FAE5 /* CSVImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */; };
+		82C48C8E20F3A1C40052FAE5 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8520F3A1C40052FAE5 /* FileSource.swift */; };
+		82C48C8F20F3A1C40052FAE5 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8520F3A1C40052FAE5 /* FileSource.swift */; };
+		82C48C9020F3A1C40052FAE5 /* FileSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8520F3A1C40052FAE5 /* FileSource.swift */; };
+		82C48C9120F3A1C40052FAE5 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8620F3A1C40052FAE5 /* StringSource.swift */; };
+		82C48C9220F3A1C40052FAE5 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8620F3A1C40052FAE5 /* StringSource.swift */; };
+		82C48C9320F3A1C40052FAE5 /* StringSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8620F3A1C40052FAE5 /* StringSource.swift */; };
+		82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
+		82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
+		82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
 		A1E6AFAD1EEC153F000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A01F1C4AFC9300627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1E6AFAE1EEC153F000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0201C4AFC9300627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1E6AFB01EEC154F000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0241C4AFCAE00627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1E6AFB11EEC154F000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0251C4AFCAE00627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1E6AFB31EEC1560000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0291C4AFCC900627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1E6AFB41EEC1560000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A02A1C4AFCC900627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1EC02DB1E0431F20021718E /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC02DA1E0431F20021718E /* TextFile.swift */; };
-		A1EC02DC1E0431F20021718E /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC02DA1E0431F20021718E /* TextFile.swift */; };
-		A1EC02DD1E0431F20021718E /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EC02DA1E0431F20021718E /* TextFile.swift */; };
 		A1F5AEE61E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE71E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE81E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
@@ -226,25 +226,18 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		2EC505211FDDC1D800ACFBA4 /* StringSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringSource.swift; sourceTree = "<group>"; };
-		2EC505251FDDC1FC00ACFBA4 /* FileSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileSource.swift; sourceTree = "<group>"; };
-		2EC505291FDDC21E00ACFBA4 /* Source.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source.swift; sourceTree = "<group>"; };
 		2EE2D01B2039C3E800C21E3F /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
 		82239F471C4AF70500627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F4A1C4AF70500627674 /* CSVImporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CSVImporter.h; path = "Sources/Supporting Files/CSVImporter.h"; sourceTree = SOURCE_ROOT; };
-		82239F4C1C4AF70500627674 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Sources/Supporting Files/Info.plist"; sourceTree = SOURCE_ROOT; };
-		82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F581C4AF70500627674 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../Tests/Supporting Files/Info.plist"; sourceTree = "<group>"; };
+		82239F511C4AF70500627674 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239F611C4AF89200627674 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = SOURCE_ROOT; };
 		82239F621C4AF89200627674 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = SOURCE_ROOT; };
 		82239F681C4AF9AE00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/iOS/HandySwift.framework; sourceTree = SOURCE_ROOT; };
 		82239F6C1C4AFA0F00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/tvOS/HandySwift.framework; sourceTree = SOURCE_ROOT; };
 		82239F6E1C4AFA1E00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/Mac/HandySwift.framework; sourceTree = SOURCE_ROOT; };
-		82239F701C4AFAA800627674 /* CSVImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CSVImporter.swift; path = Sources/Code/CSVImporter.swift; sourceTree = SOURCE_ROOT; };
 		82239F771C4AFAFF00627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		82239F801C4AFAFF00627674 /* Tests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239F931C4AFB1000627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F9C1C4AFB1000627674 /* CSVImporter OSX Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter OSX Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		82239F9C1C4AFB1000627674 /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239FB61C4AFC5100627674 /* AllstarFull.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AllstarFull.csv; sourceTree = "<group>"; };
 		82239FB71C4AFC5100627674 /* Appearances.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Appearances.csv; sourceTree = "<group>"; };
 		82239FB81C4AFC5100627674 /* AwardsManagers.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AwardsManagers.csv; sourceTree = "<group>"; };
@@ -281,9 +274,16 @@
 		827A24B51D2801580003D6DD /* LICENSE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
 		827A24B61D2801580003D6DD /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		828348671CA6E1B000DC4C26 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = "<group>"; };
+		82C48C7320F3A0C40052FAE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		82C48C7420F3A0D30052FAE5 /* CSVImporter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSVImporter.h; sourceTree = "<group>"; };
+		82C48C7520F3A0D30052FAE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		82C48C8320F3A1C40052FAE5 /* Source.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Source.swift; sourceTree = "<group>"; };
+		82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVImporter.swift; sourceTree = "<group>"; };
+		82C48C8520F3A1C40052FAE5 /* FileSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileSource.swift; sourceTree = "<group>"; };
+		82C48C8620F3A1C40052FAE5 /* StringSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringSource.swift; sourceTree = "<group>"; };
+		82C48C8720F3A1C40052FAE5 /* TextFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFile.swift; sourceTree = "<group>"; };
 		A110355E1D666CFD00214547 /* CSVImporter.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = CSVImporter.podspec; sourceTree = "<group>"; };
 		A1EC02D91E0431C00021718E /* Cartfile.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.resolved; sourceTree = "<group>"; };
-		A1EC02DA1E0431F20021718E /* TextFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TextFile.swift; path = Sources/Code/TextFile.swift; sourceTree = SOURCE_ROOT; };
 		A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = UTF16_Example.csv; sourceTree = "<group>"; };
 		A1F5AEE91E056FBA003D6949 /* .swift-version */ = {isa = PBXFileReference; lastKnownFileType = text; path = ".swift-version"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -346,11 +346,11 @@
 		82239F3D1C4AF70500627674 = {
 			isa = PBXGroup;
 			children = (
-				A1EC02D81E0431A90021718E /* Root Files */,
-				82239F491C4AF70500627674 /* Sources */,
+				82239F491C4AF70500627674 /* Framework */,
 				82239F551C4AF70500627674 /* Tests */,
+				A1EC02D81E0431A90021718E /* Root Files */,
+				82C48C7D20F3A1510052FAE5 /* Frameworks */,
 				82239F481C4AF70500627674 /* Products */,
-				82239F631C4AF89600627674 /* Carthage */,
 			);
 			sourceTree = "<group>";
 		};
@@ -358,22 +358,22 @@
 			isa = PBXGroup;
 			children = (
 				82239F471C4AF70500627674 /* CSVImporter.framework */,
-				82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */,
+				82239F511C4AF70500627674 /* Tests iOS.xctest */,
 				82239F771C4AFAFF00627674 /* CSVImporter.framework */,
-				82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */,
+				82239F801C4AFAFF00627674 /* Tests tvOS.xctest */,
 				82239F931C4AFB1000627674 /* CSVImporter.framework */,
-				82239F9C1C4AFB1000627674 /* CSVImporter OSX Tests.xctest */,
+				82239F9C1C4AFB1000627674 /* Tests macOS.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
-		82239F491C4AF70500627674 /* Sources */ = {
+		82239F491C4AF70500627674 /* Framework */ = {
 			isa = PBXGroup;
 			children = (
-				8223A03A1C4AFE5D00627674 /* Code */,
-				8223A03B1C4AFE6200627674 /* Supporting Files */,
+				8223A03A1C4AFE5D00627674 /* Sources */,
+				8223A03B1C4AFE6200627674 /* SupportingFiles */,
 			);
-			path = Sources;
+			path = Framework;
 			sourceTree = "<group>";
 		};
 		82239F551C4AF70500627674 /* Tests */ = {
@@ -381,7 +381,7 @@
 			children = (
 				8223A01A1C4AFC6700627674 /* Code */,
 				82239FB41C4AFC5100627674 /* Assets */,
-				8223A03C1C4AFE6E00627674 /* Supporting Files */,
+				8223A03C1C4AFE6E00627674 /* SupportingFiles */,
 			);
 			path = Tests;
 			sourceTree = "<group>";
@@ -389,9 +389,8 @@
 		82239F631C4AF89600627674 /* Carthage */ = {
 			isa = PBXGroup;
 			children = (
-				82239F641C4AF98800627674 /* iOS */,
-				82239F651C4AF98C00627674 /* tvOS */,
-				82239F661C4AF99400627674 /* OSX */,
+				82C48C7F20F3A16E0052FAE5 /* Tests */,
+				82C48C7E20F3A16A0052FAE5 /* Framework */,
 			);
 			name = Carthage;
 			sourceTree = "<group>";
@@ -400,7 +399,6 @@
 			isa = PBXGroup;
 			children = (
 				82239F681C4AF9AE00627674 /* HandySwift.framework */,
-				8223A0231C4AFC9900627674 /* Tests */,
 			);
 			name = iOS;
 			sourceTree = "<group>";
@@ -409,18 +407,16 @@
 			isa = PBXGroup;
 			children = (
 				82239F6C1C4AFA0F00627674 /* HandySwift.framework */,
-				8223A0281C4AFCB400627674 /* Tests */,
 			);
 			name = tvOS;
 			sourceTree = "<group>";
 		};
-		82239F661C4AF99400627674 /* OSX */ = {
+		82239F661C4AF99400627674 /* macOS */ = {
 			isa = PBXGroup;
 			children = (
 				82239F6E1C4AFA1E00627674 /* HandySwift.framework */,
-				8223A02D1C4AFCCD00627674 /* Tests */,
 			);
-			name = OSX;
+			name = macOS;
 			sourceTree = "<group>";
 		};
 		82239FB41C4AFC5100627674 /* Assets */ = {
@@ -473,68 +469,88 @@
 			path = Code;
 			sourceTree = "<group>";
 		};
-		8223A0231C4AFC9900627674 /* Tests */ = {
+		8223A03A1C4AFE5D00627674 /* Sources */ = {
 			isa = PBXGroup;
 			children = (
-				8223A01F1C4AFC9300627674 /* Nimble.framework */,
-				8223A0201C4AFC9300627674 /* Quick.framework */,
+				82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */,
+				82C48C8520F3A1C40052FAE5 /* FileSource.swift */,
+				82C48C8320F3A1C40052FAE5 /* Source.swift */,
+				82C48C8620F3A1C40052FAE5 /* StringSource.swift */,
+				82C48C8720F3A1C40052FAE5 /* TextFile.swift */,
 			);
-			name = Tests;
+			path = Sources;
 			sourceTree = "<group>";
 		};
-		8223A0281C4AFCB400627674 /* Tests */ = {
+		8223A03B1C4AFE6200627674 /* SupportingFiles */ = {
 			isa = PBXGroup;
 			children = (
-				8223A0241C4AFCAE00627674 /* Nimble.framework */,
-				8223A0251C4AFCAE00627674 /* Quick.framework */,
+				82C48C7420F3A0D30052FAE5 /* CSVImporter.h */,
+				82C48C7520F3A0D30052FAE5 /* Info.plist */,
 			);
-			name = Tests;
+			path = SupportingFiles;
 			sourceTree = "<group>";
 		};
-		8223A02D1C4AFCCD00627674 /* Tests */ = {
+		8223A03C1C4AFE6E00627674 /* SupportingFiles */ = {
 			isa = PBXGroup;
 			children = (
-				8223A0291C4AFCC900627674 /* Nimble.framework */,
-				8223A02A1C4AFCC900627674 /* Quick.framework */,
+				82C48C7320F3A0C40052FAE5 /* Info.plist */,
 			);
-			name = Tests;
+			path = SupportingFiles;
 			sourceTree = "<group>";
 		};
-		8223A03A1C4AFE5D00627674 /* Code */ = {
+		82C48C7D20F3A1510052FAE5 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				82239F701C4AFAA800627674 /* CSVImporter.swift */,
-				2EC505291FDDC21E00ACFBA4 /* Source.swift */,
-				2EC505211FDDC1D800ACFBA4 /* StringSource.swift */,
-				2EC505251FDDC1FC00ACFBA4 /* FileSource.swift */,
-				A1E6AFAB1EEC13EB000FF121 /* Helpers */,
-				A1EC02E21E0433300021718E /* Text Reader */,
+				82239F631C4AF89600627674 /* Carthage */,
 			);
-			path = Code;
+			name = Frameworks;
 			sourceTree = "<group>";
 		};
-		8223A03B1C4AFE6200627674 /* Supporting Files */ = {
+		82C48C7E20F3A16A0052FAE5 /* Framework */ = {
 			isa = PBXGroup;
 			children = (
-				82239F4A1C4AF70500627674 /* CSVImporter.h */,
-				82239F4C1C4AF70500627674 /* Info.plist */,
+				82239F641C4AF98800627674 /* iOS */,
+				82239F661C4AF99400627674 /* macOS */,
+				82239F651C4AF98C00627674 /* tvOS */,
 			);
-			path = "Supporting Files";
+			name = Framework;
 			sourceTree = "<group>";
 		};
-		8223A03C1C4AFE6E00627674 /* Supporting Files */ = {
+		82C48C7F20F3A16E0052FAE5 /* Tests */ = {
 			isa = PBXGroup;
 			children = (
-				82239F581C4AF70500627674 /* Info.plist */,
+				82C48C8020F3A1760052FAE5 /* iOS */,
+				82C48C8220F3A17E0052FAE5 /* macOS */,
+				82C48C8120F3A17A0052FAE5 /* tvOS */,
 			);
-			path = "Supporting Files";
+			name = Tests;
 			sourceTree = "<group>";
 		};
-		A1E6AFAB1EEC13EB000FF121 /* Helpers */ = {
+		82C48C8020F3A1760052FAE5 /* iOS */ = {
 			isa = PBXGroup;
 			children = (
+				8223A01F1C4AFC9300627674 /* Nimble.framework */,
+				8223A0201C4AFC9300627674 /* Quick.framework */,
 			);
-			path = Helpers;
+			name = iOS;
+			sourceTree = "<group>";
+		};
+		82C48C8120F3A17A0052FAE5 /* tvOS */ = {
+			isa = PBXGroup;
+			children = (
+				8223A0241C4AFCAE00627674 /* Nimble.framework */,
+				8223A0251C4AFCAE00627674 /* Quick.framework */,
+			);
+			name = tvOS;
+			sourceTree = "<group>";
+		};
+		82C48C8220F3A17E0052FAE5 /* macOS */ = {
+			isa = PBXGroup;
+			children = (
+				8223A0291C4AFCC900627674 /* Nimble.framework */,
+				8223A02A1C4AFCC900627674 /* Quick.framework */,
+			);
+			name = macOS;
 			sourceTree = "<group>";
 		};
 		A1EC02D81E0431A90021718E /* Root Files */ = {
@@ -553,14 +569,6 @@
 			name = "Root Files";
 			sourceTree = "<group>";
 		};
-		A1EC02E21E0433300021718E /* Text Reader */ = {
-			isa = PBXGroup;
-			children = (
-				A1EC02DA1E0431F20021718E /* TextFile.swift */,
-			);
-			name = "Text Reader";
-			sourceTree = "<group>";
-		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
@@ -568,7 +576,7 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				82239F4B1C4AF70500627674 /* CSVImporter.h in Headers */,
+				82C48C7620F3A0D80052FAE5 /* CSVImporter.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -576,7 +584,7 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				82239FB01C4AFB3900627674 /* CSVImporter.h in Headers */,
+				82C48C7720F3A0D90052FAE5 /* CSVImporter.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -584,16 +592,16 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				82239FB11C4AFB3A00627674 /* CSVImporter.h in Headers */,
+				82C48C7820F3A0D90052FAE5 /* CSVImporter.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXHeadersBuildPhase section */
 
 /* Begin PBXNativeTarget section */
-		82239F461C4AF70500627674 /* CSVImporter iOS */ = {
+		82239F461C4AF70500627674 /* Framework iOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS" */;
+			buildConfigurationList = 82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Framework iOS" */;
 			buildPhases = (
 				82239F421C4AF70500627674 /* Sources */,
 				82239F431C4AF70500627674 /* Frameworks */,
@@ -605,14 +613,14 @@
 			);
 			dependencies = (
 			);
-			name = "CSVImporter iOS";
+			name = "Framework iOS";
 			productName = CSVImporter;
 			productReference = 82239F471C4AF70500627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F501C4AF70500627674 /* CSVImporter iOS Tests */ = {
+		82239F501C4AF70500627674 /* Tests iOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS Tests" */;
+			buildConfigurationList = 82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Tests iOS" */;
 			buildPhases = (
 				82239F4D1C4AF70500627674 /* Sources */,
 				82239F4E1C4AF70500627674 /* Frameworks */,
@@ -625,14 +633,14 @@
 			dependencies = (
 				82239F541C4AF70500627674 /* PBXTargetDependency */,
 			);
-			name = "CSVImporter iOS Tests";
+			name = "Tests iOS";
 			productName = CSVImporterTests;
-			productReference = 82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */;
+			productReference = 82239F511C4AF70500627674 /* Tests iOS.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
-		82239F761C4AFAFF00627674 /* CSVImporter tvOS */ = {
+		82239F761C4AFAFF00627674 /* Framework tvOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS" */;
+			buildConfigurationList = 82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Framework tvOS" */;
 			buildPhases = (
 				82239F721C4AFAFF00627674 /* Sources */,
 				82239F731C4AFAFF00627674 /* Frameworks */,
@@ -644,14 +652,14 @@
 			);
 			dependencies = (
 			);
-			name = "CSVImporter tvOS";
+			name = "Framework tvOS";
 			productName = "CSVImporter tvOS";
 			productReference = 82239F771C4AFAFF00627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F7F1C4AFAFF00627674 /* CSVImporter tvOS Tests */ = {
+		82239F7F1C4AFAFF00627674 /* Tests tvOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS Tests" */;
+			buildConfigurationList = 82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Tests tvOS" */;
 			buildPhases = (
 				82239F7C1C4AFAFF00627674 /* Sources */,
 				82239F7D1C4AFAFF00627674 /* Frameworks */,
@@ -664,14 +672,14 @@
 			dependencies = (
 				82239F831C4AFAFF00627674 /* PBXTargetDependency */,
 			);
-			name = "CSVImporter tvOS Tests";
+			name = "Tests tvOS";
 			productName = "CSVImporter tvOSTests";
-			productReference = 82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */;
+			productReference = 82239F801C4AFAFF00627674 /* Tests tvOS.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
-		82239F921C4AFB1000627674 /* CSVImporter OSX */ = {
+		82239F921C4AFB1000627674 /* Framework macOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter OSX" */;
+			buildConfigurationList = 82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Framework macOS" */;
 			buildPhases = (
 				82239F8E1C4AFB1000627674 /* Sources */,
 				82239F8F1C4AFB1000627674 /* Frameworks */,
@@ -683,14 +691,14 @@
 			);
 			dependencies = (
 			);
-			name = "CSVImporter OSX";
+			name = "Framework macOS";
 			productName = "CSVImporter OSX";
 			productReference = 82239F931C4AFB1000627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F9B1C4AFB1000627674 /* CSVImporter OSX Tests */ = {
+		82239F9B1C4AFB1000627674 /* Tests macOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter OSX Tests" */;
+			buildConfigurationList = 82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Tests macOS" */;
 			buildPhases = (
 				82239F981C4AFB1000627674 /* Sources */,
 				82239F991C4AFB1000627674 /* Frameworks */,
@@ -703,9 +711,9 @@
 			dependencies = (
 				82239F9F1C4AFB1000627674 /* PBXTargetDependency */,
 			);
-			name = "CSVImporter OSX Tests";
+			name = "Tests macOS";
 			productName = "CSVImporter OSXTests";
-			productReference = 82239F9C1C4AFB1000627674 /* CSVImporter OSX Tests.xctest */;
+			productReference = 82239F9C1C4AFB1000627674 /* Tests macOS.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
 /* End PBXNativeTarget section */
@@ -715,12 +723,12 @@
 			isa = PBXProject;
 			attributes = {
 				LastSwiftUpdateCheck = 0720;
-				LastUpgradeCheck = 0910;
+				LastUpgradeCheck = 0940;
 				ORGANIZATIONNAME = Flinesoft;
 				TargetAttributes = {
 					82239F461C4AF70500627674 = {
 						CreatedOnToolsVersion = 7.2;
-						LastSwiftMigration = 0900;
+						LastSwiftMigration = 0940;
 					};
 					82239F501C4AF70500627674 = {
 						CreatedOnToolsVersion = 7.2;
@@ -729,7 +737,7 @@
 					};
 					82239F761C4AFAFF00627674 = {
 						CreatedOnToolsVersion = 7.2;
-						LastSwiftMigration = 0900;
+						LastSwiftMigration = 0940;
 					};
 					82239F7F1C4AFAFF00627674 = {
 						CreatedOnToolsVersion = 7.2;
@@ -738,7 +746,7 @@
 					};
 					82239F921C4AFB1000627674 = {
 						CreatedOnToolsVersion = 7.2;
-						LastSwiftMigration = 0900;
+						LastSwiftMigration = 0940;
 					};
 					82239F9B1C4AFB1000627674 = {
 						CreatedOnToolsVersion = 7.2;
@@ -760,12 +768,12 @@
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				82239F461C4AF70500627674 /* CSVImporter iOS */,
-				82239F501C4AF70500627674 /* CSVImporter iOS Tests */,
-				82239F761C4AFAFF00627674 /* CSVImporter tvOS */,
-				82239F7F1C4AFAFF00627674 /* CSVImporter tvOS Tests */,
-				82239F921C4AFB1000627674 /* CSVImporter OSX */,
-				82239F9B1C4AFB1000627674 /* CSVImporter OSX Tests */,
+				82239F461C4AF70500627674 /* Framework iOS */,
+				82239F501C4AF70500627674 /* Tests iOS */,
+				82239F761C4AFAFF00627674 /* Framework tvOS */,
+				82239F7F1C4AFAFF00627674 /* Tests tvOS */,
+				82239F921C4AFB1000627674 /* Framework macOS */,
+				82239F9B1C4AFB1000627674 /* Tests macOS */,
 			);
 		};
 /* End PBXProject section */
@@ -946,11 +954,11 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2EC505261FDDC1FC00ACFBA4 /* FileSource.swift in Sources */,
-				A1EC02DB1E0431F20021718E /* TextFile.swift in Sources */,
-				2EC505221FDDC1D800ACFBA4 /* StringSource.swift in Sources */,
-				2EC5052A1FDDC21E00ACFBA4 /* Source.swift in Sources */,
-				82239F711C4AFAA800627674 /* CSVImporter.swift in Sources */,
+				82C48C8B20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */,
+				82C48C9120F3A1C40052FAE5 /* StringSource.swift in Sources */,
+				82C48C8820F3A1C40052FAE5 /* Source.swift in Sources */,
+				82C48C8E20F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -966,11 +974,11 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2EC505271FDDC1FC00ACFBA4 /* FileSource.swift in Sources */,
-				A1EC02DC1E0431F20021718E /* TextFile.swift in Sources */,
-				2EC505231FDDC1D800ACFBA4 /* StringSource.swift in Sources */,
-				2EC5052B1FDDC21E00ACFBA4 /* Source.swift in Sources */,
-				82239FAE1C4AFB3500627674 /* CSVImporter.swift in Sources */,
+				82C48C8C20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */,
+				82C48C9220F3A1C40052FAE5 /* StringSource.swift in Sources */,
+				82C48C8920F3A1C40052FAE5 /* Source.swift in Sources */,
+				82C48C8F20F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -986,11 +994,11 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2EC505281FDDC1FC00ACFBA4 /* FileSource.swift in Sources */,
-				A1EC02DD1E0431F20021718E /* TextFile.swift in Sources */,
-				2EC505241FDDC1D800ACFBA4 /* StringSource.swift in Sources */,
-				2EC5052C1FDDC21E00ACFBA4 /* Source.swift in Sources */,
-				82239FAF1C4AFB3600627674 /* CSVImporter.swift in Sources */,
+				82C48C8D20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */,
+				82C48C9320F3A1C40052FAE5 /* StringSource.swift in Sources */,
+				82C48C8A20F3A1C40052FAE5 /* Source.swift in Sources */,
+				82C48C9020F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1007,17 +1015,17 @@
 /* Begin PBXTargetDependency section */
 		82239F541C4AF70500627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F461C4AF70500627674 /* CSVImporter iOS */;
+			target = 82239F461C4AF70500627674 /* Framework iOS */;
 			targetProxy = 82239F531C4AF70500627674 /* PBXContainerItemProxy */;
 		};
 		82239F831C4AFAFF00627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F761C4AFAFF00627674 /* CSVImporter tvOS */;
+			target = 82239F761C4AFAFF00627674 /* Framework tvOS */;
 			targetProxy = 82239F821C4AFAFF00627674 /* PBXContainerItemProxy */;
 		};
 		82239F9F1C4AFB1000627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F921C4AFB1000627674 /* CSVImporter OSX */;
+			target = 82239F921C4AFB1000627674 /* Framework macOS */;
 			targetProxy = 82239F9E1C4AFB1000627674 /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
@@ -1035,12 +1043,14 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -1068,9 +1078,9 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.2;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
+				PRODUCT_NAME = CSVImporter;
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Off;
@@ -1092,12 +1102,14 @@
 				CLANG_WARN_BOOL_CONVERSION = YES;
 				CLANG_WARN_COMMA = YES;
 				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
 				CLANG_WARN_EMPTY_BODY = YES;
 				CLANG_WARN_ENUM_CONVERSION = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
@@ -1119,8 +1131,8 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 9.2;
 				MTL_ENABLE_DEBUG_INFO = NO;
+				PRODUCT_NAME = CSVImporter;
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Off;
@@ -1145,12 +1157,11 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SKIP_INSTALL = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 4.0;
@@ -1171,12 +1182,11 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SKIP_INSTALL = YES;
 				SWIFT_VERSION = 4.0;
 			};
@@ -1185,12 +1195,13 @@
 		82239F5F1C4AF70500627674 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporterTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1201,12 +1212,13 @@
 		82239F601C4AF70500627674 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporterTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1218,6 +1230,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
+				CLANG_ENABLE_MODULES = YES;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1227,13 +1240,13 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SDKROOT = appletvos;
 				SKIP_INSTALL = YES;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 4.0;
 				TARGETED_DEVICE_FAMILY = 3;
 				TVOS_DEPLOYMENT_TARGET = 9.0;
@@ -1244,6 +1257,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
+				CLANG_ENABLE_MODULES = YES;
 				"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
 				DEFINES_MODULE = YES;
 				DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1253,11 +1267,10 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SDKROOT = appletvos;
 				SKIP_INSTALL = YES;
 				SWIFT_VERSION = 4.0;
@@ -1269,12 +1282,13 @@
 		82239F8C1C4AFAFF00627674 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-tvOSTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1287,12 +1301,13 @@
 		82239F8D1C4AFAFF00627674 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-tvOSTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -1306,6 +1321,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
+				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEFINES_MODULE = YES;
@@ -1317,14 +1333,14 @@
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
 				FRAMEWORK_VERSION = A;
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 4.0;
 			};
 			name = Debug;
@@ -1333,6 +1349,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				APPLICATION_EXTENSION_API_ONLY = NO;
+				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_IDENTITY = "";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEFINES_MODULE = YES;
@@ -1344,12 +1361,11 @@
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
 				FRAMEWORK_VERSION = A;
-				INFOPLIST_FILE = "$(SRCROOT)/Sources/Supporting Files/Info.plist";
+				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
-				PRODUCT_NAME = CSVImporter;
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
 				SWIFT_VERSION = 4.0;
@@ -1359,6 +1375,7 @@
 		82239FA81C4AFB1000627674 /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_IDENTITY = "Mac Developer";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
@@ -1366,7 +1383,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-OSXTests";
@@ -1379,6 +1396,7 @@
 		82239FA91C4AFB1000627674 /* Release */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_IDENTITY = "Mac Developer";
 				COMBINE_HIDPI_IMAGES = YES;
 				DEVELOPMENT_TEAM = 767S6EFMJ8;
@@ -1386,7 +1404,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
-				INFOPLIST_FILE = "Tests/Supporting Files/Info.plist";
+				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-OSXTests";
@@ -1408,7 +1426,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS" */ = {
+		82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Framework iOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F5C1C4AF70500627674 /* Debug */,
@@ -1417,7 +1435,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS Tests" */ = {
+		82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Tests iOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F5F1C4AF70500627674 /* Debug */,
@@ -1426,7 +1444,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS" */ = {
+		82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Framework tvOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F891C4AFAFF00627674 /* Debug */,
@@ -1435,7 +1453,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS Tests" */ = {
+		82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Tests tvOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F8C1C4AFAFF00627674 /* Debug */,
@@ -1444,7 +1462,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter OSX" */ = {
+		82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Framework macOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239FA51C4AFB1000627674 /* Debug */,
@@ -1453,7 +1471,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter OSX Tests" */ = {
+		82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Tests macOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239FA81C4AFB1000627674 /* Debug */,
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme
index 4bd3f22..ef842fd 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme	
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0910"
+   LastUpgradeVersion = "0940"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F921C4AFB1000627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "CSVImporter OSX"
+               BlueprintName = "Framework macOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -26,7 +26,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
@@ -34,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F9B1C4AFB1000627674"
-               BuildableName = "CSVImporter OSX Tests.xctest"
-               BlueprintName = "CSVImporter OSX Tests"
+               BuildableName = "Tests macOS.xctest"
+               BlueprintName = "Tests macOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -45,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter OSX"
+            BlueprintName = "Framework macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -56,7 +55,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
@@ -68,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter OSX"
+            BlueprintName = "Framework macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -86,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter OSX"
+            BlueprintName = "Framework macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme
index a9806f0..e88c07a 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme	
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0910"
+   LastUpgradeVersion = "0940"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F461C4AF70500627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "CSVImporter iOS"
+               BlueprintName = "Framework iOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -26,7 +26,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
@@ -34,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F501C4AF70500627674"
-               BuildableName = "CSVImporter iOS Tests.xctest"
-               BlueprintName = "CSVImporter iOS Tests"
+               BuildableName = "Tests iOS.xctest"
+               BlueprintName = "Tests iOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -45,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter iOS"
+            BlueprintName = "Framework iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -56,7 +55,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
@@ -68,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter iOS"
+            BlueprintName = "Framework iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -86,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter iOS"
+            BlueprintName = "Framework iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme
index 5078914..ae86411 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme	
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "0910"
+   LastUpgradeVersion = "0940"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F761C4AFAFF00627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "CSVImporter tvOS"
+               BlueprintName = "Framework tvOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -26,7 +26,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       shouldUseLaunchSchemeArgsEnv = "YES">
       <Testables>
          <TestableReference
@@ -34,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F7F1C4AFAFF00627674"
-               BuildableName = "CSVImporter tvOS Tests.xctest"
-               BlueprintName = "CSVImporter tvOS Tests"
+               BuildableName = "Tests tvOS.xctest"
+               BlueprintName = "Tests tvOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -45,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter tvOS"
+            BlueprintName = "Framework tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -56,7 +55,6 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      language = ""
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
@@ -68,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter tvOS"
+            BlueprintName = "Framework tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -86,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "CSVImporter tvOS"
+            BlueprintName = "Framework tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/CSVImporter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CSVImporter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/CSVImporter.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/Cartfile.resolved b/Cartfile.resolved
index 4aa944b..940bd03 100644
--- a/Cartfile.resolved
+++ b/Cartfile.resolved
@@ -1,3 +1,3 @@
-github "Flinesoft/HandySwift" "2.5.0"
-github "Quick/Nimble" "v7.0.3"
-github "Quick/Quick" "v1.2.0"
+github "Flinesoft/HandySwift" "2.6.0"
+github "Quick/Nimble" "v7.1.3"
+github "Quick/Quick" "v1.3.0"
diff --git a/Sources/Code/CSVImporter.swift b/Framework/Sources/CSVImporter.swift
similarity index 100%
rename from Sources/Code/CSVImporter.swift
rename to Framework/Sources/CSVImporter.swift
diff --git a/Sources/Code/FileSource.swift b/Framework/Sources/FileSource.swift
similarity index 100%
rename from Sources/Code/FileSource.swift
rename to Framework/Sources/FileSource.swift
diff --git a/Sources/Code/Source.swift b/Framework/Sources/Source.swift
similarity index 100%
rename from Sources/Code/Source.swift
rename to Framework/Sources/Source.swift
diff --git a/Sources/Code/StringSource.swift b/Framework/Sources/StringSource.swift
similarity index 100%
rename from Sources/Code/StringSource.swift
rename to Framework/Sources/StringSource.swift
diff --git a/Sources/Code/TextFile.swift b/Framework/Sources/TextFile.swift
similarity index 100%
rename from Sources/Code/TextFile.swift
rename to Framework/Sources/TextFile.swift
diff --git a/Sources/Supporting Files/CSVImporter.h b/Framework/SupportingFiles/CSVImporter.h
similarity index 100%
rename from Sources/Supporting Files/CSVImporter.h
rename to Framework/SupportingFiles/CSVImporter.h
diff --git a/Sources/Supporting Files/Info.plist b/Framework/SupportingFiles/Info.plist
similarity index 100%
rename from Sources/Supporting Files/Info.plist
rename to Framework/SupportingFiles/Info.plist
diff --git a/Tests/Supporting Files/Info.plist b/Tests/SupportingFiles/Info.plist
similarity index 100%
rename from Tests/Supporting Files/Info.plist
rename to Tests/SupportingFiles/Info.plist
diff --git a/UsageExamples.playground/Contents.swift b/UsageExamples.playground/Contents.swift
index a226210..de8896d 100644
--- a/UsageExamples.playground/Contents.swift
+++ b/UsageExamples.playground/Contents.swift
@@ -45,11 +45,11 @@ results
 let wrongPathImporter = CSVImporter<[String]>(path: "a/wrong/path")
 wrongPathImporter.startImportingRecords { $0 }.onFail {
     
-    ".onFail called because the path is wrong"
+    _ = ".onFail called because the path is wrong"
     
 }.onFinish { importedRecords in
     
-    ".onFinish is never called here because the path is wrong"
+    _ = ".onFinish is never called here because the path is wrong"
     
 }
 
@@ -69,7 +69,7 @@ defaultImporter.startImportingRecords { $0 }.onProgress { importedDataLinesCount
 let structureImporter = CSVImporter<[String: String]>(path: path)
 structureImporter.startImportingRecords(structure: { headerValues in
     
-    headerValues // the structural information from the first line as a [String]
+    _ = headerValues // the structural information from the first line as a [String]
 
 }){ $0 }.onFinish { importedRecords in
     
@@ -114,7 +114,7 @@ teamsDefaultImporter.startImportingRecords { recordValues -> Team in
 let teamsStructuredImporter = CSVImporter<Team>(path: path)
 teamsStructuredImporter.startImportingRecords(structure: { headerValues in
     
-    headerValues // the structure form the first line of the CSV file
+    _ = headerValues // the structure form the first line of the CSV file
     
 }) { recordValues -> Team in
     

From 776f429592a8c2f5d4d9b22ace50a2a5c26feaa0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20G=C3=BCnd=C3=BCz?= <commits@cihatguenduez.de>
Date: Fri, 3 Aug 2018 14:40:59 +0200
Subject: [PATCH 02/11] [README.md] Fix Bitrise badge

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index d5d821e..f998c47 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 <p align="center">
     <a href="https://www.bitrise.io/app/729b6b29afaa23cb">
-        <img src="https://www.bitrise.io/app/729b6b29afaa23cb.svg?token=vylelkIV0d8L8dgaENuNqg&branch=stable"
+        <img src="https://app.bitrise.io/app/729b6b29afaa23cb/status.svg?token=vylelkIV0d8L8dgaENuNqg&branch=stable"
              alt="Build Status">
     </a>
     <a href="https://codebeat.co/projects/github-com-flinesoft-csvimporter">

From f43c41559b59d5b37f118f9acd48ab7048838af8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20G=C3=BCnd=C3=BCz?= <commits@cihatguenduez.de>
Date: Fri, 3 Aug 2018 14:41:57 +0200
Subject: [PATCH 03/11] [README.md] Fix Bitrise badge

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f998c47..c7d944a 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
 </p>
 
 <p align="center">
-    <a href="https://www.bitrise.io/app/729b6b29afaa23cb">
+    <a href="https://app.bitrise.io/app/729b6b29afaa23cb">
         <img src="https://app.bitrise.io/app/729b6b29afaa23cb/status.svg?token=vylelkIV0d8L8dgaENuNqg&branch=stable"
              alt="Build Status">
     </a>

From 18f929567ddb5f668e721a1812c9ff0e34cf28ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Thu, 27 Sep 2018 19:26:49 +0200
Subject: [PATCH 04/11] Update project structure

---
 .projlint.yml                                 |  84 +++++
 .swift-version                                |   1 -
 .swiftlint.yml                                | 329 +++++++++++++++---
 CHANGELOG.md                                  |  26 ++
 CODE_OF_CONDUCT.md                            |  74 ++++
 CONTRIBUTING.md                               |  31 ++
 CSVImporter.podspec                           |   1 +
 CSVImporter.xcodeproj/project.pbxproj         | 310 +++++++++--------
 .../xcshareddata/IDETemplateMacros.plist      |  11 +
 .../xcschemes/CSVImporter iOS.xcscheme        |  12 +-
 ...SX.xcscheme => CSVImporter macOS.xcscheme} |  12 +-
 .../xcschemes/CSVImporter tvOS.xcscheme       |  12 +-
 Cartfile                                      |   2 +-
 Cartfile.resolved                             |   6 +-
 .../CSVImporter}/CSVImporter.swift            |   0
 .../CSVImporter}/FileSource.swift             |   0
 .../CSVImporter}/Source.swift                 |   0
 .../CSVImporter}/StringSource.swift           |   0
 .../CSVImporter}/TextFile.swift               |   0
 .../SupportingFiles/CSVImporter.h             |   0
 .../SupportingFiles/Info.plist                |   0
 LICENSE.md => LICENSE                         |  13 +-
 Package.swift                                 |  24 +-
 README.md                                     |  53 +--
 .../CSVImporterSpec.swift                     |   6 +-
 25 files changed, 732 insertions(+), 275 deletions(-)
 create mode 100644 .projlint.yml
 delete mode 100644 .swift-version
 create mode 100644 CHANGELOG.md
 create mode 100644 CODE_OF_CONDUCT.md
 create mode 100644 CONTRIBUTING.md
 create mode 100644 CSVImporter.xcodeproj/xcshareddata/IDETemplateMacros.plist
 rename CSVImporter.xcodeproj/xcshareddata/xcschemes/{CSVImporter OSX.xcscheme => CSVImporter macOS.xcscheme} (91%)
 rename {Framework/Sources => Frameworks/CSVImporter}/CSVImporter.swift (100%)
 rename {Framework/Sources => Frameworks/CSVImporter}/FileSource.swift (100%)
 rename {Framework/Sources => Frameworks/CSVImporter}/Source.swift (100%)
 rename {Framework/Sources => Frameworks/CSVImporter}/StringSource.swift (100%)
 rename {Framework/Sources => Frameworks/CSVImporter}/TextFile.swift (100%)
 rename {Framework => Frameworks}/SupportingFiles/CSVImporter.h (100%)
 rename {Framework => Frameworks}/SupportingFiles/Info.plist (100%)
 rename LICENSE.md => LICENSE (86%)
 rename Tests/{Code => CSVImporterTests}/CSVImporterSpec.swift (99%)

diff --git a/.projlint.yml b/.projlint.yml
new file mode 100644
index 0000000..412e9b0
--- /dev/null
+++ b/.projlint.yml
@@ -0,0 +1,84 @@
+shared_variables:
+  rightholder: Flinesoft
+  project_name: CSVImporter
+
+rules:
+  - xcode_build_phases:
+      project_path: <:project_name:>.xcodeproj
+      target_name: <:project_name:> iOS
+      run_scripts:
+        SwiftLint: |
+          if [ "${CONFIGURATION}" = "Debug" ]; then
+              if which swiftlint > /dev/null; then
+                  swiftlint
+              else
+                  echo "warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint"
+              fi
+          fi
+
+        ProjLint: |
+          if [ "${CONFIGURATION}" = "Debug" ]; then
+              if which projlint > /dev/null; then
+                  projlint lint --xcode --timeout 2 --ignore-network-errors
+              else
+                  echo "warning: ProjLint not installed, download it from https://github.com/JamitLabs/ProjLint"
+              fi
+          fi
+
+  - xcode_project_navigator:
+      project_path: <:project_name:>.xcodeproj
+      sorted:
+        - Frameworks/<:project_name:>
+        - Frameworks/SupportingFiles
+        - Tests/<:project_name:>Tests
+        - Tests/SupportingFiles
+      inner_group_order:
+        - assets
+        - entitlements
+        - plists
+        - strings
+        - others
+        - [code_files, interfaces]
+        - folders
+      structure:
+        - Frameworks:
+            - <:project_name:>
+            - SupportingFiles:
+                - Info.plist
+        - Tests:
+            - <:project_name:>Tests
+            - SupportingFiles:
+                - Info.plist
+        - RootFiles:
+            - beak.swift
+            - .projlint.yml
+            - .swiftlint.yml
+            - Package.swift
+        - Products
+  - file_content_template:
+      matching:
+        .swiftlint.yml:
+          template_url: "https://raw.githubusercontent.com/JamitLabs/ProjLintTemplates/master/Framework/SwiftLint.stencil"
+          parameters:
+            rightholder: <:rightholder:>
+        .projlint.yml:
+          template_url: "https://raw.githubusercontent.com/JamitLabs/ProjLintTemplates/master/Framework/ProjLint.stencil"
+          parameters:
+            rightholder: <:rightholder:>
+            project_name: <:project_name:>
+  - file_existence:
+      existing_paths:
+        - .gitignore
+        - .swiftlint.yml
+        - .sourcery/LinuxMain.stencil
+        - CODE_OF_CONDUCT.md
+        - CONTRIBUTING.md
+        - CHANGELOG.md
+        - LICENSE
+        - README.md
+        - <:project_name:>.podspec
+        - Package.swift
+        - beak.swift
+        - <:project_name:>.xcodeproj/xcshareddata/IDETemplateMacros.plist
+        - Frameworks/SupportingFiles/Info.plist
+        - Tests/SupportingFiles/Info.plist
diff --git a/.swift-version b/.swift-version
deleted file mode 100644
index 5186d07..0000000
--- a/.swift-version
+++ /dev/null
@@ -1 +0,0 @@
-4.0
diff --git a/.swiftlint.yml b/.swiftlint.yml
index 8ce9a16..6443cf1 100644
--- a/.swiftlint.yml
+++ b/.swiftlint.yml
@@ -1,48 +1,151 @@
+# Basic Configuration
 opt_in_rules:
+- array_init
 - attributes
 - closure_end_indentation
 - closure_spacing
+- conditional_returns_on_newline
+- contains_over_first_not_nil
+- convenience_type
 - empty_count
+- empty_string
+- empty_xctest_method
 - explicit_init
+- explicit_type_interface
+- extension_access_modifier
+- fallthrough
 - fatal_error_message
 - file_header
+- file_name
+- file_types_order
 - first_where
-- implicit_return
+- function_default_parameter_at_end
 - implicitly_unwrapped_optional
+- is_disjoint
+- joined_default_parameter
+- let_var_whitespace
+- literal_expression_end_indentation
+- lower_acl_than_parent
+- missing_docs
+- modifier_order
+- multiline_arguments
+- multiline_arguments_brackets
+- multiline_function_chains
+- multiline_literal_brackets
+- multiline_parameters
+- multiline_parameters_brackets
 - nimble_operator
 - no_extension_access_modifier
 - number_separator
+- object_literal
 - operator_usage_whitespace
 - overridden_super_call
+- override_in_extension
+- pattern_matching_keywords
+- private_action
 - private_outlet
 - prohibited_super_call
+- quick_discouraged_call
+- quick_discouraged_focused_test
+- quick_discouraged_pending_test
 - redundant_nil_coalescing
+- redundant_type_annotation
+- single_test_class
+- sorted_first_last
+- sorted_imports
 - switch_case_on_newline
+- trailing_closure
+- type_contents_order
+- unavailable_function
+- unneeded_parentheses_in_closure_argument
+- untyped_error_in_catch
+- vertical_parameter_alignment_on_call
+- vertical_whitespace_between_cases
+- vertical_whitespace_closing_braces
+- vertical_whitespace_opening_braces
+- yoda_condition
+
+disabled_rules:
+- force_cast
+- todo
+- type_name
 
 included:
 - Sources
 - Tests
 
 excluded:
-- Carthage
-- Sources/Code/TextFile.swift
+- Tests/LinuxMain.swift
+
+# Rule Configurations
+conditional_returns_on_newline:
+  if_only: true
 
-line_length: 180
+explicit_type_interface:
+  allow_redundancy: true
+  excluded:
+    - local
 
 file_header:
   required_pattern: |
                     \/\/
-                    \/\/  .*?\.swift
-                    \/\/  [\S ]+
-                    \/\/
-                    \/\/  Created by [\S ]+ on \d{1,2}\.\d{1,2}\.\d{2}\.
-                    \/\/  Copyright © \d{4} [\S ]+\. All rights reserved\.
+                    \/\/  Created by [^\(\)\d\n]+ on \S{6,10}\.
+                    \/\/  Copyright © \d{4} Flinesoft\. All rights reserved\.
                     \/\/
 
+file_name:
+  suffix_pattern: "Extensions?|\\+.*"
+
+file_types_order:
+  order:
+    - supporting_type
+    - main_type
+    - extension
+
+identifier_name:
+  excluded:
+    - id
+
+line_length: 160
+
+type_contents_order:
+  order:
+    - case
+    - [type_alias, associated_type]
+    - subtype
+    - type_property
+    - instance_property
+    - ib_outlet
+    - initializer
+    - type_method
+    - view_life_cycle_method
+    - ib_action
+    - other_method
+    - subscript
+
+# Custom Rules
 custom_rules:
+  class_name_suffix_collection_view_controller:
+    included: ".*.swift"
+    regex: 'class +\w+(?<!CollectionViewController) *(?:<[^>]+>)? *: +\w+CollectionViewController'
+    name: "Class Name Suffix View Controller"
+    message: "All `CollectionViewController` subclasses should end on `CollectionViewController`."
+    severity: warning
+  class_name_suffix_table_view_controller:
+    included: ".*.swift"
+    regex: 'class +\w+(?<!TableViewController) *(?:<[^>]+>)? *: +\w+TableViewController'
+    name: "Class Name Suffix View Controller"
+    message: "All `TableViewController` subclasses should end on `TableViewController`."
+    severity: warning
+  class_name_suffix_view_controller:
+    included: ".*.swift"
+    regex: 'class +\w+(?<!ViewController) *(?:<[^>]+>)? *: +\w+ViewController'
+    name: "Class Name Suffix View Controller"
+    message: "All `ViewController` subclasses should end on `ViewController`."
+    severity: warning
   closing_brace_whitespace:
     included: ".*.swift"
-    regex: '(?:\n| {2,})\}\)? *\n *[^ \n\})\]]'
+    regex: '(?:\n| {2,})\}\)? *\n *[^ \n\})\]s#"]'
     name: "Closing Brace Whitespace"
     message: "Empty line required after closing curly braces if code with same indentation follows."
     severity: warning
@@ -52,15 +155,81 @@ custom_rules:
     name: "Unnecessary Closure Params Parantheses"
     message: "Don't use parantheses around non-typed parameters in a closure."
     severity: warning
-  ending_closure:
+  comment_type_note:
+    included: ".*.swift"
+    regex: '// *(?:WORKAROUND|HACK|WARNING)[:\\s]'
+    name: "Comment Type NOTE"
+    message: "Use a '// NOTE:' comment instead."
+    severity: warning
+  comment_type_refactor:
+    included: ".*.swift"
+    regex: '// *(?:TODO|NOTE)[:\\s][^\n]*(?:refactor|REFACTOR|Refactor)'
+    name: "Comment Type REFACTOR"
+    message: "Use a '// REFACTOR:' comment instead."
+    severity: warning
+  comment_type_todo:
+    included: ".*.swift"
+    regex: '// *(?:BUG|MOCK|FIXME|RELEASE|TEST)[:\\s]'
+    name: "Comment Type TODO"
+    message: "Use a '// TODO:' comment instead."
+    severity: warning
+  controller_class_name_suffix:
+    included: ".*.swift"
+    regex: 'class +\w+(?<!View|Flow)Controller'
+    name: "Controller Class Name Suffix"
+    message: "Only use the `Controller` class name suffix for ViewControllers or FlowControllers."
+    severity: warning
+  debug_log_level:
+    included: ".*.swift"
+    regex: 'log.debug\('
+    name: "Debug Log Level"
+    message: "Make sure to remove all debug log levels before committing."
+    severity: warning
+  empty_init_body:
+    included: ".*.swift"
+    regex: 'init\([^\{\n]*\) \{\s+\}'
+    name: "Empty Init Body"
+    message: "Don't use whitespace or newlines for the body of empty initializers – use `init() {}` instead."
+    severity: warning
+  empty_method:
+    included: ".*.swift"
+    regex: 'func [^\s\(]+\([^\{\n]*\) \{\s*\}'
+    name: "Empty Method"
+    message: "Don't keep empty methods in code without commenting inside why they are needed or a `// TODO: not yet implemented`."
+    severity: warning
+  empty_type:
+    included: ".*.swift"
+    regex: '(?:class|protocol|struct|enum) [^\{]+\{\s*\}'
+    name: "Empty Type"
+    message: "Don't keep empty types in code without commenting inside why they are needed or a `// TODO: not yet implemented`."
+    severity: warning
+  flow_controller_variable_naming:
     included: ".*.swift"
-    regex: '(?:\(|, | *\S+ *: *)\{[^\}]+\}\) *\n'
-    name: "Ending Closure"
-    message: "Don't use '(' and ')' on the last closure of a method – remove them instead."
+    regex: '(?:let|var) +\w*(?:fc|FC|Fc|flowC|flowController|FlowController) *='
+    name: "Flow Controller Variable Naming"
+    message: "Always name your flow controller variables with the suffix `FlowCtrl`."
+    severity: warning
+  handyswift_delay:
+    included: ".*.swift"
+    regex: 'DispatchQueue\.\S+\.asyncAfter\(deadline:'
+    name: "HandySwift Delay"
+    message: "Use the `delay(by:qosClass:)` method of HandySwift instead of DispatchQueue for delayed code."
+    severity: warning
+  handyswift_delay_time_interval:
+    included: ".*.swift"
+    regex: 'delay\(by: ?\d'
+    name: "HandySwift Delay TimeInterval"
+    message: "Use one of the HandySwift TimeInterval extension methods like `.milliseconds(100)` instead."
+    severity: warning
+  handyswift_time_interval:
+    included: ".*.swift"
+    regex: ':\s*(?:Dispatch)?TimeInterval\s*=\s*(?:[1-9]|0\.0*[1-9])'
+    name: "HandySwift TimeInterval"
+    message: "Use one of the HandySwift (Dispatch)TimeInterval extension methods like `.milliseconds(100)` instead."
     severity: warning
   if_as_guard:
     included: ".*.swift"
-    regex: '\n *if [^\{]+\{\s*return[^\n]*\n *\}(?! *else)'
+    regex: '(?<=\n) *if [^\{]+\{\s*return\s*(?:nil){0,1}([^a-zA-z\n]*)\n*\s*\}(?! *else)'
     name: "If as Guard"
     message: "Don't use an if statement to just return – use guard for such cases instead."
     severity: warning
@@ -70,41 +239,101 @@ custom_rules:
     name: "Late Force Unwrapping"
     message: "Don't use ? first to force unwrap later – directly unwrap within the parantheses."
     severity: warning
-  long_switch_case:
+  local_l10n:
     included: ".*.swift"
-    regex: 'case (?:let )?\.[^\n]+\n((?!\s*switch)[^\n\}]+\n){5,}?\s*(case|\})'
-    name: "Long Switch Cases"
-    message: "Use a maximum of 3 lines within each case."
+    regex: 'func \S+\s*\{\s*[^\}]*let l10n'
+    name: "Local l10n"
+    message: "Don't name local variable `l10n` – use a property instead and further specify with `localL10n` if needed."
     severity: warning
-  missing_docs:
+  log_prefix:
     included: ".*.swift"
-    regex: '\n *(?!\/\/\/)(\/\/)?[^\n\/]*\n *(?:public|open)'
-    name: "Missing Docs"
-    message: "Types, properties and methods with public or open access level should be documented."
+    regex: 'log\.(?:verbose|debug|info|warning|error)\("(?:verbose|debug|info|warning|error).*"\)'
+    name: "Logging Prefix"
+    message: "Don't use logging prefixes with log.verbose/debug/info/warning/error – done automatically."
     severity: warning
   multiple_closure_params:
     included: ".*.swift"
-    regex: '\} *\) *\{'
+    regex: '\n *(?:[^\.\n=]+\.)+[^\(\s]+\([^\{\n]+\{[^\}\n]+\}\)\s*\{'
     name: "Multiple Closure Params"
     message: "Don't use multiple in-line closures – save one or more of them to variables instead."
     severity: warning
-  return_whitespace:
+  none_case_enum:
+    included: ".*.swift"
+    regex: 'enum\s+[^\{]+\{(?:\s*\/\/[^\n]*)*(?:\s*case\s+[^\n]+)*\s*case\s+none[^\S]'
+    name: "Non Case Enum"
+    message: "Do not call enum cases `none` as you might run into problems with Optionals of this type."
+    severity: warning
+  quick_temporary_disabling:
+    included: ".*.swift"
+    regex: '\sxdescribe\(|\sxcontext\(|\sxit\('
+    name: "Quick Temporary Disabling"
+    message: "Temporary disabled Quick examples or groups shouldn't be commited."
+    severity: warning
+  quick_temporary_focus:
+    included: ".*.swift"
+    regex: '\sfdescribe\(|\sfcontext\(|\sfit\('
+    name: "Quick Temporary Focus"
+    message: "Temporary focused Quick examples or groups shouldn't be commited."
+    severity: warning
+  remove_where_for_negative_filtering:
+    included: ".*.swift"
+    regex: '\.filter *\{ *!\$0\.[^\}&|]+\}'
+    name: "Remove Where for Negative Filtering"
+    message: "Use `remove(where:)` instead of `filter(where not ...)` for performance."
+    severity: warning
+  self_conditional_binding:
+    included: ".*.swift"
+    regex: '\s+`?\w+`?(?<! strongSelf)\s*=\s*self\s'
+    name: "Self Conditional Binding"
+    message: "Constants with conditional binding on `self` should be named `strongSelf`."
+    severity: warning
+  single_line_enum_cases:
     included: ".*.swift"
-    regex: '( {4}\S[^\n]+\n){2,} {4}return|( {8}\S[^\n]+\n){2,} {8}return|( {12}\S[^\n]+\n){2,} {12}return|( {16}\S[^\n]+\n){2,} {16}return|( {20}\S[^\n]+\n){2,} {20}return|( {24}\S[^\n]+\n){2,} {24}return'
-    name: "Return Whitespace"
-    message: "Put an empty line before the return line if two or more other lines in closure."
+    regex: 'enum [^\{]+\{\s*(?:\s*\/\/[^\n]*)*\s*case\s+[^,(\n]+,'
+    name: "Single Line Enum Cases"
+    message: "Use a new line for each enum case."
     severity: warning
   single_line_guard:
     included: ".*.swift"
-    regex: 'guard[^\{]{2,100}else\s*\{\s*\n\s*return.{2,60}\}'
+    regex: 'guard[^\{]{2,80}else\s*\{\s*\n\s*return.{2,40}\}'
     name: "Single Line Guard"
     message: "Use a single line guard for simple checks."
     severity: warning
-  space_before_comment:
+  singleton_default_private_init:
+    included: ".*.swift"
+    regex: 'class +(?<TYPE>\w+)(?:<[^\>]+>)? *\{.*static let `default`(?:: *\k<TYPE>)? *= *\k<TYPE>\(.*(?<=private) init\('
+    name: "Singleton Default Private Init"
+    message: "Singletons with a `default` object (pseudo-singletons) should not declare init methods as private."
+    severity: warning
+  singleton_shared_final:
+    included: ".*.swift"
+    regex: '(?<!final )class +(?<TYPE>\w+)(?:<[^\>]+>)? *\{.*static let shared(?:: *\k<TYPE>)? *= *\k<TYPE>\('
+    name: "Singleton Shared Final"
+    message: "Singletons with a single object (`shared`) should be marked as final."
+    severity: warning
+  singleton_shared_private_init:
+    included: ".*.swift"
+    regex: 'class +(?<TYPE>\w+)(?:<[^\>]+>)? *\{.*static let shared(?:: *\k<TYPE>)? *= *\k<TYPE>\(.*(?<= |\t|public|internal) init\('
+    name: "Singleton Shared Private Init"
+    message: "Singletons with a single object (`shared`) should declare their init method(s) as private."
+    severity: warning
+  singleton_shared_single_object:
     included: ".*.swift"
-    regex: '\n[ ]{0}[^\/ \n][^\n]*\n[ ]{0}\/\/|\n[ ]{4}[^\/ \n][^\n]*\n[ ]{4}\/\/|\n[ ]{8}[^\/ \n][^\n]*\n[ ]{8}\/\/|\n[ ]{16}[^\/ \n][^\n]*\n[ ]{16}\/\/|\n[ ]{20}[^\/ \n][^\n]*\n[ ]{20}\/\/|\n[ ]{24}[^\/ \n][^\n]*\n[ ]{24}\/\/'
-    name: "Space Before Comment"
-    message: "Always put a space line before a comment line and always comment code beforehand."
+    regex: 'class +(?<TYPE>\w+)(?:<[^\>]+>)? *\{.*(?:static let shared(?:: *\k<TYPE>)? *= *\k<TYPE>\(.*static let \w+(?:: *\k<TYPE>)? *= *\k<TYPE>\(|static let \w+(?:: *\k<TYPE>)? *= *\k<TYPE>\(.*static let shared(?:: *\k<TYPE>)? *= *\k<TYPE>\()'
+    name: "Singleton Shared Single Object"
+    message: "Singletons with a `shared` object (real Singletons) should not have other static let properties. Use `default` instead (if needed)."
+    severity: warning
+  switch_associated_value_style:
+    included: ".*.swift"
+    regex: 'case\s+[^\(][^\n]*(?:\(let |[^\)], let)'
+    name: "Switch Associated Value Style"
+    message: "Always put the `let` in front of case – even if only one associated value captured."
+    severity: warning
+  toggle_bool:
+    included: ".*.swift"
+    regex: '(?<=\n)[ \t]*(?<VAR>\w+) *= *!\k<VAR>(?=\s)'
+    name: "Toggle Bool"
+    message: "Use `toggle()` instead of toggling manually."
     severity: warning
   too_much_indentation:
     included: ".*.swift"
@@ -114,13 +343,19 @@ custom_rules:
     severity: warning
   too_much_unindentation:
     included: ".*.swift"
-    regex: ' {28}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,23}[^\s\/]| {24}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,19}[^\s\/]| {20}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,15}[^\s\/]| {16}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,11}[^\s\/]| {12}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,7}[^\s\/]| {8}\S(.|[^\n]*[^\)][^\ ][^\}])\n+ {0,3}[^\s\/]'
+    regex: ' {28}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,23}[^\s\/]| {24}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,19}[^\s\/]| {20}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,15}[^\s\/]| {16}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,11}[^\s\/]| {12}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,7}[^\s\/]| {8}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,3}[^\s\/]'
     name: "Too Much Unindentation"
     message: "Don't unindent code by more than 4 whitespaces."
     severity: warning
+  tuple_index:
+    included: ".*.swift"
+    regex: '(\$\d|\w*[^\d \(\[\{])\.\d'
+    name: "Tuple Index"
+    message: "Prevent unwraping tuples by their index – define a typealias with named components instead."
+    severity: warning
   unnecessary_case_break:
     included: ".*.swift"
-    regex: '(case |default)(?:[^\n\}]+\n){2,}\s*break|\n *\n *break(?:\n *\n|\n *\})'
+    regex: '(case |default)(?:[^\n\}]+\n){2,}\s*break *\n|\n *\n *break(?:\n *\n|\n *\})'
     name: "Unnecessary Case Break"
     message: "Don't use break in switch cases – Swift breaks by default."
     severity: warning
@@ -130,33 +365,27 @@ custom_rules:
     name: "Unnecessary Nil Assignment"
     message: "Don't assign nil as a value when defining an optional type – it's nil by default."
     severity: warning
-  vertical_whitespace_between_cases:
-    included: ".*.swift"
-    regex: '[^\n{][ \t]*\n[ \t]*(?:case[^\n]+|default):[ \t]*\n'
-    name: "Vertical Whitespace Between Cases"
-    message: "Include a vertical whitespace (empty line) between cases in switch statements."
-    severity: warning
   vertical_whitespaces_around_mark:
     included: ".*.swift"
     regex: '\/\/\s*MARK:[^\n]*(\n\n)|(\n\n\n)[ \t]*\/\/\s*MARK:|[^\s{]\n[^\n\/]*\/\/\s*MARK:'
     name: "Vertical Whitespaces Around MARK:"
     message: "Include a single vertical whitespace (empty line) before and none after MARK: comments."
     severity: warning
-  vertical_whitespace_opening_braces:
+  view_controller_variable_naming:
     included: ".*.swift"
-    regex: '[{(\[][ \t]*\n[ \t]*\n'
-    name: "Vertical Whitespace after Opening Braces"
-    message: "Don't include vertical whitespace (empty line) after opening braces."
+    regex: '(?:let|var) +\w*(?:vc|VC|Vc|viewC|viewController|ViewController) *='
+    name: "View Controller Variable Naming"
+    message: "Always name your view controller variables with the suffix `ViewCtrl`."
     severity: warning
-  vertical_whitespace_closing_braces:
+  whitespace_around_range_operators:
     included: ".*.swift"
-    regex: '\n[ \t]*\n[ \t]*[)}\]]'
-    name: "Vertical Whitespace before Closing Braces"
-    message: "Don't include vertical whitespace (empty line) before closing braces."
+    regex: '\w\.\.[<\.]\w'
+    name: "Whitespace around Range Operators"
+    message: "A range operator should be surrounded by a single whitespace."
     severity: warning
   whitespace_comment_start:
     included: ".*.swift"
-    regex: '[^:]\/\/[^\s\/]'
+    regex: '[^:#\]\}\)][^:#\]\}\)]\/\/[^\s\/]'
     name: "Whitespace Comment Start"
     message: "A comment should always start with a whitespace."
     severity: warning
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..067a303
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,26 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+### Added
+- None.
+### Changed
+- None.
+### Deprecated
+- None.
+### Removed
+- None.
+### Fixed
+- None.
+### Security
+- None.
+
+## [1.8.0] - 2017-12-10
+### Changed
+- Upgraded Code to Swift 4.
+
+## [1.7.0] - 2017-02-13
+### Added
+- Added **import method** that works **synchronously** (see [README](https://github.com/Flinesoft/CSVImporter#import-synchronously))
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..14eb070
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at github [at] cihatguenduez [dot] de. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..09d8046
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,31 @@
+# Contributing
+
+Bug reports and pull requests are welcome on GitHub at https://github.com/Flinesoft/CSVImporter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
+
+## Getting Started
+
+This section will tell you how you can get started contributing to HandySwift.
+
+### Prerequisites
+
+Before you start developing, please make sure you have the following tools installed on your machine:
+
+- Xcode 10.0+
+- [SwiftLint](https://github.com/realm/SwiftLint)
+- [ProjLint](https://github.com/JamitLabs/ProjLint)
+- [Beak](https://github.com/yonaskolb/Beak)
+- [Sourcery](https://github.com/krzysztofzablocki/Sourcery)
+
+### Useful Commands
+
+To **update the Linux tests** (required after adding/renaming/removing test methods):
+
+```
+beak run generateLinuxMain
+```
+
+This will make sure the Linux CI can also find and run all the tests.
+
+### Commit Messages
+
+Please also try to follow the same syntax and semantic in your **commit messages** (see rationale [here](http://chris.beams.io/posts/git-commit/)).
diff --git a/CSVImporter.podspec b/CSVImporter.podspec
index 7c88014..e9c144f 100644
--- a/CSVImporter.podspec
+++ b/CSVImporter.podspec
@@ -25,5 +25,6 @@ Pod::Spec.new do |s|
   s.source_files  = "Sources", "Sources/**/*.swift"
   s.framework  = "Foundation"
   s.dependency "HandySwift", "~> 2.5"
+  s.swift_version = "4.2"
 
 end
diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index 17d3399..e0d8ee6 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -88,15 +88,21 @@
 		8223A01C1C4AFC6700627674 /* CSVImporterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223A01B1C4AFC6700627674 /* CSVImporterSpec.swift */; };
 		8223A01D1C4AFC6700627674 /* CSVImporterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223A01B1C4AFC6700627674 /* CSVImporterSpec.swift */; };
 		8223A01E1C4AFC6700627674 /* CSVImporterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8223A01B1C4AFC6700627674 /* CSVImporterSpec.swift */; };
-		8223A0211C4AFC9300627674 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A01F1C4AFC9300627674 /* Nimble.framework */; };
-		8223A0221C4AFC9300627674 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A0201C4AFC9300627674 /* Quick.framework */; };
-		8223A0261C4AFCAE00627674 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A0241C4AFCAE00627674 /* Nimble.framework */; };
-		8223A0271C4AFCAE00627674 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A0251C4AFCAE00627674 /* Quick.framework */; };
-		8223A02B1C4AFCC900627674 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A0291C4AFCC900627674 /* Nimble.framework */; };
-		8223A02C1C4AFCC900627674 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8223A02A1C4AFCC900627674 /* Quick.framework */; };
 		8223A0301C4AFD3200627674 /* HandySwift.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82239F681C4AF9AE00627674 /* HandySwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		8223A0331C4AFD4600627674 /* HandySwift.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82239F6C1C4AFA0F00627674 /* HandySwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		8223A0361C4AFD5700627674 /* HandySwift.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82239F6E1C4AFA1E00627674 /* HandySwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C22215D49490059FB5B /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C20215D49480059FB5B /* Quick.framework */; };
+		82297C25215D49490059FB5B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C21215D49490059FB5B /* Nimble.framework */; };
+		82297C2A215D49540059FB5B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C28215D49540059FB5B /* Nimble.framework */; };
+		82297C2B215D49540059FB5B /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C29215D49540059FB5B /* Quick.framework */; };
+		82297C2E215D495E0059FB5B /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C2C215D495E0059FB5B /* Nimble.framework */; };
+		82297C2F215D495E0059FB5B /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82297C2D215D495E0059FB5B /* Quick.framework */; };
+		82297C30215D49C40059FB5B /* Nimble.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C21215D49490059FB5B /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C31215D49C40059FB5B /* Quick.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C20215D49480059FB5B /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C32215D49CA0059FB5B /* Nimble.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C2C215D495E0059FB5B /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C33215D49CA0059FB5B /* Quick.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C2D215D495E0059FB5B /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C34215D49D10059FB5B /* Nimble.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C28215D49540059FB5B /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C35215D49D10059FB5B /* Quick.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C29215D49540059FB5B /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		827A24B21D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B31D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B41D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
@@ -118,12 +124,6 @@
 		82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
 		82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
 		82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
-		A1E6AFAD1EEC153F000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A01F1C4AFC9300627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1E6AFAE1EEC153F000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0201C4AFC9300627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1E6AFB01EEC154F000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0241C4AFCAE00627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1E6AFB11EEC154F000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0251C4AFCAE00627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1E6AFB31EEC1560000FF121 /* Nimble.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A0291C4AFCC900627674 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		A1E6AFB41EEC1560000FF121 /* Quick.framework in Carthage */ = {isa = PBXBuildFile; fileRef = 8223A02A1C4AFCC900627674 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		A1F5AEE61E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE71E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE81E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
@@ -161,6 +161,8 @@
 			dstSubfolderSpec = 10;
 			files = (
 				8223A0301C4AFD3200627674 /* HandySwift.framework in Copy Framework Dependencies */,
+				82297C30215D49C40059FB5B /* Nimble.framework in Copy Framework Dependencies */,
+				82297C31215D49C40059FB5B /* Quick.framework in Copy Framework Dependencies */,
 			);
 			name = "Copy Framework Dependencies";
 			runOnlyForDeploymentPostprocessing = 0;
@@ -172,6 +174,8 @@
 			dstSubfolderSpec = 10;
 			files = (
 				8223A0331C4AFD4600627674 /* HandySwift.framework in Copy Framework Dependencies */,
+				82297C32215D49CA0059FB5B /* Nimble.framework in Copy Framework Dependencies */,
+				82297C33215D49CA0059FB5B /* Quick.framework in Copy Framework Dependencies */,
 			);
 			name = "Copy Framework Dependencies";
 			runOnlyForDeploymentPostprocessing = 0;
@@ -183,61 +187,26 @@
 			dstSubfolderSpec = 10;
 			files = (
 				8223A0361C4AFD5700627674 /* HandySwift.framework in Copy Framework Dependencies */,
+				82297C34215D49D10059FB5B /* Nimble.framework in Copy Framework Dependencies */,
+				82297C35215D49D10059FB5B /* Quick.framework in Copy Framework Dependencies */,
 			);
 			name = "Copy Framework Dependencies";
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		A1E6AFAC1EEC1529000FF121 /* Carthage */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A1E6AFAD1EEC153F000FF121 /* Nimble.framework in Carthage */,
-				A1E6AFAE1EEC153F000FF121 /* Quick.framework in Carthage */,
-			);
-			name = Carthage;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A1E6AFAF1EEC1545000FF121 /* Carthage */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A1E6AFB01EEC154F000FF121 /* Nimble.framework in Carthage */,
-				A1E6AFB11EEC154F000FF121 /* Quick.framework in Carthage */,
-			);
-			name = Carthage;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A1E6AFB21EEC1555000FF121 /* Carthage */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A1E6AFB31EEC1560000FF121 /* Nimble.framework in Carthage */,
-				A1E6AFB41EEC1560000FF121 /* Quick.framework in Carthage */,
-			);
-			name = Carthage;
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
 		2EE2D01B2039C3E800C21E3F /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
 		82239F471C4AF70500627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F511C4AF70500627674 /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239F611C4AF89200627674 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = SOURCE_ROOT; };
-		82239F621C4AF89200627674 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = SOURCE_ROOT; };
 		82239F681C4AF9AE00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/iOS/HandySwift.framework; sourceTree = SOURCE_ROOT; };
 		82239F6C1C4AFA0F00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/tvOS/HandySwift.framework; sourceTree = SOURCE_ROOT; };
 		82239F6E1C4AFA1E00627674 /* HandySwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HandySwift.framework; path = Carthage/Build/Mac/HandySwift.framework; sourceTree = SOURCE_ROOT; };
 		82239F771C4AFAFF00627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F801C4AFAFF00627674 /* Tests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239F931C4AFB1000627674 /* CSVImporter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CSVImporter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		82239F9C1C4AFB1000627674 /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		82239F9C1C4AFB1000627674 /* CSVImporter macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "CSVImporter macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		82239FB61C4AFC5100627674 /* AllstarFull.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AllstarFull.csv; sourceTree = "<group>"; };
 		82239FB71C4AFC5100627674 /* Appearances.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Appearances.csv; sourceTree = "<group>"; };
 		82239FB81C4AFC5100627674 /* AwardsManagers.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AwardsManagers.csv; sourceTree = "<group>"; };
@@ -264,14 +233,19 @@
 		82239FCD1C4AFC5100627674 /* TeamsFranchises.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TeamsFranchises.csv; sourceTree = "<group>"; };
 		82239FCE1C4AFC5100627674 /* TeamsHalf.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TeamsHalf.csv; sourceTree = "<group>"; };
 		8223A01B1C4AFC6700627674 /* CSVImporterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVImporterSpec.swift; sourceTree = "<group>"; };
-		8223A01F1C4AFC9300627674 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = "<group>"; };
-		8223A0201C4AFC9300627674 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = "<group>"; };
-		8223A0241C4AFCAE00627674 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/tvOS/Nimble.framework; sourceTree = "<group>"; };
-		8223A0251C4AFCAE00627674 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/tvOS/Quick.framework; sourceTree = "<group>"; };
-		8223A0291C4AFCC900627674 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = "<group>"; };
-		8223A02A1C4AFCC900627674 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = "<group>"; };
+		82297C17215D453B0059FB5B /* .projlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .projlint.yml; sourceTree = "<group>"; };
+		82297C18215D453B0059FB5B /* CODE_OF_CONDUCT.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CODE_OF_CONDUCT.md; sourceTree = "<group>"; };
+		82297C19215D453B0059FB5B /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
+		82297C1A215D453B0059FB5B /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
+		82297C1B215D453B0059FB5B /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = "<group>"; };
+		82297C1C215D45B70059FB5B /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = "<group>"; };
+		82297C20215D49480059FB5B /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = "<group>"; };
+		82297C21215D49490059FB5B /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = "<group>"; };
+		82297C28215D49540059FB5B /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = "<group>"; };
+		82297C29215D49540059FB5B /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = "<group>"; };
+		82297C2C215D495E0059FB5B /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/tvOS/Nimble.framework; sourceTree = "<group>"; };
+		82297C2D215D495E0059FB5B /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/tvOS/Quick.framework; sourceTree = "<group>"; };
 		827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CommaSemicolonQuotes.csv; sourceTree = "<group>"; };
-		827A24B51D2801580003D6DD /* LICENSE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
 		827A24B61D2801580003D6DD /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		828348671CA6E1B000DC4C26 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = "<group>"; };
 		82C48C7320F3A0C40052FAE5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -285,7 +259,6 @@
 		A110355E1D666CFD00214547 /* CSVImporter.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = CSVImporter.podspec; sourceTree = "<group>"; };
 		A1EC02D91E0431C00021718E /* Cartfile.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.resolved; sourceTree = "<group>"; };
 		A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = UTF16_Example.csv; sourceTree = "<group>"; };
-		A1F5AEE91E056FBA003D6949 /* .swift-version */ = {isa = PBXFileReference; lastKnownFileType = text; path = ".swift-version"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -300,9 +273,9 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				82297C25215D49490059FB5B /* Nimble.framework in Frameworks */,
+				82297C22215D49490059FB5B /* Quick.framework in Frameworks */,
 				82239F521C4AF70500627674 /* CSVImporter.framework in Frameworks */,
-				8223A0211C4AFC9300627674 /* Nimble.framework in Frameworks */,
-				8223A0221C4AFC9300627674 /* Quick.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -318,8 +291,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				82239F811C4AFAFF00627674 /* CSVImporter.framework in Frameworks */,
-				8223A0261C4AFCAE00627674 /* Nimble.framework in Frameworks */,
-				8223A0271C4AFCAE00627674 /* Quick.framework in Frameworks */,
+				82297C2F215D495E0059FB5B /* Quick.framework in Frameworks */,
+				82297C2E215D495E0059FB5B /* Nimble.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -335,8 +308,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				82239F9D1C4AFB1000627674 /* CSVImporter.framework in Frameworks */,
-				8223A02B1C4AFCC900627674 /* Nimble.framework in Frameworks */,
-				8223A02C1C4AFCC900627674 /* Quick.framework in Frameworks */,
+				82297C2B215D49540059FB5B /* Quick.framework in Frameworks */,
+				82297C2A215D49540059FB5B /* Nimble.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -346,7 +319,7 @@
 		82239F3D1C4AF70500627674 = {
 			isa = PBXGroup;
 			children = (
-				82239F491C4AF70500627674 /* Framework */,
+				82239F491C4AF70500627674 /* Frameworks */,
 				82239F551C4AF70500627674 /* Tests */,
 				A1EC02D81E0431A90021718E /* Root Files */,
 				82C48C7D20F3A1510052FAE5 /* Frameworks */,
@@ -358,28 +331,28 @@
 			isa = PBXGroup;
 			children = (
 				82239F471C4AF70500627674 /* CSVImporter.framework */,
-				82239F511C4AF70500627674 /* Tests iOS.xctest */,
+				82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */,
 				82239F771C4AFAFF00627674 /* CSVImporter.framework */,
-				82239F801C4AFAFF00627674 /* Tests tvOS.xctest */,
+				82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */,
 				82239F931C4AFB1000627674 /* CSVImporter.framework */,
-				82239F9C1C4AFB1000627674 /* Tests macOS.xctest */,
+				82239F9C1C4AFB1000627674 /* CSVImporter macOS Tests.xctest */,
 			);
 			name = Products;
 			sourceTree = "<group>";
 		};
-		82239F491C4AF70500627674 /* Framework */ = {
+		82239F491C4AF70500627674 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				8223A03A1C4AFE5D00627674 /* Sources */,
+				8223A03A1C4AFE5D00627674 /* CSVImporter */,
 				8223A03B1C4AFE6200627674 /* SupportingFiles */,
 			);
-			path = Framework;
+			path = Frameworks;
 			sourceTree = "<group>";
 		};
 		82239F551C4AF70500627674 /* Tests */ = {
 			isa = PBXGroup;
 			children = (
-				8223A01A1C4AFC6700627674 /* Code */,
+				8223A01A1C4AFC6700627674 /* CSVImporterTests */,
 				82239FB41C4AFC5100627674 /* Assets */,
 				8223A03C1C4AFE6E00627674 /* SupportingFiles */,
 			);
@@ -461,15 +434,15 @@
 			path = "Lahman's Baseball Database";
 			sourceTree = "<group>";
 		};
-		8223A01A1C4AFC6700627674 /* Code */ = {
+		8223A01A1C4AFC6700627674 /* CSVImporterTests */ = {
 			isa = PBXGroup;
 			children = (
 				8223A01B1C4AFC6700627674 /* CSVImporterSpec.swift */,
 			);
-			path = Code;
+			path = CSVImporterTests;
 			sourceTree = "<group>";
 		};
-		8223A03A1C4AFE5D00627674 /* Sources */ = {
+		8223A03A1C4AFE5D00627674 /* CSVImporter */ = {
 			isa = PBXGroup;
 			children = (
 				82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */,
@@ -478,7 +451,7 @@
 				82C48C8620F3A1C40052FAE5 /* StringSource.swift */,
 				82C48C8720F3A1C40052FAE5 /* TextFile.swift */,
 			);
-			path = Sources;
+			path = CSVImporter;
 			sourceTree = "<group>";
 		};
 		8223A03B1C4AFE6200627674 /* SupportingFiles */ = {
@@ -529,8 +502,8 @@
 		82C48C8020F3A1760052FAE5 /* iOS */ = {
 			isa = PBXGroup;
 			children = (
-				8223A01F1C4AFC9300627674 /* Nimble.framework */,
-				8223A0201C4AFC9300627674 /* Quick.framework */,
+				82297C21215D49490059FB5B /* Nimble.framework */,
+				82297C20215D49480059FB5B /* Quick.framework */,
 			);
 			name = iOS;
 			sourceTree = "<group>";
@@ -538,8 +511,8 @@
 		82C48C8120F3A17A0052FAE5 /* tvOS */ = {
 			isa = PBXGroup;
 			children = (
-				8223A0241C4AFCAE00627674 /* Nimble.framework */,
-				8223A0251C4AFCAE00627674 /* Quick.framework */,
+				82297C2C215D495E0059FB5B /* Nimble.framework */,
+				82297C2D215D495E0059FB5B /* Quick.framework */,
 			);
 			name = tvOS;
 			sourceTree = "<group>";
@@ -547,8 +520,8 @@
 		82C48C8220F3A17E0052FAE5 /* macOS */ = {
 			isa = PBXGroup;
 			children = (
-				8223A0291C4AFCC900627674 /* Nimble.framework */,
-				8223A02A1C4AFCC900627674 /* Quick.framework */,
+				82297C28215D49540059FB5B /* Nimble.framework */,
+				82297C29215D49540059FB5B /* Quick.framework */,
 			);
 			name = macOS;
 			sourceTree = "<group>";
@@ -556,15 +529,18 @@
 		A1EC02D81E0431A90021718E /* Root Files */ = {
 			isa = PBXGroup;
 			children = (
-				827A24B61D2801580003D6DD /* README.md */,
-				827A24B51D2801580003D6DD /* LICENSE.md */,
+				82297C17215D453B0059FB5B /* .projlint.yml */,
+				828348671CA6E1B000DC4C26 /* .swiftlint.yml */,
 				82239F611C4AF89200627674 /* Cartfile */,
-				82239F621C4AF89200627674 /* Cartfile.private */,
+				82297C1C215D45B70059FB5B /* Cartfile.private */,
 				A1EC02D91E0431C00021718E /* Cartfile.resolved */,
+				82297C19215D453B0059FB5B /* CHANGELOG.md */,
+				82297C18215D453B0059FB5B /* CODE_OF_CONDUCT.md */,
+				82297C1B215D453B0059FB5B /* CONTRIBUTING.md */,
 				A110355E1D666CFD00214547 /* CSVImporter.podspec */,
-				828348671CA6E1B000DC4C26 /* .swiftlint.yml */,
-				A1F5AEE91E056FBA003D6949 /* .swift-version */,
+				82297C1A215D453B0059FB5B /* LICENSE */,
 				2EE2D01B2039C3E800C21E3F /* Package.swift */,
+				827A24B61D2801580003D6DD /* README.md */,
 			);
 			name = "Root Files";
 			sourceTree = "<group>";
@@ -599,121 +575,121 @@
 /* End PBXHeadersBuildPhase section */
 
 /* Begin PBXNativeTarget section */
-		82239F461C4AF70500627674 /* Framework iOS */ = {
+		82239F461C4AF70500627674 /* CSVImporter iOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Framework iOS" */;
+			buildConfigurationList = 82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS" */;
 			buildPhases = (
 				82239F421C4AF70500627674 /* Sources */,
 				82239F431C4AF70500627674 /* Frameworks */,
 				82239F441C4AF70500627674 /* Headers */,
 				82239F451C4AF70500627674 /* Resources */,
 				828348681CA6E1F100DC4C26 /* SwiftLint */,
+				82297C1D215D479E0059FB5B /* ProjLint */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "Framework iOS";
+			name = "CSVImporter iOS";
 			productName = CSVImporter;
 			productReference = 82239F471C4AF70500627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F501C4AF70500627674 /* Tests iOS */ = {
+		82239F501C4AF70500627674 /* CSVImporter iOS Tests */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Tests iOS" */;
+			buildConfigurationList = 82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS Tests" */;
 			buildPhases = (
 				82239F4D1C4AF70500627674 /* Sources */,
 				82239F4E1C4AF70500627674 /* Frameworks */,
 				82239F4F1C4AF70500627674 /* Resources */,
 				8223A02E1C4AFD1900627674 /* Copy Framework Dependencies */,
-				A1E6AFAC1EEC1529000FF121 /* Carthage */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				82239F541C4AF70500627674 /* PBXTargetDependency */,
 			);
-			name = "Tests iOS";
+			name = "CSVImporter iOS Tests";
 			productName = CSVImporterTests;
-			productReference = 82239F511C4AF70500627674 /* Tests iOS.xctest */;
+			productReference = 82239F511C4AF70500627674 /* CSVImporter iOS Tests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
-		82239F761C4AFAFF00627674 /* Framework tvOS */ = {
+		82239F761C4AFAFF00627674 /* CSVImporter tvOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Framework tvOS" */;
+			buildConfigurationList = 82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS" */;
 			buildPhases = (
 				82239F721C4AFAFF00627674 /* Sources */,
 				82239F731C4AFAFF00627674 /* Frameworks */,
 				82239F741C4AFAFF00627674 /* Headers */,
 				82239F751C4AFAFF00627674 /* Resources */,
 				828348691CA6E1FD00DC4C26 /* SwiftLint */,
+				82297C1E215D47B80059FB5B /* ProjLint */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "Framework tvOS";
+			name = "CSVImporter tvOS";
 			productName = "CSVImporter tvOS";
 			productReference = 82239F771C4AFAFF00627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F7F1C4AFAFF00627674 /* Tests tvOS */ = {
+		82239F7F1C4AFAFF00627674 /* CSVImporter tvOS Tests */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Tests tvOS" */;
+			buildConfigurationList = 82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS Tests" */;
 			buildPhases = (
 				82239F7C1C4AFAFF00627674 /* Sources */,
 				82239F7D1C4AFAFF00627674 /* Frameworks */,
 				82239F7E1C4AFAFF00627674 /* Resources */,
 				8223A0311C4AFD3700627674 /* Copy Framework Dependencies */,
-				A1E6AFAF1EEC1545000FF121 /* Carthage */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				82239F831C4AFAFF00627674 /* PBXTargetDependency */,
 			);
-			name = "Tests tvOS";
+			name = "CSVImporter tvOS Tests";
 			productName = "CSVImporter tvOSTests";
-			productReference = 82239F801C4AFAFF00627674 /* Tests tvOS.xctest */;
+			productReference = 82239F801C4AFAFF00627674 /* CSVImporter tvOS Tests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
-		82239F921C4AFB1000627674 /* Framework macOS */ = {
+		82239F921C4AFB1000627674 /* CSVImporter macOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Framework macOS" */;
+			buildConfigurationList = 82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter macOS" */;
 			buildPhases = (
 				82239F8E1C4AFB1000627674 /* Sources */,
 				82239F8F1C4AFB1000627674 /* Frameworks */,
 				82239F901C4AFB1000627674 /* Headers */,
 				82239F911C4AFB1000627674 /* Resources */,
 				8283486A1CA6E20800DC4C26 /* SwiftLint */,
+				82297C1F215D47C80059FB5B /* ProjLint */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "Framework macOS";
+			name = "CSVImporter macOS";
 			productName = "CSVImporter OSX";
 			productReference = 82239F931C4AFB1000627674 /* CSVImporter.framework */;
 			productType = "com.apple.product-type.framework";
 		};
-		82239F9B1C4AFB1000627674 /* Tests macOS */ = {
+		82239F9B1C4AFB1000627674 /* CSVImporter macOS Tests */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Tests macOS" */;
+			buildConfigurationList = 82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter macOS Tests" */;
 			buildPhases = (
 				82239F981C4AFB1000627674 /* Sources */,
 				82239F991C4AFB1000627674 /* Frameworks */,
 				82239F9A1C4AFB1000627674 /* Resources */,
 				8223A0341C4AFD4900627674 /* Copy Framework Dependencies */,
-				A1E6AFB21EEC1555000FF121 /* Carthage */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				82239F9F1C4AFB1000627674 /* PBXTargetDependency */,
 			);
-			name = "Tests macOS";
+			name = "CSVImporter macOS Tests";
 			productName = "CSVImporter OSXTests";
-			productReference = 82239F9C1C4AFB1000627674 /* Tests macOS.xctest */;
+			productReference = 82239F9C1C4AFB1000627674 /* CSVImporter macOS Tests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
 /* End PBXNativeTarget section */
@@ -750,7 +726,7 @@
 					};
 					82239F9B1C4AFB1000627674 = {
 						CreatedOnToolsVersion = 7.2;
-						DevelopmentTeam = 767S6EFMJ8;
+						DevelopmentTeam = DB7EUU9D79;
 						LastSwiftMigration = 0900;
 						ProvisioningStyle = Automatic;
 					};
@@ -768,12 +744,12 @@
 			projectDirPath = "";
 			projectRoot = "";
 			targets = (
-				82239F461C4AF70500627674 /* Framework iOS */,
-				82239F501C4AF70500627674 /* Tests iOS */,
-				82239F761C4AFAFF00627674 /* Framework tvOS */,
-				82239F7F1C4AFAFF00627674 /* Tests tvOS */,
-				82239F921C4AFB1000627674 /* Framework macOS */,
-				82239F9B1C4AFB1000627674 /* Tests macOS */,
+				82239F461C4AF70500627674 /* CSVImporter iOS */,
+				82239F501C4AF70500627674 /* CSVImporter iOS Tests */,
+				82239F761C4AFAFF00627674 /* CSVImporter tvOS */,
+				82239F7F1C4AFAFF00627674 /* CSVImporter tvOS Tests */,
+				82239F921C4AFB1000627674 /* CSVImporter macOS */,
+				82239F9B1C4AFB1000627674 /* CSVImporter macOS Tests */,
 			);
 		};
 /* End PBXProject section */
@@ -905,6 +881,60 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
+		82297C1D215D479E0059FB5B /* ProjLint */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = ProjLint;
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which projlint > /dev/null; then\n        projlint lint --xcode --timeout 2 --ignore-network-errors\n    else\n        echo \"warning: ProjLint not installed, download it from https://github.com/JamitLabs/   ProjLint\"\n    fi\nfi\n";
+		};
+		82297C1E215D47B80059FB5B /* ProjLint */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = ProjLint;
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which projlint > /dev/null; then\n        projlint lint --xcode --timeout 2 --ignore-network-errors\n    else\n        echo \"warning: ProjLint not installed, download it from https://github.com/JamitLabs/ProjLint\"\n    fi\nfi\n";
+		};
+		82297C1F215D47C80059FB5B /* ProjLint */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = ProjLint;
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which projlint > /dev/null; then\n        projlint lint --xcode --timeout 2 --ignore-network-errors\n    else\n        echo \"warning: ProjLint not installed, download it from https://github.com/JamitLabs/ProjLint\"\n    fi\nfi\n";
+		};
 		828348681CA6E1F100DC4C26 /* SwiftLint */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -917,7 +947,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi";
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi\n";
 		};
 		828348691CA6E1FD00DC4C26 /* SwiftLint */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -1015,17 +1045,17 @@
 /* Begin PBXTargetDependency section */
 		82239F541C4AF70500627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F461C4AF70500627674 /* Framework iOS */;
+			target = 82239F461C4AF70500627674 /* CSVImporter iOS */;
 			targetProxy = 82239F531C4AF70500627674 /* PBXContainerItemProxy */;
 		};
 		82239F831C4AFAFF00627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F761C4AFAFF00627674 /* Framework tvOS */;
+			target = 82239F761C4AFAFF00627674 /* CSVImporter tvOS */;
 			targetProxy = 82239F821C4AFAFF00627674 /* PBXContainerItemProxy */;
 		};
 		82239F9F1C4AFB1000627674 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 82239F921C4AFB1000627674 /* Framework macOS */;
+			target = 82239F921C4AFB1000627674 /* CSVImporter macOS */;
 			targetProxy = 82239F9E1C4AFB1000627674 /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
@@ -1157,7 +1187,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -1182,7 +1212,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -1240,7 +1270,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
@@ -1267,7 +1297,7 @@
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
 				);
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
@@ -1287,6 +1317,7 @@
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
 				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -1306,6 +1337,7 @@
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/tvOS",
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
 				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -1333,7 +1365,7 @@
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
 				FRAMEWORK_VERSION = A;
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
@@ -1361,7 +1393,7 @@
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
 				);
 				FRAMEWORK_VERSION = A;
-				INFOPLIST_FILE = "$(SRCROOT)/Framework/SupportingFiles/Info.plist";
+				INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
 				MACOSX_DEPLOYMENT_TARGET = 10.10;
@@ -1378,10 +1410,11 @@
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_IDENTITY = "Mac Developer";
 				COMBINE_HIDPI_IMAGES = YES;
-				DEVELOPMENT_TEAM = 767S6EFMJ8;
+				DEVELOPMENT_TEAM = DB7EUU9D79;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
 				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
@@ -1399,10 +1432,11 @@
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_IDENTITY = "Mac Developer";
 				COMBINE_HIDPI_IMAGES = YES;
-				DEVELOPMENT_TEAM = 767S6EFMJ8;
+				DEVELOPMENT_TEAM = DB7EUU9D79;
 				FRAMEWORK_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Carthage/Build/Mac",
+					"$(PROJECT_DIR)/Carthage/Build/iOS",
 				);
 				INFOPLIST_FILE = Tests/SupportingFiles/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
@@ -1426,7 +1460,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Framework iOS" */ = {
+		82239F5B1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F5C1C4AF70500627674 /* Debug */,
@@ -1435,7 +1469,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "Tests iOS" */ = {
+		82239F5E1C4AF70500627674 /* Build configuration list for PBXNativeTarget "CSVImporter iOS Tests" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F5F1C4AF70500627674 /* Debug */,
@@ -1444,7 +1478,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Framework tvOS" */ = {
+		82239F881C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F891C4AFAFF00627674 /* Debug */,
@@ -1453,7 +1487,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "Tests tvOS" */ = {
+		82239F8B1C4AFAFF00627674 /* Build configuration list for PBXNativeTarget "CSVImporter tvOS Tests" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239F8C1C4AFAFF00627674 /* Debug */,
@@ -1462,7 +1496,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Framework macOS" */ = {
+		82239FA41C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter macOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239FA51C4AFB1000627674 /* Debug */,
@@ -1471,7 +1505,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "Tests macOS" */ = {
+		82239FA71C4AFB1000627674 /* Build configuration list for PBXNativeTarget "CSVImporter macOS Tests" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				82239FA81C4AFB1000627674 /* Debug */,
diff --git a/CSVImporter.xcodeproj/xcshareddata/IDETemplateMacros.plist b/CSVImporter.xcodeproj/xcshareddata/IDETemplateMacros.plist
new file mode 100644
index 0000000..859887a
--- /dev/null
+++ b/CSVImporter.xcodeproj/xcshareddata/IDETemplateMacros.plist
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>FILEHEADER</key>
+	<string>
+//  Created by ___FULLUSERNAME___ on ___DATE___.
+//  ___COPYRIGHT___
+//</string>
+</dict>
+</plist>
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme
index e88c07a..f64a057 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter iOS.xcscheme	
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F461C4AF70500627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "Framework iOS"
+               BlueprintName = "CSVImporter iOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -33,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F501C4AF70500627674"
-               BuildableName = "Tests iOS.xctest"
-               BlueprintName = "Tests iOS"
+               BuildableName = "CSVImporter iOS Tests.xctest"
+               BlueprintName = "CSVImporter iOS Tests"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -44,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework iOS"
+            BlueprintName = "CSVImporter iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -66,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework iOS"
+            BlueprintName = "CSVImporter iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -84,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F461C4AF70500627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework iOS"
+            BlueprintName = "CSVImporter iOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter macOS.xcscheme
similarity index 91%
rename from CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme
rename to CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter macOS.xcscheme
index ef842fd..aeb5cdf 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter OSX.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter macOS.xcscheme	
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F921C4AFB1000627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "Framework macOS"
+               BlueprintName = "CSVImporter macOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -33,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F9B1C4AFB1000627674"
-               BuildableName = "Tests macOS.xctest"
-               BlueprintName = "Tests macOS"
+               BuildableName = "CSVImporter macOS Tests.xctest"
+               BlueprintName = "CSVImporter macOS Tests"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -44,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework macOS"
+            BlueprintName = "CSVImporter macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -66,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework macOS"
+            BlueprintName = "CSVImporter macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -84,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F921C4AFB1000627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework macOS"
+            BlueprintName = "CSVImporter macOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme
index ae86411..cbb0e4f 100644
--- a/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme	
+++ b/CSVImporter.xcodeproj/xcshareddata/xcschemes/CSVImporter tvOS.xcscheme	
@@ -16,7 +16,7 @@
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F761C4AFAFF00627674"
                BuildableName = "CSVImporter.framework"
-               BlueprintName = "Framework tvOS"
+               BlueprintName = "CSVImporter tvOS"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -33,8 +33,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "82239F7F1C4AFAFF00627674"
-               BuildableName = "Tests tvOS.xctest"
-               BlueprintName = "Tests tvOS"
+               BuildableName = "CSVImporter tvOS Tests.xctest"
+               BlueprintName = "CSVImporter tvOS Tests"
                ReferencedContainer = "container:CSVImporter.xcodeproj">
             </BuildableReference>
          </TestableReference>
@@ -44,7 +44,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework tvOS"
+            BlueprintName = "CSVImporter tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -66,7 +66,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework tvOS"
+            BlueprintName = "CSVImporter tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -84,7 +84,7 @@
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "82239F761C4AFAFF00627674"
             BuildableName = "CSVImporter.framework"
-            BlueprintName = "Framework tvOS"
+            BlueprintName = "CSVImporter tvOS"
             ReferencedContainer = "container:CSVImporter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/Cartfile b/Cartfile
index 1646f0a..2f6ed12 100644
--- a/Cartfile
+++ b/Cartfile
@@ -1,2 +1,2 @@
 # Handy Swift features that didn't make it into the Swift standard library.
-github "Flinesoft/HandySwift" ~> 2.5
+github "Flinesoft/HandySwift" ~> 2.7
diff --git a/Cartfile.resolved b/Cartfile.resolved
index 940bd03..7d7dccb 100644
--- a/Cartfile.resolved
+++ b/Cartfile.resolved
@@ -1,3 +1,3 @@
-github "Flinesoft/HandySwift" "2.6.0"
-github "Quick/Nimble" "v7.1.3"
-github "Quick/Quick" "v1.3.0"
+github "Flinesoft/HandySwift" "2.7.0"
+github "Quick/Nimble" "v7.3.1"
+github "Quick/Quick" "v1.3.2"
diff --git a/Framework/Sources/CSVImporter.swift b/Frameworks/CSVImporter/CSVImporter.swift
similarity index 100%
rename from Framework/Sources/CSVImporter.swift
rename to Frameworks/CSVImporter/CSVImporter.swift
diff --git a/Framework/Sources/FileSource.swift b/Frameworks/CSVImporter/FileSource.swift
similarity index 100%
rename from Framework/Sources/FileSource.swift
rename to Frameworks/CSVImporter/FileSource.swift
diff --git a/Framework/Sources/Source.swift b/Frameworks/CSVImporter/Source.swift
similarity index 100%
rename from Framework/Sources/Source.swift
rename to Frameworks/CSVImporter/Source.swift
diff --git a/Framework/Sources/StringSource.swift b/Frameworks/CSVImporter/StringSource.swift
similarity index 100%
rename from Framework/Sources/StringSource.swift
rename to Frameworks/CSVImporter/StringSource.swift
diff --git a/Framework/Sources/TextFile.swift b/Frameworks/CSVImporter/TextFile.swift
similarity index 100%
rename from Framework/Sources/TextFile.swift
rename to Frameworks/CSVImporter/TextFile.swift
diff --git a/Framework/SupportingFiles/CSVImporter.h b/Frameworks/SupportingFiles/CSVImporter.h
similarity index 100%
rename from Framework/SupportingFiles/CSVImporter.h
rename to Frameworks/SupportingFiles/CSVImporter.h
diff --git a/Framework/SupportingFiles/Info.plist b/Frameworks/SupportingFiles/Info.plist
similarity index 100%
rename from Framework/SupportingFiles/Info.plist
rename to Frameworks/SupportingFiles/Info.plist
diff --git a/LICENSE.md b/LICENSE
similarity index 86%
rename from LICENSE.md
rename to LICENSE
index 419dacc..aaa41a3 100644
--- a/LICENSE.md
+++ b/LICENSE
@@ -1,6 +1,6 @@
-# The MIT License (MIT)
+The MIT License
 
-**Copyright (c) 2015-2016 Flinesoft**
+Copyright (c) 2015-2018 Flinesoft
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
@@ -9,13 +9,14 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
 
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/Package.swift b/Package.swift
index d9c7470..1785bda 100644
--- a/Package.swift
+++ b/Package.swift
@@ -4,24 +4,24 @@ import PackageDescription
 let package = Package(
     name: "CSVImporter",
     products: [
-        .library(
-            name: "CSVImporter",
-            targets: ["CSVImporter"]
-        )
+        .library(name: "CSVImporter", targets: ["CSVImporter"])
     ],
     dependencies: [
-        .package(url: "https://github.com/Flinesoft/HandySwift.git", .upToNextMajor(from: "2.5.0"))
+        .package(url: "https://github.com/Flinesoft/HandySwift.git", .upToNextMajor(from: "2.7.0")),
+        .package(url: "https://github.com/Quick/Quick.git", .upToNextMajor(from: "1.3.2")),
+        .package(url: "https://github.com/Quick/Nimble.git", .upToNextMajor(from: "7.3.1"))
     ],
     targets: [
         .target(
             name: "CSVImporter",
-            dependencies: [
-                "HandySwift"
-            ],
-            path: "Sources",
-            exclude: [
-                "Sources/Supporting Files"
-            ]
+            dependencies: ["HandySwift"],
+            path: "Frameworks/CSVImporter",
+            exclude: ["Frameworks/SupportingFiles"]
+        ),
+        .testTarget(
+            name: "CSVImporterTests",
+            dependencies: ["CSVImporter", "Quick", "Nimble"],
+            exclude: ["Tests/SupportingFiles"]
         )
     ],
     swiftLanguageVersions: [4]
diff --git a/README.md b/README.md
index c7d944a..42a4d6a 100644
--- a/README.md
+++ b/README.md
@@ -3,22 +3,22 @@
 </p>
 
 <p align="center">
-    <a href="https://app.bitrise.io/app/729b6b29afaa23cb">
-        <img src="https://app.bitrise.io/app/729b6b29afaa23cb/status.svg?token=vylelkIV0d8L8dgaENuNqg&branch=stable"
+    <a href="https://app.bitrise.io/app/257039737afe71d1">
+        <img src="https://app.bitrise.io/app/257039737afe71d1/status.svg?token=5IksJHfDRgFFmIFyTWMdxQ&branch=stable"
              alt="Build Status">
     </a>
     <a href="https://codebeat.co/projects/github-com-flinesoft-csvimporter">
         <img src="https://codebeat.co/badges/c665ed7c-1f1b-45db-9602-9ac216327edf"
-             alt="codebeat badge">
+             alt="Codebeat Status">
     </a>
     <a href="https://github.com/Flinesoft/CSVImporter/releases">
         <img src="https://img.shields.io/badge/Version-1.9.0-blue.svg"
              alt="Version: 1.9.0">
     </a>
-    <img src="https://img.shields.io/badge/Swift-4-FFAC45.svg"
-         alt="Swift: 4">
-    <img src="https://img.shields.io/badge/Platforms-iOS%20%7C%20tvOS%20%7C%20macOS-FF69B4.svg"
-        alt="Platforms: iOS | tvOS | macOS">
+    <img src="https://img.shields.io/badge/Swift-4.2-FFAC45.svg"
+         alt="Swift: 4.2">
+    <img src="https://img.shields.io/badge/Platforms-iOS%20%7C%20tvOS%20%7C%20macOS%20%7C%20Linux-FF69B4.svg"
+        alt="Platforms: iOS | tvOS | macOS | Linux">
     <a href="https://github.com/Flinesoft/CSVImporter/blob/stable/LICENSE.md">
         <img src="https://img.shields.io/badge/License-MIT-lightgrey.svg"
               alt="License: MIT">
@@ -46,42 +46,13 @@ Import CSV files line by line with ease.
 
 ## Installation
 
-Currently the recommended way of installing this library is via [Carthage](https://github.com/Carthage/Carthage).
-[Cocoapods](https://github.com/CocoaPods/CocoaPods) is supported too.
+Currently the recommended way of installing this library is via [Carthage](https://github.com/Carthage/Carthage) on macOS or [Swift Package Manager](https://github.com/apple/swift-package-manager) on Linux. [Cocoapods](https://github.com/CocoaPods/CocoaPods) might work, too, but is not tested.
 
 You can of course also just include this framework manually into your project by downloading it or by using git submodules.
 
-### Carthage
-
-Simply add this line to your Cartfile:
-
-```
-github "Flinesoft/CSVImporter" ~> 1.7
-```
-
-And run `carthage update`. Then drag & drop the HandySwift.framework in the Carthage/build folder to your project. Also do the same with the dependent framework `HandySwift`. Now you can `import CSVImporter` in each class you want to use its features. Refer to the [Carthage README](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) for detailed / updated instructions.
-
-### CocoaPods
-
-Add the line `pod 'CSVImporter'` to your target in your `Podfile` and make sure to include `use_frameworks!`
-at the top. The result might look similar to this:
-
-``` Ruby
-platform :ios, '8.0'
-use_frameworks!
-
-target 'MyAppTarget' do
-    pod 'CSVImporter', '~> 1.7'
-end
-```
-
-Now close your project and run `pod install` from the command line. Then open the `.xcworkspace` from within your project folder.
-Build your project once (with `Cmd+B`) to update the frameworks known to Xcode. Now you can `import CSVImporter` in each class you want to use its features.
-Refer to [CocoaPods.org](https://cocoapods.org) for detailed / updates instructions.
-
 ## Usage
 
-Please have a look at the UsageExamples.playground and the Tests/Code/CSVImporterSpec.swift files for a complete list of features provided.
+Please have a look at the UsageExamples.playground and the Tests/CSVImporterTests/CSVImporterSpec.swift files for a complete list of features provided.
 Open the Playground from within the `.xcworkspace` in order for it to work.
 
 
@@ -214,11 +185,9 @@ Note: If a records values count doesn't match that of the first lines values cou
 
 ## Contributing
 
-Contributions are welcome. Please just open an Issue on GitHub to discuss a point or request a feature or send a Pull Request with your suggestion.
+See the file [CONTRIBUTING.md](https://github.com/Flinesoft/HandySwift/blob/stable/CONTRIBUTING.md).
 
-Pull requests with new features will only be accepted when the following are given:
-- **Tests** for the new feature exist and all tests pass successfully for all targets.
-- **Usage examples** of the new feature are given in the Playgrounds.
 
 ## License
+
 This library is released under the [MIT License](http://opensource.org/licenses/MIT). See LICENSE for details.
diff --git a/Tests/Code/CSVImporterSpec.swift b/Tests/CSVImporterTests/CSVImporterSpec.swift
similarity index 99%
rename from Tests/Code/CSVImporterSpec.swift
rename to Tests/CSVImporterTests/CSVImporterSpec.swift
index 6b8c666..f3a0ca3 100644
--- a/Tests/Code/CSVImporterSpec.swift
+++ b/Tests/CSVImporterTests/CSVImporterSpec.swift
@@ -8,12 +8,10 @@
 
 // swiftlint:disable file_length
 
-import XCTest
-
+@testable import CSVImporter
 import Quick
 import Nimble
-
-@testable import CSVImporter
+import XCTest
 
 class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
     override func spec() { // swiftlint:disable:this function_body_length cyclomatic_complexity

From 9342bdfcefe36bce7072fd630156d168410fa72c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Thu, 27 Sep 2018 19:40:55 +0200
Subject: [PATCH 05/11] Add basic tests support on Linux + Fix linter warnings

---
 .sourcery/LinuxMain.stencil                  |  16 ++
 CSVImporter.xcodeproj/project.pbxproj        |  34 +--
 Package.resolved                             |  22 +-
 Tests/CSVImporterTests/CSVImporterSpec.swift |  82 +++---
 Tests/LinuxMain.swift                        |  10 +
 beak.swift                                   | 280 +++++++++++++++++++
 6 files changed, 385 insertions(+), 59 deletions(-)
 create mode 100644 .sourcery/LinuxMain.stencil
 create mode 100644 Tests/LinuxMain.swift
 create mode 100644 beak.swift

diff --git a/.sourcery/LinuxMain.stencil b/.sourcery/LinuxMain.stencil
new file mode 100644
index 0000000..6ef60aa
--- /dev/null
+++ b/.sourcery/LinuxMain.stencil
@@ -0,0 +1,16 @@
+@testable import CSVImporterTests
+import XCTest
+
+// swiftlint:disable line_length file_length
+
+{% for type in types.classes|based:"XCTestCase" %}
+extension {{ type.name }} {
+    static var allTests: [(String, ({{ type.name }}) -> () throws -> Void)] = [
+    {% for method in type.methods where method.parameters.count == 0 and method.shortName|hasPrefix:"test" and method|!annotated:"skipTestOnLinux" %}    ("{{ method.shortName }}", {{ method.shortName }}){% if not forloop.last %},{% endif %}
+    {% endfor %}]
+}
+
+{% endfor %}
+XCTMain([
+{% for type in types.classes|based:"XCTestCase" %}    testCase({{ type.name }}.allTests){% if not forloop.last %},{% endif %}
+{% endfor %}])
diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index e0d8ee6..62fe42b 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -321,7 +321,7 @@
 			children = (
 				82239F491C4AF70500627674 /* Frameworks */,
 				82239F551C4AF70500627674 /* Tests */,
-				A1EC02D81E0431A90021718E /* Root Files */,
+				A1EC02D81E0431A90021718E /* RootFiles */,
 				82C48C7D20F3A1510052FAE5 /* Frameworks */,
 				82239F481C4AF70500627674 /* Products */,
 			);
@@ -457,8 +457,8 @@
 		8223A03B1C4AFE6200627674 /* SupportingFiles */ = {
 			isa = PBXGroup;
 			children = (
-				82C48C7420F3A0D30052FAE5 /* CSVImporter.h */,
 				82C48C7520F3A0D30052FAE5 /* Info.plist */,
+				82C48C7420F3A0D30052FAE5 /* CSVImporter.h */,
 			);
 			path = SupportingFiles;
 			sourceTree = "<group>";
@@ -526,7 +526,7 @@
 			name = macOS;
 			sourceTree = "<group>";
 		};
-		A1EC02D81E0431A90021718E /* Root Files */ = {
+		A1EC02D81E0431A90021718E /* RootFiles */ = {
 			isa = PBXGroup;
 			children = (
 				82297C17215D453B0059FB5B /* .projlint.yml */,
@@ -542,7 +542,7 @@
 				2EE2D01B2039C3E800C21E3F /* Package.swift */,
 				827A24B61D2801580003D6DD /* README.md */,
 			);
-			name = "Root Files";
+			name = RootFiles;
 			sourceTree = "<group>";
 		};
 /* End PBXGroup section */
@@ -704,12 +704,12 @@
 				TargetAttributes = {
 					82239F461C4AF70500627674 = {
 						CreatedOnToolsVersion = 7.2;
-						LastSwiftMigration = 0940;
+						LastSwiftMigration = "";
 					};
 					82239F501C4AF70500627674 = {
 						CreatedOnToolsVersion = 7.2;
 						DevelopmentTeam = 767S6EFMJ8;
-						LastSwiftMigration = 0900;
+						LastSwiftMigration = "";
 					};
 					82239F761C4AFAFF00627674 = {
 						CreatedOnToolsVersion = 7.2;
@@ -897,7 +897,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which projlint > /dev/null; then\n        projlint lint --xcode --timeout 2 --ignore-network-errors\n    else\n        echo \"warning: ProjLint not installed, download it from https://github.com/JamitLabs/   ProjLint\"\n    fi\nfi\n";
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which projlint > /dev/null; then\n        projlint lint --xcode --timeout 2 --ignore-network-errors\n    else\n        echo \"warning: ProjLint not installed, download it from https://github.com/JamitLabs/ProjLint\"\n    fi\nfi\n";
 		};
 		82297C1E215D47B80059FB5B /* ProjLint */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -947,7 +947,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi\n";
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi\n";
 		};
 		828348691CA6E1FD00DC4C26 /* SwiftLint */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -961,7 +961,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi";
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi\n";
 		};
 		8283486A1CA6E20800DC4C26 /* SwiftLint */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -975,7 +975,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi";
+			shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n    if which swiftlint > /dev/null; then\n        swiftlint\n    else\n        echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n    fi\nfi\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -1114,6 +1114,7 @@
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Off;
+				SWIFT_VERSION = 4.2;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
@@ -1166,6 +1167,7 @@
 				SDKROOT = iphoneos;
 				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
 				SWIFT_SWIFT3_OBJC_INFERENCE = Off;
+				SWIFT_VERSION = 4.2;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALIDATE_PRODUCT = YES;
 				VERSIONING_SYSTEM = "apple-generic";
@@ -1194,7 +1196,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
 				SKIP_INSTALL = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
-				SWIFT_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -1218,7 +1219,6 @@
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
 				SKIP_INSTALL = YES;
-				SWIFT_VERSION = 4.0;
 			};
 			name = Release;
 		};
@@ -1235,7 +1235,6 @@
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporterTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -1252,7 +1251,6 @@
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporterTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
-				SWIFT_VERSION = 4.0;
 			};
 			name = Release;
 		};
@@ -1277,7 +1275,6 @@
 				SDKROOT = appletvos;
 				SKIP_INSTALL = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
-				SWIFT_VERSION = 4.0;
 				TARGETED_DEVICE_FAMILY = 3;
 				TVOS_DEPLOYMENT_TARGET = 9.0;
 			};
@@ -1303,7 +1300,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
 				SDKROOT = appletvos;
 				SKIP_INSTALL = YES;
-				SWIFT_VERSION = 4.0;
 				TARGETED_DEVICE_FAMILY = 3;
 				TVOS_DEPLOYMENT_TARGET = 9.0;
 			};
@@ -1324,7 +1320,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-tvOSTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = appletvos;
-				SWIFT_VERSION = 4.0;
 				TVOS_DEPLOYMENT_TARGET = 9.1;
 			};
 			name = Debug;
@@ -1344,7 +1339,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-tvOSTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = appletvos;
-				SWIFT_VERSION = 4.0;
 				TVOS_DEPLOYMENT_TARGET = 9.1;
 			};
 			name = Release;
@@ -1373,7 +1367,6 @@
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
-				SWIFT_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -1400,7 +1393,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.flinesoft.CSVImporter;
 				SDKROOT = macosx;
 				SKIP_INSTALL = YES;
-				SWIFT_VERSION = 4.0;
 			};
 			name = Release;
 		};
@@ -1422,7 +1414,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-OSXTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
-				SWIFT_VERSION = 4.0;
 			};
 			name = Debug;
 		};
@@ -1444,7 +1435,6 @@
 				PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.CSVImporter-OSXTests";
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SDKROOT = macosx;
-				SWIFT_VERSION = 4.0;
 			};
 			name = Release;
 		};
diff --git a/Package.resolved b/Package.resolved
index 8750b85..c24c3db 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -6,8 +6,26 @@
         "repositoryURL": "https://github.com/Flinesoft/HandySwift.git",
         "state": {
           "branch": null,
-          "revision": "a2004f8c842721ec739fd27cbe7b6269f6c6d0ba",
-          "version": "2.5.0"
+          "revision": "dfa0f27ac41b8f1129581a62d1d65c355cb0b3a3",
+          "version": "2.7.0"
+        }
+      },
+      {
+        "package": "Nimble",
+        "repositoryURL": "https://github.com/Quick/Nimble.git",
+        "state": {
+          "branch": null,
+          "revision": "cd6dfb86f496fcd96ce0bc6da962cd936bf41903",
+          "version": "7.3.1"
+        }
+      },
+      {
+        "package": "Quick",
+        "repositoryURL": "https://github.com/Quick/Quick.git",
+        "state": {
+          "branch": null,
+          "revision": "5fbf13871d185526993130c3a1fad0b70bfe37ce",
+          "version": "1.3.2"
         }
       }
     ]
diff --git a/Tests/CSVImporterTests/CSVImporterSpec.swift b/Tests/CSVImporterTests/CSVImporterSpec.swift
index f3a0ca3..7efb8af 100644
--- a/Tests/CSVImporterTests/CSVImporterSpec.swift
+++ b/Tests/CSVImporterTests/CSVImporterSpec.swift
@@ -6,11 +6,11 @@
 //  Copyright © 2016 Flinesoft. All rights reserved.
 //
 
-// swiftlint:disable file_length
+// swiftlint:disable file_length multiline_function_chains multiline_arguments_brackets
 
 @testable import CSVImporter
-import Quick
 import Nimble
+import Quick
 import XCTest
 
 class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
@@ -84,14 +84,18 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             expect(recordValues).toEventuallyNot(beNil())
             expect(recordValues?.first).toEventuallyNot(beNil())
-            expect(recordValues!.first!).toEventually(equal([
-                "",
-                "Text, with \"comma\"; and 'semicolon'.",
-                "",
-                "Another text with \"comma\"; and 'semicolon'!",
-                "Text without special chars.",
-                ""
-            ]))
+            expect(recordValues!.first!).toEventually(
+                equal(
+                    [
+                        "",
+                        "Text, with \"comma\"; and 'semicolon'.",
+                        "",
+                        "Another text with \"comma\"; and 'semicolon'!",
+                        "Text without special chars.",
+                        ""
+                    ]
+                )
+            )
         }
 
         it("imports data from CSV file with headers") {
@@ -101,9 +105,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             if let path = path {
                 let importer = CSVImporter<[String: String]>(path: path)
 
-                importer.startImportingRecords(structure: { (headerValues) -> Void in
+                importer.startImportingRecords(structure: { headerValues -> Void in
                     print(headerValues)
-                }, recordMapper: { (recordValues) -> [String: String] in
+                }, recordMapper: { recordValues -> [String: String] in
                     return recordValues
                 }).onFail {
                     print("Did fail")
@@ -123,11 +127,11 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             let path = Bundle(for: CSVImporterSpec.self).path(forResource: "Teams", ofType: "csv")
             var recordValues: [[String: String]]?
 
-            let structure: ([String]) -> Void = { (headerValues) -> Void in
+            let structure: ([String]) -> Void = { headerValues -> Void in
                 print(headerValues)
             }
 
-            let recordMapper: ([String: String]) -> [String: String] = { (recordValues) -> [String: String] in
+            let recordMapper: ([String: String]) -> [String: String] = { recordValues -> [String: String] in
                 return recordValues
             }
 
@@ -148,9 +152,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             let importer = CSVImporter<[String: String]>(contentString: contentString)
 
-            importer.startImportingRecords(structure: { (headerValues) -> Void in
+            importer.startImportingRecords(structure: { headerValues -> Void in
                 print(headerValues)
-            }, recordMapper: { (recordValues) -> [String: String] in
+            }, recordMapper: { recordValues -> [String: String] in
                 return recordValues
             }).onFail {
                 print("Did fail")
@@ -172,11 +176,11 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             if let path = path {
                 let importer = CSVImporter<[String: String]>(path: path, lineEnding: .carriageReturnLineFeed)
 
-                let structure: ([String]) -> Void = { (headerValues) -> Void in
+                let structure: ([String]) -> Void = { headerValues -> Void in
                     print(headerValues)
                 }
 
-                let recordMapper: ([String: String]) -> [String: String] = { (recordValues) -> [String: String] in
+                let recordMapper: ([String: String]) -> [String: String] = { recordValues -> [String: String] in
                     return recordValues
                 }
 
@@ -199,11 +203,11 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             if let path = path {
                 let importer = CSVImporter<[String: String]>(path: path, lineEnding: .newLine)
 
-                let recordMapper: ([String: String]) -> [String: String] = { (recordValues) -> [String: String] in
+                let recordMapper: ([String: String]) -> [String: String] = { recordValues -> [String: String] in
                     return recordValues
                 }
 
-                let structure: ([String]) -> Void = { (headerValues) -> Void in
+                let structure: ([String]) -> Void = { headerValues -> Void in
                     print(headerValues)
                 }
 
@@ -228,9 +232,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             if let path = path {
                 let importer = CSVImporter<[String: String]>(path: path) // don't specify lineEnding
 
-                importer.startImportingRecords(structure: { (headerValues) -> Void in
+                importer.startImportingRecords(structure: { headerValues -> Void in
                     print(headerValues)
-                }, recordMapper: { (recordValues) -> [String: String] in
+                }, recordMapper: { recordValues -> [String: String] in
                     return recordValues
                 }).onFail {
                     print("Did fail")
@@ -258,9 +262,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
                 let importer = CSVImporter<[String: String]>(path: path, lineEnding: .newLine)    // wrong
 
-                importer.startImportingRecords(structure: { (headerValues) -> Void in
+                importer.startImportingRecords(structure: { headerValues -> Void in
                     print(headerValues)
-                }, recordMapper: { (recordValues) -> [String: String] in
+                }, recordMapper: { recordValues -> [String: String] in
                     return recordValues
                 }).onFail {
                     print("Did fail")
@@ -280,9 +284,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             if let url = url {
                 if let importer = CSVImporter<[String: String]>(url: url) {
-                    importer.startImportingRecords(structure: { (headerValues) -> Void in
+                    importer.startImportingRecords(structure: { headerValues -> Void in
                         print(headerValues)
-                    }, recordMapper: { (recordValues) -> [String: String] in
+                    }, recordMapper: { recordValues -> [String: String] in
                         return recordValues
                     }).onFail {
                         print("Did fail")
@@ -306,9 +310,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             if let url = url {
                 if let importer = CSVImporter<[String: String]>(url: url) {
-                    importer.startImportingRecords(structure: { (headerValues) -> Void in
+                    importer.startImportingRecords(structure: { headerValues -> Void in
                         print(headerValues)
-                    }, recordMapper: { (recordValues) -> [String: String] in
+                    }, recordMapper: { recordValues -> [String: String] in
                         return recordValues
                     }).onFail {
                         print("Did fail")
@@ -333,9 +337,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             if let url = url {
                 if let importer = CSVImporter<[String: String]>(url: url) {
-                    importer.startImportingRecords(structure: { (headerValues) -> Void in
+                    importer.startImportingRecords(structure: { headerValues -> Void in
                         print(headerValues)
-                    }, recordMapper: { (recordValues) -> [String: String] in
+                    }, recordMapper: { recordValues -> [String: String] in
                         return recordValues
                     }).onFail {
                         print("Did fail")
@@ -358,9 +362,9 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
 
             if let url = url {
                 if let importer = CSVImporter<[String: String]>(url: url) {
-                    importer.startImportingRecords(structure: { (headerValues) -> Void in
+                    importer.startImportingRecords(structure: { headerValues -> Void in
                         print(headerValues)
-                    }, recordMapper: { (recordValues) -> [String: String] in
+                    }, recordMapper: { recordValues -> [String: String] in
                         return recordValues
                     }).onFail {
                         print("Did fail")
@@ -383,11 +387,19 @@ class CSVImporterSpec: QuickSpec { // swiftlint:disable:this type_body_length
             var recordValues: [[String: String]]?
 
             guard let url = Bundle(for: CSVImporterSpec.self).url(forResource: "UTF16_Example.csv", withExtension: nil),
-                let importer = CSVImporter<[String: String]>(url: url, lineEnding: .carriageReturnLineFeed, encoding: .utf16LittleEndian) else { fail(); return }
+                let importer = CSVImporter<[String: String]>(
+                    url: url,
+                    lineEnding: .carriageReturnLineFeed,
+                    encoding: .utf16LittleEndian
+                )
+            else {
+                fail()
+                return
+            }
 
-            importer.startImportingRecords(structure: { (headerValues) -> Void in
+            importer.startImportingRecords(structure: { headerValues -> Void in
                 print(headerValues)
-            }, recordMapper: { (recordValues) -> [String: String] in
+            }, recordMapper: { recordValues -> [String: String] in
                 return recordValues
             }).onFail {
                 print("Did fail")
diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift
new file mode 100644
index 0000000..237b87c
--- /dev/null
+++ b/Tests/LinuxMain.swift
@@ -0,0 +1,10 @@
+// Generated using Sourcery 0.15.0 — https://github.com/krzysztofzablocki/Sourcery
+// DO NOT EDIT
+
+@testable import CSVImporterTests
+import XCTest
+
+// swiftlint:disable line_length file_length
+
+XCTMain([
+])
diff --git a/beak.swift b/beak.swift
new file mode 100644
index 0000000..e26bf24
--- /dev/null
+++ b/beak.swift
@@ -0,0 +1,280 @@
+// beak: kareman/SwiftShell @ .upToNextMajor(from: "4.0.1")
+// beak: kylef/PathKit @ .upToNextMajor(from: "0.9.1")
+// beak: onevcat/Rainbow @ .upToNextMajor(from: "3.1.2")
+// beak: Flinesoft/HandySwift @ .upToNextMajor(from: "2.6.0")
+
+import HandySwift
+import Foundation
+import SwiftShell
+import PathKit
+import Rainbow
+
+let supportedPlatforms = ["iOS", "tvOS", "macOS", "watchOS"]
+
+// MARK: - Helpers
+private func deleteFile(_ fileName: String) throws {
+    let command = "[ ! -e \(fileName) ] || rm \(fileName)"
+    print("Deleting file '\(fileName)': '\(command)'", level: .info)
+    try runAndPrint(bash: command)
+}
+
+private func renameProject(from oldName: String, to newName: String) throws {
+    var filesToReplaceContent: [Path] = [
+        Path(oldName + ".xcodeproj/project.pbxproj"),
+        Path(oldName + ".xcodeproj/project.xcworkspace/contents.xcworkspacedata")
+    ]
+
+    filesToReplaceContent += supportedPlatforms.map { Path(oldName + ".xcodeproj/xcshareddata/xcschemes/\(oldName) \($0).xcscheme") }
+    filesToReplaceContent += Path.glob("Sources/**/*.swift")
+    filesToReplaceContent += Path.glob("Tests/**/*.swift")
+    filesToReplaceContent += [
+        "README.md", "Package.swift", "Sources/Supporting Files/\(oldName).h", "UsageExamples.playground/Contents.swift",
+        "\(oldName).xcworkspace/contents.xcworkspacedata", "\(oldName).podspec"
+        ].map { Path($0) }
+
+    try filesToReplaceContent.forEach { swiftFilePath in
+        try replaceInFile(fileUrl: swiftFilePath.url, regex: try Regex(oldName), replacement: newName)
+    }
+
+    try supportedPlatforms.forEach { platform in
+        let oldSchemePath = "\(oldName).xcodeproj/xcshareddata/xcschemes/\(oldName)\\ \(platform).xcscheme"
+        let newSchemePath = "\(oldName).xcodeproj/xcshareddata/xcschemes/\(newName)\\ \(platform).xcscheme"
+        try runAndPrint(bash: "mv \(oldSchemePath) \(newSchemePath)")
+    }
+
+    try runAndPrint(bash: "mv \(oldName).xcodeproj/ \(newName).xcodeproj/")
+    try runAndPrint(bash: "mv \(oldName).xcworkspace/ \(newName).xcworkspace/")
+    try runAndPrint(bash: "mv \(oldName).podspec \(newName).podspec")
+    try runAndPrint(bash: "mv Sources/Supporting\\ Files/\(oldName).h Sources/Supporting\\ Files/\(newName).h")
+}
+
+private func renameOrganization(from oldName: String, to newName: String, projectName: String) throws {
+    var filesToReplaceContent: [Path] = [
+        Path("LICENSE.md"),
+        Path("README.md"),
+        Path("\(projectName).podspec"),
+        Path("\(projectName).xcodeproj/project.pbxproj"),
+        Path("Sources/Supporting Files/\(projectName).h")
+    ]
+
+    filesToReplaceContent += Path.glob("Sources/**/*.swift")
+    filesToReplaceContent += Path.glob("Tests/**/*.swift")
+
+    // replace normal URL appearances
+    let oldNameWithoutWhitespaces = oldName.components(separatedBy: .whitespaces).joined()
+    let newNameWithoutWhitespaces = newName.components(separatedBy: .whitespaces).joined()
+
+    let urlRegex = try Regex("\(oldNameWithoutWhitespaces)/")
+    try filesToReplaceContent.forEach { swiftFilePath in
+        try replaceInFile(fileUrl: swiftFilePath.url, regex: urlRegex, replacement: "\(newNameWithoutWhitespaces)/")
+    }
+
+    // replace reversed URl appearances
+    let reversedUrlRegex = try Regex("com.\(oldNameWithoutWhitespaces.lowercased())")
+    try filesToReplaceContent.forEach { swiftFilePath in
+        try replaceInFile(fileUrl: swiftFilePath.url, regex: reversedUrlRegex, replacement: "com.\(newNameWithoutWhitespaces.lowercased())")
+    }
+
+    // replace other
+    try filesToReplaceContent.forEach { swiftFilePath in
+        try replaceInFile(fileUrl: swiftFilePath.url, regex: try Regex(oldName), replacement: newName)
+    }
+}
+
+private func replaceInFile(fileUrl: URL, regex: Regex, replacement: String) throws {
+    print("Replacing occurences of regex '\(regex)' in file '\(fileUrl.lastPathComponent)' with '\(replacement)' ...", level: .info)
+    var content = try String(contentsOf: fileUrl, encoding: .utf8)
+    content = regex.replacingMatches(in: content, with: replacement)
+    try content.write(to: fileUrl, atomically: false, encoding: .utf8)
+}
+
+private func replaceInFile(fileUrl: URL, substring: String, replacement: String) throws {
+    print("Replacing occurences of substring '\(substring)' in file '\(fileUrl.lastPathComponent)' with '\(replacement)' ...", level: .info)
+    var content = try String(contentsOf: fileUrl, encoding: .utf8)
+    content = content.replacingOccurrences(of: substring, with: replacement)
+    try content.write(to: fileUrl, atomically: false, encoding: .utf8)
+}
+
+private enum PrintLevel {
+    case info
+    case warning
+    case error
+}
+
+private func print(_ message: String, level: PrintLevel) {
+    switch level {
+    case .info:
+        print("ℹ️ ", message.lightBlue)
+
+    case .warning:
+        print("⚠️ ", message.yellow)
+
+    case .error:
+        print("❌ ", message.red)
+    }
+}
+
+private let semanticVersionRegex = try Regex("(\\d+)\\.(\\d+)\\.(\\d+)\\s")
+
+private struct SemanticVersion: Comparable, CustomStringConvertible {
+    let major: Int
+    let minor: Int
+    let patch: Int
+
+    init(_ string: String) {
+        guard let captures = semanticVersionRegex.firstMatch(in: string)?.captures else {
+            fatalError("SemanticVersion initializer was used without checking the structure.")
+        }
+
+        major = Int(captures[0]!)!
+        minor = Int(captures[1]!)!
+        patch = Int(captures[2]!)!
+    }
+
+    static func < (lhs: SemanticVersion, rhs: SemanticVersion) -> Bool {
+        guard lhs.major == rhs.major else { return lhs.major < rhs.major }
+        guard lhs.minor == rhs.minor else { return lhs.minor < rhs.minor }
+        return lhs.patch < rhs.patch
+    }
+
+    static func == (lhs: SemanticVersion, rhs: SemanticVersion) -> Bool {
+        return lhs.major == rhs.major && lhs.minor == rhs.minor && lhs.patch == rhs.patch
+    }
+
+    var description: String {
+        return "\(major).\(minor)"
+    }
+}
+
+private func appendEntryToCartfile(_ tagline: String?, _ githubSubpath: String, _ version: String) throws {
+    let comment = tagline != nil ? "# \(tagline!)\n" : ""
+    let repoSpecifier = "github \"\(githubSubpath)\""
+    let versionSpecifier: String = {
+        guard version != "latest" else {
+            let tagListCommand = "git ls-remote --tags https://github.com/\(githubSubpath).git"
+            let commandOutput = run(bash: tagListCommand).stdout
+            let availableSemanticVersions = semanticVersionRegex.matches(in: commandOutput).map { SemanticVersion($0.string) }
+            guard !availableSemanticVersions.isEmpty else {
+                print("Dependency '\(githubSubpath)' has no tagged versions.", level: .error)
+                fatalError()
+            }
+            let latestVersion = availableSemanticVersions.sorted().last!
+            return " ~> \(latestVersion)"
+        }
+
+        return " ~> \(version)"
+    }()
+
+    let textToAddToCartfile = "\n\(comment)\(repoSpecifier)\(versionSpecifier)\n"
+
+    let command = "echo '\(textToAddToCartfile)' >> Cartfile"
+    print("Adding entry to Cartfile with: '\(command)'", level: .info)
+    try runAndPrint(bash: command)
+}
+
+private func fetchGitHubTagline(subpath: String) throws -> String? {
+    let taglineRegex = try Regex("<title>[^\\:]+\\: (.*)<\\/title>")
+    let url = URL(string: "https://github.com/\(subpath)")!
+    let html = try String(contentsOf: url, encoding: .utf8)
+    guard let firstMatch = taglineRegex.firstMatch(in: html) else { return nil }
+    guard let firstCapture = firstMatch.captures.first else { return nil }
+    return firstCapture!
+}
+
+private func pathOfXcodeProject() -> Path {
+    return Path.current.glob("*.xcodeproj").first!
+}
+
+typealias Framework = (identifier: String, name: String)
+
+private func pbxProjectFilePath() -> Path {
+    return pathOfXcodeProject() + Path("project.pbxproj")
+}
+
+private func pbxProjectFileContent() throws -> String {
+    return try pbxProjectFilePath().read(.utf8)
+}
+
+private struct CartfileEntry: CustomStringConvertible {
+    let commentLine: String?
+    let dependencyDefinitionLine: String
+
+    var description: String {
+        guard let commentLine = commentLine else { return dependencyDefinitionLine }
+        return [commentLine, dependencyDefinitionLine].joined(separator: "\n")
+    }
+}
+
+// MARK: - Tasks
+/// Initializes the project with the given info.
+public func initialize(projectName: String, organization: String) throws {
+    try ["README.md", "Logo.png"].forEach { try deleteFile($0) }
+    try runAndPrint(bash: "mv README.md.sample README.md")
+    try renameProject(from: "NewFrameworkTemplate", to: projectName)
+    try renameOrganization(from: "Flinesoft", to: organization, projectName: projectName)
+    try installDependencies()
+}
+
+/// Installs project dependencies.
+public func installDependencies() throws {
+    let command = "carthage bootstrap --platform \(supportedPlatforms.joined(separator: ",")) --cache-builds"
+    print("Installing dependencies via Carthage: '\(command)'", level: .info)
+    try runAndPrint(bash: command)
+}
+
+/// Updates project dependencies.
+public func updateDependencies() throws {
+    let command = "carthage update --platform \(supportedPlatforms.joined(separator: ",")) --cache-builds"
+    print("Updating dependencies via Carthage: \(command)", level: .info)
+    try runAndPrint(bash: command)
+}
+
+/// Adds a dependency using the configured package manager.
+public func addDependency(github githubSubpath: String, version: String = "latest") throws {
+    let tagline = try fetchGitHubTagline(subpath: githubSubpath)
+    try appendEntryToCartfile(tagline, githubSubpath, version)
+    try sortCartfile()
+    try updateDependencies()
+
+    print("Please add the new frameworks to your projects 'Carthage >> Framework' groups related platforms in the project navigator.", level: .warning)
+
+    run(bash: "open -a Finder Carthage/Build/")
+}
+
+/// Sorts the contents of Cartfile and Cartfile.private.
+public func sortCartfile() throws {
+    let dependecyLineRegex = try Regex("#? ?(?:github|binary|git) \"[^\"]+/([^\"]+)\".*")
+
+    try ["Cartfile", "Cartfile.private"].forEach { fileName in
+        let cartfileContents = try String(contentsOfFile: fileName)
+        let cartfileLines = cartfileContents.components(separatedBy: .newlines).filter { !$0.isBlank }
+
+        var temporaryComment: String?
+        let cartfileEntries: [CartfileEntry] = cartfileLines.compactMap { line in
+            if dependecyLineRegex.matches(line) {
+                let newEntry = CartfileEntry(commentLine: temporaryComment, dependencyDefinitionLine: line)
+                temporaryComment = nil
+                return newEntry
+            } else {
+                temporaryComment = line
+                return nil
+            }
+        }
+
+        let compareClosure = { (lhs: CartfileEntry, rhs: CartfileEntry) -> Bool in
+            let lhsDependencyName = dependecyLineRegex.firstMatch(in: lhs.dependencyDefinitionLine)!.captures.first!!.lowercased()
+            let rhsDependencyName = dependecyLineRegex.firstMatch(in: rhs.dependencyDefinitionLine)!.captures.first!!.lowercased()
+            return lhsDependencyName < rhsDependencyName
+        }
+
+        let sortedCartfilEntries = cartfileEntries.sorted(by: compareClosure, stable: false)
+        let newCartfileContents = sortedCartfilEntries.map { $0.description }.joined(separator: "\n\n") + "\n"
+        try newCartfileContents.write(toFile: fileName, atomically: false, encoding: .utf8)
+    }
+}
+
+/// Generates the LinuxMain.swift file by automatically searching the Tests path for tests.
+public func generateLinuxMain() {
+    run("sourcery --sources Tests --templates .sourcery/LinuxMain.stencil --output .sourcery --force-parse generated")
+    run("mv .sourcery/LinuxMain.generated.swift Tests/LinuxMain.swift")
+}

From a19beb023eb4e823906f0ddd22495690e36086c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Thu, 27 Sep 2018 19:52:07 +0200
Subject: [PATCH 06/11] Fix SwiftLint config issue + Cleanup warnings

---
 .swiftlint.yml                                |   2 +-
 CSVImporter.xcodeproj/project.pbxproj         |   8 ++
 Frameworks/CSVImporter/CSVImporter.swift      |  72 ++++++++----
 Frameworks/CSVImporter/TextFile.swift         |  99 +----------------
 .../CSVImporter/TextFileStreamReader.swift    | 103 ++++++++++++++++++
 5 files changed, 162 insertions(+), 122 deletions(-)
 create mode 100644 Frameworks/CSVImporter/TextFileStreamReader.swift

diff --git a/.swiftlint.yml b/.swiftlint.yml
index 6443cf1..6fb9c37 100644
--- a/.swiftlint.yml
+++ b/.swiftlint.yml
@@ -71,7 +71,7 @@ disabled_rules:
 - type_name
 
 included:
-- Sources
+- Frameworks
 - Tests
 
 excluded:
diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index 62fe42b..ce6e4dc 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -103,6 +103,9 @@
 		82297C33215D49CA0059FB5B /* Quick.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C2D215D495E0059FB5B /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		82297C34215D49D10059FB5B /* Nimble.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C28215D49540059FB5B /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		82297C35215D49D10059FB5B /* Quick.framework in Copy Framework Dependencies */ = {isa = PBXBuildFile; fileRef = 82297C29215D49540059FB5B /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		82297C37215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */; };
+		82297C38215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */; };
+		82297C39215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */; };
 		827A24B21D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B31D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
 		827A24B41D2801050003D6DD /* CommaSemicolonQuotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = 827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */; };
@@ -245,6 +248,7 @@
 		82297C29215D49540059FB5B /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = "<group>"; };
 		82297C2C215D495E0059FB5B /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/tvOS/Nimble.framework; sourceTree = "<group>"; };
 		82297C2D215D495E0059FB5B /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/tvOS/Quick.framework; sourceTree = "<group>"; };
+		82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFileStreamReader.swift; sourceTree = "<group>"; };
 		827A24B11D2801050003D6DD /* CommaSemicolonQuotes.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CommaSemicolonQuotes.csv; sourceTree = "<group>"; };
 		827A24B61D2801580003D6DD /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		828348671CA6E1B000DC4C26 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = "<group>"; };
@@ -450,6 +454,7 @@
 				82C48C8320F3A1C40052FAE5 /* Source.swift */,
 				82C48C8620F3A1C40052FAE5 /* StringSource.swift */,
 				82C48C8720F3A1C40052FAE5 /* TextFile.swift */,
+				82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */,
 			);
 			path = CSVImporter;
 			sourceTree = "<group>";
@@ -985,6 +990,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				82C48C8B20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82297C37215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */,
 				82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9120F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8820F3A1C40052FAE5 /* Source.swift in Sources */,
@@ -1005,6 +1011,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				82C48C8C20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82297C38215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */,
 				82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9220F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8920F3A1C40052FAE5 /* Source.swift in Sources */,
@@ -1025,6 +1032,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				82C48C8D20F3A1C40052FAE5 /* CSVImporter.swift in Sources */,
+				82297C39215D4F0F0059FB5B /* TextFileStreamReader.swift in Sources */,
 				82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9320F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8A20F3A1C40052FAE5 /* Source.swift in Sources */,
diff --git a/Frameworks/CSVImporter/CSVImporter.swift b/Frameworks/CSVImporter/CSVImporter.swift
index a2cb908..7ed4696 100644
--- a/Frameworks/CSVImporter/CSVImporter.swift
+++ b/Frameworks/CSVImporter/CSVImporter.swift
@@ -32,6 +32,16 @@ public class CSVImporter<T> {
     let workQosClass: DispatchQoS.QoSClass
     let callbacksQosClass: DispatchQoS.QoSClass?
 
+    // Various private constants used for reading lines
+    private let startPartRegex = try! NSRegularExpression(pattern: "\\A\"[^\"]*\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
+    private let middlePartRegex = try! NSRegularExpression(pattern: "\\A[^\"]*\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
+    private let endPartRegex = try! NSRegularExpression(pattern: "\\A[^\"]*\"\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
+    private let substitute: String = "\u{001a}"
+    private let delimiterQuoteDelimiter: String
+    private let delimiterDelimiter: String
+    private let quoteDelimiter: String
+    private let delimiterQuote: String
+
     // MARK: - Computed Instance Properties
     var shouldReportProgress: Bool {
         return self.progressClosure != nil && (self.lastProgressReport == nil || Date().timeIntervalSince(self.lastProgressReport!) > 0.1)
@@ -69,8 +79,14 @@ public class CSVImporter<T> {
     ///   - encoding: The encoding the file is read with. Defaults to `.utf8`.
     ///   - workQosClass: The QOS class of the background queue to run the heavy work in. Defaults to `.utility`.
     ///   - callbacksQosClass: The QOS class of the background queue to run the callbacks in or `nil` for the main queue. Defaults to `nil`.
-    public convenience init(path: String, delimiter: String = ",", lineEnding: LineEnding = .unknown, encoding: String.Encoding = .utf8,
-                            workQosClass: DispatchQoS.QoSClass = .utility, callbacksQosClass: DispatchQoS.QoSClass? = nil) {
+    public convenience init(
+        path: String,
+        delimiter: String = ",",
+        lineEnding: LineEnding = .unknown,
+        encoding: String.Encoding = .utf8,
+        workQosClass: DispatchQoS.QoSClass = .utility,
+        callbacksQosClass: DispatchQoS.QoSClass? = nil
+    ) {
         let textFile = TextFile(path: path, encoding: encoding)
         let fileSource = FileSource(textFile: textFile, encoding: encoding, lineEnding: lineEnding)
         self.init(source: fileSource, delimiter: delimiter, workQosClass: workQosClass, callbacksQosClass: callbacksQosClass)
@@ -85,10 +101,23 @@ public class CSVImporter<T> {
     ///   - encoding: The encoding the file is read with. Defaults to `.utf8`.
     ///   - workQosClass: The QOS class of the background queue to run the heavy work in. Defaults to `.utility`.
     ///   - callbacksQosClass: The QOS class of the background queue to run the callbacks in or `nil` for the main queue. Defaults to `nil`.
-    public convenience init?(url: URL, delimiter: String = ",", lineEnding: LineEnding = .unknown, encoding: String.Encoding = .utf8,
-                             workQosClass: DispatchQoS.QoSClass = .utility, callbacksQosClass: DispatchQoS.QoSClass? = nil) {
+    public convenience init?(
+        url: URL,
+        delimiter: String = ",",
+        lineEnding: LineEnding = .unknown,
+        encoding: String.Encoding = .utf8,
+        workQosClass: DispatchQoS.QoSClass = .utility,
+        callbacksQosClass: DispatchQoS.QoSClass? = nil
+    ) {
         guard url.isFileURL else { return nil }
-        self.init(path: url.path, delimiter: delimiter, lineEnding: lineEnding, encoding: encoding, workQosClass: workQosClass, callbacksQosClass: callbacksQosClass)
+        self.init(
+            path: url.path,
+            delimiter: delimiter,
+            lineEnding: lineEnding,
+            encoding: encoding,
+            workQosClass: workQosClass,
+            callbacksQosClass: callbacksQosClass
+        )
     }
 
     /// Creates a `CSVImporter` object with required configuration options.
@@ -102,8 +131,13 @@ public class CSVImporter<T> {
     ///   - lineEnding: The lineEnding used in the file. If not specified will be determined automatically.
     ///   - workQosClass: The QOS class of the background queue to run the heavy work in. Defaults to `.utility`.
     ///   - callbacksQosClass: The QOS class of the background queue to run the callbacks in or `nil` for the main queue. Defaults to `nil`.
-    public convenience init(contentString: String, delimiter: String = ",", lineEnding: LineEnding = .unknown,
-                            workQosClass: DispatchQoS.QoSClass = .utility, callbacksQosClass: DispatchQoS.QoSClass? = nil) {
+    public convenience init(
+        contentString: String,
+        delimiter: String = ",",
+        lineEnding: LineEnding = .unknown,
+        workQosClass: DispatchQoS.QoSClass = .utility,
+        callbacksQosClass: DispatchQoS.QoSClass? = nil
+    ) {
         let stringSource = StringSource(contentString: contentString, lineEnding: lineEnding)
         self.init(source: stringSource, delimiter: delimiter, workQosClass: workQosClass, callbacksQosClass: callbacksQosClass)
     }
@@ -141,14 +175,15 @@ public class CSVImporter<T> {
     ///   - structure: A closure for doing something with the found structure within the first line of the CSV file.
     ///   - recordMapper: A closure to map the dictionary data interpreted from a line to your data structure.
     /// - Returns: `self` to enable consecutive method calls (e.g. `importer.startImportingRecords {...}.onProgress {...}`).
-    public func startImportingRecords(structure structureClosure: @escaping (_ headerValues: [String]) -> Void,
-                                      recordMapper closure: @escaping (_ recordValues: [String: String]) -> T) -> Self {
+    public func startImportingRecords(
+        structure structureClosure: @escaping (_ headerValues: [String]) -> Void,
+        recordMapper closure: @escaping (_ recordValues: [String: String]) -> T
+    ) -> Self {
         workDispatchQueue.async {
             var recordStructure: [String]?
             var importedRecords = [T]()
 
             let importedLinesWithSuccess = self.importLines { valuesInLine in
-
                 if recordStructure == nil {
                     recordStructure = valuesInLine
                     structureClosure(valuesInLine)
@@ -199,13 +234,14 @@ public class CSVImporter<T> {
     ///   - structure: A closure for doing something with the found structure within the first line of the CSV file.
     ///   - recordMapper: A closure to map the dictionary data interpreted from a line to your data structure.
     /// - Returns: The imported records array.
-    public func importRecords(structure structureClosure: @escaping (_ headerValues: [String]) -> Void,
-                              recordMapper closure: @escaping (_ recordValues: [String: String]) -> T) -> [T] {
+    public func importRecords(
+        structure structureClosure: @escaping (_ headerValues: [String]) -> Void,
+        recordMapper closure: @escaping (_ recordValues: [String: String]) -> T
+    ) -> [T] {
         var recordStructure: [String]?
         var importedRecords = [T]()
 
         _ = self.importLines { valuesInLine in
-
             if recordStructure == nil {
                 recordStructure = valuesInLine
                 structureClosure(valuesInLine)
@@ -241,16 +277,6 @@ public class CSVImporter<T> {
         return anyLine
     }
 
-    // Various private constants used for reading lines
-    private let startPartRegex = try! NSRegularExpression(pattern: "\\A\"[^\"]*\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
-    private let middlePartRegex = try! NSRegularExpression(pattern: "\\A[^\"]*\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
-    private let endPartRegex = try! NSRegularExpression(pattern: "\\A[^\"]*\"\\z", options: .caseInsensitive) // swiftlint:disable:this force_try
-    private let substitute = "\u{001a}"
-    private let delimiterQuoteDelimiter: String
-    private let delimiterDelimiter: String
-    private let quoteDelimiter: String
-    private let delimiterQuote: String
-
     /// Reads the line and returns the fields found. Handles double quotes according to RFC 4180.
     ///
     /// - Parameters:
diff --git a/Frameworks/CSVImporter/TextFile.swift b/Frameworks/CSVImporter/TextFile.swift
index 591cd21..37f89f4 100644
--- a/Frameworks/CSVImporter/TextFile.swift
+++ b/Frameworks/CSVImporter/TextFile.swift
@@ -1,8 +1,5 @@
 //
-//  TextFile.swift
-//  CSVImporter
-//
-//  Created by Cihat Gündüz (Privat) on 16.12.16.
+//  Created by Cihat Gündüz on 16.12.16.
 //  Copyright © 2016 Flinesoft. All rights reserved.
 //
 //  Originally copied from https://github.com/nvzqz/FileKit/blob/feature-swift3/Sources/TextFile.swift
@@ -43,90 +40,6 @@ extension TextFile {
     }
 }
 
-/// A class to read `TextFile` line by line.
-class TextFileStreamReader {
-    /// The text encoding.
-    fileprivate let encoding: String.Encoding
-
-    /// The chunk size when reading.
-    fileprivate let chunkSize: Int
-
-    /// Tells if the position is at the end of file.
-    fileprivate var atEOF: Bool = false
-
-    fileprivate let fileHandle: FileHandle!
-    fileprivate let buffer: NSMutableData!
-    fileprivate let delimData: Data!
-
-    // MARK: - Initialization
-    /// - Parameter path:      the file path
-    /// - Parameter lineEnding: the line ending delimiter (default: \n)
-    /// - Parameter encoding: file encoding (default: NSUTF8StringEncoding)
-    /// - Parameter chunkSize: size of buffer (default: 4096)
-    fileprivate init?(path: String, lineEnding: LineEnding, encoding: String.Encoding, chunkSize: Int) {
-        self.chunkSize = chunkSize
-        self.encoding = encoding
-
-        guard let fileHandle = FileHandle(forReadingAtPath: path), let delimData = lineEnding.rawValue.data(using: encoding),
-            let buffer = NSMutableData(capacity: chunkSize) else {
-                self.fileHandle = nil
-                self.delimData = nil
-                self.buffer = nil
-                return nil
-        }
-        self.fileHandle = fileHandle
-        self.delimData = delimData
-        self.buffer = buffer
-    }
-
-    // MARK: - Deinitialization
-    deinit {
-        self.close()
-    }
-
-    // MARK: - public methods
-    /// - Returns: The next line, or nil on EOF.
-    fileprivate func nextLine() -> String? {
-        if atEOF { return nil }
-
-        // Read data chunks from file until a line delimiter is found.
-        var range = buffer.range(of: delimData, options: [], in: NSRange(location: 0, length: buffer.length))
-        while range.location == NSNotFound {
-            let tmpData = fileHandle.readData(ofLength: chunkSize)
-            if tmpData.isEmpty {
-                // EOF or read error.
-                atEOF = true
-                if buffer.length > 0 {
-                    // Buffer contains last line in file (not terminated by delimiter).
-                    let line = NSString(data: buffer as Data, encoding: encoding.rawValue)
-
-                    buffer.length = 0
-                    return line as String?
-                }
-                // No more lines.
-                return nil
-            }
-            buffer.append(tmpData)
-            range = buffer.range(of: delimData, options: [], in: NSRange(location: 0, length: buffer.length))
-        }
-
-        // Convert complete line (excluding the delimiter) to a string.
-        let lineRange = NSRange(location: 0, length: range.location)
-        let line = NSString(data: buffer.subdata(with: lineRange), encoding: encoding.rawValue)
-
-        // Remove line (and the delimiter) from the buffer.
-        let cleaningRange = NSRange(location: 0, length: range.location + range.length)
-        buffer.replaceBytes(in: cleaningRange, withBytes: nil, length: 0)
-
-        return line as String?
-    }
-
-    /// Close the underlying file. No reading must be done after calling this method.
-    fileprivate func close() {
-        fileHandle?.closeFile()
-    }
-}
-
 // MARK: File Handle
 extension TextFile {
     /// Returns a file handle for reading from `self`, or `nil` if `self`
@@ -135,13 +48,3 @@ extension TextFile {
         return FileHandle(forReadingAtPath: path)
     }
 }
-
-// Implement `SequenceType` for `TextFileStreamReader`
-extension TextFileStreamReader: Sequence {
-    /// - Returns: An iterator to be used for iterating over a `TextFileStreamReader` object.
-    func makeIterator() -> AnyIterator<String> {
-        return AnyIterator {
-            return self.nextLine()
-        }
-    }
-}
diff --git a/Frameworks/CSVImporter/TextFileStreamReader.swift b/Frameworks/CSVImporter/TextFileStreamReader.swift
new file mode 100644
index 0000000..07d8ca2
--- /dev/null
+++ b/Frameworks/CSVImporter/TextFileStreamReader.swift
@@ -0,0 +1,103 @@
+//
+//  Created by Cihat Gündüz on 16.12.16.
+//  Copyright © 2016 Flinesoft. All rights reserved.
+//
+//  Originally copied from https://github.com/nvzqz/FileKit/blob/feature-swift3/Sources/TextFile.swift
+//
+
+import Foundation
+
+/// A class to read `TextFile` line by line.
+class TextFileStreamReader {
+    /// The text encoding.
+    let encoding: String.Encoding
+
+    /// The chunk size when reading.
+    let chunkSize: Int
+
+    /// Tells if the position is at the end of file.
+    var atEOF: Bool = false
+
+    let fileHandle: FileHandle
+    let buffer: NSMutableData
+    let delimData: Data
+
+    // MARK: - Initialization
+    /// - Parameter path:      the file path
+    /// - Parameter lineEnding: the line ending delimiter (default: \n)
+    /// - Parameter encoding: file encoding (default: NSUTF8StringEncoding)
+    /// - Parameter chunkSize: size of buffer (default: 4096)
+    init?(path: String, lineEnding: LineEnding, encoding: String.Encoding, chunkSize: Int) {
+        self.chunkSize = chunkSize
+        self.encoding = encoding
+
+        guard let fileHandle = FileHandle(forReadingAtPath: path),
+            let delimData = lineEnding.rawValue.data(using: encoding),
+            let buffer = NSMutableData(capacity: chunkSize)
+        else {
+            return nil
+        }
+        self.fileHandle = fileHandle
+        self.delimData = delimData
+        self.buffer = buffer
+    }
+
+    // MARK: - Deinitialization
+    deinit {
+        self.close()
+    }
+
+    // MARK: - public methods
+    /// - Returns: The next line, or nil on EOF.
+    func nextLine() -> String? {
+        guard !atEOF else { return nil }
+
+        // Read data chunks from file until a line delimiter is found.
+        var range = buffer.range(of: delimData, options: [], in: NSRange(location: 0, length: buffer.length))
+        while range.location == NSNotFound {
+            let tmpData = fileHandle.readData(ofLength: chunkSize)
+            if tmpData.isEmpty {
+                // EOF or read error.
+                atEOF = true
+                if buffer.length > 0 {
+                    // Buffer contains last line in file (not terminated by delimiter).
+                    let line = NSString(data: buffer as Data, encoding: encoding.rawValue)
+
+                    buffer.length = 0
+                    return line as String?
+                }
+
+                // No more lines.
+                return nil
+            }
+
+            buffer.append(tmpData)
+            range = buffer.range(of: delimData, options: [], in: NSRange(location: 0, length: buffer.length))
+        }
+
+        // Convert complete line (excluding the delimiter) to a string.
+        let lineRange = NSRange(location: 0, length: range.location)
+        let line = NSString(data: buffer.subdata(with: lineRange), encoding: encoding.rawValue)
+
+        // Remove line (and the delimiter) from the buffer.
+        let cleaningRange = NSRange(location: 0, length: range.location + range.length)
+        buffer.replaceBytes(in: cleaningRange, withBytes: nil, length: 0)
+
+        return line as String?
+    }
+
+    /// Close the underlying file. No reading must be done after calling this method.
+    func close() {
+        fileHandle.closeFile()
+    }
+}
+
+// Implement `SequenceType` for `TextFileStreamReader`
+extension TextFileStreamReader: Sequence {
+    /// - Returns: An iterator to be used for iterating over a `TextFileStreamReader` object.
+    func makeIterator() -> AnyIterator<String> {
+        return AnyIterator {
+            return self.nextLine()
+        }
+    }
+}

From 878d9c862a0313856b4444b47ee12fcce4443acf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Fri, 28 Sep 2018 11:47:27 +0200
Subject: [PATCH 07/11] Add autoreleasepool global function to work around
 issue

---
 CSVImporter.xcodeproj/project.pbxproj | 10 ++++++++++
 Frameworks/CSVImporter/Globals.swift  | 12 ++++++++++++
 2 files changed, 22 insertions(+)
 create mode 100644 Frameworks/CSVImporter/Globals.swift

diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index ce6e4dc..8741a8d 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -127,6 +127,9 @@
 		82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
 		82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
 		82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C48C8720F3A1C40052FAE5 /* TextFile.swift */; };
+		82F59536215E2F2400C840A3 /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F59535215E2F2400C840A3 /* Globals.swift */; };
+		82F59537215E2F2400C840A3 /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F59535215E2F2400C840A3 /* Globals.swift */; };
+		82F59538215E2F2400C840A3 /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F59535215E2F2400C840A3 /* Globals.swift */; };
 		A1F5AEE61E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE71E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
 		A1F5AEE81E05599F003D6949 /* UTF16_Example.csv in Resources */ = {isa = PBXBuildFile; fileRef = A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */; };
@@ -260,6 +263,8 @@
 		82C48C8520F3A1C40052FAE5 /* FileSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileSource.swift; sourceTree = "<group>"; };
 		82C48C8620F3A1C40052FAE5 /* StringSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringSource.swift; sourceTree = "<group>"; };
 		82C48C8720F3A1C40052FAE5 /* TextFile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFile.swift; sourceTree = "<group>"; };
+		82F59534215E2CED00C840A3 /* beak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = beak.swift; sourceTree = "<group>"; };
+		82F59535215E2F2400C840A3 /* Globals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Globals.swift; sourceTree = "<group>"; };
 		A110355E1D666CFD00214547 /* CSVImporter.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = CSVImporter.podspec; sourceTree = "<group>"; };
 		A1EC02D91E0431C00021718E /* Cartfile.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.resolved; sourceTree = "<group>"; };
 		A1F5AEE51E05599F003D6949 /* UTF16_Example.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = UTF16_Example.csv; sourceTree = "<group>"; };
@@ -455,6 +460,7 @@
 				82C48C8620F3A1C40052FAE5 /* StringSource.swift */,
 				82C48C8720F3A1C40052FAE5 /* TextFile.swift */,
 				82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */,
+				82F59535215E2F2400C840A3 /* Globals.swift */,
 			);
 			path = CSVImporter;
 			sourceTree = "<group>";
@@ -536,6 +542,7 @@
 			children = (
 				82297C17215D453B0059FB5B /* .projlint.yml */,
 				828348671CA6E1B000DC4C26 /* .swiftlint.yml */,
+				82F59534215E2CED00C840A3 /* beak.swift */,
 				82239F611C4AF89200627674 /* Cartfile */,
 				82297C1C215D45B70059FB5B /* Cartfile.private */,
 				A1EC02D91E0431C00021718E /* Cartfile.resolved */,
@@ -994,6 +1001,7 @@
 				82C48C9420F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9120F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8820F3A1C40052FAE5 /* Source.swift in Sources */,
+				82F59536215E2F2400C840A3 /* Globals.swift in Sources */,
 				82C48C8E20F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1015,6 +1023,7 @@
 				82C48C9520F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9220F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8920F3A1C40052FAE5 /* Source.swift in Sources */,
+				82F59537215E2F2400C840A3 /* Globals.swift in Sources */,
 				82C48C8F20F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1036,6 +1045,7 @@
 				82C48C9620F3A1C40052FAE5 /* TextFile.swift in Sources */,
 				82C48C9320F3A1C40052FAE5 /* StringSource.swift in Sources */,
 				82C48C8A20F3A1C40052FAE5 /* Source.swift in Sources */,
+				82F59538215E2F2400C840A3 /* Globals.swift in Sources */,
 				82C48C9020F3A1C40052FAE5 /* FileSource.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
diff --git a/Frameworks/CSVImporter/Globals.swift b/Frameworks/CSVImporter/Globals.swift
new file mode 100644
index 0000000..0de0d6a
--- /dev/null
+++ b/Frameworks/CSVImporter/Globals.swift
@@ -0,0 +1,12 @@
+//
+//  Created by Cihat Gündüz on 28.09.18.
+//  Copyright © 2018 Flinesoft. All rights reserved.
+//
+
+import Foundation
+
+#if os(Linux)
+    func autoreleasepool(_ closure: () -> Void) {
+        closure()
+    }
+#endif

From a7864737a45abf8d339793d2781ef6e237070934 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Fri, 28 Sep 2018 13:07:01 +0200
Subject: [PATCH 08/11] Sort Swift files in Project Navigator

---
 CSVImporter.xcodeproj/project.pbxproj | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CSVImporter.xcodeproj/project.pbxproj b/CSVImporter.xcodeproj/project.pbxproj
index 8741a8d..b7684cc 100644
--- a/CSVImporter.xcodeproj/project.pbxproj
+++ b/CSVImporter.xcodeproj/project.pbxproj
@@ -456,11 +456,11 @@
 			children = (
 				82C48C8420F3A1C40052FAE5 /* CSVImporter.swift */,
 				82C48C8520F3A1C40052FAE5 /* FileSource.swift */,
+				82F59535215E2F2400C840A3 /* Globals.swift */,
 				82C48C8320F3A1C40052FAE5 /* Source.swift */,
 				82C48C8620F3A1C40052FAE5 /* StringSource.swift */,
 				82C48C8720F3A1C40052FAE5 /* TextFile.swift */,
 				82297C36215D4F0F0059FB5B /* TextFileStreamReader.swift */,
-				82F59535215E2F2400C840A3 /* Globals.swift */,
 			);
 			path = CSVImporter;
 			sourceTree = "<group>";

From a761c5638a5c34f9d20dd191f913f38ae9917a79 Mon Sep 17 00:00:00 2001
From: Chris Leversuch <chris@brightec.co.uk>
Date: Fri, 28 Apr 2017 16:52:48 +0100
Subject: [PATCH 09/11] Replace multiple instances of delimiterQuoteDelimiter

---
 Frameworks/CSVImporter/CSVImporter.swift | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Frameworks/CSVImporter/CSVImporter.swift b/Frameworks/CSVImporter/CSVImporter.swift
index 7ed4696..9cb5543 100644
--- a/Frameworks/CSVImporter/CSVImporter.swift
+++ b/Frameworks/CSVImporter/CSVImporter.swift
@@ -283,7 +283,10 @@ public class CSVImporter<T> {
     ///   - line: The line to read values from.
     /// - Returns: An array of values found in line.
     func readValuesInLine(_ line: String) -> [String] {
-        var correctedLine = line.replacingOccurrences(of: delimiterQuoteDelimiter, with: delimiterDelimiter)
+        var correctedLine = line
+        while correctedLine.contains(delimiterQuoteDelimiter) {
+            correctedLine = correctedLine.replacingOccurrences(of: delimiterQuoteDelimiter, with: delimiterDelimiter)
+        }
 
         if correctedLine.hasPrefix(quoteDelimiter) {
             correctedLine = String(correctedLine.suffix(from: correctedLine.index(correctedLine.startIndex, offsetBy: 2)))

From 65699cccccac6c7ae2eb97155e4360463dc7abb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Fri, 28 Sep 2018 13:10:35 +0200
Subject: [PATCH 10/11] Bump version num

---
 CSVImporter.podspec                   | 2 +-
 Frameworks/SupportingFiles/Info.plist | 2 +-
 README.md                             | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/CSVImporter.podspec b/CSVImporter.podspec
index e9c144f..8e64ea8 100644
--- a/CSVImporter.podspec
+++ b/CSVImporter.podspec
@@ -1,7 +1,7 @@
 Pod::Spec.new do |s|
 
   s.name         = "CSVImporter"
-  s.version      = "1.9.0"
+  s.version      = "1.9.1"
   s.summary      = "Import CSV files line by line with ease."
 
   s.description  = <<-DESC
diff --git a/Frameworks/SupportingFiles/Info.plist b/Frameworks/SupportingFiles/Info.plist
index 6e2e047..292bf76 100644
--- a/Frameworks/SupportingFiles/Info.plist
+++ b/Frameworks/SupportingFiles/Info.plist
@@ -15,7 +15,7 @@
 	<key>CFBundlePackageType</key>
 	<string>FMWK</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.9.0</string>
+	<string>1.9.1</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
diff --git a/README.md b/README.md
index 42a4d6a..03114bb 100644
--- a/README.md
+++ b/README.md
@@ -12,8 +12,8 @@
              alt="Codebeat Status">
     </a>
     <a href="https://github.com/Flinesoft/CSVImporter/releases">
-        <img src="https://img.shields.io/badge/Version-1.9.0-blue.svg"
-             alt="Version: 1.9.0">
+        <img src="https://img.shields.io/badge/Version-1.9.1-blue.svg"
+             alt="Version: 1.9.1">
     </a>
     <img src="https://img.shields.io/badge/Swift-4.2-FFAC45.svg"
          alt="Swift: 4.2">

From 546d2059b258eb1f3f900e3f38eac47099068d49 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= <commits@cihatguenduez.de>
Date: Fri, 28 Sep 2018 13:12:22 +0200
Subject: [PATCH 11/11] [CHANGELOG.md] Add version 1.9.1 entry

---
 CHANGELOG.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 067a303..353e694 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
 ### Security
 - None.
 
+## [1.9.1] - 2018-09-28
+### Added
+- Official support for building on Linux.
+### Changed
+- Upgraded to Swift 4.2 & Xcode 10.
+
 ## [1.8.0] - 2017-12-10
 ### Changed
 - Upgraded Code to Swift 4.