Skip to content

Commit f12f747

Browse files
authored
Add execution type (#3)
* Add execution type * Add more test
1 parent 5474272 commit f12f747

File tree

6 files changed

+127
-39
lines changed

6 files changed

+127
-39
lines changed

.swiftpm/Pepe.xctestplan

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"configurations" : [
3+
{
4+
"id" : "6192FF30-10FA-48B4-99EA-8DA67CA00FF5",
5+
"name" : "Test Scheme Action",
6+
"options" : {
7+
8+
}
9+
}
10+
],
11+
"defaultOptions" : {
12+
"codeCoverage" : {
13+
"targets" : [
14+
{
15+
"containerPath" : "container:",
16+
"identifier" : "Pepe",
17+
"name" : "Pepe"
18+
}
19+
]
20+
}
21+
},
22+
"testTargets" : [
23+
{
24+
"target" : {
25+
"containerPath" : "container:",
26+
"identifier" : "PepeTests",
27+
"name" : "PepeTests"
28+
}
29+
}
30+
],
31+
"version" : 1
32+
}

.swiftpm/xcode/xcshareddata/xcschemes/Pepe.xcscheme

+7-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,13 @@
4040
buildConfiguration = "Debug"
4141
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
4242
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
43-
shouldUseLaunchSchemeArgsEnv = "YES"
44-
shouldAutocreateTestPlan = "YES">
43+
shouldUseLaunchSchemeArgsEnv = "YES">
44+
<TestPlans>
45+
<TestPlanReference
46+
reference = "container:.swiftpm/Pepe.xctestplan"
47+
default = "YES">
48+
</TestPlanReference>
49+
</TestPlans>
4550
<Testables>
4651
<TestableReference
4752
skipped = "NO">

Sources/Pepe/Log.swift

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// Log.swift
3+
//
4+
//
5+
// Created by Juan Hurtado on 16/09/23.
6+
//
7+
8+
import Foundation
9+
10+
struct Log {
11+
/// Message to be logged.
12+
var message: String
13+
/// How importante the log is.
14+
let level: LogLevel
15+
/// The time when the message is logged.
16+
let date: Date
17+
18+
init(message: String, level: LogLevel) {
19+
self.message = message
20+
self.level = level
21+
self.date = Date()
22+
}
23+
}
24+
25+
/// Indicates how important a message is.
26+
public enum LogLevel {
27+
case info, debug, warning, error
28+
29+
var description: String {
30+
switch self {
31+
case .info:
32+
return "INFO"
33+
case .debug:
34+
return "DEBUG"
35+
case .warning:
36+
return "WARNING"
37+
case .error:
38+
return "ERROR"
39+
}
40+
}
41+
}

Sources/Pepe/LogModifier.swift

