13 Commits

Author SHA1 Message Date
4b944ed8c7 RES-75 Ajouter un pretty print pour le dictionnaire des params
Some checks failed
openium/resgen.swift/pipeline/pr-master There was a failure building this commit
openium/resgen.swift/pipeline/head There was a failure building this commit
2025-10-29 11:07:37 +01:00
1f9af76b40 RES-74 Ajout du multiligne sur les logs des analytics
Some checks failed
openium/resgen.swift/pipeline/head There was a failure building this commit
2025-10-29 09:23:10 +01:00
7247d20ae4 Merge pull request 'feat/RES-73_Ajout_DebugMode_Analytics' (#22) from feat/RES-73_Ajout_DebugMode_Analytics into master
Some checks failed
openium/resgen.swift/pipeline/head There was a failure building this commit
Reviewed-on: #22
2025-10-21 15:03:05 +02:00
63404f8f20 Ajout de maj
Some checks are pending
openium/resgen.swift/pipeline/pr-master Build started...
2025-10-21 15:02:34 +02:00
c4a3aa54d6 Gestion du cas des strings vides
Some checks failed
openium/resgen.swift/pipeline/pr-master There was a failure building this commit
2025-10-21 10:57:20 +02:00
b9e610a6d9 Review
Some checks failed
openium/resgen.swift/pipeline/pr-master There was a failure building this commit
2025-10-20 17:08:08 +02:00
7c6a8d2ac3 Génération du fichier + suppression variable inutile
Some checks failed
openium/resgen.swift/pipeline/pr-master There was a failure building this commit
openium/resgen.swift/pipeline/head There was a failure building this commit
2025-10-20 16:33:47 +02:00
f0aac3a91b RES-73 Ajout d'un debugMode iOS
Some checks failed
openium/resgen.swift/pipeline/head There was a failure building this commit
2025-10-20 16:30:36 +02:00
f1ca8e92b7 Remove unwanted lang translation when generated xcStrings catalog
All checks were successful
openium/resgen.swift/pipeline/head This commit looks good
2025-09-30 16:08:45 +02:00
Jean-Charles Neboit
436bc4b2af Fix Makefile INSTALL_DIR & man page
All checks were successful
gitea-openium/resgen.swift/pipeline/pr-master This commit looks good
gitea-openium/resgen.swift/pipeline/head This commit looks good
2025-09-11 14:28:21 +02:00
e0e561ff7f Update SwiftLint and fix some Swift 6 issues
All checks were successful
gitea-openium/resgen.swift/pipeline/head This commit looks good
2025-09-10 16:51:23 +02:00
ed4e9849e7 fix(RES-71): Checkstyle resgen analytics (#20)
All checks were successful
gitea-openium/resgen.swift/pipeline/head This commit looks good
Reviewed-on: #20
Reviewed-by: Thibaut Schmitt <t.schmitt@openium.fr>
Co-authored-by: Quentin Bandera <q.bandera@openium.fr>
Co-committed-by: Quentin Bandera <q.bandera@openium.fr>
2025-08-26 08:51:33 +02:00
ddf1d2509f Fix d'une inversion de property dans la génération des strings
All checks were successful
gitea-openium/resgen.swift/pipeline/head This commit looks good
2025-08-26 08:50:45 +02:00
20 changed files with 193 additions and 176 deletions

View File

@@ -1,7 +1,6 @@
SHELL = /bin/zsh
#INSTALL_DIR ?= /usr/local/bin
INSTALL_DIR = /tmp/ResgenYolo
INSTALL_DIR = /usr/local/bin
MAN_DIR := /usr/local/share/man
MAN_PAGE_NAME = resgen-swift.1
@@ -14,7 +13,7 @@ BUILD_DIR = $(REPO_DIR)/.build
# create-man-files:
# swift package plugin generate-manual
# cp $(BUILDDIR)/plugins/GenerateManualPlugin/outputs/ResgenSwift/resgen-swift.1 $(REPODIR)/man/resgen-swift.1
# cp $(BUILDDIR)/plugins/GenerateManual/outputs/ResgenSwift/resgen-swift.1 $(REPODIR)/man/resgen-swift.1
# install-man-files:
# mkdir -p ${DESTDIR}${mandir}/man1
@@ -23,7 +22,7 @@ BUILD_DIR = $(REPO_DIR)/.build
create-and-install-man-files:
swift package plugin generate-manual
mkdir -p ${MAN_DIR}/man1
cp $(BUILD_DIR)/plugins/GenerateManualPlugin/outputs/ResgenSwift/${MAN_PAGE_NAME} ${MAN_DIR}/man1/${MAN_PAGE_NAME}
cp $(BUILD_DIR)/plugins/GenerateManual/outputs/ResgenSwift/${MAN_PAGE_NAME} ${MAN_DIR}/man1/${MAN_PAGE_NAME}
#
# Build and install

View File

@@ -1,4 +1,5 @@
{
"originHash" : "fae67d9ce14b6664edc4151ad1a55b74d50d7281499f09eeca50b0376d0f837f",
"pins" : [
{
"identity" : "swift-argument-parser",
@@ -14,8 +15,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/lukepistrol/SwiftLintPlugin",
"state" : {
"revision" : "87454f5c9ff4d644086aec2a0df1ffba678e7f3c",
"version" : "0.57.1"
"revision" : "8e785a9801fc7961fef3d41ccb81acb3bd3d9735",
"version" : "0.60.0"
}
},
{
@@ -28,5 +29,5 @@
}
}
],
"version" : 2
"version" : 3
}

View File

@@ -1,4 +1,4 @@
// swift-tools-version:5.9
// swift-tools-version:6.1
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
@@ -18,7 +18,7 @@ let package = Package(
),
.package(
url: "https://github.com/lukepistrol/SwiftLintPlugin",
exact: "0.57.1"
exact: "0.60.0"
),
],
targets: [

View File

@@ -1,12 +1,12 @@
// Generated by ResgenSwift.Analytics 2.2.0
import Foundation
import MatomoTracker
import FirebaseAnalytics
import os
// MARK: - Protocol
public protocol AnalyticsManagerProtocol {
internal protocol AnalyticsManagerProtocol {
func logScreen(
name: String,
@@ -24,72 +24,6 @@ public protocol AnalyticsManagerProtocol {
func setEnable(_ enable: Bool)
}
// MARK: - Matomo
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,
params: [String: Any]?
) {
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,
action: String,
category: String,
params: [String: Any]?
) {
tracker.track(
eventWithCategory: category,
action: action,
name: name,
number: nil,
url: nil
)
}
func setEnable(_ enable: Bool) {
tracker.isOptedOut = !enable
}
}
// MARK: - Firebase
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
@@ -170,17 +104,16 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
// MARK: - Traker Type
public enum TrackerType: CaseIterable {
internal enum TrackerType: CaseIterable {
case matomo
case firebase
}
// MARK: - Manager
public class AnalyticsManager {
internal class AnalyticsManager {
public static var shared = AnalyticsManager()
internal static var shared = AnalyticsManager()
private init() {}
@@ -188,6 +121,8 @@ public class AnalyticsManager {
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
private var isDebugMode: Bool = false
private var isEnabled: Bool {
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
false
@@ -196,6 +131,8 @@ public class AnalyticsManager {
}
}
private let logger = Logger(subsystem: "resgen", category: "analytics")
// MARK: - Enable Methods
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
@@ -208,32 +145,55 @@ public class AnalyticsManager {
}
}
public func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
internal func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
setAnalytics(enable: true, analytics)
}
public func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
internal func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
setAnalytics(enable: false, analytics)
}
public func configure(siteId: String, url: String) {
managers[TrackerType.matomo] = MatomoAnalyticsManager(
siteId: siteId,
url: url
)
internal func configure(isDebugMode: Bool = false) {
self.isDebugMode = isDebugMode
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
}
// 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(
name: String,
path: String,
params: [String: Any]?
) {
guard isEnabled else { return }
guard isEnabled else {
if isDebugMode {
logger.log("Analytics disabled")
}
return
}
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(
name: name,
path: path,
@@ -248,9 +208,25 @@ public class AnalyticsManager {
category: String,
params: [String: Any]?
) {
guard isEnabled else { return }
guard isEnabled else {
if isDebugMode {
logger.log("Analytics disabled")
}
return
}
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(
name: name,
action: action,
@@ -262,7 +238,7 @@ public class AnalyticsManager {
// MARK: - section_one
public func logScreenS1DefOne(title: String) {
internal func logScreenS1DefOne(title: String) {
logScreen(
name: "s1 def one \(title)",
path: "s1_def_one/\(title)",
@@ -270,7 +246,7 @@ public class AnalyticsManager {
)
}
public func logEventS1DefTwo(
internal func logEventS1DefTwo(
title: String,
count: String,
test2: String = "test"
@@ -290,7 +266,7 @@ public class AnalyticsManager {
// MARK: - section_two
public func logScreenS2DefOne() {
internal func logScreenS2DefOne() {
logScreen(
name: "s2 def one",
path: "s2_def_one/",

View File

@@ -33,13 +33,13 @@ FORCE_FLAG="$1"
#echo "\n-------------------------\n"
## Strings
swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/sampleStrings.txt" \
--output-path "./Strings/Generated" \
--langs "fr en en-us" \
--default-lang "en" \
--extension-output-path "./Strings/Generated" \
--extension-name "String" \
--extension-suffix "GenAllScript"
#swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/sampleStrings.txt" \
# --output-path "./Strings/Generated" \
# --langs "fr en en-us" \
# --default-lang "en" \
# --extension-output-path "./Strings/Generated" \
# --extension-name "String" \
# --extension-suffix "GenAllScript"
#echo "\n-------------------------\n"
#
@@ -53,12 +53,9 @@ swift run -c release ResgenSwift strings stringium $FORCE_FLAG "./Strings/sample
#echo "\n-------------------------\n"
#
## Analytics
#swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \
# --target "firebase" \
# --extension-output-path "./Tags/Generated" \
# --extension-name "Analytics" \
# --extension-suffix "GenAllScript" \
# --static-members true
swift run -c release ResgenSwift analytics -f "./Tags/sampleTags.yml" \
--target "firebase" \
--output-file "./Tags/Generated/Analytics+GenAllScript.swift"
#
#echo "\n-------------------------\n"
#

View File

@@ -13,7 +13,7 @@ struct Analytics: ParsableCommand {
// MARK: - Command Configuration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "Generate analytics extension file.",
version: ResgenSwiftVersion
)
@@ -38,9 +38,6 @@ struct Analytics: ParsableCommand {
print("[\(Self.toolName)] Will generate analytics")
// Check requirements
guard checkRequirements() else { return }
// Parse input file
let sections = AnalyticsFileParser().parse(options.inputFile, target: options.target)

View File

@@ -143,6 +143,8 @@ enum AnalyticsGenerator {
visibility: ExtensionVisibility
) -> String {
"""
private var isDebugMode: Bool = false
private var isEnabled: Bool {
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
false
@@ -151,6 +153,8 @@ enum AnalyticsGenerator {
}
}
private let logger = Logger(subsystem: "resgen", category: "analytics")
// MARK: - Enable Methods
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
@@ -186,6 +190,8 @@ enum AnalyticsGenerator {
result.append("import FirebaseAnalytics")
}
result.append("import os")
return result.joined(separator: "\n")
}
@@ -193,14 +199,40 @@ enum AnalyticsGenerator {
"""
// 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(
name: String,
path: String,
params: [String: Any]?
) {
guard isEnabled else { return }
guard isEnabled else {
if isDebugMode {
logger.log("Analytics disabled")
}
return
}
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(
name: name,
path: path,
@@ -215,9 +247,25 @@ enum AnalyticsGenerator {
category: String,
params: [String: Any]?
) {
guard isEnabled else { return }
guard isEnabled else {
if isDebugMode {
logger.log("Analytics disabled")
}
return
}
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(
name: name,
action: action,
@@ -238,11 +286,13 @@ enum AnalyticsGenerator {
let footer = " }"
if targets.contains(TrackerType.matomo) {
header = "\(visibility) func configure(siteId: String, url: String) {"
header = "\(visibility) func configure(siteId: String, url: String, isDebugMode: Bool = false) {"
} else if targets.contains(TrackerType.firebase) {
header = "\(visibility) func configure() {"
header = "\(visibility) func configure(isDebugMode: Bool = false) {"
}
content.append(" self.isDebugMode = isDebugMode")
if targets.contains(TrackerType.matomo) {
content.append("""
managers[TrackerType.matomo] = MatomoAnalyticsManager(

View File

@@ -13,7 +13,7 @@ struct Fonts: ParsableCommand {
// MARK: - CommandConfiguration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "A utility to generate an helpful etension to access your custom font from code and also Info.plist UIAppsFont content.",
version: ResgenSwiftVersion
)

View File

@@ -13,7 +13,7 @@ struct Generate: ParsableCommand {
// MARK: - CommandConfiguration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "A utility to generate ressources based on a configuration file",
version: ResgenSwiftVersion
)

View File

@@ -38,8 +38,8 @@ extension StringsConfiguration: Runnable {
("--extension-suffix", extensionSuffix),
("--visibility", visibility),
("--asset-bundle", assetBundle),
("--xc-strings", staticMembers?.description),
("--static-members", xcStrings?.description)
("--xc-strings", xcStrings?.description),
("--static-members", staticMembers?.description)
].forEach { argumentName, argumentValue in
if let argumentValue {
args += [

View File

@@ -186,8 +186,6 @@ class XcassetsGenerator {
atomically: false,
encoding: .utf8
)
print("\(parsedImage.name) -> Generated")
}
// Success info

View File

@@ -13,7 +13,7 @@ struct Images: ParsableCommand {
// MARK: - CommandConfiguration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "A utility for generate images and an extension to access them easily.",
version: ResgenSwiftVersion
)

View File

@@ -176,21 +176,21 @@ enum StringsFileGenerator {
return // Go to next section
}
section.definitions.forEach { definition in // swiftlint:disable:this closure_body_length
var skipDefinition = false
section
.definitions
.forEach { definition in // swiftlint:disable:this closure_body_length
var isNoTranslation = false
var localizationTab: [XCStringLocalization] = []
if definition.hasOneOrMoreMatchingTags(inputTags: inputTags) == false {
skipDefinition = true
guard definition.hasOneOrMoreMatchingTags(inputTags: inputTags) else {
return
}
if definition.tags.contains(Stringium.noTranslationTag) {
isNoTranslation = true
}
if !skipDefinition {
if isNoTranslation {
// Search for langs in yaml
for lang in langs {
@@ -209,7 +209,8 @@ enum StringsFileGenerator {
}
} else {
// Search for langs in twine
for (lang, value) in definition.translations where !value.isEmpty {
for (lang, value) in definition.translations
where langs.contains(lang) && !value.isEmpty {
let localization = XCStringLocalization(
lang: lang,
content: XCStringLocalizationLangContent(
@@ -219,7 +220,6 @@ enum StringsFileGenerator {
)
)
)
print("VALUE: \(value)")
localizationTab.append(localization)
}
}
@@ -238,7 +238,6 @@ enum StringsFileGenerator {
xcStringDefinitionTab.append(xcStringDefinition)
}
}
}
let xcStringContainer = XCStringDefinitionContainer(strings: xcStringDefinitionTab)

View File

@@ -13,7 +13,7 @@ struct Stringium: ParsableCommand {
// MARK: - Command Configuration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "Generate strings with custom scripts.",
version: ResgenSwiftVersion
)

View File

@@ -11,7 +11,7 @@ import ToolCore
struct Strings: ParsableCommand {
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "A utility for generate strings.",
version: ResgenSwiftVersion,

View File

@@ -13,7 +13,7 @@ struct Tags: ParsableCommand {
// MARK: - Command Configuration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "Generate tags extension file.",
version: ResgenSwiftVersion
)

View File

@@ -13,7 +13,7 @@ struct Twine: ParsableCommand {
// MARK: - Command Configuration
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "Generate strings with twine.",
version: ResgenSwiftVersion
)

View File

@@ -11,7 +11,7 @@ import ToolCore
struct ResgenSwift: ParsableCommand {
static var configuration = CommandConfiguration(
static let configuration = CommandConfiguration(
abstract: "A utility for generate ressources.",
version: ResgenSwiftVersion,