mise-a-jour-tags #6
@ -1,27 +1,70 @@
|
|||||||
// 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) {
|
|
||||||
|
|
||||||
|
// 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) {
|
func logEvent(name: String) {
|
||||||
|
guard !tracker.isOptedOut else { return }
|
||||||
|
tracker.track(
|
||||||
|
eventWithCategory: "category",
|
||||||
|
action: "action",
|
||||||
|
name: name,
|
||||||
|
number: nil,
|
||||||
|
url: nil
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Firebase
|
// MARK: - Firebase
|
||||||
|
|
||||||
class FirebaseAnalyticsManager: AnalyticsManager {
|
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
||||||
func logScreen(name: String, path: String) {
|
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
|
// 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
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
36
Sources/ResgenSwift/Tags/Generator/FirebaseGenerator.swift
Normal file
36
Sources/ResgenSwift/Tags/Generator/FirebaseGenerator.swift
Normal 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 {
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
99
Sources/ResgenSwift/Tags/Generator/MatomoGenerator.swift
Normal file
99
Sources/ResgenSwift/Tags/Generator/MatomoGenerator.swift
Normal 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 {
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
@ -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())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user