From a9c476bc1b4801bc1302573dc88106d20e17ec75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=B6ger?= Date: Mon, 16 Sep 2024 14:03:10 +0200 Subject: [PATCH] Implements static string extension. Resolves liamnichols/xcstrings-tool#113 (#114) --- .../Snippets/SourceFileSnippet.swift | 4 +++ Tests/PluginTests/PluginTests.swift | 27 +++++++++++++++++++ .../testGenerate.FormatSpecifiers.swift | 5 ++++ .../testGenerate.Localizable.swift | 5 ++++ .../testGenerate.Multiline.swift | 5 ++++ .../testGenerate.Positional.swift | 5 ++++ .../GenerateTests/testGenerate.Simple.swift | 5 ++++ .../testGenerate.Substitution.swift | 5 ++++ .../testGenerate.Variations.swift | 5 ++++ ...nerateWithLegacyFilesCombined.Legacy.swift | 5 ++++ ...testGenerateWithLegacyStrings.Legacy.swift | 5 ++++ ...GenerateWithLegacyStringsdict.Legacy.swift | 5 ++++ ...teWithPackageAccessLevel.Localizable.swift | 5 ++++ ...ateWithPublicAccessLevel.Localizable.swift | 5 ++++ 14 files changed, 91 insertions(+) diff --git a/Sources/StringGenerator/Snippets/SourceFileSnippet.swift b/Sources/StringGenerator/Snippets/SourceFileSnippet.swift index 0cc8bee..93085d8 100644 --- a/Sources/StringGenerator/Snippets/SourceFileSnippet.swift +++ b/Sources/StringGenerator/Snippets/SourceFileSnippet.swift @@ -10,6 +10,10 @@ struct SourceFileSnippet: Snippet { ExtensionSnippet(extending: .type(.String)) { StringStringsTableStructSnippet(stringsTable: sourceFile.stringExtension.stringsTableStruct) StringInitializerSnippet(stringsTable: sourceFile.stringExtension.stringsTableStruct) + StringsTableConversionStaticMethodSnippet( + stringsTable: sourceFile.stringExtension.stringsTableStruct, + returnType: .type(.String) + ) } ExtensionSnippet( diff --git a/Tests/PluginTests/PluginTests.swift b/Tests/PluginTests/PluginTests.swift index 01f3add..5a471fd 100644 --- a/Tests/PluginTests/PluginTests.swift +++ b/Tests/PluginTests/PluginTests.swift @@ -8,6 +8,10 @@ final class PluginTests: XCTestCase { String(localizable: .demoBasic), "A basic string" ) + XCTAssertEqual( + .localizable(.demoBasic), + "A basic string" + ) XCTAssertEqual( String(localized: .localizable(.multiline(2))), @@ -23,6 +27,13 @@ final class PluginTests: XCTestCase { spans 2 lines """ ) + XCTAssertEqual( + .localizable(.multiline(2)), + """ + A string that + spans 2 lines + """ + ) XCTAssertEqual( String(localized: .featureOne(.pluralExample(1))), @@ -32,6 +43,10 @@ final class PluginTests: XCTestCase { String(featureOne: .pluralExample(1)), "1 string remaining" ) + XCTAssertEqual( + .featureOne(.pluralExample(1)), + "1 string remaining" + ) XCTAssertEqual( String(localized: .featureOne(.pluralExample(10))), @@ -41,6 +56,10 @@ final class PluginTests: XCTestCase { String(featureOne: .pluralExample(10)), "10 strings remaining" ) + XCTAssertEqual( + .featureOne(.pluralExample(10)), + "10 strings remaining" + ) } func testSwiftUI() { @@ -59,11 +78,19 @@ final class PluginTests: XCTestCase { String(legacy: .simpleString("foo")), "This simple string: foo" ) + XCTAssertEqual( + .legacy(.simpleString("foo")), + "This simple string: foo" + ) XCTAssertEqual( String(legacy: .plural("John", 1)), "Hello John, I have 1 plural" ) + XCTAssertEqual( + .legacy(.plural("John", 1)), + "Hello John, I have 1 plural" + ) } func testComparisons() { diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.FormatSpecifiers.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.FormatSpecifiers.swift index 21e45f0..72dbf8e 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.FormatSpecifiers.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.FormatSpecifiers.swift @@ -355,6 +355,11 @@ extension String { arguments: formatSpecifiers.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘FormatSpecifiers‘ strings table. + internal static func formatSpecifiers(_ formatSpecifiers: String.FormatSpecifiers) -> String { + String(formatSpecifiers: formatSpecifiers) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Localizable.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Localizable.swift index 381ff12..c64ca8d 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Localizable.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Localizable.swift @@ -216,6 +216,11 @@ extension String { arguments: localizable.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Localizable‘ strings table. + internal static func localizable(_ localizable: String.Localizable) -> String { + String(localizable: localizable) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Multiline.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Multiline.swift index 07536f8..db5e5d8 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Multiline.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Multiline.swift @@ -162,6 +162,11 @@ extension String { arguments: multiline.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Multiline‘ strings table. + internal static func multiline(_ multiline: String.Multiline) -> String { + String(multiline: multiline) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Positional.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Positional.swift index b57586c..e6eeeb0 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Positional.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Positional.swift @@ -194,6 +194,11 @@ extension String { arguments: positional.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Positional‘ strings table. + internal static func positional(_ positional: String.Positional) -> String { + String(positional: positional) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Simple.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Simple.swift index 747cfaf..2482d60 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Simple.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Simple.swift @@ -157,6 +157,11 @@ extension String { arguments: simple.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Simple‘ strings table. + internal static func simple(_ simple: String.Simple) -> String { + String(simple: simple) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Substitution.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Substitution.swift index f812cd6..984e87a 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Substitution.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Substitution.swift @@ -161,6 +161,11 @@ extension String { arguments: substitution.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Substitution‘ strings table. + internal static func substitution(_ substitution: String.Substitution) -> String { + String(substitution: substitution) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Variations.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Variations.swift index 40e9074..49d8102 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Variations.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerate.Variations.swift @@ -172,6 +172,11 @@ extension String { arguments: variations.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Variations‘ strings table. + internal static func variations(_ variations: String.Variations) -> String { + String(variations: variations) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyFilesCombined.Legacy.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyFilesCombined.Legacy.swift index d107ed4..5090627 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyFilesCombined.Legacy.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyFilesCombined.Legacy.swift @@ -233,6 +233,11 @@ extension String { arguments: legacy.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Legacy‘ strings table. + internal static func legacy(_ legacy: String.Legacy) -> String { + String(legacy: legacy) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStrings.Legacy.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStrings.Legacy.swift index 5f75052..46d65c7 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStrings.Legacy.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStrings.Legacy.swift @@ -217,6 +217,11 @@ extension String { arguments: legacy.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Legacy‘ strings table. + internal static func legacy(_ legacy: String.Legacy) -> String { + String(legacy: legacy) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStringsdict.Legacy.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStringsdict.Legacy.swift index 0e59c7f..9159605 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStringsdict.Legacy.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithLegacyStringsdict.Legacy.swift @@ -158,6 +158,11 @@ extension String { arguments: legacy.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Legacy‘ strings table. + internal static func legacy(_ legacy: String.Legacy) -> String { + String(legacy: legacy) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPackageAccessLevel.Localizable.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPackageAccessLevel.Localizable.swift index 7c44dd6..4137d33 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPackageAccessLevel.Localizable.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPackageAccessLevel.Localizable.swift @@ -216,6 +216,11 @@ extension String { arguments: localizable.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Localizable‘ strings table. + package static func localizable(_ localizable: String.Localizable) -> String { + String(localizable: localizable) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) diff --git a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPublicAccessLevel.Localizable.swift b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPublicAccessLevel.Localizable.swift index 4cefdc2..219f788 100644 --- a/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPublicAccessLevel.Localizable.swift +++ b/Tests/XCStringsToolTests/__Snapshots__/GenerateTests/testGenerateWithPublicAccessLevel.Localizable.swift @@ -216,6 +216,11 @@ extension String { arguments: localizable.arguments.map(\.value) ) } + + /// Creates a `String` that represents a localized value in the ‘Localizable‘ strings table. + public static func localizable(_ localizable: String.Localizable) -> String { + String(localizable: localizable) + } } @available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)