mise-a-jour-tags #6

Merged
l.perret merged 21 commits from mise-a-jour-tags into master 2023-12-13 10:46:10 +01:00
9 changed files with 288 additions and 76 deletions
Showing only changes of commit 3e133773a9 - Show all commits

View File

@ -1,53 +1,114 @@
// Generated by ResgenSwift.Tags 1.2 // Generated by ResgenSwift.Tags 1.2
import UIKit import UIKit
import MatomoTracker
import Firebase
// MARK: - Protocol // MARK: - Protocol
protocol AnalyticsManager { protocol AnalyticsManagerProtocol {
func logScreen(name: String, path: String) func logScreen(name: String, path: String)
func logEvent(name: String) func logEvent(name: String)
} }
// MARK: - Matomo // MARK: - Matomo
class MatomoAnalyticsManager: AnalyticsManager { class MatomoAnalyticsManager: AnalyticsManagerProtocol {
func logScreen(name: String, path: String) {
}
func logEvent(name: String) {
}
}
// MARK: - Firebase
class FirebaseAnalyticsManager: AnalyticsManager {
func logScreen(name: String, path: String) {
}
func logEvent(name: String) {
}
}
extension Tags {
// MARK: - Properties // MARK: - Properties
let managers: [AnalyticsManager] = [MatomoAnalyticsManager(), FirebaseAnalyticsManager()] private var tracker: MatomoTracker
// MARK: - ScreenTag // MARK: - Init
func logEcranUn() { 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: AnalyticsManagerProtocol {
func logScreen(name: String, path: String) {
}
func logEvent(name: String) {
}
}
// MARK: - Manager
class AnalyticsManager {
static var shared = AnalyticsManager()
// MARK: - Properties
var managers: [AnalyticsManagerProtocol] = []
func configure(sideId: String, url: String) {
managers.append(MatomoAnalyticsManager(siteId: sideId, url: url))
managers.append(FirebaseAnalyticsManager())
FirebaseApp.configure()
}
private func logScreen(name: String, path: String) {
managers.forEach { manager in managers.forEach { manager in
manager.logScreen(name: name, path: path) manager.logScreen(name: name, path: path)
} }
} }
func logEcranDeux() { private func logEvent(name: String) {
managers.forEach { manager in managers.forEach { manager in
manager.logEvent(name: name) manager.logEvent(name: name)
} }
} }
// MARK: - ScreenTag
func logScreenEcranUn(name: String, path: String) {
logScreen(name: name, path: path)
}
func logEventEcranDeux(name: String) {
logEvent(name: name)
}
} }

View File

@ -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 {
"""
"""
}
}

View File

@ -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 {
"""
}
"""
}
}

View File

