From 01184921623d8ab05efe76951e5cb310db8c6199 Mon Sep 17 00:00:00 2001 From: Loris Perret Date: Mon, 5 Jan 2026 14:31:39 +0100 Subject: [PATCH] Add MainActor on AnalysticsManager shared property (#24) Reviewed-on: https://gitea.openium.fr/openium/resgen.swift/pulls/24 --- Jenkinsfile | 2 +- .../Generator/AnalyticsGenerator.swift | 31 +++---- .../Generate/GenerateOptions.swift | 14 +-- .../Analytics/AnalyticsGeneratorTests.swift | 87 ++++++++++--------- 4 files changed, 70 insertions(+), 64 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5a66ba7..48b9b80 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,6 @@ library "openiumpipeline" -env.DEVELOPER_DIR="/Applications/Xcode-26.0.0.app/Contents/Developer" +env.DEVELOPER_DIR="/Applications/Xcode-26.2.0.app/Contents/Developer" // env.SIMULATOR_DEVICE_TYPES="iPhone-14-Pro" // env.SLACK_CHANNEL = "prj-skdevkit" env.IS_PACKAGE_SWIFT=1 diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index f92351d..be55f74 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -104,6 +104,7 @@ enum AnalyticsGenerator { \(visibility) class AnalyticsManager { + @MainActor \(visibility) static var shared = AnalyticsManager() private init() {} @@ -144,7 +145,7 @@ enum AnalyticsGenerator { ) -> String { """ private var isDebugMode: Bool = false - + private var isEnabled: Bool { if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" { false @@ -152,7 +153,7 @@ enum AnalyticsGenerator { true } } - + private let logger = Logger(subsystem: "resgen", category: "analytics") // MARK: - Enable Methods @@ -198,18 +199,18 @@ enum AnalyticsGenerator { private static func getPrivateLogFunction() -> String { """ // MARK: - Private Log Methods - + private func formattedParams(_ params: [String: Any]?) -> String { guard let params = params, !params.isEmpty else { return "-" } - + let formattedParams = params.map { key, value in " \\(key): \\(value)" } .joined(separator: "\\n") - + return "\\n" + formattedParams } - + private func logScreen( name: String, path: String, @@ -219,11 +220,11 @@ enum AnalyticsGenerator { if isDebugMode { logger.log("Analytics disabled") } - return + return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 🖥️ Screen: @@ -232,7 +233,7 @@ enum AnalyticsGenerator { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logScreen( name: name, path: path, @@ -240,7 +241,7 @@ enum AnalyticsGenerator { ) } } - + private func logEvent( name: String, action: String, @@ -251,11 +252,11 @@ enum AnalyticsGenerator { if isDebugMode { logger.log("Analytics disabled") } - return + return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 📊 Event: @@ -265,7 +266,7 @@ enum AnalyticsGenerator { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logEvent( name: name, action: action, diff --git a/Sources/ResgenSwift/Generate/GenerateOptions.swift b/Sources/ResgenSwift/Generate/GenerateOptions.swift index e6f044d..91043af 100644 --- a/Sources/ResgenSwift/Generate/GenerateOptions.swift +++ b/Sources/ResgenSwift/Generate/GenerateOptions.swift @@ -16,12 +16,14 @@ struct GenerateOptions: ParsableArguments { @Argument(help: "Configuration file.", transform: { $0.replaceTiltWithHomeDirectoryPath() }) var configurationFile: String - @Option(help: "Project directory. It will be added to every relative path (path that does not start with `/`", - transform: { - if $0.last == "/" { - return $0 + @Option( + help: "Project directory. It will be added to every relative path (path that does not start with `/`", + transform: { + if $0.last == "/" { + return $0 + } + return $0 + "/" } - return $0 + "/" - }) + ) var projectDirectory: String } diff --git a/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift b/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift index d1f03b9..0c97b26 100644 --- a/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift +++ b/Tests/ResgenSwiftTests/Analytics/AnalyticsGeneratorTests.swift @@ -35,22 +35,22 @@ final class AnalyticsGeneratorTests: XCTestCase { private func protocolString(visibility: ExtensionVisibility) -> String { """ // MARK: - Protocol - + \(visibility) protocol AnalyticsManagerProtocol { - + func logScreen( name: String, path: String, params: [String: Any]? ) - + func logEvent( name: String, action: String, category: String, params: [String: Any]? ) - + func setEnable(_ enable: Bool) } """ @@ -94,7 +94,7 @@ final class AnalyticsGeneratorTests: XCTestCase { parameters: parameters ) } - + func logEvent( name: String, action: String, @@ -260,6 +260,7 @@ final class AnalyticsGeneratorTests: XCTestCase { internal class AnalyticsManager { + @MainActor internal static var shared = AnalyticsManager() private init() {} @@ -267,7 +268,7 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Properties var managers: [TrackerType: AnalyticsManagerProtocol] = [:] - + private var isDebugMode: Bool = false private var isEnabled: Bool { @@ -277,7 +278,7 @@ final class AnalyticsGeneratorTests: XCTestCase { true } } - + private let logger = Logger(subsystem: "resgen", category: "analytics") // MARK: - Enable Methods @@ -306,15 +307,15 @@ final class AnalyticsGeneratorTests: XCTestCase { } // MARK: - Private Log Methods - + private func formattedParams(_ params: [String: Any]?) -> String { guard let params = params, !params.isEmpty else { return "-" } - + let formattedParams = params.map { key, value in " \\(key): \\(value)" } .joined(separator: "\\n") - + return "\\n" + formattedParams } @@ -331,7 +332,7 @@ final class AnalyticsGeneratorTests: XCTestCase { } managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 🖥️ Screen: @@ -340,7 +341,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logScreen( name: name, path: path, @@ -363,7 +364,7 @@ final class AnalyticsGeneratorTests: XCTestCase { } managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 📊 Event: @@ -373,7 +374,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logEvent( name: name, action: action, @@ -472,6 +473,7 @@ final class AnalyticsGeneratorTests: XCTestCase { internal class AnalyticsManager { + @MainActor internal static var shared = AnalyticsManager() private init() {} @@ -479,7 +481,7 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Properties var managers: [TrackerType: AnalyticsManagerProtocol] = [:] - + private var isDebugMode: Bool = false private var isEnabled: Bool { @@ -489,7 +491,7 @@ final class AnalyticsGeneratorTests: XCTestCase { true } } - + private let logger = Logger(subsystem: "resgen", category: "analytics") // MARK: - Enable Methods @@ -524,12 +526,12 @@ final class AnalyticsGeneratorTests: XCTestCase { private func formattedParams(_ params: [String: Any]?) -> String { guard let params = params, !params.isEmpty else { return "-" } - + let formattedParams = params.map { key, value in " \\(key): \\(value)" } .joined(separator: "\\n") - + return "\\n" + formattedParams } @@ -544,9 +546,9 @@ final class AnalyticsGeneratorTests: XCTestCase { } return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 🖥️ Screen: @@ -555,7 +557,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logScreen( name: name, path: path, @@ -563,7 +565,7 @@ final class AnalyticsGeneratorTests: XCTestCase { ) } } - + private func logEvent( name: String, action: String, @@ -576,9 +578,9 @@ final class AnalyticsGeneratorTests: XCTestCase { } return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 📊 Event: @@ -588,7 +590,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logEvent( name: name, action: action, @@ -597,9 +599,9 @@ final class AnalyticsGeneratorTests: XCTestCase { ) } } - + // MARK: - section_one - + internal func logScreenS1DefOne() { logScreen( name: "s1 def one", @@ -607,7 +609,7 @@ final class AnalyticsGeneratorTests: XCTestCase { params: nil ) } - + internal func logEventS1DefTwo() { logEvent( name: "s1 def two", @@ -616,9 +618,9 @@ final class AnalyticsGeneratorTests: XCTestCase { params: nil ) } - + // MARK: - section_two - + internal func logScreenS2DefOne() { logScreen( name: "s2 def one", @@ -692,6 +694,7 @@ final class AnalyticsGeneratorTests: XCTestCase { internal class AnalyticsManager { + @MainActor internal static var shared = AnalyticsManager() private init() {} @@ -699,7 +702,7 @@ final class AnalyticsGeneratorTests: XCTestCase { // MARK: - Properties var managers: [TrackerType: AnalyticsManagerProtocol] = [:] - + private var isDebugMode: Bool = false private var isEnabled: Bool { @@ -709,7 +712,7 @@ final class AnalyticsGeneratorTests: XCTestCase { true } } - + private let logger = Logger(subsystem: "resgen", category: "analytics") // MARK: - Enable Methods @@ -742,15 +745,15 @@ final class AnalyticsGeneratorTests: XCTestCase { } // MARK: - Private Log Methods - + private func formattedParams(_ params: [String: Any]?) -> String { guard let params = params, !params.isEmpty else { return "-" } - + let formattedParams = params.map { key, value in " \\(key): \\(value)" } .joined(separator: "\\n") - + return "\\n" + formattedParams } @@ -765,9 +768,9 @@ final class AnalyticsGeneratorTests: XCTestCase { } return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 🖥️ Screen: @@ -776,7 +779,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logScreen( name: name, path: path, @@ -784,7 +787,7 @@ final class AnalyticsGeneratorTests: XCTestCase { ) } } - + private func logEvent( name: String, action: String, @@ -797,9 +800,9 @@ final class AnalyticsGeneratorTests: XCTestCase { } return } - + managers.values.forEach { manager in - + if isDebugMode { logger.debug(\""" 📊 Event: @@ -809,7 +812,7 @@ final class AnalyticsGeneratorTests: XCTestCase { Params: \\(self.formattedParams(params), privacy: .public) \""") } - + manager.logEvent( name: name, action: action,