diff --git a/DevExcuses.xcodeproj/project.pbxproj b/DevExcuses.xcodeproj/project.pbxproj index ec9da03..42b8af6 100644 --- a/DevExcuses.xcodeproj/project.pbxproj +++ b/DevExcuses.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ 241F01FA0BFC50E2D06A6568 /* libPods-devexcuses-DevexcusesTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7239B59036FBDC9BED38B3E8 /* libPods-devexcuses-DevexcusesTest.a */; }; - 6166270BC30A7670329D31CD /* libPods-DevexcusesTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 235CD2DE50CF5D60EEA290AF /* libPods-DevexcusesTest.a */; }; - 7B480B4C223254820019EB07 /* DevexcusesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B480B4B223254820019EB07 /* DevexcusesTest.swift */; }; 7B480B52223254C00019EB07 /* UnsplashClientTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B480B51223254C00019EB07 /* UnsplashClientTest.swift */; }; 7B480B67223264530019EB07 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = E71262FB2080FF78006D94DA /* User.swift */; }; 7B480B68223264530019EB07 /* UserLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = E71262FD20810014006D94DA /* UserLinks.swift */; }; @@ -33,16 +31,13 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 235CD2DE50CF5D60EEA290AF /* libPods-DevexcusesTest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-DevexcusesTest.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 27C93E4E9697D42766097BFE /* Pods-devexcuses.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-devexcuses.release.xcconfig"; path = "Pods/Target Support Files/Pods-devexcuses/Pods-devexcuses.release.xcconfig"; sourceTree = ""; }; 3E863DF3A0B23534EF450EF5 /* Pods-DevexcusesTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DevexcusesTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-DevexcusesTest/Pods-DevexcusesTest.release.xcconfig"; sourceTree = ""; }; 539D1BC2C6EE6F55F52398E0 /* Pods-devexcuses-DevexcusesTest.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-devexcuses-DevexcusesTest.release.xcconfig"; path = "Pods/Target Support Files/Pods-devexcuses-DevexcusesTest/Pods-devexcuses-DevexcusesTest.release.xcconfig"; sourceTree = ""; }; 7239B59036FBDC9BED38B3E8 /* libPods-devexcuses-DevexcusesTest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-devexcuses-DevexcusesTest.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 7B480B49223254820019EB07 /* DevexcusesTest.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DevexcusesTest.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 7B480B4B223254820019EB07 /* DevexcusesTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DevexcusesTest.swift; sourceTree = ""; }; 7B480B4D223254820019EB07 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7B480B51223254C00019EB07 /* UnsplashClientTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsplashClientTest.swift; sourceTree = ""; }; - A2680B78518C1AF55F934501 /* libPods-devexcusestest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-devexcusestest.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A58DB4D36B5F52A24E6ED461 /* Pods-devexcuses.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-devexcuses.debug.xcconfig"; path = "Pods/Target Support Files/Pods-devexcuses/Pods-devexcuses.debug.xcconfig"; sourceTree = ""; }; ADAB50A2F0A56B20D37C93A0 /* libPods-devexcuses.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-devexcuses.a"; sourceTree = BUILT_PRODUCTS_DIR; }; E70963302081BDD8006B381C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; @@ -70,7 +65,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 6166270BC30A7670329D31CD /* libPods-DevexcusesTest.a in Frameworks */, 241F01FA0BFC50E2D06A6568 /* libPods-devexcuses-DevexcusesTest.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -99,14 +93,13 @@ name = Pods; sourceTree = ""; }; - 7B480B4A223254820019EB07 /* DevexcusesTest */ = { + 7B480B4A223254820019EB07 /* DevExcusesTest */ = { isa = PBXGroup; children = ( 7B480B51223254C00019EB07 /* UnsplashClientTest.swift */, - 7B480B4B223254820019EB07 /* DevexcusesTest.swift */, 7B480B4D223254820019EB07 /* Info.plist */, ); - path = DevexcusesTest; + path = DevExcusesTest; sourceTree = ""; }; E71262FA2080FF59006D94DA /* Models */ = { @@ -150,7 +143,7 @@ E77A61982081F06800F8E1B7 /* README.md */, E75B4B15209CA74500A44D10 /* Podfile */, E7CDCC6E2080F42200A553DF /* DevExcuses */, - 7B480B4A223254820019EB07 /* DevexcusesTest */, + 7B480B4A223254820019EB07 /* DevExcusesTest */, E7CDCC6D2080F42200A553DF /* Products */, 42F8B77797667FD49945E145 /* Pods */, F7C37CE0587B069290983FA6 /* Frameworks */, @@ -179,8 +172,6 @@ isa = PBXGroup; children = ( ADAB50A2F0A56B20D37C93A0 /* libPods-devexcuses.a */, - A2680B78518C1AF55F934501 /* libPods-devexcusestest.a */, - 235CD2DE50CF5D60EEA290AF /* libPods-DevexcusesTest.a */, 7239B59036FBDC9BED38B3E8 /* libPods-devexcuses-DevexcusesTest.a */, ); name = Frameworks; @@ -361,7 +352,6 @@ 7B480B69223264530019EB07 /* PhotoUrls.swift in Sources */, 7B480B6C2232645E0019EB07 /* Extensions.swift in Sources */, 7B480B52223254C00019EB07 /* UnsplashClientTest.swift in Sources */, - 7B480B4C223254820019EB07 /* DevexcusesTest.swift in Sources */, 7B480B68223264530019EB07 /* UserLinks.swift in Sources */, 7B480B67223264530019EB07 /* User.swift in Sources */, ); @@ -482,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -535,7 +525,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -558,7 +548,7 @@ "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; PRODUCT_BUNDLE_IDENTIFIER = com.github.ayltai.devexcuses; PRODUCT_NAME = "Developers Excuses"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -582,7 +572,7 @@ "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.10; + MACOSX_DEPLOYMENT_TARGET = 10.14; PRODUCT_BUNDLE_IDENTIFIER = com.github.ayltai.devexcuses; PRODUCT_NAME = "Developers Excuses"; SWIFT_VERSION = 4.0; diff --git a/DevExcuses/Sources/DevExcusesView.swift b/DevExcuses/Sources/DevExcusesView.swift index 972a52c..96e718e 100644 --- a/DevExcuses/Sources/DevExcusesView.swift +++ b/DevExcuses/Sources/DevExcusesView.swift @@ -205,9 +205,9 @@ class DevExcusesView: ScreenSaverView { .subscribe { event in if let error = event.error { self.update( - excuse: error.localizedDescription, + excuse : error.localizedDescription, background: nil, - userName: nil, + userName : nil, profileUrl: nil ) @@ -219,9 +219,9 @@ class DevExcusesView: ScreenSaverView { .subscribe { event in if let error = event.error { self.update( - excuse: error.localizedDescription, + excuse : error.localizedDescription, background: nil, - userName: nil, + userName : nil, profileUrl: nil ) } else if @@ -231,9 +231,9 @@ class DevExcusesView: ScreenSaverView { let links = user.links, let profileUrl = links.html { self.update( - excuse: DevExcusesView.excuses[DevExcusesView.excuses.count.random()], + excuse : DevExcusesView.excuses[DevExcusesView.excuses.count.random()], background: data, - userName: userName, + userName : userName, profileUrl: profileUrl) } diff --git a/DevExcuses/Sources/KenBurnsView.swift b/DevExcuses/Sources/KenBurnsView.swift index 52b9ee6..ae71808 100644 --- a/DevExcuses/Sources/KenBurnsView.swift +++ b/DevExcuses/Sources/KenBurnsView.swift @@ -6,9 +6,9 @@ final class KenBurnsView: NSImageView { private var duration: TimeInterval = 15 func animate(image: NSImage?, alpha: CGFloat, duration: TimeInterval) { - self.image = image - self.alphaValue = alpha - self.duration = duration + self.image = image + self.alphaValue = alpha + self.duration = duration } override var wantsUpdateLayer: Bool { diff --git a/DevExcuses/Sources/Models/Photo.swift b/DevExcuses/Sources/Models/Photo.swift index fa22afb..d36b57b 100644 --- a/DevExcuses/Sources/Models/Photo.swift +++ b/DevExcuses/Sources/Models/Photo.swift @@ -1,11 +1,16 @@ -import Unbox +struct Photo: Codable { + enum CodingKeys: CodingKey { + case user + case urls + } -struct Photo: Unboxable { let user: User? let urls: PhotoUrls? - init(unboxer: Unboxer) throws { - self.user = unboxer.unbox(key: "user") - self.urls = unboxer.unbox(key: "urls") + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.user = try container.decodeIfPresent(User.self, forKey: .user) + self.urls = try container.decodeIfPresent(PhotoUrls.self, forKey: .urls) } } diff --git a/DevExcuses/Sources/Models/PhotoUrls.swift b/DevExcuses/Sources/Models/PhotoUrls.swift index cb110c3..220301d 100644 --- a/DevExcuses/Sources/Models/PhotoUrls.swift +++ b/DevExcuses/Sources/Models/PhotoUrls.swift @@ -1,9 +1,13 @@ -import Unbox +struct PhotoUrls: Codable { + enum CodingKeys: CodingKey { + case custom + } -struct PhotoUrls: Unboxable { let custom: String? - init(unboxer: Unboxer) throws { - self.custom = unboxer.unbox(key: "custom") + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.custom = try container.decodeIfPresent(String.self, forKey: .custom) } } diff --git a/DevExcuses/Sources/Models/User.swift b/DevExcuses/Sources/Models/User.swift index d87e5f2..43a99dc 100644 --- a/DevExcuses/Sources/Models/User.swift +++ b/DevExcuses/Sources/Models/User.swift @@ -1,11 +1,16 @@ -import Unbox +struct User: Codable { + enum CodingKeys: CodingKey { + case name + case links + } -struct User: Unboxable { let name : String? let links: UserLinks? - init(unboxer: Unboxer) throws { - self.name = unboxer.unbox(key: "name") - self.links = unboxer.unbox(key: "links") + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.name = try container.decodeIfPresent(String.self, forKey: .name) + self.links = try container.decodeIfPresent(UserLinks.self, forKey: .links) } } diff --git a/DevExcuses/Sources/Models/UserLinks.swift b/DevExcuses/Sources/Models/UserLinks.swift index 052303e..bccf103 100644 --- a/DevExcuses/Sources/Models/UserLinks.swift +++ b/DevExcuses/Sources/Models/UserLinks.swift @@ -1,9 +1,13 @@ -import Unbox +struct UserLinks: Codable { + enum CodingKeys: CodingKey { + case html + } -struct UserLinks: Unboxable { let html: String? - init(unboxer: Unboxer) throws { - self.html = unboxer.unbox(key: "html") + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + self.html = try container.decodeIfPresent(String.self, forKey: .html) } } diff --git a/DevExcuses/Sources/UnsplashClient.swift b/DevExcuses/Sources/UnsplashClient.swift index fcc727c..3b1c555 100644 --- a/DevExcuses/Sources/UnsplashClient.swift +++ b/DevExcuses/Sources/UnsplashClient.swift @@ -1,5 +1,4 @@ import RxSwift -import Unbox final class UnsplashClient { private static let endPoint = "https://api.unsplash.com/" @@ -26,7 +25,7 @@ final class UnsplashClient { mutable.path = "/photos/random" mutable.queryItems = queryItems - URLSession(configuration: URLSessionConfiguration.default).dataTask(with: mutable.url!) { (data, response, error) in + URLSession.shared.dataTask(with: mutable.url!) { (data, response, error) in if let error = error { observer.onError(error as NSError) } else if @@ -34,7 +33,7 @@ final class UnsplashClient { let data = data { if response.isSuccess { do { - let photo: Photo = try unbox(data: data) + let photo: Photo = try JSONDecoder().decode(Photo.self, from: data) observer.onNext(photo) } catch let error as NSError { observer.onError(error) diff --git a/DevexcusesTest/Info.plist b/DevExcusesTest/Info.plist similarity index 100% rename from DevexcusesTest/Info.plist rename to DevExcusesTest/Info.plist diff --git a/DevexcusesTest/DevexcusesTest.swift b/DevexcusesTest/DevexcusesTest.swift deleted file mode 100644 index 69e41ee..0000000 --- a/DevexcusesTest/DevexcusesTest.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// DevexcusesTest.swift -// DevexcusesTest -// -// Created by Brian Chung on 8/3/2019. -// Copyright © 2019 Alan Tai. All rights reserved. -// - -import XCTest - -class DevexcusesTest: XCTestCase { - - override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/DevexcusesTest/UnsplashClientTest.swift b/DevexcusesTest/UnsplashClientTest.swift index da32ac7..563a2ba 100644 --- a/DevexcusesTest/UnsplashClientTest.swift +++ b/DevexcusesTest/UnsplashClientTest.swift @@ -1,34 +1,20 @@ -// -// UnsplashClientTest.swift -// DevexcusesTest -// -// Created by Brian Chung on 8/3/2019. -// Copyright © 2019 Alan Tai. All rights reserved. -// - import XCTest import Nimble class UnsplashClientTest: XCTestCase { - private var unsplashClient: UnsplashClient! - private let apiKey = "Please replace your key here" override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - unsplashClient = UnsplashClient(apiKey: apiKey) - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. + unsplashClient = UnsplashClient(apiKey: "Please replace your key here") } func testRandom() { let targetSize = CGSize(width: 800, height: 600) + for _ in 0...2 { waitUntil(timeout: 10.0) { done in _ = self.unsplashClient.random(size: targetSize, query: nil) - .subscribe(onNext: { (photo) in + .subscribe(onNext: { photo in done() }) } diff --git a/Podfile b/Podfile index 8227428..e7af511 100644 --- a/Podfile +++ b/Podfile @@ -1,8 +1,7 @@ -platform :osx, '10.10' +platform :osx, '10.14' target 'devexcuses' do - pod 'RxSwift', '~> 4.0' - pod 'Unbox', '~> 3.0' + pod 'RxSwift' pod 'SwiftLint' target 'DevexcusesTest' do diff --git a/Podfile.lock b/Podfile.lock index 6f4b7cd..9a7fc53 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,16 +1,14 @@ PODS: - - Nimble (7.3.4) - - Quick (1.3.4) - - RxSwift (4.3.1) - - SwiftLint (0.25.1) - - Unbox (3.0.0) + - Nimble (8.0.2) + - Quick (2.1.0) + - RxSwift (5.0.0) + - SwiftLint (0.34.0) DEPENDENCIES: - Nimble - Quick - - RxSwift (~> 4.0) + - RxSwift - SwiftLint - - Unbox (~> 3.0) SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -18,15 +16,13 @@ SPEC REPOS: - Quick - RxSwift - SwiftLint - - Unbox SPEC CHECKSUMS: - Nimble: 051e3d8912d40138fa5591c78594f95fb172af37 - Quick: f4f7f063c524394c73ed93ac70983c609805d481 - RxSwift: fe0fd770a43acdb7d0a53da411c9b892e69bb6e4 - SwiftLint: ce933681be10c3266e82576dad676fa815a602e9 - Unbox: 9ed33b2a31f7a8a049f54b94d40c4a52a28c4d9d + Nimble: 622629381bda1dd5678162f21f1368cec7cbba60 + Quick: 4be43f6634acfa727dd106bdf3929ce125ffa79d + RxSwift: 8b0671caa829a763bbce7271095859121cbd895f + SwiftLint: 79d48a17c6565dc286c37efb8322c7b450f95c67 -PODFILE CHECKSUM: 445cfd34da02ee18ec26b2b018630aa0b784a60d +PODFILE CHECKSUM: c4e102af2eb5609201f4523b659b339ea988fe7c COCOAPODS: 1.5.3 diff --git a/README.md b/README.md index e932c2a..48c81bb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Developers Excuses -[![Release](https://img.shields.io/github/release/ayltai/MacOS-Developers-Excuses.svg?label=release&maxAge=1800)](Releases/1.1/screensaver.zip) [![macOS](https://img.shields.io/badge/macOS-10.10-blue.svg?style=flat&label=macOS&maxAge=300)](https://en.wikipedia.org/wiki/OS_X_Yosemite) [![License](https://img.shields.io/badge/License-apache%202.0-blue.svg?label=license&maxAge=1800)](https://github.com/ayltai/MacOS-Developers-Excuses/blob/master/LICENSE) +[![Release](https://img.shields.io/github/release/ayltai/MacOS-Developers-Excuses.svg?label=release&maxAge=1800)](Releases/1.2/screensaver.zip) [![macOS](https://img.shields.io/badge/macOS-10.14-blue.svg?style=flat&label=macOS&maxAge=300)](https://en.wikipedia.org/wiki/OS_X_Mojave) [![License](https://img.shields.io/badge/License-apache%202.0-blue.svg?label=license&maxAge=1800)](https://github.com/ayltai/MacOS-Developers-Excuses/blob/master/LICENSE) A macOS screen saver that shows a random [developer excuse](http://www.devexcuses.com) over a [beautiful photo background](https://unsplash.com). Made with ❤ @@ -20,14 +20,14 @@ A macOS screen saver that shows a random [developer excuse](http://www.devexcuse ![Configurations](Screenshots/configurations.png) ## Downloads -### [Screen Saver](Releases/1.1/screensaver.zip) +### [Screen Saver](Releases/1.2/screensaver.zip) Double-click to install. -### [Security Camera](Releases/1.1/SecurityCamera.zip) +### [Security Camera](Releases/1.2/SecurityCamera.zip) Place it to somewhere handy, such as `~/Downloads` or `/usr/bin`, and then update its path in the screen saver configurations . ## Compatibility -Developers Excuses screen saver requires OS X Yosemite or later. +Developers Excuses screen saver requires OS X Mojave or later. ## How to build 0. Install [CocoaPods](https://cocoapods.org) diff --git a/Releases/1.2/SecurityCamera.zip b/Releases/1.2/SecurityCamera.zip new file mode 100644 index 0000000..2486a83 Binary files /dev/null and b/Releases/1.2/SecurityCamera.zip differ diff --git a/Releases/1.2/screensaver.zip b/Releases/1.2/screensaver.zip new file mode 100644 index 0000000..3622317 Binary files /dev/null and b/Releases/1.2/screensaver.zip differ diff --git a/SecurityCamera/SecurityCamera.xcodeproj/project.pbxproj b/SecurityCamera/SecurityCamera.xcodeproj/project.pbxproj index 87f457d..6075879 100644 --- a/SecurityCamera/SecurityCamera.xcodeproj/project.pbxproj +++ b/SecurityCamera/SecurityCamera.xcodeproj/project.pbxproj @@ -106,6 +106,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = E7A751A220915CBC00DBF96E; productRefGroup = E7A751AC20915CBD00DBF96E /* Products */; @@ -181,7 +182,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -235,7 +236,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule;