diff --git a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift index 357a294..8e775cd 100644 --- a/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/AnalyticsGenerator.swift @@ -5,11 +5,14 @@ // Created by Loris Perret on 08/12/2023. // +// CPD-OFF + import CoreVideo import Foundation import ToolCore // Disabled cause it's a pain to handle in generated string +// swiftlint:disable type_body_length enum AnalyticsGenerator { @@ -89,49 +92,49 @@ enum AnalyticsGenerator { ) -> String { """ // Generated by ResgenSwift.\(Analytics.toolName) \(ResgenSwiftVersion) - + \(Self.getImport(targets: targets)) - + \(Self.getAnalyticsProtocol(targets: targets)) \(Self.getTrackerTypeEnum(targets: targets)) - + // MARK: - Manager class AnalyticsManager { - + static var shared = AnalyticsManager() - + private init() {} // MARK: - Properties - + var managers: [TrackerType: AnalyticsManagerProtocol] = [:] - + \(Self.getEnabledContent()) - + \(Self.getAnalyticsProperties(targets: targets)) - + \(Self.getPrivateLogFunction()) """ } - + private static func getTrackerTypeEnum(targets: [TrackerType]) -> String { var result: [String] = [] targets.forEach { type in result.append(" case \(type)") } - + return """ // MARK: - Traker Type - + enum TrackerType: CaseIterable { - + \(result.joined(separator: "\n")) } """ } - + private static func getEnabledContent() -> String { """ private var isEnabled: Bool { @@ -141,9 +144,9 @@ enum AnalyticsGenerator { true } } - + // MARK: - Enable Methods - + private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) { managers.forEach { (key, value) in if analytics.contains(where: { type in @@ -153,11 +156,11 @@ enum AnalyticsGenerator { } } } - + func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { setAnalytics(enable: true, analytics) } - + func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { setAnalytics(enable: false, analytics) } @@ -172,6 +175,7 @@ enum AnalyticsGenerator { if targets.contains(TrackerType.matomo) { result.append("import MatomoTracker") } + if targets.contains(TrackerType.firebase) { result.append("import FirebaseAnalytics") } @@ -182,14 +186,14 @@ enum AnalyticsGenerator { private static func getPrivateLogFunction() -> String { """ // MARK: - Private Log Methods - + private func logScreen( name: String, path: String, params: [String: Any]? ) { guard isEnabled else { return } - + managers.values.forEach { manager in manager.logScreen( name: name, @@ -206,7 +210,7 @@ enum AnalyticsGenerator { params: [String: Any]? ) { guard isEnabled else { return } - + managers.values.forEach { manager in manager.logEvent( name: name, @@ -238,6 +242,7 @@ enum AnalyticsGenerator { ) """) } + if targets.contains(TrackerType.firebase) { content.append(" managers[TrackerType.firebase] = FirebaseAnalyticsManager()") } @@ -255,20 +260,20 @@ enum AnalyticsGenerator { // MARK: - Protocol 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) } """ @@ -322,3 +327,5 @@ enum AnalyticsGenerator { """ } } + +// CPD-ON diff --git a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift index 168f944..1be7df3 100644 --- a/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/FirebaseGenerator.swift @@ -13,11 +13,11 @@ enum FirebaseGenerator { static var service: String { [ - FirebaseGenerator.header, - FirebaseGenerator.logScreen, - FirebaseGenerator.logEvent, - FirebaseGenerator.enable, - FirebaseGenerator.footer + Self.header, + Self.logScreen, + Self.logEvent, + Self.enable, + Self.footer ] .joined(separator: "\n") } @@ -29,9 +29,9 @@ enum FirebaseGenerator { // MARK: - Firebase class FirebaseAnalyticsManager: AnalyticsManagerProtocol { - + // MARK: - Methods - + """ } @@ -45,11 +45,11 @@ enum FirebaseGenerator { var parameters = [ AnalyticsParameterScreenName: name as NSObject ] - + if path.isEmpty == false { parameters["path"] = path + "/iOS" as NSObject } - + if let supplementaryParameters = params { for (newKey, newValue) in supplementaryParameters { if parameters.contains(where: { (key: String, value: NSObject) in @@ -57,11 +57,11 @@ enum FirebaseGenerator { }) { continue } - + parameters[newKey] = newValue as? NSObject } } - + Analytics.logEvent( AnalyticsEventScreenView, parameters: parameters @@ -82,15 +82,15 @@ enum FirebaseGenerator { var parameters: [String:NSObject] = [ AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject ] - + if category.isEmpty == false { parameters["AnalyticsParameterItemCategory"] = category as NSObject } - + if action.isEmpty == false { parameters["action"] = action as NSObject } - + if let supplementaryParameters = params { for (newKey, newValue) in supplementaryParameters { if parameters.contains(where: { (key: String, value: NSObject) in @@ -111,7 +111,7 @@ enum FirebaseGenerator { """ } - + private static var enable: String { """ func setEnable(_ enable: Bool) { @@ -119,7 +119,7 @@ enum FirebaseGenerator { } """ } - + private static var footer: String { """ } diff --git a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift index 50e3c1e..dd8c9bc 100644 --- a/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift +++ b/Sources/ResgenSwift/Analytics/Generator/MatomoGenerator.swift @@ -5,18 +5,20 @@ // Created by Loris Perret on 05/12/2023. // +// CPD-OFF + import Foundation enum MatomoGenerator { static var service: String { [ - MatomoGenerator.header, - MatomoGenerator.setup, - MatomoGenerator.logScreen, - MatomoGenerator.logEvent, - MatomoGenerator.enable, - MatomoGenerator.footer + Self.header, + Self.setup, + Self.logScreen, + Self.logEvent, + Self.enable, + Self.footer ] .joined(separator: "\n") } @@ -100,10 +102,10 @@ enum MatomoGenerator { url: nil ) } - + """ } - + private static var enable: String { """ func setEnable(_ enable: Bool) { @@ -118,3 +120,5 @@ enum MatomoGenerator { """ } } + +// CPD-ON diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift index c84bf1c..57c646a 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsDefinition.swift @@ -52,20 +52,22 @@ class AnalyticsDefinition { private func getParameters() -> String { var result: String - + let paramsString = parameters.compactMap { parameter -> String? in guard parameter.value.isEmpty else { return nil } - + let defaultValue: String switch parameter.type { case .bool: defaultValue = "\(parameter.defaultValue.lowercased())" + case .int, .double: defaultValue = "\(parameter.defaultValue)" + case .string: defaultValue = "\"\(parameter.defaultValue)\"" } - + let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)" return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)" } @@ -90,9 +92,13 @@ class AnalyticsDefinition { for rep in parameter.replaceIn { switch rep { case "name": name = name.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") + case "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") + case "category": category = category.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") + case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") + default: if let param = parameters.first(where: { $0.name == rep }), param.value.isEmpty == false { param.value = param.value.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") @@ -117,8 +123,10 @@ class AnalyticsDefinition { switch param.type { case .bool: params.append("\"\(param.name)\": \(param.value.lowercased())") + case .int, .double: params.append("\"\(param.name)\": \(param.value)") + case .string: params.append("\"\(param.name)\": \"\(param.value)\"") } diff --git a/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift b/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift index 42dd8b5..1accfa2 100644 --- a/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift +++ b/Sources/ResgenSwift/Analytics/Model/AnalyticsParameter.swift @@ -18,7 +18,7 @@ class AnalyticsParameter { var replaceIn: [String] = [] // MARK: - Init - + init(name: String, type: ParameterType, value: String, defaultValue: String) { self.name = name self.type = type diff --git a/Sources/ResgenSwift/Analytics/Model/ParameterType.swift b/Sources/ResgenSwift/Analytics/Model/ParameterType.swift index 1f60ef9..6cf8519 100644 --- a/Sources/ResgenSwift/Analytics/Model/ParameterType.swift +++ b/Sources/ResgenSwift/Analytics/Model/ParameterType.swift @@ -8,6 +8,7 @@ import Foundation enum ParameterType: String { + case string = "String" case int = "Int" case double = "Double" diff --git a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift index 64a5cec..eca1512 100644 --- a/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift +++ b/Sources/ResgenSwift/Analytics/Parser/AnalyticsFileParser.swift @@ -78,18 +78,21 @@ class AnalyticsFileParser { print(error.description) Analytics.exit(withError: error) } + case .bool: if Bool(value.lowercased()) == nil { let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") print(error.description) Analytics.exit(withError: error) } + case .double: if Double(value) == nil { let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") print(error.description) Analytics.exit(withError: error) } + case .string: break } @@ -147,7 +150,7 @@ class AnalyticsFileParser { } if let parameters { - definition.parameters = AnalyticsFileParser.getParameters(from: parameters) + definition.parameters = Self.getParameters(from: parameters) } return definition