diff --git a/SampleFiles/Tags/Generated/Tags+GenAllScript.swift b/SampleFiles/Tags/Generated/Tags+GenAllScript.swift index 1702990..ebed455 100644 --- a/SampleFiles/Tags/Generated/Tags+GenAllScript.swift +++ b/SampleFiles/Tags/Generated/Tags+GenAllScript.swift @@ -1,27 +1,70 @@ // Generated by ResgenSwift.Tags 1.2 import UIKit +import MatomoTracker +import Firebase // MARK: - Protocol -protocol AnalyticsManager { +protocol AnalyticsManagerProtocol { func logScreen(name: String, path: String) func logEvent(name: String) } + // MARK: - Matomo -class MatomoAnalyticsManager: AnalyticsManager { - func logScreen(name: String, path: String) { +class MatomoAnalyticsManager: AnalyticsManagerProtocol { + // MARK: - Properties + + private var tracker: MatomoTracker + + // MARK: - Init + + init(siteId: String, url: String) { + debugPrint("[Matomo service] Server URL: \(url)") + debugPrint("[Matomo service] Site ID: \(siteId)") + tracker = MatomoTracker(siteId: siteId, baseURL: URL(string: url)!) + + #if DEBUG + tracker.dispatchInterval = 5 + #endif + + #if DEBUG + tracker.logger = DefaultLogger(minLevel: .verbose) + #endif + + debugPrint("[Matomo service] Configured with content base: \(tracker.contentBase?.absoluteString ?? "-")") + debugPrint("[Matomo service] Opt out: \(tracker.isOptedOut)") + } + + // MARK: - Methods + + func logScreen(name: String, path: String) { + guard !tracker.isOptedOut else { return } + guard let trackerUrl = tracker.contentBase?.absoluteString else { return } + let urlString = URL(string: "\(trackerUrl)" + "/" + "\(path)" + "iOS") + tracker.track( + view: [name], + url: urlString + ) } func logEvent(name: String) { - + guard !tracker.isOptedOut else { return } + tracker.track( + eventWithCategory: "category", + action: "action", + name: name, + number: nil, + url: nil + ) } } + // MARK: - Firebase -class FirebaseAnalyticsManager: AnalyticsManager { +class FirebaseAnalyticsManager: AnalyticsManagerProtocol { func logScreen(name: String, path: String) { } @@ -31,23 +74,41 @@ class FirebaseAnalyticsManager: AnalyticsManager { } } -extension Tags { +// MARK: - Manager + +class AnalyticsManager { + static var shared = AnalyticsManager() // MARK: - Properties - let managers: [AnalyticsManager] = [MatomoAnalyticsManager(), FirebaseAnalyticsManager()] + var managers: [AnalyticsManagerProtocol] = [] - // MARK: - ScreenTag + func configure(sideId: String, url: String) { + managers.append(MatomoAnalyticsManager(siteId: sideId, url: url)) - func logEcranUn() { + managers.append(FirebaseAnalyticsManager()) + FirebaseApp.configure() + } + + private func logScreen(name: String, path: String) { managers.forEach { manager in manager.logScreen(name: name, path: path) } } - - func logEcranDeux() { + + private func logEvent(name: String) { managers.forEach { manager in manager.logEvent(name: name) } } + + // MARK: - ScreenTag + + func logScreenEcranUn(name: String, path: String) { + logScreen(name: name, path: path) + } + + func logEventEcranDeux(name: String) { + logEvent(name: name) + } } diff --git a/Sources/ResgenSwift/Tags/Generator/FirebaseGenerator.swift b/Sources/ResgenSwift/Tags/Generator/FirebaseGenerator.swift new file mode 100644 index 0000000..4226c55 --- /dev/null +++ b/Sources/ResgenSwift/Tags/Generator/FirebaseGenerator.swift @@ -0,0 +1,36 @@ +// +// FirebaseGenerator.swift +// +// +// Created by Loris Perret on 05/12/2023. +// + +import Foundation + +enum FirebaseGenerator { + var header: String { + """ + // MARK: - Firebase + + class FirebaseAnalyticsManager: AnalyticsManagerProtocol { + """ + } + + var footer: String { + """ + } + + """ + } + + var logScreen: String { + """ + """ + } + + var logEvent: String { + """ + """ + } + +} diff --git a/Sources/ResgenSwift/Tags/Generator/MatomoGenerator.swift b/Sources/ResgenSwift/Tags/Generator/MatomoGenerator.swift new file mode 100644 index 0000000..2d7b56a --- /dev/null +++ b/Sources/ResgenSwift/Tags/Generator/MatomoGenerator.swift @@ -0,0 +1,99 @@ +// +// MatomoGenerator.swift +// +// +// Created by Loris Perret on 05/12/2023. +// + +import Foundation + +enum MatomoGenerator { + case service + + var content: String { + [ + MatomoGenerator.service.header, + MatomoGenerator.service.setup, + MatomoGenerator.service.logScreen, + MatomoGenerator.service.logEvent, + MatomoGenerator.service.footer + ] + .joined(separator: "\n") + } + + private var header: String { + """ + // MARK: - Matomo + + class MatomoAnalyticsManager: AnalyticsManagerProtocol { + + // MARK: - Properties + + private var tracker: MatomoTracker + + """ + } + + private var setup: String { + """ + // MARK: - Init + + init(siteId: String, url: String) { + debugPrint("[Matomo service] Server URL: \\(url)") + debugPrint("[Matomo service] Site ID: \\(siteId)") + tracker = MatomoTracker(siteId: siteId, baseURL: URL(string: url)!) + + #if DEBUG + tracker.dispatchInterval = 5 + #endif + + #if DEBUG + tracker.logger = DefaultLogger(minLevel: .verbose) + #endif + + debugPrint("[Matomo service] Configured with content base: \\(tracker.contentBase?.absoluteString ?? "-")") + debugPrint("[Matomo service] Opt out: \\(tracker.isOptedOut)") + } + + // MARK: - Methods + + """ + } + + private var logScreen: String { + """ + func logScreen(name: String, path: String) { + guard !tracker.isOptedOut else { return } + guard let trackerUrl = tracker.contentBase?.absoluteString else { return } + let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS") + tracker.track( + view: [name], + url: urlString + ) + } + + """ + } + + private var logEvent: String { + """ + func logEvent(name: String) { + guard !tracker.isOptedOut else { return } + tracker.track( + eventWithCategory: "category", + action: "action", + name: name, + number: nil, + url: nil + ) + } + """ + } + + private var footer: String { + """ + } + + """ + } +} diff --git a/Sources/ResgenSwift/TagsV2/Generator/TagsGenerator.swift b/Sources/ResgenSwift/Tags/Generator/TagsGenerator.swift similarity index 62% rename from Sources/ResgenSwift/TagsV2/Generator/TagsGenerator.swift rename to Sources/ResgenSwift/Tags/Generator/TagsGenerator.swift index eb32e67..48f2e67 100644 --- a/Sources/ResgenSwift/TagsV2/Generator/TagsGenerator.swift +++ b/Sources/ResgenSwift/Tags/Generator/TagsGenerator.swift @@ -10,10 +10,11 @@ import ToolCore import CoreVideo class TagsGenerator { + static var targets: [Tags.TargetType] = [] + static func writeExtensionFiles(sections: [TagSection], target: String, tags: [String], staticVar: Bool, extensionName: String, extensionFilePath: String) { // Get target type from enum let targetsString: [String] = target.components(separatedBy: " ") - var targets: [Tags.TargetType] = [] Tags.TargetType.allCases.forEach { enumTarget in if targetsString.contains(enumTarget.value) { @@ -25,7 +26,6 @@ class TagsGenerator { // Get extension content let extensionFileContent = Self.getExtensionContent(sections: sections, - targets: targets, tags: tags, staticVar: staticVar, extensionName: extensionName) @@ -43,10 +43,10 @@ class TagsGenerator { // MARK: - Extension content - static func getExtensionContent(sections: [TagSection], targets: [Tags.TargetType], tags: [String], staticVar: Bool, extensionName: String) -> String { + static func getExtensionContent(sections: [TagSection], tags: [String], staticVar: Bool, extensionName: String) -> String { [ - Self.getHeader(extensionClassname: extensionName, staticVar: staticVar, targets: targets), - Self.getProperties(sections: sections, target: "target", tags: tags, staticVar: staticVar), + Self.getHeader(extensionClassname: extensionName, staticVar: staticVar), + Self.getProperties(sections: sections, tags: tags, staticVar: staticVar), Self.getFooter() ] .joined(separator: "\n") @@ -54,67 +54,100 @@ class TagsGenerator { // MARK: - Extension part - private static func getHeader(extensionClassname: String, staticVar: Bool, targets: [Tags.TargetType]) -> String { + private static func getHeader(extensionClassname: String, staticVar: Bool) -> String { """ // Generated by ResgenSwift.\(Tags.toolName) \(ResgenSwiftVersion) \(staticVar ? "typelias Tags = String\n\n" : "")import UIKit + \(Self.getImport()) - \(Self.getAnalytics(targets: targets)) + \(Self.getAnalytics()) - extension \(extensionClassname) { + // MARK: - Manager + + class AnalyticsManager { + static var shared = AnalyticsManager() // MARK: - Properties - let managers: [AnalyticsManager] = [\(Self.getAnalyticsProperties(targets: targets))] + var managers: [AnalyticsManagerProtocol] = [] + + \(Self.getAnalyticsProperties()) + + \(Self.getPrivateLogFunction()) """ } - private static func getAnalyticsProperties(targets: [Tags.TargetType]) -> String { - let matomo = "MatomoAnalyticsManager()" - let firebase = "FirebaseAnalyticsManager()" - + private static func getImport() -> String { var result: [String] = [] if targets.contains(Tags.TargetType.matomo) { - result.append(matomo) + result.append("import MatomoTracker") } - if targets.contains(Tags.TargetType.firebase) { - result.append(firebase) + result.append("import Firebase") } - return result.joined(separator: ", ") + return result.joined(separator: "\n") } - private static func getAnalytics(targets: [Tags.TargetType]) -> String { + private static func getPrivateLogFunction() -> String { + """ + private func logScreen(name: String, path: String) { + managers.forEach { manager in + manager.logScreen(name: name, path: path) + } + } + + private func logEvent(name: String) { + managers.forEach { manager in + manager.logEvent(name: name) + } + } + """ + } + + private static func getAnalyticsProperties() -> String { + var header = " // MARK: - Methods\n" + var content: [String] = [] + let footer = " }" + + if targets.contains(Tags.TargetType.matomo) { + header = "func configure(sideId: String, url: String) {" + } else if targets.contains(Tags.TargetType.firebase) { + header = "func configure() {" + } + + if targets.contains(Tags.TargetType.matomo) { + content.append(" managers.append(MatomoAnalyticsManager(siteId: sideId, url: url))\n") + } + if targets.contains(Tags.TargetType.firebase) { + content.append(" managers.append(FirebaseAnalyticsManager())") + } + + return [ + header, + content.joined(separator: "\n"), + footer + ] + .joined(separator: "\n") + } + + private static func getAnalytics() -> String { let proto = """ // MARK: - Protocol - protocol AnalyticsManager { + protocol AnalyticsManagerProtocol { func logScreen(name: String, path: String) func logEvent(name: String) } - """ - let matomo = """ - // MARK: - Matomo - - class MatomoAnalyticsManager: AnalyticsManager { - func logScreen(name: String, path: String) { - - } - - func logEvent(name: String) { - - } - } """ let firebase = """ // MARK: - Firebase - class FirebaseAnalyticsManager: AnalyticsManager { + class FirebaseAnalyticsManager: AnalyticsManagerProtocol { func logScreen(name: String, path: String) { } @@ -128,7 +161,7 @@ class TagsGenerator { var result: [String] = [proto] if targets.contains(Tags.TargetType.matomo) { - result.append(matomo) + result.append(MatomoGenerator.service.content) } if targets.contains(Tags.TargetType.firebase) { @@ -138,7 +171,7 @@ class TagsGenerator { return result.joined(separator: "\n") } - private static func getProperties(sections: [TagSection], target: String, tags: [String], staticVar: Bool) -> String { + private static func getProperties(sections: [TagSection], tags: [String], staticVar: Bool) -> String { sections .compactMap { section in // Check that at least one string will be generated @@ -153,9 +186,9 @@ class TagsGenerator { } if staticVar { - res += "\n\n\(definition.getStaticProperty(forTarget: target))" + res += "\n\n\(definition.getStaticProperty())" } else { - res += "\n\n\(definition.getProperty(forTarget: target))" + res += "\n\n\(definition.getProperty())" } } return res diff --git a/Sources/ResgenSwift/TagsV2/Model/TagDefinition.swift b/Sources/ResgenSwift/Tags/Model/TagDefinition.swift similarity index 77% rename from Sources/ResgenSwift/TagsV2/Model/TagDefinition.swift rename to Sources/ResgenSwift/Tags/Model/TagDefinition.swift index 0fd3f25..97736c2 100644 --- a/Sources/ResgenSwift/TagsV2/Model/TagDefinition.swift +++ b/Sources/ResgenSwift/Tags/Model/TagDefinition.swift @@ -91,48 +91,31 @@ class TagDefinition { pascalCaseTitle.append(contentsOf: word.uppercasedFirst()) } - return "log\(pascalCaseTitle)" + return "log\(type == TagType.screen.value ? "Screen" : "Event")\(pascalCaseTitle)" } private func getlogFunction() -> String { if type == TagType.screen.value { - "manager.logScreen(name: name, path: path)" + "logScreen(name: name, path: path)" } else { - "manager.logEvent(name: name)" + "logEvent(name: name)" } } // MARK: - Raw strings - func getProperty(forTarget target: String) -> String { - return """ - func \(getFuncName())() { - managers.forEach { manager in - \(getlogFunction()) - } + func getProperty() -> String { + """ + func \(getFuncName())(name: String\(type == TagType.screen.value ? ", path: String" : "")) { + \(getlogFunction()) } """ } - func getStaticProperty(forTarget target: String) -> String { -// guard let translation = translations[lang] else { -// let error = StringiumError.langNotDefined(lang, title, reference != nil) -// print(error.description) -// Stringium.exit(withError: error) -// } -// -// return """ -// /// Translation in \(lang) : -// /// \(translation) -// static var \(title): String { -// "\(translation)" -// } -// """ - return """ - static func \(getFuncName())() { - managers.forEach { manager in - \(getlogFunction()) - } + func getStaticProperty() -> String { + """ + static func \(getFuncName())(name: name\(type == TagType.screen.value ? ", path: String" : "")) { + \(getlogFunction()) } """ } diff --git a/Sources/ResgenSwift/TagsV2/Model/TagSection.swift b/Sources/ResgenSwift/Tags/Model/TagSection.swift similarity index 100% rename from Sources/ResgenSwift/TagsV2/Model/TagSection.swift rename to Sources/ResgenSwift/Tags/Model/TagSection.swift diff --git a/Sources/ResgenSwift/TagsV2/Parser/TagFileParser.swift b/Sources/ResgenSwift/Tags/Parser/TagFileParser.swift similarity index 100% rename from Sources/ResgenSwift/TagsV2/Parser/TagFileParser.swift rename to Sources/ResgenSwift/Tags/Parser/TagFileParser.swift diff --git a/Sources/ResgenSwift/TagsV2/Tags.swift b/Sources/ResgenSwift/Tags/Tags.swift similarity index 100% rename from Sources/ResgenSwift/TagsV2/Tags.swift rename to Sources/ResgenSwift/Tags/Tags.swift diff --git a/Sources/ResgenSwift/TagsV2/TagsOptions.swift b/Sources/ResgenSwift/Tags/TagsOptions.swift similarity index 100% rename from Sources/ResgenSwift/TagsV2/TagsOptions.swift rename to Sources/ResgenSwift/Tags/TagsOptions.swift