Fix Tests Analytics #17
@@ -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
|
||||||
|
@@ -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 {
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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)\"")
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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"
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user