Fix Tests Analytics #17

Merged
t.schmitt merged 6 commits from analytics into master 2025-07-17 14:11:28 +02:00
11 changed files with 470 additions and 441 deletions
Showing only changes of commit ffb3ca8393 - Show all commits

View File

@@ -5,11 +5,14 @@
// Created by Loris Perret on 08/12/2023. // Created by Loris Perret on 08/12/2023.
// //
// CPD-OFF
import CoreVideo import CoreVideo
import Foundation import Foundation
import ToolCore import ToolCore
// Disabled cause it's a pain to handle in generated string // Disabled cause it's a pain to handle in generated string
// swiftlint:disable type_body_length
enum AnalyticsGenerator { enum AnalyticsGenerator {
@@ -89,49 +92,49 @@ enum AnalyticsGenerator {
) -> String { ) -> String {
""" """
// Generated by ResgenSwift.\(Analytics.toolName) \(ResgenSwiftVersion) // Generated by ResgenSwift.\(Analytics.toolName) \(ResgenSwiftVersion)
\(Self.getImport(targets: targets)) \(Self.getImport(targets: targets))
\(Self.getAnalyticsProtocol(targets: targets)) \(Self.getAnalyticsProtocol(targets: targets))
\(Self.getTrackerTypeEnum(targets: targets)) \(Self.getTrackerTypeEnum(targets: targets))
// MARK: - Manager // MARK: - Manager
class AnalyticsManager { class AnalyticsManager {
static var shared = AnalyticsManager() static var shared = AnalyticsManager()
private init() {} private init() {}
// MARK: - Properties // MARK: - Properties
var managers: [TrackerType: AnalyticsManagerProtocol] = [:] var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
\(Self.getEnabledContent()) \(Self.getEnabledContent())
\(Self.getAnalyticsProperties(targets: targets)) \(Self.getAnalyticsProperties(targets: targets))
\(Self.getPrivateLogFunction()) \(Self.getPrivateLogFunction())
""" """
} }
private static func getTrackerTypeEnum(targets: [TrackerType]) -> String { private static func getTrackerTypeEnum(targets: [TrackerType]) -> String {
var result: [String] = [] var result: [String] = []
targets.forEach { type in targets.forEach { type in
result.append(" case \(type)") result.append(" case \(type)")
} }
return """ return """
// MARK: - Traker Type // MARK: - Traker Type
enum TrackerType: CaseIterable { enum TrackerType: CaseIterable {
\(result.joined(separator: "\n")) \(result.joined(separator: "\n"))
} }
""" """
} }
private static func getEnabledContent() -> String { private static func getEnabledContent() -> String {
""" """
private var isEnabled: Bool { private var isEnabled: Bool {
@@ -141,9 +144,9 @@ enum AnalyticsGenerator {
true true
} }
} }
// MARK: - Enable Methods // MARK: - Enable Methods
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) { private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
managers.forEach { (key, value) in managers.forEach { (key, value) in
if analytics.contains(where: { type in if analytics.contains(where: { type in
@@ -153,11 +156,11 @@ enum AnalyticsGenerator {
} }
} }
} }
func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
setAnalytics(enable: true, analytics) setAnalytics(enable: true, analytics)
} }
func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) { func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
setAnalytics(enable: false, analytics) setAnalytics(enable: false, analytics)
} }
@@ -172,6 +175,7 @@ enum AnalyticsGenerator {
if targets.contains(TrackerType.matomo) { if targets.contains(TrackerType.matomo) {
result.append("import MatomoTracker") result.append("import MatomoTracker")
} }
if targets.contains(TrackerType.firebase) { if targets.contains(TrackerType.firebase) {
result.append("import FirebaseAnalytics") result.append("import FirebaseAnalytics")
} }
@@ -182,14 +186,14 @@ enum AnalyticsGenerator {
private static func getPrivateLogFunction() -> String { private static func getPrivateLogFunction() -> String {
""" """
// MARK: - Private Log Methods // MARK: - Private Log Methods
private func logScreen( private func logScreen(
name: String, name: String,
path: String, path: String,
params: [String: Any]? params: [String: Any]?
) { ) {
guard isEnabled else { return } guard isEnabled else { return }
managers.values.forEach { manager in managers.values.forEach { manager in
manager.logScreen( manager.logScreen(
name: name, name: name,
@@ -206,7 +210,7 @@ enum AnalyticsGenerator {
params: [String: Any]? params: [String: Any]?
) { ) {
guard isEnabled else { return } guard isEnabled else { return }
managers.values.forEach { manager in managers.values.forEach { manager in
manager.logEvent( manager.logEvent(
name: name, name: name,
@@ -238,6 +242,7 @@ enum AnalyticsGenerator {
) )
""") """)
} }
if targets.contains(TrackerType.firebase) { if targets.contains(TrackerType.firebase) {
content.append(" managers[TrackerType.firebase] = FirebaseAnalyticsManager()") content.append(" managers[TrackerType.firebase] = FirebaseAnalyticsManager()")
} }
@@ -255,20 +260,20 @@ enum AnalyticsGenerator {
// MARK: - Protocol // MARK: - Protocol
protocol AnalyticsManagerProtocol { protocol AnalyticsManagerProtocol {
func logScreen( func logScreen(
name: String, name: String,
path: String, path: String,
params: [String: Any]? params: [String: Any]?
) )
func logEvent( func logEvent(
name: String, name: String,
action: String, action: String,
category: String, category: String,
params: [String: Any]? params: [String: Any]?
) )
func setEnable(_ enable: Bool) func setEnable(_ enable: Bool)
} }
""" """
@@ -322,3 +327,5 @@ enum AnalyticsGenerator {
""" """
} }
} }
// CPD-ON

View File

@@ -13,11 +13,11 @@ enum FirebaseGenerator {
static var service: String { static var service: String {
[ [
FirebaseGenerator.header, Self.header,
FirebaseGenerator.logScreen, Self.logScreen,
FirebaseGenerator.logEvent, Self.logEvent,
FirebaseGenerator.enable, Self.enable,
FirebaseGenerator.footer Self.footer
] ]
.joined(separator: "\n") .joined(separator: "\n")
} }
@@ -29,9 +29,9 @@ enum FirebaseGenerator {
// MARK: - Firebase // MARK: - Firebase
class FirebaseAnalyticsManager: AnalyticsManagerProtocol { class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
// MARK: - Methods // MARK: - Methods
""" """
} }
@@ -45,11 +45,11 @@ enum FirebaseGenerator {
var parameters = [ var parameters = [
AnalyticsParameterScreenName: name as NSObject AnalyticsParameterScreenName: name as NSObject
] ]
if path.isEmpty == false { if path.isEmpty == false {
parameters["path"] = path + "/iOS" as NSObject parameters["path"] = path + "/iOS" as NSObject
} }
if let supplementaryParameters = params { if let supplementaryParameters = params {
for (newKey, newValue) in supplementaryParameters { for (newKey, newValue) in supplementaryParameters {
if parameters.contains(where: { (key: String, value: NSObject) in if parameters.contains(where: { (key: String, value: NSObject) in
@@ -57,11 +57,11 @@ enum FirebaseGenerator {
}) { }) {
continue continue
} }
parameters[newKey] = newValue as? NSObject parameters[newKey] = newValue as? NSObject
} }
} }
Analytics.logEvent( Analytics.logEvent(
AnalyticsEventScreenView, AnalyticsEventScreenView,
parameters: parameters parameters: parameters
@@ -82,15 +82,15 @@ enum FirebaseGenerator {
var parameters: [String:NSObject] = [ var parameters: [String:NSObject] = [
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject
] ]
if category.isEmpty == false { if category.isEmpty == false {
parameters["AnalyticsParameterItemCategory"] = category as NSObject parameters["AnalyticsParameterItemCategory"] = category as NSObject
} }
if action.isEmpty == false { if action.isEmpty == false {
parameters["action"] = action as NSObject parameters["action"] = action as NSObject
} }
if let supplementaryParameters = params { if let supplementaryParameters = params {
for (newKey, newValue) in supplementaryParameters { for (newKey, newValue) in supplementaryParameters {
if parameters.contains(where: { (key: String, value: NSObject) in if parameters.contains(where: { (key: String, value: NSObject) in
@@ -111,7 +111,7 @@ enum FirebaseGenerator {
""" """
} }
private static var enable: String { private static var enable: String {
""" """
func setEnable(_ enable: Bool) { func setEnable(_ enable: Bool) {
@@ -119,7 +119,7 @@ enum FirebaseGenerator {
} }
""" """
} }
private static var footer: String { private static var footer: String {
""" """
} }

View File

@@ -5,18 +5,20 @@
// Created by Loris Perret on 05/12/2023. // Created by Loris Perret on 05/12/2023.
// //
// CPD-OFF
import Foundation import Foundation
enum MatomoGenerator { enum MatomoGenerator {
static var service: String { static var service: String {
[ [
MatomoGenerator.header, Self.header,
MatomoGenerator.setup, Self.setup,
MatomoGenerator.logScreen, Self.logScreen,
MatomoGenerator.logEvent, Self.logEvent,
MatomoGenerator.enable, Self.enable,
MatomoGenerator.footer Self.footer
] ]
.joined(separator: "\n") .joined(separator: "\n")
} }
@@ -100,10 +102,10 @@ enum MatomoGenerator {
url: nil url: nil
) )
} }
""" """
} }
private static var enable: String { private static var enable: String {
""" """
func setEnable(_ enable: Bool) { func setEnable(_ enable: Bool) {
@@ -118,3 +120,5 @@ enum MatomoGenerator {
""" """
} }
} }
// CPD-ON

View File

@@ -52,20 +52,22 @@ class AnalyticsDefinition {
private func getParameters() -> String { private func getParameters() -> String {
var result: String var result: String
let paramsString = parameters.compactMap { parameter -> String? in let paramsString = parameters.compactMap { parameter -> String? in
guard parameter.value.isEmpty else { return nil } guard parameter.value.isEmpty else { return nil }
let defaultValue: String let defaultValue: String
switch parameter.type { switch parameter.type {
case .bool: case .bool:
defaultValue = "\(parameter.defaultValue.lowercased())" defaultValue = "\(parameter.defaultValue.lowercased())"
case .int, .double: case .int, .double:
defaultValue = "\(parameter.defaultValue)" defaultValue = "\(parameter.defaultValue)"
case .string: case .string:
defaultValue = "\"\(parameter.defaultValue)\"" defaultValue = "\"\(parameter.defaultValue)\""
} }
let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)" let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)"
return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)" return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)"
} }
@@ -90,9 +92,13 @@ class AnalyticsDefinition {
for rep in parameter.replaceIn { for rep in parameter.replaceIn {
switch rep { switch rep {
case "name": name = name.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))") 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 "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
case "category": category = category.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))") case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
default: default:
if let param = parameters.first(where: { $0.name == rep }), param.value.isEmpty == false { 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))") param.value = param.value.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
@@ -117,8 +123,10 @@ class AnalyticsDefinition {
switch param.type { switch param.type {
case .bool: case .bool:
params.append("\"\(param.name)\": \(param.value.lowercased())") params.append("\"\(param.name)\": \(param.value.lowercased())")
case .int, .double: case .int, .double:
params.append("\"\(param.name)\": \(param.value)") params.append("\"\(param.name)\": \(param.value)")
case .string: case .string:
params.append("\"\(param.name)\": \"\(param.value)\"") params.append("\"\(param.name)\": \"\(param.value)\"")
} }

View File

@@ -18,7 +18,7 @@ class AnalyticsParameter {
var replaceIn: [String] = [] var replaceIn: [String] = []
// MARK: - Init // MARK: - Init
init(name: String, type: ParameterType, value: String, defaultValue: String) { init(name: String, type: ParameterType, value: String, defaultValue: String) {
self.name = name self.name = name
self.type = type self.type = type

View File

@@ -8,6 +8,7 @@
import Foundation import Foundation
enum ParameterType: String { enum ParameterType: String {
case string = "String" case string = "String"
case int = "Int" case int = "Int"
case double = "Double" case double = "Double"

View File

@@ -78,18 +78,21 @@ class AnalyticsFileParser {
print(error.description) print(error.description)
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
case .bool: case .bool:
if Bool(value.lowercased()) == nil { if Bool(value.lowercased()) == nil {
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
print(error.description) print(error.description)
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
case .double: case .double:
if Double(value) == nil { if Double(value) == nil {
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)") let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
print(error.description) print(error.description)
Analytics.exit(withError: error) Analytics.exit(withError: error)
} }
case .string: case .string:
break break
} }
@@ -147,7 +150,7 @@ class AnalyticsFileParser {
} }
if let parameters { if let parameters {
definition.parameters = AnalyticsFileParser.getParameters(from: parameters) definition.parameters = Self.getParameters(from: parameters)
} }
return definition return definition