Add visibility parameters to control scope of generated extension
Some checks failed
gitea-openium/resgen.swift/pipeline/head There was a failure building this commit

This commit is contained in:
2025-07-18 11:53:46 +02:00
parent beca2c6b2b
commit 7162f13166
61 changed files with 1511 additions and 791 deletions

View File

@ -251,7 +251,8 @@ enum StringsFileGenerator {
inputFilename: String,
extensionName: String,
extensionFilePath: String,
extensionSuffix: String
extensionSuffix: String,
visibility: ExtensionVisibility
) {
// Get extension content
let extensionFileContent = Self.getExtensionContent(
@ -261,7 +262,8 @@ enum StringsFileGenerator {
staticVar: staticVar,
inputFilename: inputFilename,
extensionName: extensionName,
extensionSuffix: extensionSuffix
extensionSuffix: extensionSuffix,
visibility: visibility
)
// Write content
@ -284,7 +286,8 @@ enum StringsFileGenerator {
staticVar: Bool,
inputFilename: String,
extensionName: String,
extensionSuffix: String
extensionSuffix: String,
visibility: ExtensionVisibility
) -> String {
[
Self.getHeader(
@ -295,13 +298,15 @@ enum StringsFileGenerator {
sections: sections,
tags: tags,
extensionClassname: extensionName,
extensionSuffix: extensionSuffix
extensionSuffix: extensionSuffix,
visibility: visibility
),
Self.getProperties(
sections: sections,
defaultLang: lang,
tags: tags,
staticVar: staticVar
staticVar: staticVar,
visibility: visibility
),
Self.getFooter()
]
@ -326,9 +331,10 @@ enum StringsFileGenerator {
sections: [Section],
tags: [String],
extensionClassname: String,
extensionSuffix: String
extensionSuffix: String,
visibility: ExtensionVisibility
) -> String {
var enumDefinition = "\n enum Key\(extensionSuffix.uppercasedFirst()): String {\n"
var enumDefinition = "\n \(visibility) enum Key\(extensionSuffix.uppercasedFirst()): String {\n"
// Enum
sections.forEach { section in
@ -347,7 +353,7 @@ enum StringsFileGenerator {
// KeyPath accessors
enumDefinition += "\n"
enumDefinition += " var keyPath: KeyPath<\(extensionClassname), String> {\n"
enumDefinition += " \(visibility) var keyPath: KeyPath<\(extensionClassname), String> {\n"
enumDefinition += " switch self {\n"
sections.forEach { section in
// Check that at least one string will be generated
@ -369,7 +375,13 @@ enum StringsFileGenerator {
return enumDefinition
}
private static func getProperties(sections: [Section], defaultLang lang: String, tags: [String], staticVar: Bool) -> String {
private static func getProperties(
sections: [Section],
defaultLang lang: String,
tags: [String],
staticVar: Bool,
visibility: ExtensionVisibility
) -> String {
sections.compactMap { section in
// Check that at least one string will be generated
guard section.hasOneOrMoreMatchingTags(tags: tags) else {
@ -382,10 +394,21 @@ enum StringsFileGenerator {
return nil // Go to next definition
}
if staticVar {
return "\n\(definition.getNSLocalizedStringStaticProperty(forLang: lang))"
}
return "\n\(definition.getNSLocalizedStringProperty(forLang: lang))"
let property: String = {
if staticVar {
definition.getNSLocalizedStringStaticProperty(
forLang: lang,
visibility: visibility
)
} else {
definition.getNSLocalizedStringProperty(
forLang: lang,
visibility: visibility
)
}
}()
return "\n\(property)"
}
.joined(separator: "\n")
return res

View File

@ -17,7 +17,8 @@ enum TagsGenerator {
tags: [String],
staticVar: Bool,
extensionName: String,
extensionFilePath: String
extensionFilePath: String,
visibility: ExtensionVisibility
) {
// Get extension content
let extensionFileContent = Self.getExtensionContent(
@ -25,7 +26,8 @@ enum TagsGenerator {
lang: lang,
tags: tags,
staticVar: staticVar,
extensionName: extensionName
extensionName: extensionName,
visibility: visibility
)
// Write content
@ -46,7 +48,8 @@ enum TagsGenerator {
lang: String,
tags: [String],
staticVar: Bool,
extensionName: String
extensionName: String,
visibility: ExtensionVisibility
) -> String {
[
Self.getHeader(
@ -57,7 +60,8 @@ enum TagsGenerator {
sections: sections,
lang: lang,
tags: tags,
staticVar: staticVar
staticVar: staticVar,
visibility: visibility
),
Self.getFooter()
]
@ -80,7 +84,8 @@ enum TagsGenerator {
sections: [Section],
lang: String,
tags: [String],
staticVar: Bool
staticVar: Bool,
visibility: ExtensionVisibility
) -> String {
sections
.compactMap { section in
@ -96,9 +101,9 @@ enum TagsGenerator {
}
if staticVar {
res += "\n\n\(definition.getStaticProperty(forLang: lang))"
res += "\n\n\(definition.getStaticProperty(forLang: lang, visibility: visibility))"
} else {
res += "\n\n\(definition.getProperty(forLang: lang))"
res += "\n\n\(definition.getProperty(forLang: lang, visibility: visibility))"
}
}
return res

View File

@ -6,6 +6,7 @@
//
import Foundation
import ToolCore
// swiftlint:disable force_unwrapping
@ -99,14 +100,20 @@ class Definition {
return (inputParameters: inputParameters, translationArguments: translationArguments)
}
private func getBaseProperty(lang: String, translation: String, isStatic: Bool, comment: String?) -> String {
private func getBaseProperty(
lang: String,
translation: String,
isStatic: Bool,
comment: String?,
visibility: ExtensionVisibility
) -> String {
"""
/// Translation in \(lang) :
/// \(translation)
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
\(isStatic ? "static " : "")var \(name): String {
\(visibility) \(isStatic ? "static " : "")var \(name): String {
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "\(comment ?? "")")
}
"""
@ -118,7 +125,8 @@ class Definition {
isStatic: Bool,
inputParameters: [String],
translationArguments: [String],
comment: String?
comment: String?,
visibility: ExtensionVisibility
) -> String {
"""
@ -127,13 +135,13 @@ class Definition {
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
\(isStatic ? "static " : "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
\(visibility) \(isStatic ? "static " : "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", ")))
}
"""
}
func getNSLocalizedStringProperty(forLang lang: String) -> String {
func getNSLocalizedStringProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@ -145,7 +153,8 @@ class Definition {
lang: lang,
translation: translation,
isStatic: false,
comment: self.comment
comment: self.comment,
visibility: visibility
)
// Generate method
@ -157,14 +166,15 @@ class Definition {
isStatic: false,
inputParameters: parameters.inputParameters,
translationArguments: parameters.translationArguments,
comment: self.comment
comment: self.comment,
visibility: visibility
)
}
return property + method
}
func getNSLocalizedStringStaticProperty(forLang lang: String) -> String {
func getNSLocalizedStringStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@ -176,7 +186,8 @@ class Definition {
lang: lang,
translation: translation,
isStatic: true,
comment: self.comment
comment: self.comment,
visibility: visibility
)
// Generate method
@ -188,7 +199,8 @@ class Definition {
isStatic: true,
inputParameters: parameters.inputParameters,
translationArguments: parameters.translationArguments,
comment: self.comment
comment: self.comment,
visibility: visibility
)
}
@ -197,7 +209,7 @@ class Definition {
// MARK: - Raw strings
func getProperty(forLang lang: String) -> String {
func getProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@ -210,14 +222,13 @@ class Definition {
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
var \(name): String {
\(visibility) var \(name): String {
"\(translation)"
}
"""
}
func getStaticProperty(forLang lang: String) -> String {
func getStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
guard let translation = translations[lang] else {
let error = StringiumError.langNotDefined(lang, name, reference != nil)
print(error.description)
@ -230,7 +241,7 @@ class Definition {
///
/// Comment :
/// \(comment?.isEmpty == false ? comment! : "No comment")
static var \(name): String {
\(visibility) static var \(name): String {
"\(translation)"
}
"""

View File

@ -72,7 +72,8 @@ struct Stringium: ParsableCommand {
inputFilename: options.inputFilenameWithoutExt,
extensionName: extensionName,
extensionFilePath: extensionFilePath,
extensionSuffix: options.extensionSuffix ?? ""
extensionSuffix: options.extensionSuffix ?? "",
visibility: options.extensionVisibility
)
}

View File

@ -7,6 +7,7 @@
import ArgumentParser
import Foundation
import ToolCore
// swiftlint:disable no_grouping_extension
@ -23,7 +24,7 @@ struct StringiumOptions: ParsableArguments {
@Option(
name: .customLong("output-path"),
help: "Path where to strings file.",
help: "Path where to find the .xcStrings file or the lproj folders.",
transform: { $0.replaceTiltWithHomeDirectoryPath() }
)
fileprivate var outputPathRaw: String
@ -49,6 +50,13 @@ struct StringiumOptions: ParsableArguments {
@Option(help: "Tell if it will generate xcStrings file or lproj file. True by default")
var xcStrings: Bool = true
@Option(
name: .customLong("visibility"),
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
completion: .list(["public", "private", "package", "internal"])
)
var extensionVisibility: ExtensionVisibility = .internal
@Option(
help: "Path where to generate the extension.",
transform: { $0.replaceTiltWithHomeDirectoryPath() }

View File

@ -49,7 +49,8 @@ struct Tags: ParsableCommand {
tags: ["ios", "iosonly", Self.noTranslationTag],
staticVar: options.staticMembers,
extensionName: options.extensionName,
extensionFilePath: options.extensionFilePath
extensionFilePath: options.extensionFilePath,
visibility: options.extensionVisibility
)
print("[\(Self.toolName)] Tags generated")

View File

@ -7,6 +7,7 @@
import ArgumentParser
import Foundation
import ToolCore
// swiftlint:disable no_grouping_extension
@ -21,7 +22,17 @@ struct TagsOptions: ParsableArguments {
@Option(help: "Lang to generate. (\"ium\" by default)")
var lang: String = "ium"
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
@Option(
name: .customLong("visibility"),
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
completion: .list(["public", "private", "package", "internal"])
)
var extensionVisibility: ExtensionVisibility = .internal
@Option(
help: "Path where to generate the extension.",
transform: { $0.replaceTiltWithHomeDirectoryPath() }
)
var extensionOutputPath: String
@Option(help: "Tell if it will generate static properties or not")