From 06ba908c9acb7c36a5bd612686eb7e4fb03c614a Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Fri, 31 Jan 2025 21:48:22 +0100 Subject: [PATCH 01/26] Create .DS_Store --- .DS_Store | Bin 0 -> 6148 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e106018ace00893f5d353dae57055aab176212ab GIT binary patch literal 6148 zcmeHKy-LJD5S}psBQ_~5x3Uzkx5ypw3GM|X9z^9ruFyUYBidWo+xSGbg5T_nUX}}% zBF7BuezWtllYEff3=#3-VKpNviKxI3WKkwW%#*GI3l=BK9_x0tyzaZr#3ujMB+s7H z8MSmv_sR1gzFdrbU0>JDx^G}B?jD=@^V9o0^{;;QZ*E5190jCOhMFCrLwA=Tgtb8E^)i0cXG&5C(8(ixkI-K05=>fHUyJfSeBjL$ER& z6ywo>DYgK>9Ofv{rI(PLU|1Orits>KQ-PYw)?%=x!yYWIG8_~&o!FWWw#whl3&-l% zKg4k2O3`O$z!^vx$aGoC{eOv1X0pjoQ+(wNI0Jje0O$3xUf`wdZryo3xoZQ)6^4k! p4WdAxCqDsL$T@Nno$3#wBd#(W6lE8&$8@0o2t-1Bat8i@fiE~pL(u>L literal 0 HcmV?d00001 From d259a1853701ad7202f0d4a275d9e8721aa36d1b Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 17:45:17 +0100 Subject: [PATCH 02/26] Create MyBuildToolPlugin.swift --- .../Plugins/MyBuildToolPlugin.swift | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift diff --git a/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift b/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift new file mode 100644 index 0000000..fbb710f --- /dev/null +++ b/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift @@ -0,0 +1,56 @@ +import PackagePlugin + +@main +struct MyBuildToolPlugin: BuildToolPlugin { + /// Entry point for creating build commands for targets in Swift packages. + func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] { + // This plugin only runs for package targets that can have source files. + guard let sourceFiles = target.sourceModule?.sourceFiles else { return [] } + + // Find the code generator tool to run (replace this with the actual one). + let generatorTool = try context.tool(named: "my-code-generator") + + // Construct a build command for each source file with a particular suffix. + return sourceFiles.map(\.path).compactMap { + createBuildCommand(for: $0, in: context.pluginWorkDirectory, with: generatorTool.path) + } + } +} + +#if canImport(XcodeProjectPlugin) +import XcodeProjectPlugin + +extension MyBuildToolPlugin: XcodeBuildToolPlugin { + // Entry point for creating build commands for targets in Xcode projects. + func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] { + // Find the code generator tool to run (replace this with the actual one). + let generatorTool = try context.tool(named: "my-code-generator") + + // Construct a build command for each source file with a particular suffix. + return target.inputFiles.map(\.path).compactMap { + createBuildCommand(for: $0, in: context.pluginWorkDirectory, with: generatorTool.path) + } + } +} + +#endif + +extension MyBuildToolPlugin { + /// Shared function that returns a configured build command if the input files is one that should be processed. + func createBuildCommand(for inputPath: Path, in outputDirectoryPath: Path, with generatorToolPath: Path) -> Command? { + // Skip any file that doesn't have the extension we're looking for (replace this with the actual one). + guard inputPath.extension == "my-input-suffix" else { return .none } + + // Return a command that will run during the build to generate the output file. + let inputName = inputPath.lastComponent + let outputName = inputPath.stem + ".swift" + let outputPath = outputDirectoryPath.appending(outputName) + return .buildCommand( + displayName: "Generating \(outputName) from \(inputName)", + executable: generatorToolPath, + arguments: ["\(inputPath)", "-o", "\(outputPath)"], + inputFiles: [inputPath], + outputFiles: [outputPath] + ) + } +} From ce3b621ecb5cac4a78ba89f17529ead79f63ccf7 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 17:45:25 +0100 Subject: [PATCH 03/26] Create .gitignore --- MyBuildToolPlugin/.gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 MyBuildToolPlugin/.gitignore diff --git a/MyBuildToolPlugin/.gitignore b/MyBuildToolPlugin/.gitignore new file mode 100644 index 0000000..0023a53 --- /dev/null +++ b/MyBuildToolPlugin/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc From fc1931740898ea887af7a1cf45df82f990990d4d Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 17:45:32 +0100 Subject: [PATCH 04/26] Create Package.swift --- MyBuildToolPlugin/Package.swift | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 MyBuildToolPlugin/Package.swift diff --git a/MyBuildToolPlugin/Package.swift b/MyBuildToolPlugin/Package.swift new file mode 100644 index 0000000..ae7c77e --- /dev/null +++ b/MyBuildToolPlugin/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MyBuildToolPlugin", + products: [ + // Products can be used to vend plugins, making them visible to other packages. + .plugin( + name: "MyBuildToolPlugin", + targets: ["MyBuildToolPlugin"]), + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .plugin( + name: "MyBuildToolPlugin", + capability: .buildTool() + ), + ] +) From a065c3520399247485dc0741a14c2808a472d860 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 17:45:32 +0100 Subject: [PATCH 05/26] Create Package.swift --- 2qw/2qw.xcodeproj/project.pbxproj | 556 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 6435 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 58 ++ 2qw/2qw/Assets.xcassets/Contents.json | 6 + 2qw/2qw/Item.swift | 18 + .../Preview Assets.xcassets/Contents.json | 6 + 2qw/2qw/_qw.entitlements | 10 + 2qw/2qw/_qwApp.swift | 32 + 2qw/2qw/x.swift | 59 ++ 2qw/2qwTests/_qwTests.swift | 17 + 2qw/2qwUITests/_qwUITests.swift | 43 ++ 2qw/2qwUITests/_qwUITestsLaunchTests.swift | 33 ++ MyBuildToolPlugin/Package.swift | 22 + 16 files changed, 892 insertions(+) create mode 100644 2qw/2qw.xcodeproj/project.pbxproj create mode 100644 2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 2qw/2qw.xcodeproj/project.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 2qw/2qw/Assets.xcassets/Contents.json create mode 100644 2qw/2qw/Item.swift create mode 100644 2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 2qw/2qw/_qw.entitlements create mode 100644 2qw/2qw/_qwApp.swift create mode 100644 2qw/2qw/x.swift create mode 100644 2qw/2qwTests/_qwTests.swift create mode 100644 2qw/2qwUITests/_qwUITests.swift create mode 100644 2qw/2qwUITests/_qwUITestsLaunchTests.swift create mode 100644 MyBuildToolPlugin/Package.swift diff --git a/2qw/2qw.xcodeproj/project.pbxproj b/2qw/2qw.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6d695f7 --- /dev/null +++ b/2qw/2qw.xcodeproj/project.pbxproj @@ -0,0 +1,556 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXContainerItemProxy section */ + 4D4C766E2D4E87C3005E2F9B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4D4C76522D4E87C0005E2F9B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D4C76592D4E87C0005E2F9B; + remoteInfo = 2qw; + }; + 4D4C76782D4E87C3005E2F9B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4D4C76522D4E87C0005E2F9B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4D4C76592D4E87C0005E2F9B; + remoteInfo = 2qw; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 4D4C765A2D4E87C0005E2F9B /* 2qw.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 2qw.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 2qwTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 2qwUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 4D4C765C2D4E87C0005E2F9B /* 2qw */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = 2qw; + sourceTree = ""; + }; + 4D4C76702D4E87C3005E2F9B /* 2qwTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = 2qwTests; + sourceTree = ""; + }; + 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = 2qwUITests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4D4C76572D4E87C0005E2F9B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C766A2D4E87C3005E2F9B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C76742D4E87C3005E2F9B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4D4C76512D4E87C0005E2F9B = { + isa = PBXGroup; + children = ( + 4D4C765C2D4E87C0005E2F9B /* 2qw */, + 4D4C76702D4E87C3005E2F9B /* 2qwTests */, + 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */, + 4D4C765B2D4E87C0005E2F9B /* Products */, + ); + sourceTree = ""; + }; + 4D4C765B2D4E87C0005E2F9B /* Products */ = { + isa = PBXGroup; + children = ( + 4D4C765A2D4E87C0005E2F9B /* 2qw.app */, + 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */, + 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4D4C76592D4E87C0005E2F9B /* 2qw */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4D4C76812D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */; + buildPhases = ( + 4D4C76562D4E87C0005E2F9B /* Sources */, + 4D4C76572D4E87C0005E2F9B /* Frameworks */, + 4D4C76582D4E87C0005E2F9B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4D4C765C2D4E87C0005E2F9B /* 2qw */, + ); + name = 2qw; + packageProductDependencies = ( + ); + productName = 2qw; + productReference = 4D4C765A2D4E87C0005E2F9B /* 2qw.app */; + productType = "com.apple.product-type.application"; + }; + 4D4C766C2D4E87C3005E2F9B /* 2qwTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4D4C76842D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwTests" */; + buildPhases = ( + 4D4C76692D4E87C3005E2F9B /* Sources */, + 4D4C766A2D4E87C3005E2F9B /* Frameworks */, + 4D4C766B2D4E87C3005E2F9B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4D4C766F2D4E87C3005E2F9B /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4D4C76702D4E87C3005E2F9B /* 2qwTests */, + ); + name = 2qwTests; + packageProductDependencies = ( + ); + productName = 2qwTests; + productReference = 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4D4C76762D4E87C3005E2F9B /* 2qwUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4D4C76872D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwUITests" */; + buildPhases = ( + 4D4C76732D4E87C3005E2F9B /* Sources */, + 4D4C76742D4E87C3005E2F9B /* Frameworks */, + 4D4C76752D4E87C3005E2F9B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4D4C76792D4E87C3005E2F9B /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */, + ); + name = 2qwUITests; + packageProductDependencies = ( + ); + productName = 2qwUITests; + productReference = 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4D4C76522D4E87C0005E2F9B /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; + TargetAttributes = { + 4D4C76592D4E87C0005E2F9B = { + CreatedOnToolsVersion = 16.2; + }; + 4D4C766C2D4E87C3005E2F9B = { + CreatedOnToolsVersion = 16.2; + TestTargetID = 4D4C76592D4E87C0005E2F9B; + }; + 4D4C76762D4E87C3005E2F9B = { + CreatedOnToolsVersion = 16.2; + TestTargetID = 4D4C76592D4E87C0005E2F9B; + }; + }; + }; + buildConfigurationList = 4D4C76552D4E87C0005E2F9B /* Build configuration list for PBXProject "2qw" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4D4C76512D4E87C0005E2F9B; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 4D4C765B2D4E87C0005E2F9B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4D4C76592D4E87C0005E2F9B /* 2qw */, + 4D4C766C2D4E87C3005E2F9B /* 2qwTests */, + 4D4C76762D4E87C3005E2F9B /* 2qwUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4D4C76582D4E87C0005E2F9B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C766B2D4E87C3005E2F9B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C76752D4E87C3005E2F9B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4D4C76562D4E87C0005E2F9B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C76692D4E87C3005E2F9B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4D4C76732D4E87C3005E2F9B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4D4C766F2D4E87C3005E2F9B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4D4C76592D4E87C0005E2F9B /* 2qw */; + targetProxy = 4D4C766E2D4E87C3005E2F9B /* PBXContainerItemProxy */; + }; + 4D4C76792D4E87C3005E2F9B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4D4C76592D4E87C0005E2F9B /* 2qw */; + targetProxy = 4D4C76782D4E87C3005E2F9B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4D4C767F2D4E87C3005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4D4C76802D4E87C3005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 15.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 4D4C76822D4E87C3005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"2qw/Preview Content\""; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 4D4C76832D4E87C3005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"2qw/Preview Content\""; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 4D4C76852D4E87C3005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qwTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/2qw.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/2qw"; + }; + name = Debug; + }; + 4D4C76862D4E87C3005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qwTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/2qw.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/2qw"; + }; + name = Release; + }; + 4D4C76882D4E87C3005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qwUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = 2qw; + }; + name = Debug; + }; + 4D4C76892D4E87C3005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qwUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = 2qw; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4D4C76552D4E87C0005E2F9B /* Build configuration list for PBXProject "2qw" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4D4C767F2D4E87C3005E2F9B /* Debug */, + 4D4C76802D4E87C3005E2F9B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4D4C76812D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4D4C76822D4E87C3005E2F9B /* Debug */, + 4D4C76832D4E87C3005E2F9B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4D4C76842D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4D4C76852D4E87C3005E2F9B /* Debug */, + 4D4C76862D4E87C3005E2F9B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4D4C76872D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4D4C76882D4E87C3005E2F9B /* Debug */, + 4D4C76892D4E87C3005E2F9B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4D4C76522D4E87C0005E2F9B /* Project object */; +} diff --git a/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/2qw/2qw.xcodeproj/project.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate b/2qw/2qw.xcodeproj/project.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..e48b2058cf996d96b07cbf3969eb95ed3318208c GIT binary patch literal 6435 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 literal 0 HcmV?d00001 diff --git a/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..acd798f --- /dev/null +++ b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + 2qw.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json b/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json b/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..3f00db4 --- /dev/null +++ b/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/2qw/2qw/Assets.xcassets/Contents.json b/2qw/2qw/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/2qw/2qw/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/2qw/2qw/Item.swift b/2qw/2qw/Item.swift new file mode 100644 index 0000000..4aa3dc4 --- /dev/null +++ b/2qw/2qw/Item.swift @@ -0,0 +1,18 @@ +// +// Item.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import Foundation +import SwiftData + +@Model +final class Item { + var timestamp: Date + + init(timestamp: Date) { + self.timestamp = timestamp + } +} diff --git a/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json b/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/2qw/2qw/_qw.entitlements b/2qw/2qw/_qw.entitlements new file mode 100644 index 0000000..18aff0c --- /dev/null +++ b/2qw/2qw/_qw.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/2qw/2qw/_qwApp.swift b/2qw/2qw/_qwApp.swift new file mode 100644 index 0000000..334bc0c --- /dev/null +++ b/2qw/2qw/_qwApp.swift @@ -0,0 +1,32 @@ +// +// _qwApp.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import SwiftUI +import SwiftData + +@main +struct _qwApp: App { + var sharedModelContainer: ModelContainer = { + let schema = Schema([ + Item.self, + ]) + let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) + + do { + return try ModelContainer(for: schema, configurations: [modelConfiguration]) + } catch { + fatalError("Could not create ModelContainer: \(error)") + } + }() + + var body: some Scene { + WindowGroup { + ContentView() + } + .modelContainer(sharedModelContainer) + } +} diff --git a/2qw/2qw/x.swift b/2qw/2qw/x.swift new file mode 100644 index 0000000..6af8827 --- /dev/null +++ b/2qw/2qw/x.swift @@ -0,0 +1,59 @@ +// +// ContentView.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import SwiftUI +import SwiftData + +struct ContentView: View { + @Environment(\.modelContext) private var modelContext + @Query private var items: [Item] + + var body: some View { + NavigationSplitView { + List { + ForEach(items) { item in + NavigationLink { + Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") + } label: { + Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) + } + } + .onDelete(perform: deleteItems) + } + .navigationSplitViewColumnWidth(min: 180, ideal: 200) + .toolbar { + ToolbarItem { + Button(action: addItem) { + Label("Add Item", systemImage: "plus") + } + } + } + } detail: { + Text("Select an item") + } + } + + private func addItem() { + withAnimation { + let newItem = Item(timestamp: Date()) + modelContext.insert(newItem) + } + } + + private func deleteItems(offsets: IndexSet) { + withAnimation { + for index in offsets { + modelContext.delete(items[index]) + } + } + } +} + +#Preview { + ContentView() + .modelContainer(for: Item.self, inMemory: true) +} diff --git a/2qw/2qwTests/_qwTests.swift b/2qw/2qwTests/_qwTests.swift new file mode 100644 index 0000000..76340c4 --- /dev/null +++ b/2qw/2qwTests/_qwTests.swift @@ -0,0 +1,17 @@ +// +// _qwTests.swift +// 2qwTests +// +// Created by PF on 01/02/2025. +// + +import Testing +@testable import _qw + +struct _qwTests { + + @Test func example() async throws { + // Write your test here and use APIs like `#expect(...)` to check expected conditions. + } + +} diff --git a/2qw/2qwUITests/_qwUITests.swift b/2qw/2qwUITests/_qwUITests.swift new file mode 100644 index 0000000..8fc3dad --- /dev/null +++ b/2qw/2qwUITests/_qwUITests.swift @@ -0,0 +1,43 @@ +// +// _qwUITests.swift +// 2qwUITests +// +// Created by PF on 01/02/2025. +// + +import XCTest + +final class _qwUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + @MainActor + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + @MainActor + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/2qw/2qwUITests/_qwUITestsLaunchTests.swift b/2qw/2qwUITests/_qwUITestsLaunchTests.swift new file mode 100644 index 0000000..c8537b2 --- /dev/null +++ b/2qw/2qwUITests/_qwUITestsLaunchTests.swift @@ -0,0 +1,33 @@ +// +// _qwUITestsLaunchTests.swift +// 2qwUITests +// +// Created by PF on 01/02/2025. +// + +import XCTest + +final class _qwUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + @MainActor + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/MyBuildToolPlugin/Package.swift b/MyBuildToolPlugin/Package.swift new file mode 100644 index 0000000..ae7c77e --- /dev/null +++ b/MyBuildToolPlugin/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MyBuildToolPlugin", + products: [ + // Products can be used to vend plugins, making them visible to other packages. + .plugin( + name: "MyBuildToolPlugin", + targets: ["MyBuildToolPlugin"]), + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .plugin( + name: "MyBuildToolPlugin", + capability: .buildTool() + ), + ] +) From 56a16b86ea4ebc2e7ea46a1e62e325f335fd9861 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:16 +0100 Subject: [PATCH 06/26] Create 2qw.xcscheme Co-Authored-By: Morten Daniel Fornes --- .../xcshareddata/xcschemes/2qw.xcscheme | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme diff --git a/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme b/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme new file mode 100644 index 0000000..1d4bbb4 --- /dev/null +++ b/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From ee6173b6f07e00e058a6b1f01fc756424ab05f28 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:20 +0100 Subject: [PATCH 07/26] Create _qw.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/_qw.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 2qw/2qw/_qw.swift diff --git a/2qw/2qw/_qw.swift b/2qw/2qw/_qw.swift new file mode 100644 index 0000000..e7a113e --- /dev/null +++ b/2qw/2qw/_qw.swift @@ -0,0 +1,18 @@ +// +// _qw.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import Foundation + +/// This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. +class _qw: NSObject, _qwProtocol { + + /// This implements the example protocol. Replace the body of this class with the implementation of this service's protocol. + @objc func performCalculation(firstNumber: Int, secondNumber: Int, with reply: @escaping (Int) -> Void) { + let response = firstNumber + secondNumber + reply(response) + } +} From 747a22e9eb2c6b270f3cd7bbfcb19212faaa8d86 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:25 +0100 Subject: [PATCH 08/26] Delete _qwApp.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/_qwApp.swift | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 2qw/2qw/_qwApp.swift diff --git a/2qw/2qw/_qwApp.swift b/2qw/2qw/_qwApp.swift deleted file mode 100644 index 334bc0c..0000000 --- a/2qw/2qw/_qwApp.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// _qwApp.swift -// 2qw -// -// Created by PF on 01/02/2025. -// - -import SwiftUI -import SwiftData - -@main -struct _qwApp: App { - var sharedModelContainer: ModelContainer = { - let schema = Schema([ - Item.self, - ]) - let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false) - - do { - return try ModelContainer(for: schema, configurations: [modelConfiguration]) - } catch { - fatalError("Could not create ModelContainer: \(error)") - } - }() - - var body: some Scene { - WindowGroup { - ContentView() - } - .modelContainer(sharedModelContainer) - } -} From bb50b97053f6aa5396957f305d50804388d7b145 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:49 +0100 Subject: [PATCH 09/26] Update xcschememanagement.plist Co-Authored-By: Morten Daniel Fornes --- .../xcschemes/xcschememanagement.plist | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist index acd798f..148e708 100644 --- a/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,5 +10,13 @@ 0 + SuppressBuildableAutocreation + + 4D4C76A42D4E9104005E2F9B + + primary + + + From 27696f44184e580f7c240f758a992dc73862dd67 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:51 +0100 Subject: [PATCH 10/26] Delete Contents.json Co-Authored-By: Morten Daniel Fornes --- .../AccentColor.colorset/Contents.json | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json b/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/2qw/2qw/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} From 8186c54f724fd7a66af18a0f00faac0bc22f1b0a Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:32:56 +0100 Subject: [PATCH 11/26] Create _qwProtocol.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/_qwProtocol.swift | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 2qw/2qw/_qwProtocol.swift diff --git a/2qw/2qw/_qwProtocol.swift b/2qw/2qw/_qwProtocol.swift new file mode 100644 index 0000000..e2c9909 --- /dev/null +++ b/2qw/2qw/_qwProtocol.swift @@ -0,0 +1,35 @@ +// +// _qwProtocol.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import Foundation + +/// The protocol that this service will vend as its API. This protocol will also need to be visible to the process hosting the service. +@objc protocol _qwProtocol { + + /// Replace the API of this protocol with an API appropriate to the service you are vending. + func performCalculation(firstNumber: Int, secondNumber: Int, with reply: @escaping (Int) -> Void) +} + +/* + To use the service from an application or other process, use NSXPCConnection to establish a connection to the service by doing something like this: + + connectionToService = NSXPCConnection(serviceName: "p.-qw") + connectionToService.remoteObjectInterface = NSXPCInterface(with: _qwProtocol.self) + connectionToService.resume() + + Once you have a connection to the service, you can use it like this: + + if let proxy = connectionToService.remoteObjectProxy as? _qwProtocol { + proxy.performCalculation(firstNumber: 23, secondNumber: 19) { result in + NSLog("Result of calculation is: \(result)") + } + } + + And, when you are finished with the service, clean up the connection like this: + + connectionToService.invalidate() +*/ From 10a48c7f349c218e85be0cf20d1e1a26e488e26a Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:37:06 +0100 Subject: [PATCH 12/26] * Add a section mentioning the new `MyBuildToolPlugin` * **MyBuildToolPlugin** - Describe the new plugin and its purpose - Mention the location of the plugin's definition and main source file --- .DS_Store | Bin 6148 -> 6198 bytes README.md | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/.DS_Store b/.DS_Store index e106018ace00893f5d353dae57055aab176212ab..fd3904ec67e0e6fe1089f482fd4d4d90e492d54e 100644 GIT binary patch delta 222 zcmZoM*k-UnjWPKB{=GH~3=Av`dJO3dnG7Yl`7SO=Ir&LIF^(*tWRfG0fFMUybt$;i zO-^StWrJv$JdaV_1i}%{Lj7xR`-rlWlmcz;uI%9f;n% WU&NJpVgb))b^%)!u!O4!rUC#hzF;T- delta 169 zcmdmH&|SjIYe|yh@@2;+2Qo^rL7A0| zrnY|%0wtM&igOv#k(H}`*(Q*_?3g36Yzo{ksO;wdj7eOK4Ucontact us for details. +## MyBuildToolPlugin + +The `MyBuildToolPlugin` is a new plugin added to the project. It provides a build tool capability for generating code during the build process. The plugin is defined in the `MyBuildToolPlugin/Package.swift` file and the main source file is `MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift`. + From 5646394137e8baacc1f82d1b1a905d23725df359 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:39:39 +0100 Subject: [PATCH 13/26] Update project.pbxproj Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw.xcodeproj/project.pbxproj | 407 +++++++----------------------- 1 file changed, 89 insertions(+), 318 deletions(-) diff --git a/2qw/2qw.xcodeproj/project.pbxproj b/2qw/2qw.xcodeproj/project.pbxproj index 6d695f7..89410b6 100644 --- a/2qw/2qw.xcodeproj/project.pbxproj +++ b/2qw/2qw.xcodeproj/project.pbxproj @@ -6,63 +6,33 @@ objectVersion = 77; objects = { -/* Begin PBXContainerItemProxy section */ - 4D4C766E2D4E87C3005E2F9B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4D4C76522D4E87C0005E2F9B /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4D4C76592D4E87C0005E2F9B; - remoteInfo = 2qw; - }; - 4D4C76782D4E87C3005E2F9B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4D4C76522D4E87C0005E2F9B /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4D4C76592D4E87C0005E2F9B; - remoteInfo = 2qw; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ - 4D4C765A2D4E87C0005E2F9B /* 2qw.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = 2qw.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 2qwTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = 2qwUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = 2qw.xpc; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4D4C76B02D4E9104005E2F9B /* Exceptions for "2qw" folder in "2qw" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4D4C76A42D4E9104005E2F9B /* 2qw */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ - 4D4C765C2D4E87C0005E2F9B /* 2qw */ = { + 4D4C76A72D4E9104005E2F9B /* 2qw */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4D4C76B02D4E9104005E2F9B /* Exceptions for "2qw" folder in "2qw" target */, + ); path = 2qw; sourceTree = ""; }; - 4D4C76702D4E87C3005E2F9B /* 2qwTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = 2qwTests; - sourceTree = ""; - }; - 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = 2qwUITests; - sourceTree = ""; - }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ - 4D4C76572D4E87C0005E2F9B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C766A2D4E87C3005E2F9B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C76742D4E87C3005E2F9B /* Frameworks */ = { + 4D4C76A22D4E9104005E2F9B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -72,22 +42,18 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 4D4C76512D4E87C0005E2F9B = { + 4D4C769C2D4E9104005E2F9B = { isa = PBXGroup; children = ( - 4D4C765C2D4E87C0005E2F9B /* 2qw */, - 4D4C76702D4E87C3005E2F9B /* 2qwTests */, - 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */, - 4D4C765B2D4E87C0005E2F9B /* Products */, + 4D4C76A72D4E9104005E2F9B /* 2qw */, + 4D4C76A62D4E9104005E2F9B /* Products */, ); sourceTree = ""; }; - 4D4C765B2D4E87C0005E2F9B /* Products */ = { + 4D4C76A62D4E9104005E2F9B /* Products */ = { isa = PBXGroup; children = ( - 4D4C765A2D4E87C0005E2F9B /* 2qw.app */, - 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */, - 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */, + 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */, ); name = Products; sourceTree = ""; @@ -95,134 +61,64 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 4D4C76592D4E87C0005E2F9B /* 2qw */ = { + 4D4C76A42D4E9104005E2F9B /* 2qw */ = { isa = PBXNativeTarget; - buildConfigurationList = 4D4C76812D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */; + buildConfigurationList = 4D4C76B12D4E9104005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */; buildPhases = ( - 4D4C76562D4E87C0005E2F9B /* Sources */, - 4D4C76572D4E87C0005E2F9B /* Frameworks */, - 4D4C76582D4E87C0005E2F9B /* Resources */, + 4D4C76A12D4E9104005E2F9B /* Sources */, + 4D4C76A22D4E9104005E2F9B /* Frameworks */, + 4D4C76A32D4E9104005E2F9B /* Resources */, ); buildRules = ( ); dependencies = ( ); fileSystemSynchronizedGroups = ( - 4D4C765C2D4E87C0005E2F9B /* 2qw */, + 4D4C76A72D4E9104005E2F9B /* 2qw */, ); name = 2qw; packageProductDependencies = ( ); productName = 2qw; - productReference = 4D4C765A2D4E87C0005E2F9B /* 2qw.app */; - productType = "com.apple.product-type.application"; - }; - 4D4C766C2D4E87C3005E2F9B /* 2qwTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D4C76842D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwTests" */; - buildPhases = ( - 4D4C76692D4E87C3005E2F9B /* Sources */, - 4D4C766A2D4E87C3005E2F9B /* Frameworks */, - 4D4C766B2D4E87C3005E2F9B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4D4C766F2D4E87C3005E2F9B /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 4D4C76702D4E87C3005E2F9B /* 2qwTests */, - ); - name = 2qwTests; - packageProductDependencies = ( - ); - productName = 2qwTests; - productReference = 4D4C766D2D4E87C3005E2F9B /* 2qwTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 4D4C76762D4E87C3005E2F9B /* 2qwUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4D4C76872D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwUITests" */; - buildPhases = ( - 4D4C76732D4E87C3005E2F9B /* Sources */, - 4D4C76742D4E87C3005E2F9B /* Frameworks */, - 4D4C76752D4E87C3005E2F9B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4D4C76792D4E87C3005E2F9B /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 4D4C767A2D4E87C3005E2F9B /* 2qwUITests */, - ); - name = 2qwUITests; - packageProductDependencies = ( - ); - productName = 2qwUITests; - productReference = 4D4C76772D4E87C3005E2F9B /* 2qwUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; + productReference = 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */; + productType = "com.apple.product-type.xpc-service"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 4D4C76522D4E87C0005E2F9B /* Project object */ = { + 4D4C769D2D4E9104005E2F9B /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1620; LastUpgradeCheck = 1620; TargetAttributes = { - 4D4C76592D4E87C0005E2F9B = { - CreatedOnToolsVersion = 16.2; - }; - 4D4C766C2D4E87C3005E2F9B = { + 4D4C76A42D4E9104005E2F9B = { CreatedOnToolsVersion = 16.2; - TestTargetID = 4D4C76592D4E87C0005E2F9B; - }; - 4D4C76762D4E87C3005E2F9B = { - CreatedOnToolsVersion = 16.2; - TestTargetID = 4D4C76592D4E87C0005E2F9B; }; }; }; - buildConfigurationList = 4D4C76552D4E87C0005E2F9B /* Build configuration list for PBXProject "2qw" */; + buildConfigurationList = 4D4C76A02D4E9104005E2F9B /* Build configuration list for PBXProject "2qw" */; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 4D4C76512D4E87C0005E2F9B; + mainGroup = 4D4C769C2D4E9104005E2F9B; minimizedProjectReferenceProxies = 1; preferredProjectObjectVersion = 77; - productRefGroup = 4D4C765B2D4E87C0005E2F9B /* Products */; + productRefGroup = 4D4C76A62D4E9104005E2F9B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 4D4C76592D4E87C0005E2F9B /* 2qw */, - 4D4C766C2D4E87C3005E2F9B /* 2qwTests */, - 4D4C76762D4E87C3005E2F9B /* 2qwUITests */, + 4D4C76A42D4E9104005E2F9B /* 2qw */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 4D4C76582D4E87C0005E2F9B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C766B2D4E87C3005E2F9B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C76752D4E87C3005E2F9B /* Resources */ = { + 4D4C76A32D4E9104005E2F9B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -232,21 +128,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 4D4C76562D4E87C0005E2F9B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C76692D4E87C3005E2F9B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4D4C76732D4E87C3005E2F9B /* Sources */ = { + 4D4C76A12D4E9104005E2F9B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -255,21 +137,52 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 4D4C766F2D4E87C3005E2F9B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4D4C76592D4E87C0005E2F9B /* 2qw */; - targetProxy = 4D4C766E2D4E87C3005E2F9B /* PBXContainerItemProxy */; +/* Begin XCBuildConfiguration section */ + 4D4C76B22D4E9104005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = 2qw/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = 2qw; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; }; - 4D4C76792D4E87C3005E2F9B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 4D4C76592D4E87C0005E2F9B /* 2qw */; - targetProxy = 4D4C76782D4E87C3005E2F9B /* PBXContainerItemProxy */; + 4D4C76B32D4E9104005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = 2qw/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = 2qw; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 4D4C767F2D4E87C3005E2F9B /* Debug */ = { + 4D4C76B42D4E9104005E2F9B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -332,7 +245,7 @@ }; name = Debug; }; - 4D4C76802D4E87C3005E2F9B /* Release */ = { + 4D4C76B52D4E9104005E2F9B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -387,170 +300,28 @@ }; name = Release; }; - 4D4C76822D4E87C3005E2F9B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"2qw/Preview Content\""; - DEVELOPMENT_TEAM = S9ZL84LCM9; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 4D4C76832D4E87C3005E2F9B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"2qw/Preview Content\""; - DEVELOPMENT_TEAM = S9ZL84LCM9; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 4D4C76852D4E87C3005E2F9B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = S9ZL84LCM9; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qwTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/2qw.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/2qw"; - }; - name = Debug; - }; - 4D4C76862D4E87C3005E2F9B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = S9ZL84LCM9; - GENERATE_INFOPLIST_FILE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qwTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/2qw.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/2qw"; - }; - name = Release; - }; - 4D4C76882D4E87C3005E2F9B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = S9ZL84LCM9; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qwUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = 2qw; - }; - name = Debug; - }; - 4D4C76892D4E87C3005E2F9B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = S9ZL84LCM9; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "p.-qwUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TEST_TARGET_NAME = 2qw; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4D4C76552D4E87C0005E2F9B /* Build configuration list for PBXProject "2qw" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4D4C767F2D4E87C3005E2F9B /* Debug */, - 4D4C76802D4E87C3005E2F9B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D4C76812D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4D4C76822D4E87C3005E2F9B /* Debug */, - 4D4C76832D4E87C3005E2F9B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4D4C76842D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwTests" */ = { + 4D4C76A02D4E9104005E2F9B /* Build configuration list for PBXProject "2qw" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4D4C76852D4E87C3005E2F9B /* Debug */, - 4D4C76862D4E87C3005E2F9B /* Release */, + 4D4C76B42D4E9104005E2F9B /* Debug */, + 4D4C76B52D4E9104005E2F9B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4D4C76872D4E87C3005E2F9B /* Build configuration list for PBXNativeTarget "2qwUITests" */ = { + 4D4C76B12D4E9104005E2F9B /* Build configuration list for PBXNativeTarget "2qw" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4D4C76882D4E87C3005E2F9B /* Debug */, - 4D4C76892D4E87C3005E2F9B /* Release */, + 4D4C76B22D4E9104005E2F9B /* Debug */, + 4D4C76B32D4E9104005E2F9B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 4D4C76522D4E87C0005E2F9B /* Project object */; + rootObject = 4D4C769D2D4E9104005E2F9B /* Project object */; } From cc5629ee6e59b36ed564ea02bc4031fc9ca8ed04 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:39:49 +0100 Subject: [PATCH 14/26] Delete Contents.json Co-Authored-By: Morten Daniel Fornes --- .../AppIcon.appiconset/Contents.json | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json b/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 3f00db4..0000000 --- a/2qw/2qw/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images" : [ - { - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} From 6282461069f83000e23487e11dcf9e541bd643fa Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:39:58 +0100 Subject: [PATCH 15/26] Delete Contents.json Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/Assets.xcassets/Contents.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 2qw/2qw/Assets.xcassets/Contents.json diff --git a/2qw/2qw/Assets.xcassets/Contents.json b/2qw/2qw/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/2qw/2qw/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} From 0819120c5c929eb09df004c04fa75b8dc152e300 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:07 +0100 Subject: [PATCH 16/26] Update UserInterfaceState.xcuserstate Co-Authored-By: Morten Daniel Fornes --- .../UserInterfaceState.xcuserstate | Bin 6435 -> 33078 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/2qw/2qw.xcodeproj/project.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate b/2qw/2qw.xcodeproj/project.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate index e48b2058cf996d96b07cbf3969eb95ed3318208c..bcf77f17aab95132c96a5d89ab0eed6617758b74 100644 GIT binary patch literal 33078 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

