From 618cc15e73b899d562171d5d68eb5bde4272b759 Mon Sep 17 00:00:00 2001 From: crazytan Date: Fri, 3 Apr 2026 21:01:00 -0700 Subject: [PATCH] Update project settings and remove UI tests --- Config.xcconfig.example | 6 + TaskMenu.xcodeproj/project.pbxproj | 156 +++----------- TaskMenu/Resources/Info.plist | 4 +- TaskMenu/Resources/TaskMenu.entitlements | 9 +- TaskMenuUITests/TaskMenuUITests.swift | 261 ----------------------- project.yml | 17 +- 6 files changed, 56 insertions(+), 397 deletions(-) delete mode 100644 TaskMenuUITests/TaskMenuUITests.swift diff --git a/Config.xcconfig.example b/Config.xcconfig.example index 26d09f3..d06726b 100644 --- a/Config.xcconfig.example +++ b/Config.xcconfig.example @@ -4,3 +4,9 @@ GOOGLE_CLIENT_ID = your-client-id.apps.googleusercontent.com GOOGLE_CLIENT_SECRET = your-client-secret + +// Optional local signing overrides. +// Keep these out of source control so different machines and CI can provide their own values. +DEVELOPMENT_TEAM = YOUR_TEAM_ID +CODE_SIGN_STYLE = Automatic +CODE_SIGN_IDENTITY = diff --git a/TaskMenu.xcodeproj/project.pbxproj b/TaskMenu.xcodeproj/project.pbxproj index 9b1784c..6dcd7c4 100644 --- a/TaskMenu.xcodeproj/project.pbxproj +++ b/TaskMenu.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 0A9AE96BCBF5513327268CAD /* GoogleAuthService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E868E0B0520F6ABD40D350 /* GoogleAuthService.swift */; }; 0FD718B29CF8183561A6F550 /* TaskItemModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4CD6808B2587AD2F8F9563 /* TaskItemModelTests.swift */; }; 11E28771324DA02B74C9983F /* DateFormattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500B536CAEBC7F3B0AF40519 /* DateFormattingTests.swift */; }; + 16F0CFB570B7684CE136B82E /* MenuBarIcon.svg in Resources */ = {isa = PBXBuildFile; fileRef = D898FA58565B1CBB9ED2695E /* MenuBarIcon.svg */; }; 3059000A80728B12B6989398 /* KeychainServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058C00FB539FD9B1D05BCBFD /* KeychainServiceTests.swift */; }; 423DB4F7DE968CBD6A6E805D /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4BD10764723731B64E9E183 /* AppState.swift */; }; 44A6F4A2E806FF1D44F0E19B /* TestDueDateNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADED99C71B9C470D7D37974C /* TestDueDateNotificationService.swift */; }; @@ -18,11 +19,13 @@ 48943AA6EDE34BA7B373106E /* QuickAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01BFC3843C941C89C85576B /* QuickAddView.swift */; }; 4C4A40DBCD2948E2FC0F1F3A /* DateFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C7BCF6CD54266E26B32F6DD /* DateFormatting.swift */; }; 5D77ED33F50BA2FB8E0F4B8F /* MenuBarPopover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42EAB07F42BE73AAED7BCC56 /* MenuBarPopover.swift */; }; + 67748198F5F097AEE9019675 /* MockTasksAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88387DAAC83474A8C1AE6EEE /* MockTasksAPI.swift */; }; 69765D5311C642C2DFADB0A0 /* GoogleTasksAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C79B44669D075555352A0BB4 /* GoogleTasksAPITests.swift */; }; 76E308FD16F5E910DE7D81E6 /* GoogleTasksAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DC959FBC4EF3DD0EF5D14D6 /* GoogleTasksAPI.swift */; }; 78E76881CED717FBB2187185 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3377E75BA19027E464EAEB8 /* Assets.xcassets */; }; 7A424E7FDBAFD974B955448D /* TaskItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD51E43AB6E5559C98303A3 /* TaskItem.swift */; }; 8F3D1A4FC0600A0D85BA22E8 /* SearchFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AC00155161191D4DBBDA015 /* SearchFilterTests.swift */; }; + 939FC3A4B4EB2424F77B577C /* TasksAPIProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C351DB97FAAF55B3B516EAD9 /* TasksAPIProtocol.swift */; }; 986954B711E286DA6CDC3353 /* GoogleAuthServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5360741190B5DF2436BE448 /* GoogleAuthServiceTests.swift */; }; 9ADC495EEB87994A08F73AB8 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12212B7B62ECCDD28979CA54 /* Constants.swift */; }; 9BE1233CADF8C3BFFC734F1D /* ListPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7A7998A82BE9D4729E85B13 /* ListPickerView.swift */; }; @@ -38,12 +41,10 @@ DE51E84794E46D07C1401DE6 /* TaskList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 633899C51990EF71D24F5C89 /* TaskList.swift */; }; DFD21FE92BBBBD402B0B05A1 /* AppStateBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C0C7E5843F31C5163A17D3D /* AppStateBehaviorTests.swift */; }; E53F1F56DBC73CF159E93516 /* SignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7270F80F12239828D873B133 /* SignInView.swift */; }; + E54169E513191306010635A7 /* AppIcon.svg in Resources */ = {isa = PBXBuildFile; fileRef = 8C8C52C19BDA6F8F2D3C638F /* AppIcon.svg */; }; E7D0145136EE024CB87D7963 /* TaskListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 612D4C039654B488ADC17151 /* TaskListView.swift */; }; FEBB3BC550B3CC63B620ED8F /* AppStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3614C7335BB0200D28F074 /* AppStateTests.swift */; }; FF5F630937F736E64BD3C1FD /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D04BFBB6F10A824FCFD02C9 /* SettingsView.swift */; }; - AA0000000000000000000005 /* TasksAPIProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0000000000000000000001 /* TasksAPIProtocol.swift */; }; - AA0000000000000000000006 /* MockTasksAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0000000000000000000002 /* MockTasksAPI.swift */; }; - AA0000000000000000000007 /* TaskMenuUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA0000000000000000000003 /* TaskMenuUITests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -54,13 +55,6 @@ remoteGlobalIDString = 54F3465CB5E85F801680719A; remoteInfo = TaskMenu; }; - AA000000000000000000000A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E6415FE6D54A18079324D516 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 54F3465CB5E85F801680719A; - remoteInfo = TaskMenu; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -84,6 +78,8 @@ 6E4CD6808B2587AD2F8F9563 /* TaskItemModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskItemModelTests.swift; sourceTree = ""; }; 7270F80F12239828D873B133 /* SignInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInView.swift; sourceTree = ""; }; 7B9B96C944BC0E6F55E3D791 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; + 88387DAAC83474A8C1AE6EEE /* MockTasksAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTasksAPI.swift; sourceTree = ""; }; + 8C8C52C19BDA6F8F2D3C638F /* AppIcon.svg */ = {isa = PBXFileReference; path = AppIcon.svg; sourceTree = ""; }; 8F3614C7335BB0200D28F074 /* AppStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateTests.swift; sourceTree = ""; }; 8FE1F31A1E2F87FD9042F1B4 /* GoogleTasksAPIBehaviorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleTasksAPIBehaviorTests.swift; sourceTree = ""; }; 9C0DB3189CC6045A5C0A230F /* TaskMenuAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskMenuAppTests.swift; sourceTree = ""; }; @@ -96,17 +92,15 @@ BB598B8D34C0A014D7826A63 /* MockURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLProtocol.swift; sourceTree = ""; }; BFE9F6BF8DFE197A82CE6A11 /* InMemoryKeychainService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemoryKeychainService.swift; sourceTree = ""; }; C3377E75BA19027E464EAEB8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C351DB97FAAF55B3B516EAD9 /* TasksAPIProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksAPIProtocol.swift; sourceTree = ""; }; C5360741190B5DF2436BE448 /* GoogleAuthServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthServiceTests.swift; sourceTree = ""; }; C79B44669D075555352A0BB4 /* GoogleTasksAPITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleTasksAPITests.swift; sourceTree = ""; }; CED98B3B1A1223A88415EB92 /* TaskDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskDetailView.swift; sourceTree = ""; }; D7A7998A82BE9D4729E85B13 /* ListPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListPickerView.swift; sourceTree = ""; }; + D898FA58565B1CBB9ED2695E /* MenuBarIcon.svg */ = {isa = PBXFileReference; path = MenuBarIcon.svg; sourceTree = ""; }; D9592A4B7C25B7B328D1CAE3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; EAFA7FEDB3F9559D6C71C2C4 /* KeychainService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainService.swift; sourceTree = ""; }; F4BD10764723731B64E9E183 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; - AA0000000000000000000001 /* TasksAPIProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TasksAPIProtocol.swift; sourceTree = ""; }; - AA0000000000000000000002 /* MockTasksAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTasksAPI.swift; sourceTree = ""; }; - AA0000000000000000000003 /* TaskMenuUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskMenuUITests.swift; sourceTree = ""; }; - AA0000000000000000000004 /* TaskMenuUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TaskMenuUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXGroup section */ @@ -122,8 +116,10 @@ 141A484087CC4923B5F2371C /* Resources */ = { isa = PBXGroup; children = ( + 8C8C52C19BDA6F8F2D3C638F /* AppIcon.svg */, C3377E75BA19027E464EAEB8 /* Assets.xcassets */, D9592A4B7C25B7B328D1CAE3 /* Info.plist */, + D898FA58565B1CBB9ED2695E /* MenuBarIcon.svg */, 68CD93FC69779BFB08340F08 /* TaskMenu.entitlements */, ); path = Resources; @@ -134,7 +130,6 @@ children = ( 4E2E315C1C8E04FD083F0AEA /* TaskMenu.app */, 0BB887AE76D5ACD713E065CE /* TaskMenuTests.xctest */, - AA0000000000000000000004 /* TaskMenuUITests.xctest */, ); name = Products; sourceTree = ""; @@ -146,8 +141,8 @@ 63E868E0B0520F6ABD40D350 /* GoogleAuthService.swift */, 4DC959FBC4EF3DD0EF5D14D6 /* GoogleTasksAPI.swift */, EAFA7FEDB3F9559D6C71C2C4 /* KeychainService.swift */, - AA0000000000000000000002 /* MockTasksAPI.swift */, - AA0000000000000000000001 /* TasksAPIProtocol.swift */, + 88387DAAC83474A8C1AE6EEE /* MockTasksAPI.swift */, + C351DB97FAAF55B3B516EAD9 /* TasksAPIProtocol.swift */, ); path = Services; sourceTree = ""; @@ -221,21 +216,12 @@ path = TaskMenuTests; sourceTree = ""; }; - AA0000000000000000000008 /* TaskMenuUITests */ = { - isa = PBXGroup; - children = ( - AA0000000000000000000003 /* TaskMenuUITests.swift */, - ); - path = TaskMenuUITests; - sourceTree = ""; - }; E7776CF5C61A2557700CB1FE = { isa = PBXGroup; children = ( A34BA795C75683448AFABACA /* TaskMenu */, 02C7954B6F0AE7D4B33301DC /* TaskMenu */, C53DB1319E1111ADB350C841 /* TaskMenuTests */, - AA0000000000000000000008 /* TaskMenuUITests */, 1E011DB940E268BD3223C95C /* Products */, ); sourceTree = ""; @@ -279,24 +265,6 @@ productReference = 4E2E315C1C8E04FD083F0AEA /* TaskMenu.app */; productType = "com.apple.product-type.application"; }; - AA0000000000000000000009 /* TaskMenuUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = AA000000000000000000000F /* Build configuration list for PBXNativeTarget "TaskMenuUITests" */; - buildPhases = ( - AA000000000000000000000C /* Sources */, - ); - buildRules = ( - ); - dependencies = ( - AA000000000000000000000B /* PBXTargetDependency */, - ); - name = TaskMenuUITests; - packageProductDependencies = ( - ); - productName = TaskMenuUITests; - productReference = AA0000000000000000000004 /* TaskMenuUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -304,7 +272,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1600; + LastUpgradeCheck = 2640; TargetAttributes = { 2499498786EF41DCFC6BE7F6 = { DevelopmentTeam = ZW5U6862Q8; @@ -314,11 +282,6 @@ DevelopmentTeam = ZW5U6862Q8; ProvisioningStyle = Manual; }; - AA0000000000000000000009 = { - DevelopmentTeam = ZW5U6862Q8; - ProvisioningStyle = Manual; - TestTargetID = 54F3465CB5E85F801680719A; - }; }; }; buildConfigurationList = 0E2A7987D24F541D4861D04A /* Build configuration list for PBXProject "TaskMenu" */; @@ -337,7 +300,6 @@ targets = ( 54F3465CB5E85F801680719A /* TaskMenu */, 2499498786EF41DCFC6BE7F6 /* TaskMenuTests */, - AA0000000000000000000009 /* TaskMenuUITests */, ); }; /* End PBXProject section */ @@ -347,7 +309,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E54169E513191306010635A7 /* AppIcon.svg in Resources */, 78E76881CED717FBB2187185 /* Assets.xcassets in Resources */, + 16F0CFB570B7684CE136B82E /* MenuBarIcon.svg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -367,7 +331,7 @@ C169507407838BDD4C665CF1 /* KeychainService.swift in Sources */, 9BE1233CADF8C3BFFC734F1D /* ListPickerView.swift in Sources */, 5D77ED33F50BA2FB8E0F4B8F /* MenuBarPopover.swift in Sources */, - AA0000000000000000000006 /* MockTasksAPI.swift in Sources */, + 67748198F5F097AEE9019675 /* MockTasksAPI.swift in Sources */, 48943AA6EDE34BA7B373106E /* QuickAddView.swift in Sources */, FF5F630937F736E64BD3C1FD /* SettingsView.swift in Sources */, E53F1F56DBC73CF159E93516 /* SignInView.swift in Sources */, @@ -377,7 +341,7 @@ E7D0145136EE024CB87D7963 /* TaskListView.swift in Sources */, C1AE79D6748EFE551C7E8F1B /* TaskMenuApp.swift in Sources */, C1D9C85DFAE57179E9A438A1 /* TaskRowView.swift in Sources */, - AA0000000000000000000005 /* TasksAPIProtocol.swift in Sources */, + 939FC3A4B4EB2424F77B577C /* TasksAPIProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -403,14 +367,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - AA000000000000000000000C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AA0000000000000000000007 /* TaskMenuUITests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -419,11 +375,6 @@ target = 54F3465CB5E85F801680719A /* TaskMenu */; targetProxy = 0CB22A41B832FE7621882395 /* PBXContainerItemProxy */; }; - AA000000000000000000000B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 54F3465CB5E85F801680719A /* TaskMenu */; - targetProxy = AA000000000000000000000A /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -432,10 +383,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = TaskMenu/Resources/TaskMenu.entitlements; - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; + ENABLE_APP_SANDBOX = YES; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = TaskMenu/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -483,6 +432,8 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -494,6 +445,7 @@ "$(inherited)", "DEBUG=1", ); + GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -501,6 +453,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 0.1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -509,6 +462,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_STRICT_CONCURRENCY = complete; + SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; SWIFT_VERSION = 6.0; }; name = Debug; @@ -517,10 +471,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; GENERATE_INFOPLIST_FILE = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -568,11 +519,14 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -580,13 +534,15 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 0.1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OPTIMIZATION_LEVEL = "-Osize"; SWIFT_STRICT_CONCURRENCY = complete; + SWIFT_TREAT_WARNINGS_AS_ERRORS = YES; SWIFT_VERSION = 6.0; }; name = Release; @@ -596,10 +552,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = TaskMenu/Resources/TaskMenu.entitlements; - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; + ENABLE_APP_SANDBOX = YES; ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = TaskMenu/Resources/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -616,10 +570,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; GENERATE_INFOPLIST_FILE = YES; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -632,44 +583,6 @@ }; name = Debug; }; - AA000000000000000000000D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.taskmenu.TaskMenuUITests; - SDKROOT = macosx; - TEST_TARGET_NAME = TaskMenu; - }; - name = Debug; - }; - AA000000000000000000000E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = 47081BEFF0F575643E99369B44CBAC87BBCC85E6; - CODE_SIGN_STYLE = Manual; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = ZW5U6862Q8; - GENERATE_INFOPLIST_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.taskmenu.TaskMenuUITests; - SDKROOT = macosx; - TEST_TARGET_NAME = TaskMenu; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -700,15 +613,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; - AA000000000000000000000F /* Build configuration list for PBXNativeTarget "TaskMenuUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AA000000000000000000000D /* Debug */, - AA000000000000000000000E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; /* End XCConfigurationList section */ }; rootObject = E6415FE6D54A18079324D516 /* Project object */; diff --git a/TaskMenu/Resources/Info.plist b/TaskMenu/Resources/Info.plist index 0804648..454f4c1 100644 --- a/TaskMenu/Resources/Info.plist +++ b/TaskMenu/Resources/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.1.0 + $(MARKETING_VERSION) CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/TaskMenu/Resources/TaskMenu.entitlements b/TaskMenu/Resources/TaskMenu.entitlements index 0c67376..7a2230d 100644 --- a/TaskMenu/Resources/TaskMenu.entitlements +++ b/TaskMenu/Resources/TaskMenu.entitlements @@ -1,5 +1,12 @@ - + + com.apple.security.app-sandbox + + com.apple.security.network.client + + com.apple.security.network.server + + diff --git a/TaskMenuUITests/TaskMenuUITests.swift b/TaskMenuUITests/TaskMenuUITests.swift deleted file mode 100644 index 09348f3..0000000 --- a/TaskMenuUITests/TaskMenuUITests.swift +++ /dev/null @@ -1,261 +0,0 @@ -import XCTest - -final class TaskMenuUITests: XCTestCase { - var app: XCUIApplication! - - override func setUp() { - super.setUp() - continueAfterFailure = false - app = XCUIApplication() - app.launchArguments = ["-ui-testing"] - app.launch() - - // Wait for tasks to load - let firstTask = app.staticTexts["task.title.task1"] - XCTAssertTrue(firstTask.waitForExistence(timeout: 10), "Tasks should load on launch") - } - - override func tearDown() { - app.terminate() - app = nil - super.tearDown() - } - - /// Helper to find a task row element by its accessibility identifier. - /// Falls back through element types since SwiftUI containers may expose as different roles. - private func taskRow(_ taskId: String) -> XCUIElement { - let identifier = "task.row.\(taskId)" - let group = app.groups[identifier] - if group.exists { return group } - let other = app.otherElements[identifier] - if other.exists { return other } - // Fallback: use the title text for interaction (context menu propagates from child) - return app.staticTexts["task.title.\(taskId)"] - } - - // MARK: - 1. testTaskListLoadsOnLaunch - - func testTaskListLoadsOnLaunch() { - XCTAssertTrue(app.staticTexts["task.title.task1"].exists, "Buy groceries should be visible") - XCTAssertTrue(app.staticTexts["task.title.task2"].exists, "Read chapter 5 should be visible") - XCTAssertTrue(app.staticTexts["task.title.task4"].exists, "Schedule dentist should be visible") - // Completed task should NOT be visible (section collapsed) - XCTAssertFalse(app.staticTexts["task.title.task5"].exists, "File taxes should not be visible") - } - - // MARK: - 2. testAddTask - - func testAddTask() { - let quickAddField = app.textFields["quickadd.field"] - XCTAssertTrue(quickAddField.waitForExistence(timeout: 5)) - quickAddField.click() - quickAddField.typeText("New test task\r") - - let newTask = app.staticTexts.containing(NSPredicate(format: "value == %@", "New test task")).firstMatch - XCTAssertTrue(newTask.waitForExistence(timeout: 5), "New test task should appear in the list") - } - - // MARK: - 3. testCompleteTask - - func testCompleteTask() { - let checkbox = app.buttons["task.checkbox.task1"] - XCTAssertTrue(checkbox.waitForExistence(timeout: 5)) - checkbox.click() - - // After completing, the task title should disappear from the active section - // (it moves to the collapsed completed section) - let titleGone = XCTNSPredicateExpectation( - predicate: NSPredicate(format: "exists == false"), - object: app.staticTexts["task.title.task1"] - ) - let result = XCTWaiter.wait(for: [titleGone], timeout: 5) - if result != .completed { - // Task might still be visible if completed section auto-expands; - // verify it's in the completed section by toggling - let completedToggle = app.buttons["completed.toggle"] - if completedToggle.exists { - completedToggle.click() - sleep(1) - XCTAssertTrue(app.staticTexts["task.title.task1"].exists, - "Completed task should appear in completed section") - } - } - } - - // MARK: - 4. testDeleteTask - - func testDeleteTask() { - let row = taskRow("task1") - XCTAssertTrue(row.waitForExistence(timeout: 5)) - row.rightClick() - - let deleteButton = app.menuItems["Delete"] - XCTAssertTrue(deleteButton.waitForExistence(timeout: 5)) - deleteButton.click() - - let titleGone = XCTNSPredicateExpectation( - predicate: NSPredicate(format: "exists == false"), - object: app.staticTexts["task.title.task1"] - ) - let result = XCTWaiter.wait(for: [titleGone], timeout: 5) - XCTAssertEqual(result, .completed, "Buy groceries should no longer be visible after deletion") - } - - // MARK: - 5. testEditTaskDetails - - func testEditTaskDetails() { - let taskTitle = app.staticTexts["task.title.task1"] - XCTAssertTrue(taskTitle.waitForExistence(timeout: 5)) - taskTitle.click() - - // Detail view should appear with title field - let titleField = app.textFields["detail.title.field"] - XCTAssertTrue(titleField.waitForExistence(timeout: 5), "Detail title field should appear") - XCTAssertEqual(titleField.value as? String, "Buy groceries") - - // Clear and type new title - titleField.click() - titleField.selectAll() - titleField.typeText("Buy organic groceries") - - // Click Done - let doneButton = app.buttons["detail.done.button"] - XCTAssertTrue(doneButton.exists) - doneButton.click() - - // Back in list view, new title should be visible - let updatedTask = app.staticTexts.containing( - NSPredicate(format: "value == %@", "Buy organic groceries") - ).firstMatch - XCTAssertTrue(updatedTask.waitForExistence(timeout: 5), "Buy organic groceries should be visible") - } - - // MARK: - 6. testAddSubtaskInline - - func testAddSubtaskInline() { - let row = taskRow("task1") - XCTAssertTrue(row.waitForExistence(timeout: 5)) - row.rightClick() - - let addSubtaskItem = app.menuItems["Add Subtask"] - XCTAssertTrue(addSubtaskItem.waitForExistence(timeout: 5)) - addSubtaskItem.click() - - let inlineField = app.textFields["inline.subtask.field"] - XCTAssertTrue(inlineField.waitForExistence(timeout: 5), "Inline subtask field should appear") - - inlineField.typeText("Get milk\r") - - // Wait for the subtask to appear - let subtask = app.staticTexts.containing( - NSPredicate(format: "value == %@", "Get milk") - ).firstMatch - XCTAssertTrue(subtask.waitForExistence(timeout: 5), "Get milk should appear as a subtask") - } - - // MARK: - 7. testIndentTask - - func testIndentTask() { - // Right-click "Read chapter 5" (2nd root task) - let row = taskRow("task2") - XCTAssertTrue(row.waitForExistence(timeout: 5)) - row.rightClick() - - let makeSubtaskItem = app.menuItems["Make Subtask"] - XCTAssertTrue(makeSubtaskItem.waitForExistence(timeout: 5)) - makeSubtaskItem.click() - - // "Read chapter 5" should now be indented under "Buy groceries" - // Verify it still exists (now as a subtask) - sleep(1) - XCTAssertTrue(app.staticTexts["task.title.task2"].exists, - "Read chapter 5 should still be visible (now indented)") - } - - // MARK: - 8. testOutdentTask - - func testOutdentTask() { - // Right-click "Take notes" (subtask of "Read chapter 5") - let row = taskRow("task3") - XCTAssertTrue(row.waitForExistence(timeout: 5)) - row.rightClick() - - let moveToTopItem = app.menuItems["Move to Top Level"] - XCTAssertTrue(moveToTopItem.waitForExistence(timeout: 5)) - moveToTopItem.click() - - // "Take notes" should now be at root level - sleep(1) - XCTAssertTrue(app.staticTexts["task.title.task3"].exists, - "Take notes should still be visible (now at root level)") - } - - // MARK: - 9. testCompletedSectionToggle - - func testCompletedSectionToggle() { - // File taxes should not be visible initially - XCTAssertFalse(app.staticTexts["task.title.task5"].exists, - "File taxes should not be visible initially") - - // Click the completed disclosure button - let completedToggle = app.buttons["completed.toggle"] - XCTAssertTrue(completedToggle.waitForExistence(timeout: 5)) - completedToggle.click() - - // File taxes should now be visible - let fileTaxes = app.staticTexts["task.title.task5"] - XCTAssertTrue(fileTaxes.waitForExistence(timeout: 5), - "File taxes should be visible after expanding completed section") - - // Click again to collapse - completedToggle.click() - - // File taxes should no longer be visible - let titleGone = XCTNSPredicateExpectation( - predicate: NSPredicate(format: "exists == false"), - object: app.staticTexts["task.title.task5"] - ) - let result = XCTWaiter.wait(for: [titleGone], timeout: 5) - XCTAssertEqual(result, .completed, - "File taxes should not be visible after collapsing completed section") - } - - // MARK: - 10. testSearchFiltersTasks - - func testSearchFiltersTasks() { - let searchField = app.textFields["search.field"] - XCTAssertTrue(searchField.waitForExistence(timeout: 5)) - searchField.click() - searchField.typeText("chapter") - - // Wait for filter to apply - sleep(1) - - // "Read chapter 5" should be visible - XCTAssertTrue(app.staticTexts["task.title.task2"].exists, - "Read chapter 5 should be visible when searching 'chapter'") - // "Buy groceries" should NOT be visible - XCTAssertFalse(app.staticTexts["task.title.task1"].exists, - "Buy groceries should not be visible when searching 'chapter'") - - // Clear search - searchField.click() - searchField.selectAll() - searchField.typeText("\u{8}") // Backspace to delete selection - - // Wait for filter to clear - sleep(1) - - // All tasks should be visible again - XCTAssertTrue(app.staticTexts["task.title.task1"].exists, - "Buy groceries should be visible after clearing search") - XCTAssertTrue(app.staticTexts["task.title.task2"].exists, - "Read chapter 5 should be visible after clearing search") - } -} - -private extension XCUIElement { - func selectAll() { - typeKey("a", modifierFlags: .command) - } -} diff --git a/project.yml b/project.yml index fb36fde..05a664f 100644 --- a/project.yml +++ b/project.yml @@ -3,7 +3,7 @@ options: bundleIdPrefix: com.taskmenu deploymentTarget: macOS: "14.0" - xcodeVersion: "16.0" + xcodeVersion: "26.4" generateEmptyDirectories: true configFiles: @@ -12,9 +12,17 @@ configFiles: settings: base: + CURRENT_PROJECT_VERSION: "1" + DEAD_CODE_STRIPPING: YES + GCC_TREAT_WARNINGS_AS_ERRORS: YES SWIFT_VERSION: "6.0" + MARKETING_VERSION: "0.1.0" MACOSX_DEPLOYMENT_TARGET: "14.0" SWIFT_STRICT_CONCURRENCY: complete + SWIFT_TREAT_WARNINGS_AS_ERRORS: YES + configs: + Release: + SWIFT_OPTIMIZATION_LEVEL: "-Osize" targets: TaskMenu: @@ -27,12 +35,10 @@ targets: PRODUCT_BUNDLE_IDENTIFIER: com.taskmenu.TaskMenu INFOPLIST_FILE: TaskMenu/Resources/Info.plist CODE_SIGN_ENTITLEMENTS: TaskMenu/Resources/TaskMenu.entitlements + ENABLE_APP_SANDBOX: YES ENABLE_HARDENED_RUNTIME: YES ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon COMBINE_HIDPI_IMAGES: YES - CODE_SIGN_IDENTITY: "47081BEFF0F575643E99369B44CBAC87BBCC85E6" # Apple Development: Jia Tan - CODE_SIGN_STYLE: Manual - DEVELOPMENT_TEAM: ZW5U6862Q8 PRODUCT_NAME: TaskMenu entitlements: path: TaskMenu/Resources/TaskMenu.entitlements @@ -49,6 +55,3 @@ targets: GENERATE_INFOPLIST_FILE: YES BUNDLE_LOADER: "$(TEST_HOST)" TEST_HOST: "$(BUILT_PRODUCTS_DIR)/TaskMenu.app/Contents/MacOS/TaskMenu" - CODE_SIGN_IDENTITY: "47081BEFF0F575643E99369B44CBAC87BBCC85E6" # Apple Development: Jia Tan - CODE_SIGN_STYLE: Manual - DEVELOPMENT_TEAM: ZW5U6862Q8