From 2f1249351bde93b9fc27bfe33818d2cc98f1e8f1 Mon Sep 17 00:00:00 2001 From: Justin Williams Date: Wed, 27 Jul 2016 14:05:56 -0600 Subject: [PATCH 1/4] Swift 3.0 --- Aspen.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Aspen.xcodeproj/project.pbxproj b/Aspen.xcodeproj/project.pbxproj index 402a730..f71078f 100644 --- a/Aspen.xcodeproj/project.pbxproj +++ b/Aspen.xcodeproj/project.pbxproj @@ -719,7 +719,7 @@ PRODUCT_NAME = Aspen; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 2.3; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -741,7 +741,7 @@ PRODUCT_NAME = Aspen; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 2.3; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -759,7 +759,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "AspenTests/AspenTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 2.3; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -773,7 +773,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "AspenTests/AspenTests-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 2.3; + SWIFT_VERSION = 3.0; }; name = Release; }; From 1ced15aff9a479aeee49ac1b37dca435fb5a7ba4 Mon Sep 17 00:00:00 2001 From: Justin Williams Date: Wed, 27 Jul 2016 14:10:48 -0600 Subject: [PATCH 2/4] Swift 3.0 migrator. --- Aspen/Aspen.swift | 16 +++++++------- Aspen/AspenHelpers.swift | 4 ++-- Aspen/ConsoleLogger.swift | 4 ++-- Aspen/FileLogger.swift | 34 +++++++++++++++--------------- Aspen/LogFormatter.swift | 12 +++++------ Aspen/LogInterface.swift | 2 +- Aspen/LogLevel.swift | 38 +++++++++++++++++----------------- Aspen/Logger.swift | 34 +++++++++++++++--------------- AspenTests/AspenTestCase.swift | 28 ++++++++++++------------- AspenTests/AspenTests.swift | 15 +++++++------- 10 files changed, 93 insertions(+), 94 deletions(-) diff --git a/Aspen/Aspen.swift b/Aspen/Aspen.swift index c3bc182..2e8ba98 100644 --- a/Aspen/Aspen.swift +++ b/Aspen/Aspen.swift @@ -24,24 +24,24 @@ import Foundation public final class Aspen: NSObject { - static var globalLogger = Logger(name: "Shared", level: .Info) + static var globalLogger = Logger(name: "Shared", level: .info) - public class func registerLogger(logger: LogInterface) { + public class func registerLogger(_ logger: LogInterface) { globalLogger.registerLogger(logger) } - public class func setLoggingLevel(level: DefaultLogLevel) { + public class func setLoggingLevel(_ level: DefaultLogLevel) { globalLogger.setLoggingLevel(level) } - public class func getLogger(logName:String, level:DefaultLogLevel) -> Logger { + public class func getLogger(_ logName:String, level:DefaultLogLevel) -> Logger { let logger = Logger(name: logName, level: level) logger.activeLoggers += globalLogger.activeLoggers return logger } } -public func aspenVerbose(@autoclosure message: () -> String) { Aspen.globalLogger.verbose(message) } -public func aspenInfo(@autoclosure message: () -> String) { Aspen.globalLogger.info(message) } -public func aspenWarn(@autoclosure message: () -> String) { Aspen.globalLogger.warn(message) } -public func aspenError(@autoclosure message: () -> String) { Aspen.globalLogger.error(message) } +public func aspenVerbose( _ message: @autoclosure () -> String) { Aspen.globalLogger.verbose(message) } +public func aspenInfo( _ message: @autoclosure () -> String) { Aspen.globalLogger.info(message) } +public func aspenWarn( _ message: @autoclosure () -> String) { Aspen.globalLogger.warn(message) } +public func aspenError( _ message: @autoclosure () -> String) { Aspen.globalLogger.error(message) } diff --git a/Aspen/AspenHelpers.swift b/Aspen/AspenHelpers.swift index 0fa4568..fd3fcbd 100644 --- a/Aspen/AspenHelpers.swift +++ b/Aspen/AspenHelpers.swift @@ -28,8 +28,8 @@ import Foundation */ extension Aspen { @objc(willLog:) - public class func willLog(level: DefaultLogLevel) -> Bool { return self.globalLogger.willLog(level) } + public class func willLog(_ level: DefaultLogLevel) -> Bool { return self.globalLogger.willLog(level) } @objc(logWithLevel:message:) - public class func log(level: DefaultLogLevel, message: String!) { self.globalLogger.logFormatted(level, message: message) } + public class func log(_ level: DefaultLogLevel, message: String!) { self.globalLogger.logFormatted(level, message: message) } } diff --git a/Aspen/ConsoleLogger.swift b/Aspen/ConsoleLogger.swift index 77a1e64..9396de0 100644 --- a/Aspen/ConsoleLogger.swift +++ b/Aspen/ConsoleLogger.swift @@ -28,7 +28,7 @@ public final class ConsoleLogger: NSObject, LogInterface { super.init() } - public func log(message: String) { + public func log(_ message: String) { print(message) } -} \ No newline at end of file +} diff --git a/Aspen/FileLogger.swift b/Aspen/FileLogger.swift index 75ecc7f..d3e7de4 100644 --- a/Aspen/FileLogger.swift +++ b/Aspen/FileLogger.swift @@ -23,25 +23,25 @@ import Foundation public final class FileLogger: NSObject, LogInterface { - public var fileURL:NSURL? + public var fileURL:URL? - private var fileHandle:NSFileHandle? + private var fileHandle:FileHandle? public override init() { super.init() - let locale = NSLocale(localeIdentifier: "en_US_POSIX") + let locale = Locale(localeIdentifier: "en_US_POSIX") - let timeFormatter = NSDateFormatter() + let timeFormatter = DateFormatter() timeFormatter.locale = locale timeFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" - let dateString = timeFormatter.stringFromDate(NSDate()) + let dateString = timeFormatter.string(from: Date()) - let fm = NSFileManager.defaultManager() - let urls = fm.URLsForDirectory(.LibraryDirectory, inDomains: .UserDomainMask) + let fm = FileManager.default + let urls = fm.urlsForDirectory(.libraryDirectory, inDomains: .userDomainMask) guard let url = urls.last else { return } if let p = url.path { - let path = NSURL.fileURLWithPath("\(p)/Logs/\(dateString).log") + let path = URL.init(fileURLWithPath: "\(p)/Logs/\(dateString).log") fileURL = path openFile() } @@ -51,13 +51,13 @@ public final class FileLogger: NSObject, LogInterface { closeFile() } - public func log(message: String) { + public func log(_ message: String) { if let handle = fileHandle { handle.seekToEndOfFile() let messageWithNewLine = "\(message)\n" - if let data = messageWithNewLine.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { + if let data = messageWithNewLine.data(using: String.Encoding.utf8, allowLossyConversion: false) { let exception = tryBlock { - handle.writeData(data) + handle.write(data) } if exception != nil { print("Error writing to log file \(exception)") @@ -67,17 +67,17 @@ public final class FileLogger: NSObject, LogInterface { } private func openFile() { - let fm = NSFileManager.defaultManager() + let fm = FileManager.default if let URL = fileURL, filePath = URL.path { - if fm.fileExistsAtPath(filePath) == false { + if fm.fileExists(atPath: filePath) == false { do { - try fm.createDirectoryAtURL(URL.URLByDeletingLastPathComponent!, withIntermediateDirectories: true, attributes: nil) + try fm.createDirectory(at: try! URL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil) } catch _ { } - fm.createFileAtPath(filePath, contents: nil, attributes: nil) + fm.createFile(atPath: filePath, contents: nil, attributes: nil) } do { - fileHandle = try NSFileHandle(forWritingToURL: URL) + fileHandle = try FileHandle(forWritingTo: URL) } catch { print("Error opening log file \(error)") fileHandle = nil @@ -92,4 +92,4 @@ public final class FileLogger: NSObject, LogInterface { fileHandle = nil } -} \ No newline at end of file +} diff --git a/Aspen/LogFormatter.swift b/Aspen/LogFormatter.swift index 6de99f5..7fb8888 100644 --- a/Aspen/LogFormatter.swift +++ b/Aspen/LogFormatter.swift @@ -23,24 +23,24 @@ import Foundation public final class LogFormatter: NSObject { - public var timeFormatter:NSDateFormatter + public var timeFormatter:DateFormatter public override init() { - let locale = NSLocale(localeIdentifier: "en_US_POSIX") + let locale = Locale(localeIdentifier: "en_US_POSIX") - timeFormatter = NSDateFormatter() + timeFormatter = DateFormatter() timeFormatter.locale = locale timeFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" super.init() } - public func formatLog(level: DefaultLogLevel, message: String) -> String { + public func formatLog(_ level: DefaultLogLevel, message: String) -> String { let logLevel = LogLevel.getLevel(level) let levelName = logLevel.label let emoji = logLevel.emojiIdentifier() - let now = NSDate() - let timeString = timeFormatter.stringFromDate(now) + let now = Date() + let timeString = timeFormatter.string(from: now) return "\(timeString) — [\(emoji)\(levelName)\(emoji)] \(message)" } diff --git a/Aspen/LogInterface.swift b/Aspen/LogInterface.swift index e50ce1e..0900a2f 100644 --- a/Aspen/LogInterface.swift +++ b/Aspen/LogInterface.swift @@ -24,5 +24,5 @@ import Foundation @objc public protocol LogInterface { - func log(message: String) + func log(_ message: String) } diff --git a/Aspen/LogLevel.swift b/Aspen/LogLevel.swift index 37495ed..2a30b72 100644 --- a/Aspen/LogLevel.swift +++ b/Aspen/LogLevel.swift @@ -24,10 +24,10 @@ import Foundation @objc public enum DefaultLogLevel: Int { - case Verbose = 200 - case Info = 300 - case Warning = 400 - case Error = 500 + case verbose = 200 + case info = 300 + case warning = 400 + case error = 500 } public final class LogLevel: NSObject { @@ -35,10 +35,10 @@ public final class LogLevel: NSObject { public var name: String public var label: String - internal static let VERBOSE_LEVEL = LogLevel.create(.Verbose, name: "Verbose Level", label: "VERBOSE") - internal static let INFO_LEVEL = LogLevel.create(.Info, name: "Info Level", label: "INFO") - internal static let WARNING_LEVEL = LogLevel.create(.Warning, name: "Warning Level", label: "WARN") - internal static let ERROR_LEVEL = LogLevel.create(.Error, name: "Error Level", label: "ERROR") + internal static let VERBOSE_LEVEL = LogLevel.create(.verbose, name: "Verbose Level", label: "VERBOSE") + internal static let INFO_LEVEL = LogLevel.create(.info, name: "Info Level", label: "INFO") + internal static let WARNING_LEVEL = LogLevel.create(.warning, name: "Warning Level", label: "WARN") + internal static let ERROR_LEVEL = LogLevel.create(.error, name: "Error Level", label: "ERROR") public init(level: DefaultLogLevel, name: String, label: String) { self.level = level @@ -48,33 +48,33 @@ public final class LogLevel: NSObject { super.init() } - public static func getLevel(level:DefaultLogLevel) -> LogLevel { + public static func getLevel(_ level:DefaultLogLevel) -> LogLevel { switch level { - case .Verbose: + case .verbose: return VERBOSE_LEVEL - case .Info: + case .info: return INFO_LEVEL - case .Warning: + case .warning: return WARNING_LEVEL - case .Error: + case .error: return ERROR_LEVEL } } public func emojiIdentifier() -> String { switch level { - case .Verbose: + case .verbose: return "🚧" - case .Info: + case .info: return "☝️" - case .Warning: + case .warning: return "⚠️" - case .Error: + case .error: return "🚨" } } - private static func create(level: DefaultLogLevel, name: String, label: String) -> LogLevel { + private static func create(_ level: DefaultLogLevel, name: String, label: String) -> LogLevel { return LogLevel(level:level, name: name, label: label) } -} \ No newline at end of file +} diff --git a/Aspen/Logger.swift b/Aspen/Logger.swift index 175272b..2a94058 100644 --- a/Aspen/Logger.swift +++ b/Aspen/Logger.swift @@ -30,13 +30,13 @@ public final class Logger: NSObject { internal var activeLoggers = Array() - private let queue = dispatch_queue_create("com.secondgear.AspenQueue", DISPATCH_QUEUE_SERIAL) + private let queue = DispatchQueue(label: "com.secondgear.AspenQueue", attributes: DispatchQueueAttributes.serial) override init() { fatalError("Please use init(name:, level:) to initialize a new Logger instance") } - public init(name: String, level: DefaultLogLevel = .Info) { + public init(name: String, level: DefaultLogLevel = .info) { self.name = name self.level = LogLevel.getLevel(level) self.formatter = LogFormatter() @@ -44,19 +44,19 @@ public final class Logger: NSObject { super.init() } - public func registerLogger(logger: LogInterface) { + public func registerLogger(_ logger: LogInterface) { activeLoggers.append(logger) } - public func setLoggingLevel(level: DefaultLogLevel) { + public func setLoggingLevel(_ level: DefaultLogLevel) { self.level = LogLevel.getLevel(level) } - func willLog(logLevel: DefaultLogLevel) -> Bool { + func willLog(_ logLevel: DefaultLogLevel) -> Bool { return logLevel.rawValue >= level.level.rawValue } - func log(logLevel: DefaultLogLevel, @autoclosure message: () -> String) { + func log(_ logLevel: DefaultLogLevel, message: @autoclosure () -> String) { // Don't bother trying to log something with no loggers registered. guard activeLoggers.count > 0 else { print("*** WARNING: log(\(logLevel.rawValue)) invoked with no loggers registered. If you're expecting file logging for forensic purposes, you're losing data. Message was '\(message())'") @@ -67,33 +67,33 @@ public final class Logger: NSObject { let constMessage = message() activeLoggers.forEach { logger in - dispatch_async(queue) { + queue.async { logger.log(constMessage) } } } } - func logFormatted(logLevel: DefaultLogLevel, @autoclosure message: () -> String) { + func logFormatted(_ logLevel: DefaultLogLevel, message: @autoclosure () -> String) { log(logLevel, message: formatter.formatLog(logLevel, message: message())) } } /** Convenience / shorthand logging functions for predefined log levels. */ extension Logger { - public func verbose(@autoclosure message: () -> String) { - logFormatted(.Verbose, message: message) + public func verbose( _ message: @autoclosure () -> String) { + logFormatted(.verbose, message: message) } - public func info(@autoclosure message: () -> String) { - logFormatted(.Info, message: message) + public func info( _ message: @autoclosure () -> String) { + logFormatted(.info, message: message) } - public func warn(@autoclosure message: () -> String) { - logFormatted(.Warning, message: message) + public func warn( _ message: @autoclosure () -> String) { + logFormatted(.warning, message: message) } - public func error(@autoclosure message: () -> String) { - logFormatted(.Error, message: message) + public func error( _ message: @autoclosure () -> String) { + logFormatted(.error, message: message) } -} \ No newline at end of file +} diff --git a/AspenTests/AspenTestCase.swift b/AspenTests/AspenTestCase.swift index 9573152..1ca7638 100644 --- a/AspenTests/AspenTestCase.swift +++ b/AspenTests/AspenTestCase.swift @@ -11,9 +11,9 @@ import XCTest // Thx Matt Neuberg -func delay(delay: Double, block: () -> Void) +func delay(_ delay: Double, block: () -> Void) { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), block) + DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosBackground).after(when: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), block: block) } class AspenTestCase: XCTestCase { @@ -47,13 +47,13 @@ class AspenTestCase: XCTestCase { // MARK: - Log output confirmation - func expectLog(timeout: Double = 0.5, test: (() -> Void)!) + func expectLog(_ timeout: Double = 0.5, test: (() -> Void)!) { precondition(logNotifier != nil, "Expected a LogNotifier to be installed before calling expectLog()") - let _ = self.expectationForNotification(AspenDidLogNotification, object: logNotifier!, handler: nil) + let _ = self.expectation(forNotification: AspenDidLogNotification, object: logNotifier!, handler: nil) test() - self.waitForExpectationsWithTimeout(timeout) { error in + self.waitForExpectations(withTimeout: timeout) { error in XCTAssertNil(error, "Expected log to fire. Set a breakpoint here to see which test failed") } } @@ -62,7 +62,7 @@ class AspenTestCase: XCTestCase { // This method exists to confirm that the log message enclosed in the test closure does not actually get logged. // An unfortunate amount of work needs to be done to accomplish this; see comments below - func expectNoLog(test: (() -> Void)!) + func expectNoLog(_ test: (() -> Void)!) { precondition(logNotifier != nil, "Expected a LogNotifier to be installed before calling expectLog()") @@ -71,7 +71,7 @@ class AspenTestCase: XCTestCase { self.addNoLogObserver() // Because we expect a log to _not_ happen, we set up a basic timeout which signals success - let expectation = self.expectationWithDescription("Expected disqualified log to time out") + let expectation = self.expectation(withDescription: "Expected disqualified log to time out") delay(0.5) { // Remove the observer ASAP, to mitigate the race-y issues addressed by addNoLogObserver() self.removeNoLogObserver() @@ -83,7 +83,7 @@ class AspenTestCase: XCTestCase { test() // This should never time out; it should either pass, or fail via overt XCTFail in the notification observer - self.waitForExpectationsWithTimeout(1.0) { error in + self.waitForExpectations(withTimeout: 1.0) { error in XCTAssertNil(error, "Unreachable: Should have timed out waiting for log to not happen but got \(error)") } } @@ -98,14 +98,14 @@ class AspenTestCase: XCTestCase { precondition(noLogObserver == nil) precondition(logNotifier != nil, "Expected a LogNotifier to be installed before calling addNoLogObserver()") - let queue = NSOperationQueue() + let queue = OperationQueue() var observer: NSObjectProtocol? = nil - observer = NSNotificationCenter.defaultCenter().addObserverForName(AspenDidLogNotification, object: logNotifier!, queue: queue) { [weak self] notification in + observer = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: AspenDidLogNotification), object: logNotifier!, queue: queue) { [weak self] notification in // Avoid false positives by confirming that the assumed current observer is the observer that was actually tripped here // That way we don't fail one test for receiving another test's late notification if let obs1 = observer where obs1.isEqual(self?.noLogObserver) { - XCTFail("Did not expect a log message during this test; got \(notification.userInfo?[AspenNotificationKeyMessage])") + XCTFail("Did not expect a log message during this test; got \((notification as NSNotification).userInfo?[AspenNotificationKeyMessage])") } else { @@ -119,7 +119,7 @@ class AspenTestCase: XCTestCase { { if let observer = noLogObserver { - NSNotificationCenter.defaultCenter().removeObserver(observer) + NotificationCenter.default.removeObserver(observer) noLogObserver = nil } } @@ -130,8 +130,8 @@ let AspenNotificationKeyMessage = "AspenMessage" class LogNotifier: NSObject, LogInterface { - func log(message: String) + func log(_ message: String) { - NSNotificationCenter.defaultCenter().postNotificationName(AspenDidLogNotification, object: self, userInfo: [AspenNotificationKeyMessage: message]) + NotificationCenter.default.post(name: Notification.Name(rawValue: AspenDidLogNotification), object: self, userInfo: [AspenNotificationKeyMessage: message]) } } diff --git a/AspenTests/AspenTests.swift b/AspenTests/AspenTests.swift index 22c3464..618f6de 100644 --- a/AspenTests/AspenTests.swift +++ b/AspenTests/AspenTests.swift @@ -1,7 +1,6 @@ import XCTest @testable import Aspen - class AspenTests: AspenTestCase { override func setUp() @@ -19,7 +18,7 @@ class AspenTests: AspenTestCase func testVerbosePasses() { - Aspen.setLoggingLevel(.Verbose) + Aspen.setLoggingLevel(.verbose) self.expectLog { aspenVerbose(passVerbose) } self.expectLog { aspenInfo(passInfo) } @@ -31,7 +30,7 @@ class AspenTests: AspenTestCase func testInfoPasses() { - Aspen.setLoggingLevel(.Info) + Aspen.setLoggingLevel(.info) self.expectLog { aspenInfo(passInfo) } self.expectLog { aspenWarn(passWarn) } self.expectLog { aspenError(passError) } @@ -39,7 +38,7 @@ class AspenTests: AspenTestCase func testInfoFailures() { - Aspen.setLoggingLevel(.Info) + Aspen.setLoggingLevel(.info) self.expectNoLog { aspenVerbose(failVerbose) } } @@ -47,14 +46,14 @@ class AspenTests: AspenTestCase func testWarnPasses() { - Aspen.setLoggingLevel(.Warning) + Aspen.setLoggingLevel(.warning) self.expectLog { aspenWarn(passWarn) } self.expectLog { aspenError(passError) } } func testWarnFailures() { - Aspen.setLoggingLevel(.Warning) + Aspen.setLoggingLevel(.warning) self.expectNoLog { aspenInfo(failInfo) } self.expectNoLog { aspenVerbose(failVerbose) } } @@ -63,13 +62,13 @@ class AspenTests: AspenTestCase func testErrorPasses() { - Aspen.setLoggingLevel(.Error) + Aspen.setLoggingLevel(.error) self.expectLog { aspenError(passError) } } func testErrorFailures() { - Aspen.setLoggingLevel(.Error) + Aspen.setLoggingLevel(.error) self.expectNoLog { aspenVerbose(failVerbose) } self.expectNoLog { aspenInfo(failInfo) } self.expectNoLog { aspenWarn(failWarn) } From 14db0481d7bf7a2233ed13500d4c3a8d18a13498 Mon Sep 17 00:00:00 2001 From: Justin Williams Date: Sat, 20 Aug 2016 14:27:18 -0400 Subject: [PATCH 3/4] Swift 3.0 beta 6 --- Aspen/FileLogger.swift | 19 +++++++++---------- Aspen/LogFormatter.swift | 2 +- Aspen/Logger.swift | 2 +- AspenTests/AspenTestCase.swift | 2 +- AspenTests/LogLevelTests.swift | 18 +++++++++--------- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Aspen/FileLogger.swift b/Aspen/FileLogger.swift index d3e7de4..27be361 100644 --- a/Aspen/FileLogger.swift +++ b/Aspen/FileLogger.swift @@ -29,7 +29,7 @@ public final class FileLogger: NSObject, LogInterface { public override init() { super.init() - let locale = Locale(localeIdentifier: "en_US_POSIX") + let locale = Locale(identifier: "en_US_POSIX") let timeFormatter = DateFormatter() timeFormatter.locale = locale @@ -37,14 +37,13 @@ public final class FileLogger: NSObject, LogInterface { let dateString = timeFormatter.string(from: Date()) let fm = FileManager.default - let urls = fm.urlsForDirectory(.libraryDirectory, inDomains: .userDomainMask) + + let urls = fm.urls(for: .libraryDirectory, in: .userDomainMask) guard let url = urls.last else { return } - if let p = url.path { - let path = URL.init(fileURLWithPath: "\(p)/Logs/\(dateString).log") - fileURL = path - openFile() - } + let path = URL.init(fileURLWithPath: "\(url.path)/Logs/\(dateString).log") + fileURL = path + openFile() } deinit { @@ -68,10 +67,11 @@ public final class FileLogger: NSObject, LogInterface { private func openFile() { let fm = FileManager.default - if let URL = fileURL, filePath = URL.path { + if let URL = fileURL { + let filePath = URL.path if fm.fileExists(atPath: filePath) == false { do { - try fm.createDirectory(at: try! URL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil) + try fm.createDirectory(at: URL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil) } catch _ { } fm.createFile(atPath: filePath, contents: nil, attributes: nil) } @@ -91,5 +91,4 @@ public final class FileLogger: NSObject, LogInterface { } fileHandle = nil } - } diff --git a/Aspen/LogFormatter.swift b/Aspen/LogFormatter.swift index 7fb8888..b88e279 100644 --- a/Aspen/LogFormatter.swift +++ b/Aspen/LogFormatter.swift @@ -26,7 +26,7 @@ public final class LogFormatter: NSObject { public var timeFormatter:DateFormatter public override init() { - let locale = Locale(localeIdentifier: "en_US_POSIX") + let locale = Locale(identifier: "en_US_POSIX") timeFormatter = DateFormatter() timeFormatter.locale = locale diff --git a/Aspen/Logger.swift b/Aspen/Logger.swift index 2a94058..243dd4e 100644 --- a/Aspen/Logger.swift +++ b/Aspen/Logger.swift @@ -30,7 +30,7 @@ public final class Logger: NSObject { internal var activeLoggers = Array() - private let queue = DispatchQueue(label: "com.secondgear.AspenQueue", attributes: DispatchQueueAttributes.serial) + private let queue = DispatchQueue(label: "com.secondgear.AspenQueue", attributes: []) override init() { fatalError("Please use init(name:, level:) to initialize a new Logger instance") diff --git a/AspenTests/AspenTestCase.swift b/AspenTests/AspenTestCase.swift index 1ca7638..268a404 100644 --- a/AspenTests/AspenTestCase.swift +++ b/AspenTests/AspenTestCase.swift @@ -13,7 +13,7 @@ import XCTest // Thx Matt Neuberg func delay(_ delay: Double, block: () -> Void) { - DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosBackground).after(when: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), block: block) + DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: block) } class AspenTestCase: XCTestCase { diff --git a/AspenTests/LogLevelTests.swift b/AspenTests/LogLevelTests.swift index 07773e4..d55c515 100644 --- a/AspenTests/LogLevelTests.swift +++ b/AspenTests/LogLevelTests.swift @@ -16,7 +16,7 @@ class LogLevelTests: XCTestCase func testInitNewLevel() { - let level = DefaultLogLevel.Verbose + let level = DefaultLogLevel.verbose let name = "Test Level" let label = "TESTLABEL" @@ -30,30 +30,30 @@ class LogLevelTests: XCTestCase func testStaticLogLevels() { let verbose = LogLevel.VERBOSE_LEVEL - XCTAssertEqual(verbose.level, DefaultLogLevel.Verbose) + XCTAssertEqual(verbose.level, DefaultLogLevel.verbose) let info = LogLevel.INFO_LEVEL - XCTAssertEqual(info.level, DefaultLogLevel.Info) + XCTAssertEqual(info.level, DefaultLogLevel.info) let warning = LogLevel.WARNING_LEVEL - XCTAssertEqual(warning.level, DefaultLogLevel.Warning) + XCTAssertEqual(warning.level, DefaultLogLevel.warning) let error = LogLevel.ERROR_LEVEL - XCTAssertEqual(error.level, DefaultLogLevel.Error) + XCTAssertEqual(error.level, DefaultLogLevel.error) } func testFetchingDefaultLevels() { - let verbose = LogLevel.getLevel(.Verbose) + let verbose = LogLevel.getLevel(.verbose) XCTAssertEqual(verbose, LogLevel.VERBOSE_LEVEL) - let info = LogLevel.getLevel(.Info) + let info = LogLevel.getLevel(.info) XCTAssertEqual(info, LogLevel.INFO_LEVEL) - let warning = LogLevel.getLevel(.Warning) + let warning = LogLevel.getLevel(.warning) XCTAssertEqual(warning, LogLevel.WARNING_LEVEL) - let error = LogLevel.getLevel(.Error) + let error = LogLevel.getLevel(.error) XCTAssertEqual(error, LogLevel.ERROR_LEVEL) } From 3a03c29e54bcb0f7adabb1c8cd23f0e46cdeab86 Mon Sep 17 00:00:00 2001 From: Justin Williams Date: Wed, 7 Sep 2016 14:16:48 -0600 Subject: [PATCH 4/4] Cleaned up for Xcode 8 GM --- AspenTests/AspenHelperTests.m | 2 -- AspenTests/AspenTestCase.swift | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/AspenTests/AspenHelperTests.m b/AspenTests/AspenHelperTests.m index 432ed75..3f743d7 100644 --- a/AspenTests/AspenHelperTests.m +++ b/AspenTests/AspenHelperTests.m @@ -9,8 +9,6 @@ @import XCTest; @import Aspen; -#import "AspenTests-Swift.h" - @interface TestObjectPass : NSObject @end @implementation TestObjectPass diff --git a/AspenTests/AspenTestCase.swift b/AspenTests/AspenTestCase.swift index 268a404..5c556e9 100644 --- a/AspenTests/AspenTestCase.swift +++ b/AspenTests/AspenTestCase.swift @@ -11,7 +11,7 @@ import XCTest // Thx Matt Neuberg -func delay(_ delay: Double, block: () -> Void) +func delay(_ delay: Double, block: @escaping () -> Void) { DispatchQueue.global(qos: .background).asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: block) } @@ -53,7 +53,7 @@ class AspenTestCase: XCTestCase { let _ = self.expectation(forNotification: AspenDidLogNotification, object: logNotifier!, handler: nil) test() - self.waitForExpectations(withTimeout: timeout) { error in + self.waitForExpectations(timeout: timeout) { error in XCTAssertNil(error, "Expected log to fire. Set a breakpoint here to see which test failed") } } @@ -71,7 +71,7 @@ class AspenTestCase: XCTestCase { self.addNoLogObserver() // Because we expect a log to _not_ happen, we set up a basic timeout which signals success - let expectation = self.expectation(withDescription: "Expected disqualified log to time out") + let expectation = self.expectation(description: "Expected disqualified log to time out") delay(0.5) { // Remove the observer ASAP, to mitigate the race-y issues addressed by addNoLogObserver() self.removeNoLogObserver() @@ -83,7 +83,7 @@ class AspenTestCase: XCTestCase { test() // This should never time out; it should either pass, or fail via overt XCTFail in the notification observer - self.waitForExpectations(withTimeout: 1.0) { error in + self.waitForExpectations(timeout: 1.0) { error in XCTAssertNil(error, "Unreachable: Should have timed out waiting for log to not happen but got \(error)") } } @@ -103,7 +103,7 @@ class AspenTestCase: XCTestCase { observer = NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: AspenDidLogNotification), object: logNotifier!, queue: queue) { [weak self] notification in // Avoid false positives by confirming that the assumed current observer is the observer that was actually tripped here // That way we don't fail one test for receiving another test's late notification - if let obs1 = observer where obs1.isEqual(self?.noLogObserver) + if let obs1 = observer , obs1.isEqual(self?.noLogObserver) { XCTFail("Did not expect a log message during this test; got \((notification as NSNotification).userInfo?[AspenNotificationKeyMessage])") }