C0EfQ|+x9R;&y!{ujeo(NX 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

Dz^TwZy7mOE;f7YXV zrk<-8>h0?T>Qm}V>s#t?tG~B?Mg1%FyXxO)7}+qs!M7p2A-*A@A*ms^p|qjAVQPb} zp|)XKLu;N!yya4>e``_e Z)K+6_Yis}Aml&JvSc>eSCcjqk{{y*;j!FOk delta 3487 zcmZ`*33wDm7Jjd1I@3LUqKy_5OOt-?e=<*O<6C zkJAE6@{|1I;C>hn6QBr+p#(~y3@Tv;%mhCWJOXoJJ}dwWo`k31S$GasLIXSxYheRy zgty>r*az>xyRaV)z(F_!hv5jEf)nr_oP+n_1Na2KgG=x|T!t&~16+mQ5fG8X5EM|t zP&6>ij~y`zqcI*6FcFh58PhNwGq68q;(a&<$Kp7=AIIYa%)^N|8K+{Gsb#DG}A)|RF+p)}BT}32x}eP# zSPNk>xC5|=x(6VaIUv?bFuQh(N~=hN;L{?u6qbRz0iK3us0ZEN0Lx(o#Zw{^_jJhh zLp=oQDWTbXBdi*olbc>y>6zI8jZkx<$!V)$O+6(wORR(S6LNBgRr@?Fa!rDbur4SX zl{T%(>MgS`zz%S)hfS~LYO^`}hAqHG#RGiWBwVz_#fX=<77Ar$5>F0vm!ldZRi*q zt^uVt<2(&##^vM=Dx2h;G2G*u+5l&nKQDDm8VVo6ngD!611PD*LFeIfaIa<;gn#Um=Ir@<0`x&gzX=KriU>vqD3 zJgwD#>*o4A1;q^*8C3osi&jn7RtY!Vk1^Pd)g*StF4z@g>3$kd6DV&Lc1Jht#2z$} zyv&Pb%#ZzI`*p(<>=P94iFaTx>`flZrvjR^ic!{1mfF!QE*UJn6(+ta_AkRQ3vD3c97dCA3QeU#DxzX4q0+TXJ=hrMH8-|Rum$I^7wB|%_MphXXo|KGrt;__P-?`c7{f+2gB9%9J;LXl%` z1v@IOaN-|~H{j}9$}PHU7~FM44DQ41RI}nDi*OU}0{2GTj9c(U+=?&ZHhdYk<14rW zU&Wm?haRE1^eD}v$EcR(Qyo1{3uxg+SdOpZ9<;Npc!O>FCccGs+{Z#5Pm5?VtE>#N zn3*SODI3=}rNHeyKDXj-cl*tZO0TE5qP(!oSC!6w3DZ43@1&LlJcDPOUDh)3K7Pn3 z96z8X0sM%bpvdv;$ie!_^;H&@P03B1*367}fz>qV#L=x}zKCB0IhoA`@Jo8?rmvIn zn;`21C0kerFX0bCUwx04@d`an&(N|)yox{KHCj&3(Msm4{spyu{1tx>2Jbgo5#WIS zO0iAWIXi@MJQu>)x`(f@)Ekw)Z%zLT5vkkg*`~7O1WshMlF5$QzzMg08Jxt)e>f@^ z%4y9LO*z3CO;is8w1r4;LxMHGO!i|Vu4CcZ!!9Dn*rnqvyLNoct{oTfQ?_3ucRQEH zWpJ5XHaCzP%njvoxZ#|KE8x7`6t0jf=1RG8ZW>p`HFCSS12)N)Y#U{(v@NhLv@No2 zw(YhZv>mn`wH>#ew4Jt{wVktlVf)JVjqRVdOSa3lA8bF`{6EK(o@F0nFR{&*$s-1^iMzz^~_D;dk?I^XK_*`Ahs|{wjZszaCTlz&2e3b5V{F>2z`ZAAx+2<1_*lE0RJP-I0{VwF3UfyzBft};>?t&CCfl}XBEWvWu7 zlql7TUzx8oD4UfX%1&jsvPXGc*{>W_4l75MJrsbpHiPzm#Hh%{p$75&Y>eiDRfKd1x?q&wFoUr>#TLvx@oD} z0Bxw2qYc;Y)$+8-+ElGbE77X7YOO|_sXd_8YD=|s+E#6^woiLkJD?rXPHLyMv)VcB z1MO4od+oAcyP{pyuIYB&p^Lh#tGcGQ)x-5pdZZq$C+NNOK6+n0RnO7~=!5hj`Y?U8 zK2a~#efo5LhCWMwSf8WM)#vH8`U-uO{-ScNwl$u6Wll*I3sqSHSg>YrpHF>u19>Ivf3r!Nw3{ zsF7ogGbR`ljRM1KOfjmBnZ|5mt})N3HI^F7j1|UnM!nHsY%n$%Ta2y7USpr}u5rLP zWSlfk8)uDk#s|g?Gua$(7MZ1HxmjuY%<1MVbB=BwsTbGNzQ bJYXI)51VJqv(0xtj=TA8)% Date: Sat, 1 Feb 2025 18:40:15 +0100 Subject: [PATCH 17/26] Create Info.plist Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/Info.plist | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 2qw/2qw/Info.plist diff --git a/2qw/2qw/Info.plist b/2qw/2qw/Info.plist new file mode 100644 index 0000000..c123a5d --- /dev/null +++ b/2qw/2qw/Info.plist @@ -0,0 +1,11 @@ + + + + + XPCService + + ServiceType + Application + + + From 7403d4155cb0e7a98b6d5cac215a80a18d63ce0c Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:22 +0100 Subject: [PATCH 18/26] Update _qw.entitlements Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/_qw.entitlements | 2 -- 1 file changed, 2 deletions(-) diff --git a/2qw/2qw/_qw.entitlements b/2qw/2qw/_qw.entitlements index 18aff0c..852fa1a 100644 --- a/2qw/2qw/_qw.entitlements +++ b/2qw/2qw/_qw.entitlements @@ -4,7 +4,5 @@ com.apple.security.app-sandbox - com.apple.security.files.user-selected.read-only - From 8f4adf7ccddec505ec28f53aa4ab96ea3d3ec997 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:25 +0100 Subject: [PATCH 19/26] Delete _qwTests.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qwTests/_qwTests.swift | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 2qw/2qwTests/_qwTests.swift diff --git a/2qw/2qwTests/_qwTests.swift b/2qw/2qwTests/_qwTests.swift deleted file mode 100644 index 76340c4..0000000 --- a/2qw/2qwTests/_qwTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// _qwTests.swift -// 2qwTests -// -// Created by PF on 01/02/2025. -// - -import Testing -@testable import _qw - -struct _qwTests { - - @Test func example() async throws { - // Write your test here and use APIs like `#expect(...)` to check expected conditions. - } - -} From 309d66d090891050c89de7b12e93df7a62f2d745 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:28 +0100 Subject: [PATCH 20/26] Delete x.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/x.swift | 59 ------------------------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 2qw/2qw/x.swift diff --git a/2qw/2qw/x.swift b/2qw/2qw/x.swift deleted file mode 100644 index 6af8827..0000000 --- a/2qw/2qw/x.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// ContentView.swift -// 2qw -// -// Created by PF on 01/02/2025. -// - -import SwiftUI -import SwiftData - -struct ContentView: View { - @Environment(\.modelContext) private var modelContext - @Query private var items: [Item] - - var body: some View { - NavigationSplitView { - List { - ForEach(items) { item in - NavigationLink { - Text("Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))") - } label: { - Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard)) - } - } - .onDelete(perform: deleteItems) - } - .navigationSplitViewColumnWidth(min: 180, ideal: 200) - .toolbar { - ToolbarItem { - Button(action: addItem) { - Label("Add Item", systemImage: "plus") - } - } - } - } detail: { - Text("Select an item") - } - } - - private func addItem() { - withAnimation { - let newItem = Item(timestamp: Date()) - modelContext.insert(newItem) - } - } - - private func deleteItems(offsets: IndexSet) { - withAnimation { - for index in offsets { - modelContext.delete(items[index]) - } - } - } -} - -#Preview { - ContentView() - .modelContainer(for: Item.self, inMemory: true) -} From 88c606f4e60d113cfbec45558aecf523f738a120 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:30 +0100 Subject: [PATCH 21/26] Delete Contents.json Co-Authored-By: Morten Daniel Fornes --- .../Preview Content/Preview Assets.xcassets/Contents.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json b/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/2qw/2qw/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} From 064af125ccab935ed1d27d446087d4870d687461 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:33 +0100 Subject: [PATCH 22/26] Create main.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/main.swift | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 2qw/2qw/main.swift diff --git a/2qw/2qw/main.swift b/2qw/2qw/main.swift new file mode 100644 index 0000000..27dccea --- /dev/null +++ b/2qw/2qw/main.swift @@ -0,0 +1,39 @@ +// +// main.swift +// 2qw +// +// Created by PF on 01/02/2025. +// + +import Foundation + +class ServiceDelegate: NSObject, NSXPCListenerDelegate { + + /// This method is where the NSXPCListener configures, accepts, and resumes a new incoming NSXPCConnection. + func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { + + // Configure the connection. + // First, set the interface that the exported object implements. + newConnection.exportedInterface = NSXPCInterface(with: _qwProtocol.self) + + // Next, set the object that the connection exports. All messages sent on the connection to this service will be sent to the exported object to handle. The connection retains the exported object. + let exportedObject = _qw() + newConnection.exportedObject = exportedObject + + // Resuming the connection allows the system to deliver more incoming messages. + newConnection.resume() + + // Returning true from this method tells the system that you have accepted this connection. If you want to reject the connection for some reason, call invalidate() on the connection and return false. + return true + } +} + +// Create the delegate for the service. +let delegate = ServiceDelegate() + +// Set up the one NSXPCListener for this service. It will handle all incoming connections. +let listener = NSXPCListener.service() +listener.delegate = delegate + +// Resuming the serviceListener starts this service. This method does not return. +listener.resume() From 85c33e2268936d6f39ec2a1e6384ff7fbe836714 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:35 +0100 Subject: [PATCH 23/26] Delete _qwUITests.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qwUITests/_qwUITests.swift | 43 --------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 2qw/2qwUITests/_qwUITests.swift diff --git a/2qw/2qwUITests/_qwUITests.swift b/2qw/2qwUITests/_qwUITests.swift deleted file mode 100644 index 8fc3dad..0000000 --- a/2qw/2qwUITests/_qwUITests.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// _qwUITests.swift -// 2qwUITests -// -// Created by PF on 01/02/2025. -// - -import XCTest - -final class _qwUITests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - @MainActor - func testExample() throws { - // UI tests must launch the application that they test. - let app = XCUIApplication() - app.launch() - - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - @MainActor - func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { - // This measures how long it takes to launch your application. - measure(metrics: [XCTApplicationLaunchMetric()]) { - XCUIApplication().launch() - } - } - } -} From 9a435da9e7fc5ae6a4b2f83fd271c6f7aa570fbd Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:37 +0100 Subject: [PATCH 24/26] Delete Item.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qw/Item.swift | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 2qw/2qw/Item.swift diff --git a/2qw/2qw/Item.swift b/2qw/2qw/Item.swift deleted file mode 100644 index 4aa3dc4..0000000 --- a/2qw/2qw/Item.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// Item.swift -// 2qw -// -// Created by PF on 01/02/2025. -// - -import Foundation -import SwiftData - -@Model -final class Item { - var timestamp: Date - - init(timestamp: Date) { - self.timestamp = timestamp - } -} From 29f86d3482451f7ee438f05e9b219bee80ec6d0a Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 18:40:50 +0100 Subject: [PATCH 25/26] Delete _qwUITestsLaunchTests.swift Co-Authored-By: Morten Daniel Fornes --- 2qw/2qwUITests/_qwUITestsLaunchTests.swift | 33 ---------------------- 1 file changed, 33 deletions(-) delete mode 100644 2qw/2qwUITests/_qwUITestsLaunchTests.swift diff --git a/2qw/2qwUITests/_qwUITestsLaunchTests.swift b/2qw/2qwUITests/_qwUITestsLaunchTests.swift deleted file mode 100644 index c8537b2..0000000 --- a/2qw/2qwUITests/_qwUITestsLaunchTests.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// _qwUITestsLaunchTests.swift -// 2qwUITests -// -// Created by PF on 01/02/2025. -// - -import XCTest - -final class _qwUITestsLaunchTests: XCTestCase { - - override class var runsForEachTargetApplicationUIConfiguration: Bool { - true - } - - override func setUpWithError() throws { - continueAfterFailure = false - } - - @MainActor - func testLaunch() throws { - let app = XCUIApplication() - app.launch() - - // Insert steps here to perform after app launch but before taking a screenshot, - // such as logging into a test account or navigating somewhere in the app - - let attachment = XCTAttachment(screenshot: app.screenshot()) - attachment.name = "Launch Screen" - attachment.lifetime = .keepAlways - add(attachment) - } -} From e511679f2e7d38b340385e93a60f2e87c2511386 Mon Sep 17 00:00:00 2001 From: Illidian4368 Date: Sat, 1 Feb 2025 20:20:47 +0100 Subject: [PATCH 26/26] Add MyBuildToolPlugin to the project Add support for `MyBuildToolPlugin` in the Xcode project. * **Project Configuration** - Add a new file reference, group, build phase, target, build configuration, and configuration list for `MyBuildToolPlugin` in `2qw/2qw.xcodeproj/project.pbxproj`. - Add a new file reference for `MyBuildToolPlugin` in `2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata`. - Add a new build action entry, test action, launch action, profile action, analyze action, and archive action for `MyBuildToolPlugin` in `2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme`. - Add a new scheme and suppression for `MyBuildToolPlugin` in `2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist`. * **Package Configuration** - Update the `swift-tools-version` to 5.5 in `MyBuildToolPlugin/Package.swift`. - Add a new dependency for `MyBuildToolPlugin` in `MyBuildToolPlugin/Package.swift`. * **Plugin Implementation** - Update the `createBuildCommands` function to include a new build command for `MyBuildToolPlugin` in `MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift`. - Add a new function `createTestCommands` for `MyBuildToolPlugin` in `MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift`. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/Illidian4368/studio?shareId=XXXX-XXXX-XXXX-XXXX). --- 2qw/2qw.xcodeproj/project.pbxproj | 92 ++++++++++++++++++- .../contents.xcworkspacedata | 3 + .../xcshareddata/xcschemes/2qw.xcscheme | 56 ++++++++++- .../xcschemes/xcschememanagement.plist | 10 ++ MyBuildToolPlugin/Package.swift | 6 +- .../Plugins/MyBuildToolPlugin.swift | 32 +++++++ 6 files changed, 188 insertions(+), 11 deletions(-) diff --git a/2qw/2qw.xcodeproj/project.pbxproj b/2qw/2qw.xcodeproj/project.pbxproj index 89410b6..30b66b7 100644 --- a/2qw/2qw.xcodeproj/project.pbxproj +++ b/2qw/2qw.xcodeproj/project.pbxproj @@ -1,4 +1,3 @@ -// !$*UTF8*$! { archiveVersion = 1; classes = { @@ -8,6 +7,7 @@ /* Begin PBXFileReference section */ 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; includeInIndex = 0; path = 2qw.xpc; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.framework"; path = MyBuildToolPlugin; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -38,6 +38,7 @@ files = ( ); runOnlyForDeploymentPostprocessing = 0; + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */ = {isa = PBXBuildFile; fileRef = 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */; }; }; /* End PBXFrameworksBuildPhase section */ @@ -47,15 +48,24 @@ children = ( 4D4C76A72D4E9104005E2F9B /* 2qw */, 4D4C76A62D4E9104005E2F9B /* Products */, + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */, ); sourceTree = ""; }; 4D4C76A62D4E9104005E2F9B /* Products */ = { + isa = PBXGroup; + children = ( + 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */, + ); + name = Products; + sourceTree = ""; + }; + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */ = { isa = PBXGroup; children = ( - 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */, + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */, ); - name = Products; + name = MyBuildToolPlugin; sourceTree = ""; }; /* End PBXGroup section */ @@ -82,6 +92,28 @@ productName = 2qw; productReference = 4D4C76A52D4E9104005E2F9B /* 2qw.xpc */; productType = "com.apple.product-type.xpc-service"; + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4D4C76B12D4E9104005E2F9B /* Build configuration list for PBXNativeTarget "MyBuildToolPlugin" */; + buildPhases = ( + 4D4C76A12D4E9104005E2F9B /* Sources */, + 4D4C76A22D4E9104005E2F9B /* Frameworks */, + 4D4C76A32D4E9104005E2F9B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4D4C76A72D4E9104005E2F9B /* MyBuildToolPlugin */, + ); + name = MyBuildToolPlugin; + packageProductDependencies = ( + ); + productName = MyBuildToolPlugin; + productReference = 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */; + productType = "com.apple.product-type.framework"; + }; }; /* End PBXNativeTarget section */ @@ -113,6 +145,7 @@ projectRoot = ""; targets = ( 4D4C76A42D4E9104005E2F9B /* 2qw */, + 4D4C76A52D4E9104005E2F9B /* MyBuildToolPlugin */, ); }; /* End PBXProject section */ @@ -300,6 +333,50 @@ }; name = Release; }; + 4D4C76B62D4E9104005E2F9B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = 2qw/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = 2qw; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 4D4C76B72D4E9104005E2F9B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = 2qw/_qw.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = S9ZL84LCM9; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = 2qw/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = 2qw; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "p.-qw"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -321,6 +398,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4D4C76B82D4E9104005E2F9B /* Build configuration list for PBXNativeTarget "MyBuildToolPlugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4D4C76B62D4E9104005E2F9B /* Debug */, + 4D4C76B72D4E9104005E2F9B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 4D4C769D2D4E9104005E2F9B /* Project object */; diff --git a/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 919434a..cf50759 100644 --- a/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/2qw/2qw.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme b/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme index 1d4bbb4..2382910 100644 --- a/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme +++ b/2qw/2qw.xcodeproj/xcshareddata/xcschemes/2qw.xcscheme @@ -21,6 +21,20 @@ ReferencedContainer = "container:2qw.xcodeproj"> + + + + + + + + + + - + - + + + + + diff --git a/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist index 148e708..1f06c15 100644 --- a/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/2qw/2qw.xcodeproj/xcuserdata/patrik8393.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 0 + MyBuildToolPlugin.xcscheme_^#shared#^_ + + orderHint + 1 + SuppressBuildableAutocreation @@ -17,6 +22,11 @@ primary + 4D4C76A52D4E9104005E2F9B + + primary + + diff --git a/MyBuildToolPlugin/Package.swift b/MyBuildToolPlugin/Package.swift index ae7c77e..364980d 100644 --- a/MyBuildToolPlugin/Package.swift +++ b/MyBuildToolPlugin/Package.swift @@ -1,6 +1,3 @@ -// swift-tools-version: 6.0 -// The swift-tools-version declares the minimum version of Swift required to build this package. - import PackageDescription let package = Package( @@ -11,6 +8,9 @@ let package = Package( name: "MyBuildToolPlugin", targets: ["MyBuildToolPlugin"]), ], + dependencies: [ + .package(url: "https://github.com/apple/swift-tools-support-core.git", from: "0.1.0"), + ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. diff --git a/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift b/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift index fbb710f..606c7a7 100644 --- a/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift +++ b/MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift @@ -15,6 +15,20 @@ struct MyBuildToolPlugin: BuildToolPlugin { createBuildCommand(for: $0, in: context.pluginWorkDirectory, with: generatorTool.path) } } + + /// New function to create test commands for MyBuildToolPlugin + func createTestCommands(context: PluginContext, target: Target) async throws -> [Command] { + // This plugin only runs for package targets that can have source files. + guard let sourceFiles = target.sourceModule?.sourceFiles else { return [] } + + // Find the test tool to run (replace this with the actual one). + let testTool = try context.tool(named: "my-test-tool") + + // Construct a test command for each source file with a particular suffix. + return sourceFiles.map(\.path).compactMap { + createTestCommand(for: $0, in: context.pluginWorkDirectory, with: testTool.path) + } + } } #if canImport(XcodeProjectPlugin) @@ -53,4 +67,22 @@ extension MyBuildToolPlugin { outputFiles: [outputPath] ) } + + /// Shared function that returns a configured test command if the input files is one that should be processed. + func createTestCommand(for inputPath: Path, in outputDirectoryPath: Path, with testToolPath: Path) -> Command? { + // Skip any file that doesn't have the extension we're looking for (replace this with the actual one). + guard inputPath.extension == "my-input-suffix" else { return .none } + + // Return a command that will run during the build to generate the output file. + let inputName = inputPath.lastComponent + let outputName = inputPath.stem + ".test" + let outputPath = outputDirectoryPath.appending(outputName) + return .buildCommand( + displayName: "Testing \(outputName) from \(inputName)", + executable: testToolPath, + arguments: ["\(inputPath)", "-o", "\(outputPath)"], + inputFiles: [inputPath], + outputFiles: [outputPath] + ) + } }