├── .DS_Store ├── .gitignore ├── .swift-version ├── AssemblyLine.png ├── AssemblyLine.podspec ├── AssemblyLine.sketch ├── AssemblyLine.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── 1amageek.xcuserdatad │ └── xcschemes │ ├── AssemblyLine.xcscheme │ └── xcschememanagement.plist ├── AssemblyLine.xcworkspace └── contents.xcworkspacedata ├── AssemblyLine ├── Assembly.swift ├── AssemblyLine.h ├── Info.plist └── Line.swift ├── AssemblyLineTests ├── AssemblyLineTests.swift ├── Info.plist └── TeslaAssemlyLine.swift ├── LICENSE ├── Podfile ├── Podfile.lock ├── README.md ├── TeslaFactory ├── AppDelegate.swift ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist └── ViewController.swift └── proccess_flow.png /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1amageek/AssemblyLine/c391e4eb728202e6d70a63be953ab5b835065bd2/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 3.1 2 | -------------------------------------------------------------------------------- /AssemblyLine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1amageek/AssemblyLine/c391e4eb728202e6d70a63be953ab5b835065bd2/AssemblyLine.png -------------------------------------------------------------------------------- /AssemblyLine.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod spec lint AssemblyLine.podspec' to ensure this is a 3 | # valid spec and to remove all comments including this before submitting the spec. 4 | # 5 | # To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html 6 | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | 11 | s.name = "AssemblyLine" 12 | s.version = "0.1.1" 13 | s.summary = "AssemblyLine is a library for easily writing workflows." 14 | s.description = <<-DESC 15 | AssemblyLine processes several tasks continuously in the background. 16 | Discard tasks that failed during execution during execution. 17 | DESC 18 | 19 | s.homepage = "https://github.com/1amageek/AssemblyLine" 20 | s.screenshots = "https://github.com/1amageek/AssemblyLine/blob/master/AssemblyLine.png" 21 | s.license = { :type => "MIT", :file => "https://github.com/1amageek/AssemblyLine/blob/master/LICENSE" } 22 | s.author = { "1amageek" => "tmy0x3@icloud.com" } 23 | s.social_media_url = "http://twitter.com/1amageek" 24 | s.platform = :ios#, :macos, :tvos, :watchos 25 | s.ios.deployment_target = "10.0" 26 | #s.osx.deployment_target = "10.10" 27 | #s.watchos.deployment_target = "2.0" 28 | #s.tvos.deployment_target = "9.0" 29 | s.source = { :git => "https://github.com/1amageek/AssemblyLine.git", :tag => "#{s.version}" } 30 | s.source_files = "AssemblyLine", "AssemblyLine/**/*.{swift}" 31 | 32 | end 33 | -------------------------------------------------------------------------------- /AssemblyLine.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1amageek/AssemblyLine/c391e4eb728202e6d70a63be953ab5b835065bd2/AssemblyLine.sketch -------------------------------------------------------------------------------- /AssemblyLine.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 02D8FADCAF67EE39E64495C6 /* Pods_AssemblyLine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66F27657212C446717A8E930 /* Pods_AssemblyLine.framework */; }; 11 | 124A9EAD1E9F9A85000E07E8 /* AssemblyLine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 124A9EA31E9F9A84000E07E8 /* AssemblyLine.framework */; }; 12 | 124A9EB21E9F9A85000E07E8 /* AssemblyLineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124A9EB11E9F9A85000E07E8 /* AssemblyLineTests.swift */; }; 13 | 124A9EBF1E9F9A8D000E07E8 /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124A9EBD1E9F9A8D000E07E8 /* Assembly.swift */; }; 14 | 124A9EC01E9F9A8D000E07E8 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124A9EBE1E9F9A8D000E07E8 /* Line.swift */; }; 15 | 124A9EC21E9F9C26000E07E8 /* TeslaAssemlyLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124A9EC11E9F9C26000E07E8 /* TeslaAssemlyLine.swift */; }; 16 | 129412421EA24B340067A919 /* AssemblyLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 129412411EA24B340067A919 /* AssemblyLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | 1294124A1EA251450067A919 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129412491EA251450067A919 /* AppDelegate.swift */; }; 18 | 1294124C1EA251450067A919 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1294124B1EA251450067A919 /* ViewController.swift */; }; 19 | 1294124F1EA251450067A919 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1294124D1EA251450067A919 /* Main.storyboard */; }; 20 | 129412511EA251450067A919 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 129412501EA251450067A919 /* Assets.xcassets */; }; 21 | 129412541EA251450067A919 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 129412521EA251450067A919 /* LaunchScreen.storyboard */; }; 22 | 129412591EA256BE0067A919 /* TeslaAssemlyLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124A9EC11E9F9C26000E07E8 /* TeslaAssemlyLine.swift */; }; 23 | F0E89C96FC3B128A38E116CE /* Pods_AssemblyLineTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02FECF91DF84A64E6F35CD9A /* Pods_AssemblyLineTests.framework */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXContainerItemProxy section */ 27 | 124A9EAE1E9F9A85000E07E8 /* PBXContainerItemProxy */ = { 28 | isa = PBXContainerItemProxy; 29 | containerPortal = 124A9E9A1E9F9A84000E07E8 /* Project object */; 30 | proxyType = 1; 31 | remoteGlobalIDString = 124A9EA21E9F9A84000E07E8; 32 | remoteInfo = AssemblyLine; 33 | }; 34 | /* End PBXContainerItemProxy section */ 35 | 36 | /* Begin PBXFileReference section */ 37 | 02FECF91DF84A64E6F35CD9A /* Pods_AssemblyLineTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AssemblyLineTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 124A9EA31E9F9A84000E07E8 /* AssemblyLine.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AssemblyLine.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 124A9EA71E9F9A84000E07E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | 124A9EAC1E9F9A85000E07E8 /* AssemblyLineTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AssemblyLineTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 124A9EB11E9F9A85000E07E8 /* AssemblyLineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssemblyLineTests.swift; sourceTree = ""; }; 42 | 124A9EB31E9F9A85000E07E8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43 | 124A9EBD1E9F9A8D000E07E8 /* Assembly.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assembly.swift; sourceTree = ""; }; 44 | 124A9EBE1E9F9A8D000E07E8 /* Line.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; 45 | 124A9EC11E9F9C26000E07E8 /* TeslaAssemlyLine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TeslaAssemlyLine.swift; sourceTree = ""; }; 46 | 129412411EA24B340067A919 /* AssemblyLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssemblyLine.h; sourceTree = ""; }; 47 | 129412471EA251450067A919 /* TeslaFactory.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TeslaFactory.app; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | 129412491EA251450067A919 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 49 | 1294124B1EA251450067A919 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 50 | 1294124E1EA251450067A919 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 51 | 129412501EA251450067A919 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 52 | 129412531EA251450067A919 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 53 | 129412551EA251450067A919 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 1E26F08ED4FF96B140C0CBEA /* Pods-AssemblyLineTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AssemblyLineTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AssemblyLineTests/Pods-AssemblyLineTests.debug.xcconfig"; sourceTree = ""; }; 55 | 2DA95F0A117989B7F812754B /* Pods-AssemblyLine.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AssemblyLine.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AssemblyLine/Pods-AssemblyLine.debug.xcconfig"; sourceTree = ""; }; 56 | 66F27657212C446717A8E930 /* Pods_AssemblyLine.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AssemblyLine.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | A455329A6E65F49544B715BB /* Pods-AssemblyLineTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AssemblyLineTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-AssemblyLineTests/Pods-AssemblyLineTests.release.xcconfig"; sourceTree = ""; }; 58 | A93955B343B58659C098860E /* Pods-AssemblyLine.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AssemblyLine.release.xcconfig"; path = "Pods/Target Support Files/Pods-AssemblyLine/Pods-AssemblyLine.release.xcconfig"; sourceTree = ""; }; 59 | /* End PBXFileReference section */ 60 | 61 | /* Begin PBXFrameworksBuildPhase section */ 62 | 124A9E9F1E9F9A84000E07E8 /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | 02D8FADCAF67EE39E64495C6 /* Pods_AssemblyLine.framework in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | 124A9EA91E9F9A85000E07E8 /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | 124A9EAD1E9F9A85000E07E8 /* AssemblyLine.framework in Frameworks */, 75 | F0E89C96FC3B128A38E116CE /* Pods_AssemblyLineTests.framework in Frameworks */, 76 | ); 77 | runOnlyForDeploymentPostprocessing = 0; 78 | }; 79 | 129412441EA251450067A919 /* Frameworks */ = { 80 | isa = PBXFrameworksBuildPhase; 81 | buildActionMask = 2147483647; 82 | files = ( 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXFrameworksBuildPhase section */ 87 | 88 | /* Begin PBXGroup section */ 89 | 05BA0ED610D07620A5998F38 /* Pods */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 2DA95F0A117989B7F812754B /* Pods-AssemblyLine.debug.xcconfig */, 93 | A93955B343B58659C098860E /* Pods-AssemblyLine.release.xcconfig */, 94 | 1E26F08ED4FF96B140C0CBEA /* Pods-AssemblyLineTests.debug.xcconfig */, 95 | A455329A6E65F49544B715BB /* Pods-AssemblyLineTests.release.xcconfig */, 96 | ); 97 | name = Pods; 98 | sourceTree = ""; 99 | }; 100 | 124A9E991E9F9A84000E07E8 = { 101 | isa = PBXGroup; 102 | children = ( 103 | 124A9EA51E9F9A84000E07E8 /* AssemblyLine */, 104 | 124A9EB01E9F9A85000E07E8 /* AssemblyLineTests */, 105 | 129412481EA251450067A919 /* TeslaFactory */, 106 | 124A9EA41E9F9A84000E07E8 /* Products */, 107 | 05BA0ED610D07620A5998F38 /* Pods */, 108 | A5AA7D194069FF53E5E6C1AB /* Frameworks */, 109 | ); 110 | sourceTree = ""; 111 | }; 112 | 124A9EA41E9F9A84000E07E8 /* Products */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 124A9EA31E9F9A84000E07E8 /* AssemblyLine.framework */, 116 | 124A9EAC1E9F9A85000E07E8 /* AssemblyLineTests.xctest */, 117 | 129412471EA251450067A919 /* TeslaFactory.app */, 118 | ); 119 | name = Products; 120 | sourceTree = ""; 121 | }; 122 | 124A9EA51E9F9A84000E07E8 /* AssemblyLine */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 129412411EA24B340067A919 /* AssemblyLine.h */, 126 | 124A9EBD1E9F9A8D000E07E8 /* Assembly.swift */, 127 | 124A9EBE1E9F9A8D000E07E8 /* Line.swift */, 128 | 124A9EA71E9F9A84000E07E8 /* Info.plist */, 129 | ); 130 | path = AssemblyLine; 131 | sourceTree = ""; 132 | }; 133 | 124A9EB01E9F9A85000E07E8 /* AssemblyLineTests */ = { 134 | isa = PBXGroup; 135 | children = ( 136 | 124A9EB11E9F9A85000E07E8 /* AssemblyLineTests.swift */, 137 | 124A9EC11E9F9C26000E07E8 /* TeslaAssemlyLine.swift */, 138 | 124A9EB31E9F9A85000E07E8 /* Info.plist */, 139 | ); 140 | path = AssemblyLineTests; 141 | sourceTree = ""; 142 | }; 143 | 129412481EA251450067A919 /* TeslaFactory */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 129412491EA251450067A919 /* AppDelegate.swift */, 147 | 1294124B1EA251450067A919 /* ViewController.swift */, 148 | 1294124D1EA251450067A919 /* Main.storyboard */, 149 | 129412501EA251450067A919 /* Assets.xcassets */, 150 | 129412521EA251450067A919 /* LaunchScreen.storyboard */, 151 | 129412551EA251450067A919 /* Info.plist */, 152 | ); 153 | path = TeslaFactory; 154 | sourceTree = ""; 155 | }; 156 | A5AA7D194069FF53E5E6C1AB /* Frameworks */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 66F27657212C446717A8E930 /* Pods_AssemblyLine.framework */, 160 | 02FECF91DF84A64E6F35CD9A /* Pods_AssemblyLineTests.framework */, 161 | ); 162 | name = Frameworks; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXHeadersBuildPhase section */ 168 | 124A9EA01E9F9A84000E07E8 /* Headers */ = { 169 | isa = PBXHeadersBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | 129412421EA24B340067A919 /* AssemblyLine.h in Headers */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXHeadersBuildPhase section */ 177 | 178 | /* Begin PBXNativeTarget section */ 179 | 124A9EA21E9F9A84000E07E8 /* AssemblyLine */ = { 180 | isa = PBXNativeTarget; 181 | buildConfigurationList = 124A9EB71E9F9A85000E07E8 /* Build configuration list for PBXNativeTarget "AssemblyLine" */; 182 | buildPhases = ( 183 | F080CBF9ED1BAF5E7F653631 /* [CP] Check Pods Manifest.lock */, 184 | 124A9E9E1E9F9A84000E07E8 /* Sources */, 185 | 124A9E9F1E9F9A84000E07E8 /* Frameworks */, 186 | 124A9EA01E9F9A84000E07E8 /* Headers */, 187 | 124A9EA11E9F9A84000E07E8 /* Resources */, 188 | DBF3FCD9FF4DDB71652D3CD6 /* [CP] Copy Pods Resources */, 189 | ); 190 | buildRules = ( 191 | ); 192 | dependencies = ( 193 | ); 194 | name = AssemblyLine; 195 | productName = AssemblyLine; 196 | productReference = 124A9EA31E9F9A84000E07E8 /* AssemblyLine.framework */; 197 | productType = "com.apple.product-type.framework"; 198 | }; 199 | 124A9EAB1E9F9A85000E07E8 /* AssemblyLineTests */ = { 200 | isa = PBXNativeTarget; 201 | buildConfigurationList = 124A9EBA1E9F9A85000E07E8 /* Build configuration list for PBXNativeTarget "AssemblyLineTests" */; 202 | buildPhases = ( 203 | A351614029761E290682B70D /* [CP] Check Pods Manifest.lock */, 204 | 124A9EA81E9F9A85000E07E8 /* Sources */, 205 | 124A9EA91E9F9A85000E07E8 /* Frameworks */, 206 | 124A9EAA1E9F9A85000E07E8 /* Resources */, 207 | A126D05370BD31E7A88C5849 /* [CP] Embed Pods Frameworks */, 208 | 771294BF7C9F4D334AFB4401 /* [CP] Copy Pods Resources */, 209 | ); 210 | buildRules = ( 211 | ); 212 | dependencies = ( 213 | 124A9EAF1E9F9A85000E07E8 /* PBXTargetDependency */, 214 | ); 215 | name = AssemblyLineTests; 216 | productName = AssemblyLineTests; 217 | productReference = 124A9EAC1E9F9A85000E07E8 /* AssemblyLineTests.xctest */; 218 | productType = "com.apple.product-type.bundle.unit-test"; 219 | }; 220 | 129412461EA251450067A919 /* TeslaFactory */ = { 221 | isa = PBXNativeTarget; 222 | buildConfigurationList = 129412561EA251450067A919 /* Build configuration list for PBXNativeTarget "TeslaFactory" */; 223 | buildPhases = ( 224 | 129412431EA251450067A919 /* Sources */, 225 | 129412441EA251450067A919 /* Frameworks */, 226 | 129412451EA251450067A919 /* Resources */, 227 | ); 228 | buildRules = ( 229 | ); 230 | dependencies = ( 231 | ); 232 | name = TeslaFactory; 233 | productName = TeslaFactory; 234 | productReference = 129412471EA251450067A919 /* TeslaFactory.app */; 235 | productType = "com.apple.product-type.application"; 236 | }; 237 | /* End PBXNativeTarget section */ 238 | 239 | /* Begin PBXProject section */ 240 | 124A9E9A1E9F9A84000E07E8 /* Project object */ = { 241 | isa = PBXProject; 242 | attributes = { 243 | LastSwiftUpdateCheck = 0830; 244 | LastUpgradeCheck = 0830; 245 | ORGANIZATIONNAME = "Stamp Inc"; 246 | TargetAttributes = { 247 | 124A9EA21E9F9A84000E07E8 = { 248 | CreatedOnToolsVersion = 8.3; 249 | DevelopmentTeam = 88ACA86N96; 250 | LastSwiftMigration = 0830; 251 | ProvisioningStyle = Automatic; 252 | }; 253 | 124A9EAB1E9F9A85000E07E8 = { 254 | CreatedOnToolsVersion = 8.3; 255 | DevelopmentTeam = 88ACA86N96; 256 | ProvisioningStyle = Automatic; 257 | }; 258 | 129412461EA251450067A919 = { 259 | CreatedOnToolsVersion = 8.3; 260 | DevelopmentTeam = 88ACA86N96; 261 | ProvisioningStyle = Automatic; 262 | }; 263 | }; 264 | }; 265 | buildConfigurationList = 124A9E9D1E9F9A84000E07E8 /* Build configuration list for PBXProject "AssemblyLine" */; 266 | compatibilityVersion = "Xcode 3.2"; 267 | developmentRegion = English; 268 | hasScannedForEncodings = 0; 269 | knownRegions = ( 270 | en, 271 | Base, 272 | ); 273 | mainGroup = 124A9E991E9F9A84000E07E8; 274 | productRefGroup = 124A9EA41E9F9A84000E07E8 /* Products */; 275 | projectDirPath = ""; 276 | projectRoot = ""; 277 | targets = ( 278 | 124A9EA21E9F9A84000E07E8 /* AssemblyLine */, 279 | 124A9EAB1E9F9A85000E07E8 /* AssemblyLineTests */, 280 | 129412461EA251450067A919 /* TeslaFactory */, 281 | ); 282 | }; 283 | /* End PBXProject section */ 284 | 285 | /* Begin PBXResourcesBuildPhase section */ 286 | 124A9EA11E9F9A84000E07E8 /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | 124A9EAA1E9F9A85000E07E8 /* Resources */ = { 294 | isa = PBXResourcesBuildPhase; 295 | buildActionMask = 2147483647; 296 | files = ( 297 | ); 298 | runOnlyForDeploymentPostprocessing = 0; 299 | }; 300 | 129412451EA251450067A919 /* Resources */ = { 301 | isa = PBXResourcesBuildPhase; 302 | buildActionMask = 2147483647; 303 | files = ( 304 | 129412541EA251450067A919 /* LaunchScreen.storyboard in Resources */, 305 | 129412511EA251450067A919 /* Assets.xcassets in Resources */, 306 | 1294124F1EA251450067A919 /* Main.storyboard in Resources */, 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXResourcesBuildPhase section */ 311 | 312 | /* Begin PBXShellScriptBuildPhase section */ 313 | 771294BF7C9F4D334AFB4401 /* [CP] Copy Pods Resources */ = { 314 | isa = PBXShellScriptBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | ); 318 | inputPaths = ( 319 | ); 320 | name = "[CP] Copy Pods Resources"; 321 | outputPaths = ( 322 | ); 323 | runOnlyForDeploymentPostprocessing = 0; 324 | shellPath = /bin/sh; 325 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AssemblyLineTests/Pods-AssemblyLineTests-resources.sh\"\n"; 326 | showEnvVarsInLog = 0; 327 | }; 328 | A126D05370BD31E7A88C5849 /* [CP] Embed Pods Frameworks */ = { 329 | isa = PBXShellScriptBuildPhase; 330 | buildActionMask = 2147483647; 331 | files = ( 332 | ); 333 | inputPaths = ( 334 | ); 335 | name = "[CP] Embed Pods Frameworks"; 336 | outputPaths = ( 337 | ); 338 | runOnlyForDeploymentPostprocessing = 0; 339 | shellPath = /bin/sh; 340 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AssemblyLineTests/Pods-AssemblyLineTests-frameworks.sh\"\n"; 341 | showEnvVarsInLog = 0; 342 | }; 343 | A351614029761E290682B70D /* [CP] Check Pods Manifest.lock */ = { 344 | isa = PBXShellScriptBuildPhase; 345 | buildActionMask = 2147483647; 346 | files = ( 347 | ); 348 | inputPaths = ( 349 | ); 350 | name = "[CP] Check Pods Manifest.lock"; 351 | outputPaths = ( 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | shellPath = /bin/sh; 355 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 356 | showEnvVarsInLog = 0; 357 | }; 358 | DBF3FCD9FF4DDB71652D3CD6 /* [CP] Copy Pods Resources */ = { 359 | isa = PBXShellScriptBuildPhase; 360 | buildActionMask = 2147483647; 361 | files = ( 362 | ); 363 | inputPaths = ( 364 | ); 365 | name = "[CP] Copy Pods Resources"; 366 | outputPaths = ( 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | shellPath = /bin/sh; 370 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AssemblyLine/Pods-AssemblyLine-resources.sh\"\n"; 371 | showEnvVarsInLog = 0; 372 | }; 373 | F080CBF9ED1BAF5E7F653631 /* [CP] Check Pods Manifest.lock */ = { 374 | isa = PBXShellScriptBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | ); 378 | inputPaths = ( 379 | ); 380 | name = "[CP] Check Pods Manifest.lock"; 381 | outputPaths = ( 382 | ); 383 | runOnlyForDeploymentPostprocessing = 0; 384 | shellPath = /bin/sh; 385 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 386 | showEnvVarsInLog = 0; 387 | }; 388 | /* End PBXShellScriptBuildPhase section */ 389 | 390 | /* Begin PBXSourcesBuildPhase section */ 391 | 124A9E9E1E9F9A84000E07E8 /* Sources */ = { 392 | isa = PBXSourcesBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | 124A9EBF1E9F9A8D000E07E8 /* Assembly.swift in Sources */, 396 | 124A9EC01E9F9A8D000E07E8 /* Line.swift in Sources */, 397 | ); 398 | runOnlyForDeploymentPostprocessing = 0; 399 | }; 400 | 124A9EA81E9F9A85000E07E8 /* Sources */ = { 401 | isa = PBXSourcesBuildPhase; 402 | buildActionMask = 2147483647; 403 | files = ( 404 | 124A9EC21E9F9C26000E07E8 /* TeslaAssemlyLine.swift in Sources */, 405 | 124A9EB21E9F9A85000E07E8 /* AssemblyLineTests.swift in Sources */, 406 | ); 407 | runOnlyForDeploymentPostprocessing = 0; 408 | }; 409 | 129412431EA251450067A919 /* Sources */ = { 410 | isa = PBXSourcesBuildPhase; 411 | buildActionMask = 2147483647; 412 | files = ( 413 | 129412591EA256BE0067A919 /* TeslaAssemlyLine.swift in Sources */, 414 | 1294124C1EA251450067A919 /* ViewController.swift in Sources */, 415 | 1294124A1EA251450067A919 /* AppDelegate.swift in Sources */, 416 | ); 417 | runOnlyForDeploymentPostprocessing = 0; 418 | }; 419 | /* End PBXSourcesBuildPhase section */ 420 | 421 | /* Begin PBXTargetDependency section */ 422 | 124A9EAF1E9F9A85000E07E8 /* PBXTargetDependency */ = { 423 | isa = PBXTargetDependency; 424 | target = 124A9EA21E9F9A84000E07E8 /* AssemblyLine */; 425 | targetProxy = 124A9EAE1E9F9A85000E07E8 /* PBXContainerItemProxy */; 426 | }; 427 | /* End PBXTargetDependency section */ 428 | 429 | /* Begin PBXVariantGroup section */ 430 | 1294124D1EA251450067A919 /* Main.storyboard */ = { 431 | isa = PBXVariantGroup; 432 | children = ( 433 | 1294124E1EA251450067A919 /* Base */, 434 | ); 435 | name = Main.storyboard; 436 | sourceTree = ""; 437 | }; 438 | 129412521EA251450067A919 /* LaunchScreen.storyboard */ = { 439 | isa = PBXVariantGroup; 440 | children = ( 441 | 129412531EA251450067A919 /* Base */, 442 | ); 443 | name = LaunchScreen.storyboard; 444 | sourceTree = ""; 445 | }; 446 | /* End PBXVariantGroup section */ 447 | 448 | /* Begin XCBuildConfiguration section */ 449 | 124A9EB51E9F9A85000E07E8 /* Debug */ = { 450 | isa = XCBuildConfiguration; 451 | buildSettings = { 452 | ALWAYS_SEARCH_USER_PATHS = NO; 453 | CLANG_ANALYZER_NONNULL = YES; 454 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 455 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 456 | CLANG_CXX_LIBRARY = "libc++"; 457 | CLANG_ENABLE_MODULES = YES; 458 | CLANG_ENABLE_OBJC_ARC = YES; 459 | CLANG_WARN_BOOL_CONVERSION = YES; 460 | CLANG_WARN_CONSTANT_CONVERSION = YES; 461 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 462 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 463 | CLANG_WARN_EMPTY_BODY = YES; 464 | CLANG_WARN_ENUM_CONVERSION = YES; 465 | CLANG_WARN_INFINITE_RECURSION = YES; 466 | CLANG_WARN_INT_CONVERSION = YES; 467 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 468 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 469 | CLANG_WARN_UNREACHABLE_CODE = YES; 470 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 471 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 472 | COPY_PHASE_STRIP = NO; 473 | CURRENT_PROJECT_VERSION = 1; 474 | DEBUG_INFORMATION_FORMAT = dwarf; 475 | ENABLE_STRICT_OBJC_MSGSEND = YES; 476 | ENABLE_TESTABILITY = YES; 477 | GCC_C_LANGUAGE_STANDARD = gnu99; 478 | GCC_DYNAMIC_NO_PIC = NO; 479 | GCC_NO_COMMON_BLOCKS = YES; 480 | GCC_OPTIMIZATION_LEVEL = 0; 481 | GCC_PREPROCESSOR_DEFINITIONS = ( 482 | "DEBUG=1", 483 | "$(inherited)", 484 | ); 485 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 486 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 487 | GCC_WARN_UNDECLARED_SELECTOR = YES; 488 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 489 | GCC_WARN_UNUSED_FUNCTION = YES; 490 | GCC_WARN_UNUSED_VARIABLE = YES; 491 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 492 | MTL_ENABLE_DEBUG_INFO = YES; 493 | ONLY_ACTIVE_ARCH = YES; 494 | SDKROOT = iphoneos; 495 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 496 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 497 | TARGETED_DEVICE_FAMILY = "1,2"; 498 | VERSIONING_SYSTEM = "apple-generic"; 499 | VERSION_INFO_PREFIX = ""; 500 | }; 501 | name = Debug; 502 | }; 503 | 124A9EB61E9F9A85000E07E8 /* Release */ = { 504 | isa = XCBuildConfiguration; 505 | buildSettings = { 506 | ALWAYS_SEARCH_USER_PATHS = NO; 507 | CLANG_ANALYZER_NONNULL = YES; 508 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 509 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 510 | CLANG_CXX_LIBRARY = "libc++"; 511 | CLANG_ENABLE_MODULES = YES; 512 | CLANG_ENABLE_OBJC_ARC = YES; 513 | CLANG_WARN_BOOL_CONVERSION = YES; 514 | CLANG_WARN_CONSTANT_CONVERSION = YES; 515 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 516 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 517 | CLANG_WARN_EMPTY_BODY = YES; 518 | CLANG_WARN_ENUM_CONVERSION = YES; 519 | CLANG_WARN_INFINITE_RECURSION = YES; 520 | CLANG_WARN_INT_CONVERSION = YES; 521 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 522 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 523 | CLANG_WARN_UNREACHABLE_CODE = YES; 524 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 525 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 526 | COPY_PHASE_STRIP = NO; 527 | CURRENT_PROJECT_VERSION = 1; 528 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 529 | ENABLE_NS_ASSERTIONS = NO; 530 | ENABLE_STRICT_OBJC_MSGSEND = YES; 531 | GCC_C_LANGUAGE_STANDARD = gnu99; 532 | GCC_NO_COMMON_BLOCKS = YES; 533 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 534 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 535 | GCC_WARN_UNDECLARED_SELECTOR = YES; 536 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 537 | GCC_WARN_UNUSED_FUNCTION = YES; 538 | GCC_WARN_UNUSED_VARIABLE = YES; 539 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 540 | MTL_ENABLE_DEBUG_INFO = NO; 541 | SDKROOT = iphoneos; 542 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 543 | TARGETED_DEVICE_FAMILY = "1,2"; 544 | VALIDATE_PRODUCT = YES; 545 | VERSIONING_SYSTEM = "apple-generic"; 546 | VERSION_INFO_PREFIX = ""; 547 | }; 548 | name = Release; 549 | }; 550 | 124A9EB81E9F9A85000E07E8 /* Debug */ = { 551 | isa = XCBuildConfiguration; 552 | baseConfigurationReference = 2DA95F0A117989B7F812754B /* Pods-AssemblyLine.debug.xcconfig */; 553 | buildSettings = { 554 | CLANG_ENABLE_MODULES = YES; 555 | CODE_SIGN_IDENTITY = ""; 556 | DEFINES_MODULE = YES; 557 | DEVELOPMENT_TEAM = 88ACA86N96; 558 | DYLIB_COMPATIBILITY_VERSION = 1; 559 | DYLIB_CURRENT_VERSION = 1; 560 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 561 | INFOPLIST_FILE = AssemblyLine/Info.plist; 562 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 563 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 564 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.AssemblyLine; 565 | PRODUCT_NAME = "$(TARGET_NAME)"; 566 | SKIP_INSTALL = YES; 567 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 568 | SWIFT_VERSION = 3.0; 569 | }; 570 | name = Debug; 571 | }; 572 | 124A9EB91E9F9A85000E07E8 /* Release */ = { 573 | isa = XCBuildConfiguration; 574 | baseConfigurationReference = A93955B343B58659C098860E /* Pods-AssemblyLine.release.xcconfig */; 575 | buildSettings = { 576 | CLANG_ENABLE_MODULES = YES; 577 | CODE_SIGN_IDENTITY = ""; 578 | DEFINES_MODULE = YES; 579 | DEVELOPMENT_TEAM = 88ACA86N96; 580 | DYLIB_COMPATIBILITY_VERSION = 1; 581 | DYLIB_CURRENT_VERSION = 1; 582 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 583 | INFOPLIST_FILE = AssemblyLine/Info.plist; 584 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 585 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 586 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.AssemblyLine; 587 | PRODUCT_NAME = "$(TARGET_NAME)"; 588 | SKIP_INSTALL = YES; 589 | SWIFT_VERSION = 3.0; 590 | }; 591 | name = Release; 592 | }; 593 | 124A9EBB1E9F9A85000E07E8 /* Debug */ = { 594 | isa = XCBuildConfiguration; 595 | baseConfigurationReference = 1E26F08ED4FF96B140C0CBEA /* Pods-AssemblyLineTests.debug.xcconfig */; 596 | buildSettings = { 597 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 598 | DEVELOPMENT_TEAM = 88ACA86N96; 599 | INFOPLIST_FILE = AssemblyLineTests/Info.plist; 600 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 601 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.AssemblyLineTests; 602 | PRODUCT_NAME = "$(TARGET_NAME)"; 603 | SWIFT_VERSION = 3.0; 604 | }; 605 | name = Debug; 606 | }; 607 | 124A9EBC1E9F9A85000E07E8 /* Release */ = { 608 | isa = XCBuildConfiguration; 609 | baseConfigurationReference = A455329A6E65F49544B715BB /* Pods-AssemblyLineTests.release.xcconfig */; 610 | buildSettings = { 611 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 612 | DEVELOPMENT_TEAM = 88ACA86N96; 613 | INFOPLIST_FILE = AssemblyLineTests/Info.plist; 614 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 615 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.AssemblyLineTests; 616 | PRODUCT_NAME = "$(TARGET_NAME)"; 617 | SWIFT_VERSION = 3.0; 618 | }; 619 | name = Release; 620 | }; 621 | 129412571EA251450067A919 /* Debug */ = { 622 | isa = XCBuildConfiguration; 623 | buildSettings = { 624 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 625 | DEVELOPMENT_TEAM = 88ACA86N96; 626 | INFOPLIST_FILE = TeslaFactory/Info.plist; 627 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 628 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.TeslaFactory; 629 | PRODUCT_NAME = "$(TARGET_NAME)"; 630 | SWIFT_VERSION = 3.0; 631 | }; 632 | name = Debug; 633 | }; 634 | 129412581EA251450067A919 /* Release */ = { 635 | isa = XCBuildConfiguration; 636 | buildSettings = { 637 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 638 | DEVELOPMENT_TEAM = 88ACA86N96; 639 | INFOPLIST_FILE = TeslaFactory/Info.plist; 640 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 641 | PRODUCT_BUNDLE_IDENTIFIER = inc.stamp.TeslaFactory; 642 | PRODUCT_NAME = "$(TARGET_NAME)"; 643 | SWIFT_VERSION = 3.0; 644 | }; 645 | name = Release; 646 | }; 647 | /* End XCBuildConfiguration section */ 648 | 649 | /* Begin XCConfigurationList section */ 650 | 124A9E9D1E9F9A84000E07E8 /* Build configuration list for PBXProject "AssemblyLine" */ = { 651 | isa = XCConfigurationList; 652 | buildConfigurations = ( 653 | 124A9EB51E9F9A85000E07E8 /* Debug */, 654 | 124A9EB61E9F9A85000E07E8 /* Release */, 655 | ); 656 | defaultConfigurationIsVisible = 0; 657 | defaultConfigurationName = Release; 658 | }; 659 | 124A9EB71E9F9A85000E07E8 /* Build configuration list for PBXNativeTarget "AssemblyLine" */ = { 660 | isa = XCConfigurationList; 661 | buildConfigurations = ( 662 | 124A9EB81E9F9A85000E07E8 /* Debug */, 663 | 124A9EB91E9F9A85000E07E8 /* Release */, 664 | ); 665 | defaultConfigurationIsVisible = 0; 666 | defaultConfigurationName = Release; 667 | }; 668 | 124A9EBA1E9F9A85000E07E8 /* Build configuration list for PBXNativeTarget "AssemblyLineTests" */ = { 669 | isa = XCConfigurationList; 670 | buildConfigurations = ( 671 | 124A9EBB1E9F9A85000E07E8 /* Debug */, 672 | 124A9EBC1E9F9A85000E07E8 /* Release */, 673 | ); 674 | defaultConfigurationIsVisible = 0; 675 | defaultConfigurationName = Release; 676 | }; 677 | 129412561EA251450067A919 /* Build configuration list for PBXNativeTarget "TeslaFactory" */ = { 678 | isa = XCConfigurationList; 679 | buildConfigurations = ( 680 | 129412571EA251450067A919 /* Debug */, 681 | 129412581EA251450067A919 /* Release */, 682 | ); 683 | defaultConfigurationIsVisible = 0; 684 | defaultConfigurationName = Release; 685 | }; 686 | /* End XCConfigurationList section */ 687 | }; 688 | rootObject = 124A9E9A1E9F9A84000E07E8 /* Project object */; 689 | } 690 | -------------------------------------------------------------------------------- /AssemblyLine.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AssemblyLine.xcodeproj/xcuserdata/1amageek.xcuserdatad/xcschemes/AssemblyLine.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /AssemblyLine.xcodeproj/xcuserdata/1amageek.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | AssemblyLine.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | TeslaFactory.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 124A9EA21E9F9A84000E07E8 21 | 22 | primary 23 | 24 | 25 | 124A9EAB1E9F9A85000E07E8 26 | 27 | primary 28 | 29 | 30 | 129412461EA251450067A919 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /AssemblyLine.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /AssemblyLine/Assembly.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Assembly.swift 3 | // AssemblyLine 4 | // 5 | // Created by 1amageek on 2017/04/13. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol StatusProtocol { } 12 | 13 | public protocol Processable: class, Hashable { 14 | associatedtype Status: StatusProtocol 15 | var error: Error? { get } 16 | var id: String { get } 17 | var status: Status { set get } 18 | var workItem: DispatchWorkItem? { set get } 19 | func dispose(_ error: Error?) 20 | } 21 | 22 | extension Processable { 23 | public var hashValue: Int { return self.id.hash } 24 | } 25 | 26 | public func == (lhs: T, rhs: T) -> Bool { 27 | return lhs.id == rhs.id 28 | } 29 | 30 | public class Step { 31 | 32 | public typealias Input = Product 33 | public typealias Output = Product 34 | 35 | public var manufacturing: (Input) -> Output 36 | 37 | public init(_ manufacturing: @escaping (Input) -> Output) { 38 | self.manufacturing = manufacturing 39 | } 40 | 41 | public func execute(_ input: Input) -> Output { 42 | return manufacturing(input) 43 | } 44 | 45 | } 46 | 47 | public protocol Packageable { } 48 | -------------------------------------------------------------------------------- /AssemblyLine/AssemblyLine.h: -------------------------------------------------------------------------------- 1 | // 2 | // AssemblyLine.h 3 | // AssemblyLine 4 | // 5 | // Created by 1amageek on 2017/04/13. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for AssemblyLine. 12 | FOUNDATION_EXPORT double AssemblyLineVersionNumber; 13 | 14 | //! Project version string for AssemblyLine. 15 | FOUNDATION_EXPORT const unsigned char AssemblyLineVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /AssemblyLine/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /AssemblyLine/Line.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Line.swift 3 | // AssemblyLine 4 | // 5 | // Created by 1amageek on 2017/04/13. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class Line { 12 | 13 | public let id: String 14 | 15 | public let queue: DispatchQueue 16 | 17 | public let group: DispatchGroup = DispatchGroup() 18 | 19 | public let workflow: [Step] 20 | 21 | private var isStopped: Bool = false 22 | 23 | private(set) var products: [Product] = [] 24 | 25 | public init(id: String = UUID().uuidString, 26 | workflow: [Step], 27 | queue: DispatchQueue = DispatchQueue(label: "line.queue")) { 28 | self.id = id 29 | self.workflow = workflow 30 | self.queue = queue 31 | } 32 | 33 | @discardableResult 34 | public func generate(_ product: Product) -> Product { 35 | let workItem: DispatchWorkItem 36 | var product: Product = product 37 | let workflow: [Step] = self.workflow 38 | workItem = DispatchWorkItem { [weak self] in 39 | for step in workflow { 40 | product = step.execute(product) 41 | if let error: Error = product.error { 42 | product.dispose(error) 43 | self?.remove(product) 44 | break 45 | } 46 | if product.workItem!.isCancelled { 47 | product.dispose(nil) 48 | self?.remove(product) 49 | break 50 | } 51 | } 52 | } 53 | product.workItem = workItem 54 | self.products.append(product) 55 | self.queue.async(group: group, execute: workItem) 56 | return product 57 | } 58 | 59 | public func remove(_ product: Product) { 60 | if let index: Int = self.products.index(of: product) { 61 | self.products.remove(at: index) 62 | } 63 | } 64 | 65 | public func stop() { 66 | self.isStopped = true 67 | self.products.forEach { (product) in 68 | product.workItem?.cancel() 69 | } 70 | self.products.removeAll() 71 | } 72 | 73 | public func dispose() { 74 | self.stop() 75 | self.products.forEach { (product) in 76 | product.dispose(nil) 77 | } 78 | } 79 | 80 | public func packing(block: @escaping ([Product], Bool) -> Void) { 81 | if isStopped { 82 | block([], self.isStopped) 83 | return 84 | } 85 | let queue: DispatchQueue = DispatchQueue(label: "line.package.queue") 86 | queue.async { 87 | _ = self.group.wait(timeout: .distantFuture) 88 | DispatchQueue.main.async { 89 | block(self.products, self.isStopped) 90 | } 91 | } 92 | } 93 | 94 | } 95 | 96 | extension Line: Hashable { 97 | public var hashValue: Int { 98 | return self.id.hash 99 | } 100 | } 101 | 102 | public func == (lhs: Line, rhs: Line) -> Bool { 103 | return lhs.id == rhs.id 104 | } 105 | -------------------------------------------------------------------------------- /AssemblyLineTests/AssemblyLineTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AssemblyLineTests.swift 3 | // AssemblyLineTests 4 | // 5 | // Created by 1amageek on 2017/04/13. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import Quick 10 | import Nimble 11 | @testable import AssemblyLine 12 | 13 | class AssemblyLineTests: QuickSpec { 14 | 15 | override func spec() { 16 | describe("ModelX Factory") { 17 | context("White ModelX assembly line", { 18 | 19 | let assembly: Step = Step({ (product) -> ModelX in 20 | product.isAssembled = true 21 | return product 22 | }) 23 | 24 | let paint: Step = Step({ (product) -> ModelX in 25 | product.color = .white 26 | return product 27 | }) 28 | 29 | it("Step manufactring is not nil") { 30 | expect(assembly.manufacturing).toNot(beNil()) 31 | } 32 | 33 | let line: Line = Line(workflow: [assembly, paint]) 34 | (0..<10).forEach({ (index) in 35 | let product: ModelX = ModelX() 36 | line.generate(product) 37 | }) 38 | 39 | waitUntil(action: { (done) in 40 | line.packing { (products, isStopped) in 41 | let package = ModelXPackage(products: products) 42 | it("Genrate 10 units") { 43 | expect(line.products.count).to(equal(10)) 44 | } 45 | 46 | it("Package") { 47 | expect(package.products.count).to(equal(10)) 48 | } 49 | 50 | it("ModelX is assembled") { 51 | package.products.forEach({ (modelX) in 52 | expect(modelX.isAssembled).to(equal(true)) 53 | }) 54 | } 55 | 56 | it("ModelX is white color") { 57 | package.products.forEach({ (modelX) in 58 | expect(modelX.color!).to(equal(UIColor.white)) 59 | }) 60 | } 61 | 62 | done() 63 | } 64 | }) 65 | 66 | }) 67 | 68 | context("ModelX assembly bad line", { 69 | 70 | var count: Int = 0 71 | 72 | let badStep: Step = Step({ (product) -> ModelX in 73 | product.isAssembled = true 74 | if count % 2 == 0 { 75 | product.error = ModelXError.invalid 76 | } 77 | count += 1 78 | return product 79 | }) 80 | 81 | it("Step manufactring is not nil") { 82 | expect(badStep.manufacturing).toNot(beNil()) 83 | } 84 | 85 | let line: Line = Line(workflow: [badStep]) 86 | (0..<10).forEach({ (index) in 87 | let product: ModelX = ModelX() 88 | line.generate(product) 89 | }) 90 | 91 | waitUntil(action: { (done) in 92 | line.packing { (products, isStopped) in 93 | let package = ModelXPackage(products: products) 94 | 95 | it("Genrate 5 units") { 96 | expect(line.products.count).to(equal(5)) 97 | } 98 | 99 | it("Package") { 100 | expect(package.products.count).to(equal(5)) 101 | } 102 | 103 | it("ModelX is assembled") { 104 | package.products.forEach({ (modelX) in 105 | expect(modelX.isAssembled).to(equal(true)) 106 | }) 107 | } 108 | done() 109 | } 110 | }) 111 | 112 | }) 113 | 114 | } 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /AssemblyLineTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /AssemblyLineTests/TeslaAssemlyLine.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TeslaAssemlyLine.swift 3 | // AssemblyLine 4 | // 5 | // Created by 1amageek on 2017/04/13. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | import AssemblyLine 12 | 13 | enum ModelXStatus: StatusProtocol { 14 | case spec 15 | case assembly 16 | case paint 17 | } 18 | 19 | enum ModelXError: Error { 20 | case invalid 21 | } 22 | 23 | class ModelX: Processable { 24 | 25 | typealias Status = ModelXStatus 26 | 27 | var error: Error? 28 | var id: String 29 | var status: Status 30 | var workItem: DispatchWorkItem? 31 | var isAssembled: Bool = false 32 | var color: UIColor? 33 | 34 | init() { 35 | self.id = UUID().uuidString 36 | self.status = .spec 37 | } 38 | 39 | func dispose(_ error: Error?) { 40 | 41 | } 42 | } 43 | 44 | struct ModelXPackage: Packageable { 45 | var products: [ModelX] 46 | } 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 1amageek 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'AssemblyLine' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for AssemblyLine 9 | 10 | target 'AssemblyLineTests' do 11 | inherit! :search_paths 12 | pod 'Quick' 13 | pod 'Nimble' 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Nimble (6.1.0) 3 | - Quick (1.1.0) 4 | 5 | DEPENDENCIES: 6 | - Nimble 7 | - Quick 8 | 9 | SPEC CHECKSUMS: 10 | Nimble: c53e6903fee94041b90ded74f135820437d8bf59 11 | Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d 12 | 13 | PODFILE CHECKSUM: 04052e5b4471e8de0b5fed2418db9579b564d142 14 | 15 | COCOAPODS: 1.2.1 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AssemblyLine 2 | 3 | 4 | 5 | [![Version](http://img.shields.io/cocoapods/v/Bleu.svg)](http://cocoapods.org/?q=AssemblyLine) 6 | [![Platform](http://img.shields.io/cocoapods/p/Bleu.svg)]() 7 | 8 | AssemblyLine processes several tasks continuously in the background. 9 | Discard tasks that failed during execution during execution. 10 | 11 | ## Why 12 | 13 | Processing flow of data becomes complicated year by year. 14 | Until a few years ago I just took a picture and uploaded it. 15 | Recently, it passes through multiple flow, processing photos and processing meta information, face recognition. 16 | 17 | Processing of data does not always succeed in all. Because mobile has an unstable factor. 18 | 19 | 1. Network disconnection 20 | 1. Insufficient memory 21 | 1. Insufficient storage 22 | 23 | It is necessary to have a method to make each processing independent and to process it simple. 24 | 25 | 26 | 27 | ## Usage 👻 28 | 29 | Take example of Tesla's factory. 30 | 31 | 32 | 33 | Define Status. 34 | ``` swift 35 | enum ModelXStatus: StatusProtocol { 36 | case spec 37 | case assembly 38 | case paint 39 | } 40 | ``` 41 | Define Error. 42 | ``` swift 43 | enum ModelXError: Error { 44 | case invalid 45 | } 46 | ``` 47 | 48 | `Processable` protocol. 49 | ``` swift 50 | class ModelX: Processable { 51 | 52 | typealias Status = ModelXStatus 53 | 54 | var error: Error? 55 | var id: String 56 | var status: Status 57 | var workItem: DispatchWorkItem? 58 | var isAssembled: Bool = false 59 | var color: UIColor? 60 | 61 | init() { 62 | self.id = UUID().uuidString 63 | self.status = .spec 64 | } 65 | 66 | // Processing when an error occurs 67 | func dispose(_ error: Error?) { 68 | 69 | } 70 | } 71 | ``` 72 | 73 | ``` swift 74 | struct ModelXPackage: Packageable { 75 | var products: [ModelX] 76 | } 77 | 78 | ``` 79 | 80 | ``` swift 81 | // Define workflow steps 82 | let assembly: Step = Step({ (product) -> ModelX in 83 | product.isAssembled = true 84 | return product 85 | }) 86 | 87 | // Define workflow steps 88 | let paint: Step = Step({ (product) -> ModelX in 89 | product.color = .white 90 | return product 91 | }) 92 | 93 | // Making a manufacturing line to do workflow 94 | let line: Line = Line(workflow: [assembly, paint]) 95 | 96 | // Generate 10 ModelX 97 | (0..<10).forEach({ (index) in 98 | let product: ModelX = ModelX() 99 | line.generate(product) 100 | }) 101 | 102 | // Packaging 103 | line.packing { (products, isStopped) in 104 | if isStopped { 105 | print("Line is stopped") 106 | return 107 | } 108 | let package = ModelXPackage(products: products) 109 | } 110 | ``` 111 | -------------------------------------------------------------------------------- /TeslaFactory/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // TeslaFactory 4 | // 5 | // Created by 1amageek on 2017/04/15. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | } 22 | 23 | -------------------------------------------------------------------------------- /TeslaFactory/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /TeslaFactory/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /TeslaFactory/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /TeslaFactory/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /TeslaFactory/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // TeslaFactory 4 | // 5 | // Created by 1amageek on 2017/04/15. 6 | // Copyright © 2017年 Stamp Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AssemblyLine 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | let assembly: Step = Step({ (product) -> ModelX in 17 | product.isAssembled = true 18 | return product 19 | }) 20 | 21 | let paint: Step = Step({ (product) -> ModelX in 22 | product.color = .white 23 | return product 24 | }) 25 | 26 | let line: Line = Line(workflow: [assembly, paint]) 27 | (0..<10).forEach({ (index) in 28 | let product: ModelX = ModelX() 29 | line.generate(product) 30 | }) 31 | 32 | line.packing { (products, isStopped) in 33 | print("Package") 34 | } 35 | 36 | print("viewDidLoad") 37 | } 38 | 39 | override func didReceiveMemoryWarning() { 40 | super.didReceiveMemoryWarning() 41 | // Dispose of any resources that can be recreated. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /proccess_flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1amageek/AssemblyLine/c391e4eb728202e6d70a63be953ab5b835065bd2/proccess_flow.png --------------------------------------------------------------------------------