From a8618386831b8008f6d34c271226ce11df066e6e Mon Sep 17 00:00:00 2001 From: Szymon Tur Date: Tue, 19 Mar 2024 14:30:43 +0100 Subject: [PATCH 1/4] Increase macOS Deployment Target --- SampleGenerator.xcodeproj/project.pbxproj | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/SampleGenerator.xcodeproj/project.pbxproj b/SampleGenerator.xcodeproj/project.pbxproj index 49659cb..7f45e27 100644 --- a/SampleGenerator.xcodeproj/project.pbxproj +++ b/SampleGenerator.xcodeproj/project.pbxproj @@ -434,7 +434,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -488,7 +488,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -503,9 +503,10 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = SampleGenerator/SampleGenerator.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = SampleGenerator/Info.plist; @@ -513,7 +514,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 13.0; PRODUCT_BUNDLE_IDENTIFIER = com.sftnhrd.SampleGenerator; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -526,9 +527,10 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = SampleGenerator/SampleGenerator.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = SampleGenerator/Info.plist; @@ -536,7 +538,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 13.0; PRODUCT_BUNDLE_IDENTIFIER = com.sftnhrd.SampleGenerator; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -549,7 +551,7 @@ CODE_SIGN_ENTITLEMENTS = Generator/Generator.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = Generator/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -570,7 +572,7 @@ CODE_SIGN_ENTITLEMENTS = Generator/Generator.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = Generator/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -591,7 +593,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = SampleGeneratorTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -611,7 +613,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z3544C935Q; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = SampleGeneratorTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", From 6113728aad50fdea1a725edaa32ae731fa1f6ad5 Mon Sep 17 00:00:00 2001 From: Szymon Tur Date: Tue, 19 Mar 2024 15:13:16 +0100 Subject: [PATCH 2/4] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 330d167..72baa45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore +.DS_Store ## User settings xcuserdata/ From d1cfd3780d87b9f1d4c0222af84b8a19a566b668 Mon Sep 17 00:00:00 2001 From: Szymon Tur Date: Tue, 19 Mar 2024 15:26:04 +0100 Subject: [PATCH 3/4] Add enum with Object types --- Generator/Line.swift | 3 +- Generator/Object/Object.swift | 51 ++++++++++++++++++++++++++++ SampleGeneratorTests/LineTests.swift | 2 +- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/Generator/Line.swift b/Generator/Line.swift index 661b474..aa9008c 100644 --- a/Generator/Line.swift +++ b/Generator/Line.swift @@ -74,8 +74,9 @@ private extension Line { let name = words[index + 1] let type = words[index + 2] + let castedType = Object.Property.PropertyType(string: type) - return .init(name: name, type: type) + return .init(name: name, type: type, castedType: castedType) } func containsEndOfObject(_ line: String) -> Bool { diff --git a/Generator/Object/Object.swift b/Generator/Object/Object.swift index 42267e8..f59c752 100644 --- a/Generator/Object/Object.swift +++ b/Generator/Object/Object.swift @@ -13,6 +13,25 @@ final class Object { struct Property { let name: String let type: String + let castedType: PropertyType? + + enum PropertyType { + case uuid + case string + case date + case timeInterval + case bool + case int + case decimal + case double + case float + case url + case array + case dictionary + case set + case unknownOptional + case unknownNonOptional + } } let name: String @@ -40,3 +59,35 @@ extension Object.Property { ) != nil } } + +extension Object.Property.PropertyType { + init(string: String) { + let matched = Self.patterns.first { + string.contains($0.value) + } + if let matched { + self = matched.key + } else if string.contains(Self.optionalPattern) { + self = .unknownOptional + } else { + self = .unknownNonOptional + } + } + + private static let patterns: [Self: Regex] = [ + .array: /\[\w+\??\]\??$/, + .dictionary: /\[\w+ ?: ?\w+\??\]\??$/, + .set: /Set\<\w+\??\>\??$/, + .uuid: /UUID\??$/, + .string: /String\??$/, + .date: /Date\??$/, + .timeInterval: /TimeInterval\??$/, + .bool: /Bool\??$/, + .int: /[Int|Int8|Int16|Int32|Int64|UInt]\??$/, + .decimal: /Decimal\??$/, + .double: /Double\??$/, + .float: /Float\??$/, + .url: /URL\??$/, + ] + private static let optionalPattern: Regex = /.*\?$/ +} diff --git a/SampleGeneratorTests/LineTests.swift b/SampleGeneratorTests/LineTests.swift index 082ecd7..2aceb12 100644 --- a/SampleGeneratorTests/LineTests.swift +++ b/SampleGeneratorTests/LineTests.swift @@ -33,7 +33,7 @@ class SampleGeneratorTests: XCTestCase { } func testClosurePropertyArgument() { - let property = Object.Property(name: "closure", type: "() -> Void") + let property = Object.Property(name: "closure", type: "() -> Void", newType: .unknownNonOptional) let argument = property.argument XCTAssertEqual(argument, " closure: @escaping () -> Void = <#default value#>") From bc432f1c088bb28d3ddc2f11dae44357b989ffbc Mon Sep 17 00:00:00 2001 From: Szymon Tur Date: Thu, 21 Mar 2024 09:24:30 +0100 Subject: [PATCH 4/4] Add default values for the known types --- Generator/Generator.swift | 2 -- Generator/Line.swift | 22 ++++++++++-------- Generator/Object/Object+Representation.swift | 5 +--- Generator/Object/Object+Sample.swift | 6 ++--- Generator/Object/Object.swift | 24 ++++++++++++++++++-- SampleGeneratorTests/LineTests.swift | 7 ------ 6 files changed, 37 insertions(+), 29 deletions(-) diff --git a/Generator/Generator.swift b/Generator/Generator.swift index 9681f47..def1020 100644 --- a/Generator/Generator.swift +++ b/Generator/Generator.swift @@ -13,7 +13,6 @@ struct Generator { } extension Generator { - func generateSamples() -> [String] { let objects = makeObjects() return objects.map { $0.sample } @@ -21,7 +20,6 @@ extension Generator { } private extension Generator { - func makeObjects() -> [Object] { var objects = [Object]() var currentObject: Object? diff --git a/Generator/Line.swift b/Generator/Line.swift index aa9008c..9d65647 100644 --- a/Generator/Line.swift +++ b/Generator/Line.swift @@ -76,7 +76,8 @@ private extension Line { let type = words[index + 2] let castedType = Object.Property.PropertyType(string: type) - return .init(name: name, type: type, castedType: castedType) + let property = Object.Property(name: name, type: type, castedType: castedType) + return property } func containsEndOfObject(_ line: String) -> Bool { @@ -84,16 +85,17 @@ private extension Line { } func findWords(_ line: String) -> [String] { - let declarationAndType = line - .components(separatedBy: ":") - .map { $0.trimmingCharacters(in: .whitespaces) } - .filter { !$0.isEmpty } + let delimiter: Character = ":" - guard - let declaration = declarationAndType.first, - let type = declarationAndType.last - else { return [] } + guard let index = line.firstIndex(of: delimiter) else { + return line.components(separatedBy: .whitespaces) + } - return declaration.components(separatedBy: .whitespaces) + [type] + let declaration = line.prefix(upTo: index) + let type = line.suffix(from: line.index(after: index)) + let result = (declaration.components(separatedBy: .whitespaces) + [String(type)]) + .map { $0.trimmingCharacters(in: .whitespaces) } + .filter { !$0.isEmpty } + return result } } diff --git a/Generator/Object/Object+Representation.swift b/Generator/Object/Object+Representation.swift index cfe3f2d..0ca50f2 100644 --- a/Generator/Object/Object+Representation.swift +++ b/Generator/Object/Object+Representation.swift @@ -9,7 +9,6 @@ import Foundation let singleIndent = " " - let representationTemplate = """ struct %@ { @@ -18,15 +17,14 @@ struct %@ { """ extension Object { - var representation: String { representation(indent: "") } } // MARK: Private -private extension Object { +private extension Object { func representation(indent: String) -> String { .init( format: representationTemplate, @@ -55,7 +53,6 @@ private extension Object { } extension Object.Property { - func representation(indent: String) -> String { indent + "let " + name + ": " + type } diff --git a/Generator/Object/Object+Sample.swift b/Generator/Object/Object+Sample.swift index cb89eac..59b709b 100644 --- a/Generator/Object/Object+Sample.swift +++ b/Generator/Object/Object+Sample.swift @@ -24,8 +24,6 @@ extension %@ { %@ """ -let defaultValue = " = <#default value" + "#" + ">" - let escaping = "@escaping " extension Object { @@ -76,9 +74,9 @@ private extension Object { } extension Object.Property { - var argument: String { - String(repeating: singleIndent, count: 2) + name + ": " + argumentType + defaultValue + let typeSuffix: String = argumentType + " = " + castedType.defaultValue(forName: name) + return String(repeating: singleIndent, count: 2) + name + ": " + typeSuffix } var body: String { diff --git a/Generator/Object/Object.swift b/Generator/Object/Object.swift index f59c752..b549c25 100644 --- a/Generator/Object/Object.swift +++ b/Generator/Object/Object.swift @@ -13,9 +13,9 @@ final class Object { struct Property { let name: String let type: String - let castedType: PropertyType? + let castedType: PropertyType - enum PropertyType { + enum PropertyType: Hashable { case uuid case string case date @@ -90,4 +90,24 @@ extension Object.Property.PropertyType { .url: /URL\??$/, ] private static let optionalPattern: Regex = /.*\?$/ + + func defaultValue(forName name: String) -> String { + switch self { + case .uuid: return "UUID()" + case .string: return "\"\(name)\"" + case .date: return "Date(timeIntervalSince1970: 1000)" + case .timeInterval: return Int.random(in: 100 ... 200).description + case .bool: return "false" + case .int: return Int.random(in: 0 ... 100).description + case .decimal: return "Decimal(\(Int.random(in: 0 ... 100))" + case .double: return Double.random(in: 0.0 ... 10.0).description + case .float: return Float.random(in: 0.0 ... 10.0).description + case .url: return "URL(string: \"https://foo.bar/\")" + case .array: return "[]" + case .dictionary: return "[:]" + case .set: return "Set()" + case .unknownOptional: return "nil" + case .unknownNonOptional: return "<#default value#" + ">" + } + } } diff --git a/SampleGeneratorTests/LineTests.swift b/SampleGeneratorTests/LineTests.swift index 2aceb12..5784734 100644 --- a/SampleGeneratorTests/LineTests.swift +++ b/SampleGeneratorTests/LineTests.swift @@ -31,11 +31,4 @@ class SampleGeneratorTests: XCTestCase { XCTAssert(true) } - - func testClosurePropertyArgument() { - let property = Object.Property(name: "closure", type: "() -> Void", newType: .unknownNonOptional) - - let argument = property.argument - XCTAssertEqual(argument, " closure: @escaping () -> Void = <#default value#>") - } }