This commit is contained in:
@@ -90,7 +90,7 @@ analytics:
|
|||||||
inputFile: ./Tags/sampleTags.yml
|
inputFile: ./Tags/sampleTags.yml
|
||||||
target: "matomo firebase"
|
target: "matomo firebase"
|
||||||
outputFile: ./Tags/Generated/Analytics+GenAllScript.swift
|
outputFile: ./Tags/Generated/Analytics+GenAllScript.swift
|
||||||
visibility: public
|
visibility: internal
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
sections: [sectionOne, sectionTwo, sectionThree],
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
isStatic: false,
|
isStatic: false,
|
||||||
visibility: .public
|
visibility: .internal
|
||||||
)
|
)
|
||||||
|
|
||||||
// Expect Analytics
|
// Expect Analytics
|
||||||
@@ -243,23 +243,24 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import FirebaseAnalytics
|
import FirebaseAnalytics
|
||||||
|
import os
|
||||||
|
|
||||||
\(protocolString(visibility: .public))
|
\(protocolString(visibility: .internal))
|
||||||
|
|
||||||
\(firebaseString())
|
\(firebaseString())
|
||||||
|
|
||||||
// MARK: - Traker Type
|
// MARK: - Traker Type
|
||||||
|
|
||||||
public enum TrackerType: CaseIterable {
|
internal enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
case firebase
|
case firebase
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
public class AnalyticsManager {
|
internal class AnalyticsManager {
|
||||||
|
|
||||||
public static var shared = AnalyticsManager()
|
internal static var shared = AnalyticsManager()
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
|
|
||||||
@@ -267,6 +268,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
|
private var isDebugMode: Bool = false
|
||||||
|
|
||||||
private var isEnabled: Bool {
|
private var isEnabled: Bool {
|
||||||
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
false
|
false
|
||||||
@@ -275,6 +278,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let logger = Logger(subsystem: "resgen", category: "analytics")
|
||||||
|
|
||||||
// MARK: - Enable Methods
|
// MARK: - Enable Methods
|
||||||
|
|
||||||
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
@@ -287,28 +292,55 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
internal func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
setAnalytics(enable: true, analytics)
|
setAnalytics(enable: true, analytics)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
internal func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
setAnalytics(enable: false, analytics)
|
setAnalytics(enable: false, analytics)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func configure() {
|
internal func configure(isDebugMode: Bool = false) {
|
||||||
|
self.isDebugMode = isDebugMode
|
||||||
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
|
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private Log Methods
|
// 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(
|
private func logScreen(
|
||||||
name: String,
|
name: String,
|
||||||
path: String,
|
path: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
🖥️ Screen:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Path: \\(path, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logScreen(
|
manager.logScreen(
|
||||||
name: name,
|
name: name,
|
||||||
path: path,
|
path: path,
|
||||||
@@ -323,9 +355,25 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
📊 Event:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Action: \\(action.isEmpty ? "-" : action, privacy: .public)
|
||||||
|
Category: \\(category.isEmpty ? "-" : category, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@@ -337,7 +385,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
public func logScreenS1DefOne() {
|
internal func logScreenS1DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one",
|
name: "s1 def one",
|
||||||
path: "",
|
path: "",
|
||||||
@@ -345,7 +393,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func logEventS1DefTwo() {
|
internal func logEventS1DefTwo() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "",
|
action: "",
|
||||||
@@ -356,7 +404,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
public func logScreenS2DefOne() {
|
internal func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: "",
|
path: "",
|
||||||
@@ -399,7 +447,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
sections: [sectionOne, sectionTwo, sectionThree],
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
isStatic: false,
|
isStatic: false,
|
||||||
visibility: .package
|
visibility: .internal
|
||||||
)
|
)
|
||||||
// Expect Analytics
|
// Expect Analytics
|
||||||
let expect = """
|
let expect = """
|
||||||
@@ -407,23 +455,24 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import MatomoTracker
|
import MatomoTracker
|
||||||
|
import os
|
||||||
|
|
||||||
\(protocolString(visibility: .package))
|
\(protocolString(visibility: .internal))
|
||||||
|
|
||||||
\(matomoString())
|
\(matomoString())
|
||||||
|
|
||||||
// MARK: - Traker Type
|
// MARK: - Traker Type
|
||||||
|
|
||||||
package enum TrackerType: CaseIterable {
|
internal enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
case matomo
|
case matomo
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
package class AnalyticsManager {
|
internal class AnalyticsManager {
|
||||||
|
|
||||||
package static var shared = AnalyticsManager()
|
internal static var shared = AnalyticsManager()
|
||||||
|
|
||||||
private init() {}
|
private init() {}
|
||||||
|
|
||||||
@@ -431,6 +480,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
|
private var isDebugMode: Bool = false
|
||||||
|
|
||||||
private var isEnabled: Bool {
|
private var isEnabled: Bool {
|
||||||
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
false
|
false
|
||||||
@@ -439,6 +490,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let logger = Logger(subsystem: "resgen", category: "analytics")
|
||||||
|
|
||||||
// MARK: - Enable Methods
|
// MARK: - Enable Methods
|
||||||
|
|
||||||
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
@@ -451,15 +504,16 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
package func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
internal func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
setAnalytics(enable: true, analytics)
|
setAnalytics(enable: true, analytics)
|
||||||
}
|
}
|
||||||
|
|
||||||
package func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
internal func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
setAnalytics(enable: false, analytics)
|
setAnalytics(enable: false, analytics)
|
||||||
}
|
}
|
||||||
|
|
||||||
package func configure(siteId: String, url: String) {
|
internal func configure(siteId: String, url: String, isDebugMode: Bool = false) {
|
||||||
|
self.isDebugMode = isDebugMode
|
||||||
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
@@ -468,14 +522,40 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - Private Log Methods
|
// 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(
|
private func logScreen(
|
||||||
name: String,
|
name: String,
|
||||||
path: String,
|
path: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
🖥️ Screen:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Path: \\(path, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logScreen(
|
manager.logScreen(
|
||||||
name: name,
|
name: name,
|
||||||
path: path,
|
path: path,
|
||||||
@@ -490,9 +570,25 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
📊 Event:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Action: \\(action.isEmpty ? "-" : action, privacy: .public)
|
||||||
|
Category: \\(category.isEmpty ? "-" : category, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@@ -504,7 +600,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
package func logScreenS1DefOne() {
|
internal func logScreenS1DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one",
|
name: "s1 def one",
|
||||||
path: "s1_def_one/",
|
path: "s1_def_one/",
|
||||||
@@ -512,7 +608,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
package func logEventS1DefTwo() {
|
internal func logEventS1DefTwo() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "test",
|
action: "test",
|
||||||
@@ -523,7 +619,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
package func logScreenS2DefOne() {
|
internal func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: "s2_def_one/",
|
path: "s2_def_one/",
|
||||||
@@ -576,6 +672,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
import Foundation
|
import Foundation
|
||||||
import MatomoTracker
|
import MatomoTracker
|
||||||
import FirebaseAnalytics
|
import FirebaseAnalytics
|
||||||
|
import os
|
||||||
|
|
||||||
\(protocolString(visibility: .internal))
|
\(protocolString(visibility: .internal))
|
||||||
|
|
||||||
@@ -603,6 +700,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
|
private var isDebugMode: Bool = false
|
||||||
|
|
||||||
private var isEnabled: Bool {
|
private var isEnabled: Bool {
|
||||||
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
false
|
false
|
||||||
@@ -611,6 +710,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let logger = Logger(subsystem: "resgen", category: "analytics")
|
||||||
|
|
||||||
// MARK: - Enable Methods
|
// MARK: - Enable Methods
|
||||||
|
|
||||||
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
@@ -631,7 +732,8 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
setAnalytics(enable: false, analytics)
|
setAnalytics(enable: false, analytics)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func configure(siteId: String, url: String) {
|
internal func configure(siteId: String, url: String, isDebugMode: Bool = false) {
|
||||||
|
self.isDebugMode = isDebugMode
|
||||||
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
@@ -641,14 +743,40 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - Private Log Methods
|
// 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(
|
private func logScreen(
|
||||||
name: String,
|
name: String,
|
||||||
path: String,
|
path: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
🖥️ Screen:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Path: \\(path, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logScreen(
|
manager.logScreen(
|
||||||
name: name,
|
name: name,
|
||||||
path: path,
|
path: path,
|
||||||
@@ -663,9 +791,25 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else {
|
||||||
|
if isDebugMode {
|
||||||
|
logger.log("Analytics disabled")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
managers.values.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
|
|
||||||
|
if isDebugMode {
|
||||||
|
logger.debug(\"""
|
||||||
|
📊 Event:
|
||||||
|
Name: \\(name, privacy: .public)
|
||||||
|
Action: \\(action.isEmpty ? "-" : action, privacy: .public)
|
||||||
|
Category: \\(category.isEmpty ? "-" : category, privacy: .public)
|
||||||
|
Params: \\(self.formattedParams(params), privacy: .public)
|
||||||
|
\""")
|
||||||
|
}
|
||||||
|
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
|
|||||||
Reference in New Issue
Block a user