@ -10,10 +10,11 @@ import ToolCore
import CoreVideo import CoreVideo
class TagsGenerator { class TagsGenerator {
static var targets: [Tags.TargetType] = []
static func writeExtensionFiles(sections: [TagSection], target: String, tags: [String], staticVar: Bool, extensionName: String, extensionFilePath: String) { static func writeExtensionFiles(sections: [TagSection], target: String, tags: [String], staticVar: Bool, extensionName: String, extensionFilePath: String) {
// Get target type from enum // Get target type from enum
let targetsString: [String] = target.components(separatedBy: " ") let targetsString: [String] = target.components(separatedBy: " ")
var targets: [Tags.TargetType] = []
Tags.TargetType.allCases.forEach { enumTarget in Tags.TargetType.allCases.forEach { enumTarget in
if targetsString.contains(enumTarget.value) { if targetsString.contains(enumTarget.value) {
@ -25,7 +26,6 @@ class TagsGenerator {
// Get extension content // Get extension content
let extensionFileContent = Self.getExtensionContent(sections: sections, let extensionFileContent = Self.getExtensionContent(sections: sections,
targets: targets,
tags: tags, tags: tags,
staticVar: staticVar, staticVar: staticVar,
extensionName: extensionName) extensionName: extensionName)
@ -43,10 +43,10 @@ class TagsGenerator {
// MARK: - Extension content // 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.getHeader(extensionClassname: extensionName, staticVar: staticVar),
Self.getProperties(sections: sections, target: "target", tags: tags, staticVar: staticVar), Self.getProperties(sections: sections, tags: tags, staticVar: staticVar),
Self.getFooter() Self.getFooter()
] ]
.joined(separator: "\n") .joined(separator: "\n")
@ -54,67 +54,100 @@ class TagsGenerator {
// MARK: - Extension part // 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) // Generated by ResgenSwift.\(Tags.toolName) \(ResgenSwiftVersion)
\(staticVar ? "typelias Tags = String\n\n" : "")import UIKit \(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 // MARK: - Properties
let managers: [AnalyticsManager] = [\(Self.getAnalyticsProperties(targets: targets))] var managers: [AnalyticsManagerProtocol] = []
\(Self.getAnalyticsProperties())
\(Self.getPrivateLogFunction())
""" """
} }
private static func getAnalyticsProperties(targets: [Tags.TargetType]) -> String { private static func getImport() -> String {
let matomo = "MatomoAnalyticsManager()"
let firebase = "FirebaseAnalyticsManager()"
var result: [String] = [] var result: [String] = []
if targets.contains(Tags.TargetType.matomo) { if targets.contains(Tags.TargetType.matomo) {
result.append(matomo) result.append("import MatomoTracker")
} }
if targets.contains(Tags.TargetType.firebase) { 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 = """ let proto = """
// MARK: - Protocol // MARK: - Protocol
protocol AnalyticsManager { protocol AnalyticsManagerProtocol {
func logScreen(name: String, path: String) func logScreen(name: String, path: String)
func logEvent(name: String) func logEvent(name: String)
} }
"""
let matomo = """
// MARK: - Matomo
class MatomoAnalyticsManager: AnalyticsManager {
func logScreen(name: String, path: String) {
}
func logEvent(name: String) {
}
}
""" """
let firebase = """ let firebase = """
// MARK: - Firebase // MARK: - Firebase
class FirebaseAnalyticsManager: AnalyticsManager { class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
func logScreen(name: String, path: String) { func logScreen(name: String, path: String) {
} }
@ -128,7 +161,7 @@ class TagsGenerator {
var result: [String] = [proto] var result: [String] = [proto]
if targets.contains(Tags.TargetType.matomo) { if targets.contains(Tags.TargetType.matomo) {
result.append(matomo) result.append(MatomoGenerator.service.content)
} }
if targets.contains(Tags.TargetType.firebase) { if targets.contains(Tags.TargetType.firebase) {
@ -138,7 +171,7 @@ class TagsGenerator {
return result.joined(separator: "\n") 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 sections
.compactMap { section in .compactMap { section in
// Check that at least one string will be generated // Check that at least one string will be generated
@ -153,9 +186,9 @@ class TagsGenerator {
} }
if staticVar { if staticVar {
res += "\n\n\(definition.getStaticProperty(forTarget: target))" res += "\n\n\(definition.getStaticProperty())"
} else { } else {
res += "\n\n\(definition.getProperty(forTarget: target))" res += "\n\n\(definition.getProperty())"
} }
} }
return res return res

View File

@ -91,48 +91,31 @@ class TagDefinition {
pascalCaseTitle.append(contentsOf: word.uppercasedFirst()) pascalCaseTitle.append(contentsOf: word.uppercasedFirst())
} }
return "log\(pascalCaseTitle)" return "log\(type == TagType.screen.value ? "Screen" : "Event")\(pascalCaseTitle)"
} }
private func getlogFunction() -> String { private func getlogFunction() -> String {
if type == TagType.screen.value { if type == TagType.screen.value {
"manager.logScreen(name: name, path: path)" "logScreen(name: name, path: path)"
} else { } else {
"manager.logEvent(name: name)" "logEvent(name: name)"
} }
} }
// MARK: - Raw strings // MARK: - Raw strings
func getProperty(forTarget target: String) -> String { func getProperty() -> String {
return """ """
func \(getFuncName())() { func \(getFuncName())(name: String\(type == TagType.screen.value ? ", path: String" : "")) {
managers.forEach { manager in \(getlogFunction())
\(getlogFunction())
}
} }
""" """
} }
func getStaticProperty(forTarget target: String) -> String { func getStaticProperty() -> String {
// guard let translation = translations[lang] else { """
// let error = StringiumError.langNotDefined(lang, title, reference != nil) static func \(getFuncName())(name: name\(type == TagType.screen.value ? ", path: String" : "")) {
// print(error.description) \(getlogFunction())
// Stringium.exit(withError: error)
// }
//
// return """
// /// Translation in \(lang) :
// /// \(translation)
// static var \(title): String {
// "\(translation)"
// }
// """
return """
static func \(getFuncName())() {
managers.forEach { manager in
\(getlogFunction())
}
} }
""" """
} }