+8-12
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ public class LogModifier: Equatable {
3333

3434
/// Modifies a certain massage.
3535
/// - Parameters:
36-
/// - message: Message to be modified.
37-
/// - level: Log level.
38-
func modify(_ message: String, level: LogLevel) -> String {
39-
message
40-
}
36+
/// - log: Message to be modified.
37+
func modify(_ log: inout Log) {}
4138

4239
public static func == (lhs: LogModifier, rhs: LogModifier) -> Bool {
4340
lhs.id == rhs.id
@@ -46,24 +43,23 @@ public class LogModifier: Equatable {
4643

4744
// MARK: - Hi modifier
4845
public class PepeModifier: LogModifier {
49-
override func modify(_ message: String, level: LogLevel) -> String {
50-
"🐸: \(message)"
46+
override func modify(_ log: inout Log) {
47+
log.message = "🐸: \(log.message)"
5148
}
5249
}
5350

5451
// MARK: - Level modifier
5552
public class LevelModifier: LogModifier {
56-
override func modify(_ message: String, level: LogLevel) -> String {
57-
"[\(level.description)] \(message)"
53+
override func modify(_ log: inout Log) {
54+
log.message = "[\(log.level.description)] \(log.message)"
5855
}
5956
}
6057

6158
// MARK: - Time modifier
6259
public class TimeModifier: LogModifier {
63-
override func modify(_ message: String, level: LogLevel) -> String {
64-
let now = Date()
60+
override func modify(_ log: inout Log) {
6561
let formatter = DateFormatter()
6662
formatter.dateFormat = "HH:mm:ss.SSSS"
67-
return formatter.string(from: now).appending(" \(message)")
63+
log.message = formatter.string(from: log.date).appending(" \(log.message)")
6864
}
6965
}

Sources/Pepe/PepeLogger.swift

+25-24
Original file line numberDiff line numberDiff line change
@@ -12,48 +12,49 @@ import os
1212
public struct PepeLogger {
1313
/// A set of modifiers to be apllied to every log message.
1414
/// Notice that, is you set an empty array, the logged string will be the one that you provide.
15-
var modifiers: [LogModifier]
15+
public var modifiers: [LogModifier]
1616

1717
/// Indicates how the message will be logged or "written". By default, the messages will be logged
1818
/// on the console.
19-
var writer: Writer
19+
public var writer: Writer
20+
21+
/// How the log operation will be executed.
22+
public var executionType: ExecutionType
23+
24+
/// Internal property to allow syncronous execution.
25+
private let _lock = NSRecursiveLock()
26+
27+
public enum ExecutionType: Equatable {
28+
case async(DispatchQueue), sync
29+
}
2030

2131
init() {
2232
modifiers = [.pepe]
2333
writer = .console
34+
executionType = .sync
2435
}
2536

2637
/// Logs a message using the previously specified writer.
2738
/// - Parameters:
2839
/// - message: Message to be logged.
2940
/// - level: Inidicates how important this message is.
3041
public func log(_ message: String, level: LogLevel = .info) {
31-
_log(message, level: level)
42+
switch executionType {
43+
case .async(let dispatchQueue):
44+
dispatchQueue.async {
45+
_log(message, level: level)
46+
}
47+
case .sync:
48+
_lock.lock(); defer { _lock.unlock() }
49+
_log(message, level: level)
50+
}
3251
}
3352

3453
private func _log(_ message: String, level: LogLevel) {
35-
var message = message
54+
var log = Log(message: message, level: level)
3655
modifiers.reversed().forEach {
37-
message = $0.modify(message, level: level)
38-
}
39-
writer.write(message: message)
40-
}
41-
}
42-
43-
/// Indicates how important a message is.
44-
public enum LogLevel {
45-
case info, debug, warning, error
46-
47-
var description: String {
48-
switch self {
49-
case .info:
50-
return "INFO"
51-
case .debug:
52-
return "DEBUG"
53-
case .warning:
54-
return "WARNING"
55-
case .error:
56-
return "ERROR"
56+
$0.modify(&log)
5757
}
58+
writer.write(message: log.message)
5859
}
5960
}

Tests/PepeTests/PepeLoggerTests.swift

+14-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,22 @@ import XCTest
99
@testable import Pepe
1010

1111
final class PepeLoggerTests: XCTestCase {
12-
func test_initialState_shouldBeDefaultOne() {
12+
func testState_whenInit_shouldBeDefaultOne() {
1313
let logger = Pepe.loggerPlease()
1414
XCTAssertEqual(logger.modifiers, [.pepe])
1515
XCTAssertEqual(logger.writer, .console)
16+
XCTAssertEqual(logger.executionType, .sync)
17+
}
18+
19+
func testLogging_withHeavyConfig_shouldExecuteWithReasonableTime() {
20+
let reasonableTime = 0.5
21+
var logger = Pepe.loggerPlease()
22+
logger.modifiers = [.pepe, .level, .time]
23+
logger.writer = .os(subsystem: "pepe", category: "perf_test")
24+
let start = Date()
25+
logger.log("message")
26+
let end = Date()
27+
let interval = end.timeIntervalSinceReferenceDate - start.timeIntervalSinceReferenceDate
28+
XCTAssertTrue(interval < reasonableTime)
1629
}
1730
}

0 commit comments

Comments
 (0)