From 8f929699a5b14aa59691671f2028e9834b3f1b45 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 6 Apr 2023 21:23:47 -0400 Subject: [PATCH 01/59] Fix CI --- .github/workflows/swift.yml | 30 ++++-- .../contents.xcworkspacedata | 4 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ CareKit/CareKit.xcodeproj/project.pbxproj | 34 ++----- .../CareKitStore.xcodeproj/project.pbxproj | 7 +- .../xcschemes/OCKWatchCatalog.xcscheme | 92 +++++++++++++++++++ 6 files changed, 136 insertions(+), 39 deletions(-) create mode 100644 CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 404d73baf..d5beaae38 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -6,21 +6,31 @@ on: pull_request: branches: [ main ] - -jobs: - +jobs: test: - - runs-on: macos-11 - + runs-on: macos-12 strategy: matrix: - destination: ['platform=iOS\ Simulator,OS=15.0,name=iPhone\ 11\ Pro\ Max'] - scheme: ['CareKit\ iOS', 'CareKitStore\ iOS', 'CareKitUI\ iOS', 'CareKitFHIR'] - + destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] + scheme: ['CareKit\ iOS', 'CareKitStore\ iOS', 'CareKitUI\ iOS', 'CareKitFHIR', 'CareKit\ Watch', 'CareKitStore\ Watch', 'CareKitUI\ Watch'] + exclude: + - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' + scheme: 'CareKit\ Watch' + - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' + scheme: 'CareKitStore\ Watch' + - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' + scheme: 'CareKitUI\ Watch' + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKit\ iOS' + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitStore\ iOS' + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitUI\ iOS' + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitFHIR' steps: - uses: actions/checkout@v2 - name: Set Xcode Version - run: sudo xcode-select -s /Applications/Xcode_13.0.app + run: sudo xcode-select -s /Applications/Xcode_14.2.app - name: Build run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -verbose -workspace CKWorkspace.xcworkspace -scheme ${{ matrix.scheme }} -destination ${{ matrix.destination }} build test | xcpretty diff --git a/CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..94b2795e2 --- /dev/null +++ b/CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,4 @@ + + + diff --git a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index dea1f9094..406b3642d 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -936,7 +936,6 @@ }; /* End PBXResourcesBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 5196C7F5226F8F8F00F1C2A2 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -1120,12 +1119,8 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; @@ -1153,12 +1148,8 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1245,7 +1236,7 @@ TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 2.1; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -1321,6 +1312,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; @@ -1343,11 +1335,7 @@ INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKit; PRODUCT_NAME = "$(PROJECT_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1385,11 +1373,7 @@ INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKit; PRODUCT_NAME = "$(PROJECT_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index 1388d4f39..6d68bedfb 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -982,7 +982,6 @@ }; /* End PBXResourcesBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ E784B8F42232EED600736CA5 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -1436,7 +1435,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1454,7 +1453,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme b/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme new file mode 100644 index 000000000..7bc8eb341 --- /dev/null +++ b/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b33f1dea854d2758df9435d3b14b9996b874e690 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 6 Apr 2023 21:49:12 -0400 Subject: [PATCH 02/59] fix tests in Xcode project --- .../Shared/Extensions/OCKAnyEventStore+Extension.swift | 2 -- CareKit/CareKitTests/TestAnyEventStoreExtensions.swift | 2 +- .../TestHealthKitPassthroughStore+Events.swift | 3 ++- .../TestHealthKitPassthroughStore+Outcomes.swift | 1 + .../OCKHealthKitStore/TestHealthKitStore+Tasks.swift | 1 + .../OCKStoreCoordinator/TestPersistentStoreCoordinator.swift | 4 ++++ 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CareKit/CareKit/Shared/Extensions/OCKAnyEventStore+Extension.swift b/CareKit/CareKit/Shared/Extensions/OCKAnyEventStore+Extension.swift index 670134ab9..eb7859f16 100644 --- a/CareKit/CareKit/Shared/Extensions/OCKAnyEventStore+Extension.swift +++ b/CareKit/CareKit/Shared/Extensions/OCKAnyEventStore+Extension.swift @@ -36,8 +36,6 @@ import SwiftUI extension OCKAnyEventStore { - @available(iOS 15, *) - @available(watchOS 8, *) func toggleBooleanOutcome(for event: OCKAnyEvent) async throws -> OCKAnyOutcome { return try await withCheckedThrowingContinuation { continuation in toggleBooleanOutcome(for: event, completion: continuation.resume) diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index 3af463c31..570a88670 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -47,7 +47,7 @@ class TestAnyEventStoreExtensions: XCTestCase { let task = OCKTask.sample(uuid: UUID(), id: "taskA") let storedTask = try store.store.addTaskAndWait(task) let storedEvent = try store.fetchEventAndWait(forTask: storedTask, occurrence: 0) - let outcome = try await store.toggleBooleanOutcome(for: storedEvent.anyEvent) + let outcome = try await store.store.toggleBooleanOutcome(for: storedEvent.anyEvent) XCTAssertEqual(outcome.values.count, 1) XCTAssertEqual(outcome.values.first?.booleanValue, true) } diff --git a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift index 5c77dc77d..de0026a71 100644 --- a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift +++ b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift @@ -37,7 +37,7 @@ import XCTest // Note, we test the event stream and not the outcome stream because the outcome stream // calls into the event stream. Testing the outcome stream is unnecessary. - +@available(iOS 15, watchOS 8, *) class TestHealthKitPassthroughStoreEvents: XCTestCase { private let cdStore = OCKStore( @@ -822,6 +822,7 @@ private struct Event: Equatable { var outcome: OCKHealthKitOutcome? } +@available(iOS 15, watchOS 8, *) private extension Event { init(_ event: OCKHealthKitPassthroughStore.Event) { diff --git a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Outcomes.swift b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Outcomes.swift index 35450ef98..d4c3d4b5b 100644 --- a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Outcomes.swift +++ b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Outcomes.swift @@ -33,6 +33,7 @@ import HealthKit import XCTest +@available(iOS 15, watchOS 8, *) class TestHealthKitPassthroughStoreOutcomes: XCTestCase { private let cdStore = OCKStore( diff --git a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitStore+Tasks.swift b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitStore+Tasks.swift index 62198a5a5..c4e7116fb 100644 --- a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitStore+Tasks.swift +++ b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitStore+Tasks.swift @@ -31,6 +31,7 @@ @testable import CareKitStore import XCTest +@available(iOS 15, watchOS 8, *) class TestHealthKitStoreTasks: XCTestCase { var store: OCKHealthKitPassthroughStore! let link = OCKHealthKitLinkage(quantityIdentifier: .stepCount, quantityType: .cumulative, unit: .count()) diff --git a/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift b/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift index 09035d99f..d5402c20b 100644 --- a/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift +++ b/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift @@ -166,6 +166,7 @@ class TestPersistentStoreCoordinator: XCTestCase { XCTAssert(store2.patients.isEmpty) } + @available(iOS 15, watchOS 8, *) func testFetchCanResultInAnArrayPopulatedWithDifferentTypes() throws { let coordinator = OCKStoreCoordinator() let schedule = OCKSchedule.mealTimesEachDay(start: Date(), end: nil) @@ -199,6 +200,7 @@ class TestPersistentStoreCoordinator: XCTestCase { XCTAssertThrowsError(try coordinator.addAnyTaskAndWait(task)) } + @available(iOS 15, watchOS 8, *) func testStoreCoordinatorDoesNotSendNormalOutcomesToHealthKit() { let coordinator = OCKStoreCoordinator() let store = OCKStore(name: UUID().uuidString, type: .inMemory) @@ -216,6 +218,7 @@ class TestPersistentStoreCoordinator: XCTestCase { XCTAssertFalse(willHandle) } + @available(iOS 15, watchOS 8, *) func testCanAssociateHealthKitTaskWithCarePlan() throws { let store = OCKStore(name: UUID().uuidString, type: .inMemory) let passthrough = OCKHealthKitPassthroughStore(store: store) @@ -237,6 +240,7 @@ class TestPersistentStoreCoordinator: XCTestCase { } } +@available(iOS 15, watchOS 8, *) private struct SeededTaskStore { let store: OCKStoreCoordinator From 5f0cf468b8413d6d6ca483dbede1fc93690de215 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 6 Apr 2023 21:55:28 -0400 Subject: [PATCH 03/59] update CI --- .github/workflows/swift.yml | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index d5beaae38..21a2374af 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -12,22 +12,7 @@ jobs: strategy: matrix: destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] - scheme: ['CareKit\ iOS', 'CareKitStore\ iOS', 'CareKitUI\ iOS', 'CareKitFHIR', 'CareKit\ Watch', 'CareKitStore\ Watch', 'CareKitUI\ Watch'] - exclude: - - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' - scheme: 'CareKit\ Watch' - - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' - scheme: 'CareKitStore\ Watch' - - destination: 'platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test' - scheme: 'CareKitUI\ Watch' - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKit\ iOS' - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitStore\ iOS' - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitUI\ iOS' - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitFHIR' + scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] steps: - uses: actions/checkout@v2 - name: Set Xcode Version From 0a313d03fc1bff2e2734dfb46ebd8c5035182b6c Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 6 Apr 2023 22:02:47 -0400 Subject: [PATCH 04/59] don't build FHIR on watchOS --- .github/workflows/swift.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 21a2374af..f10cb4a68 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -13,6 +13,9 @@ jobs: matrix: destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] + exclude: + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitFHIR' steps: - uses: actions/checkout@v2 - name: Set Xcode Version From a92cb94e2a27bc9a28356383201934db9be84f2d Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 6 Apr 2023 22:10:06 -0400 Subject: [PATCH 05/59] Don't test on watch --- .github/workflows/swift.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index f10cb4a68..47380500f 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -11,11 +11,8 @@ jobs: runs-on: macos-12 strategy: matrix: - destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] + destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test'] scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] - exclude: - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitFHIR' steps: - uses: actions/checkout@v2 - name: Set Xcode Version From f07bfefc34ddc0c60aaa52c2f6833d299aed2693 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 6 Apr 2023 22:28:09 -0400 Subject: [PATCH 06/59] remove extra files --- .../xcshareddata/IDEWorkspaceChecks.plist | 8 -- .../contents.xcworkspacedata | 0 .../xcschemes/OCKWatchCatalog.xcscheme | 92 ------------------- 3 files changed, 100 deletions(-) delete mode 100644 CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename {CareKit.xcodeproj => OCKCatalog/OCKCatalog.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (100%) delete mode 100644 OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme diff --git a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from CareKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme b/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme deleted file mode 100644 index 7bc8eb341..000000000 --- a/OCKCatalog/OCKCatalog.xcodeproj/xcshareddata/xcschemes/OCKWatchCatalog.xcscheme +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 7cd56b1b9eef6d026fd4b31f67b2e67d25f48250 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 6 Apr 2023 22:30:47 -0400 Subject: [PATCH 07/59] Build on Xcode 14.3 --- CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 30a86e1d532a19da9dcd92ee7134d8241fabde02 Mon Sep 17 00:00:00 2001 From: Corey Date: Thu, 6 Apr 2023 22:33:31 -0400 Subject: [PATCH 08/59] cancel on new commits --- .github/workflows/swift.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 47380500f..1b262ec78 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ main ] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: test: runs-on: macos-12 From dde967df10417beec86ad0c4c6fce066761c6e88 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 08:55:46 -0400 Subject: [PATCH 09/59] remove SPM generated build folder --- .gitignore | 3 ++- .../xcode/package.xcworkspace/contents.xcworkspacedata | 7 ------- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata diff --git a/.gitignore b/.gitignore index 052dbb4ab..7195b8387 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ DerivedData # SPM .build/ +.swiftpm/ # DocC -.docc-build \ No newline at end of file +.docc-build diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - From 8bc33a7892ead620d5fad6d7f96a302dc26a6d17 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 12:17:20 -0400 Subject: [PATCH 10/59] build and pass test on watchOS --- .../Calendar/TestCustomCalendarViewSynchronizer.swift | 2 ++ .../Calendar/TestWeekCalendarViewSynchronizer.swift | 2 ++ .../Chart/TestCartesianChartViewSynchronizer.swift | 2 ++ .../Chart/TestCustomChartViewSynchronizer.swift | 2 ++ .../Contact/TestContactListViewSynchronizer.swift | 2 ++ .../Contact/TestCustomContactViewSynchronizer.swift | 2 ++ .../Contact/TestDetailedContactViewSynchronizer.swift | 2 ++ .../Contact/TestSimpleContactViewSynchronizer.swift | 2 ++ .../Higher Order/TestDailyTasksPageViewController.swift | 2 ++ CareKit/CareKitTests/Higher Order/TestListView.swift | 2 ++ .../Higher Order/TestWeekCalendarPageViewController.swift | 2 ++ .../Synchronization/TestSynchronizedViewController.swift | 2 ++ .../Task/TestButtonLogTaskViewSynchronizer.swift | 2 ++ .../CareKitTests/Task/TestChecklistViewSynchronizer.swift | 2 ++ .../Task/TestCustomTaskViewSynchronizer.swift | 2 ++ .../CareKitTests/Task/TestGridTaskViewSynchronizer.swift | 2 ++ .../Task/TestInstructionsTaskViewSynchronizer.swift | 2 ++ .../Task/TestSimpleTaskViewSynchronizer.swift | 2 ++ CareKitFHIR/CareKitFHIR/OCKFHIRResourceCoder.swift | 2 ++ .../TestPersistentStoreCoordinator.swift | 4 +++- .../CareKitStoreTests/Streaming/TestCoreDataSource.swift | 3 ++- .../CareKitStoreTests/Structs/TestKnowledgeVector.swift | 8 ++++---- 22 files changed, 47 insertions(+), 6 deletions(-) diff --git a/CareKit/CareKitTests/Calendar/TestCustomCalendarViewSynchronizer.swift b/CareKit/CareKitTests/Calendar/TestCustomCalendarViewSynchronizer.swift index ee97d96ad..76444aafe 100644 --- a/CareKit/CareKitTests/Calendar/TestCustomCalendarViewSynchronizer.swift +++ b/CareKit/CareKitTests/Calendar/TestCustomCalendarViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitUI import Foundation @@ -93,3 +94,4 @@ class TestCustomCalendarViewSynchronizer: XCTestCase { XCTAssertTrue(view.completionStates.isEmpty) } } +#endif diff --git a/CareKit/CareKitTests/Calendar/TestWeekCalendarViewSynchronizer.swift b/CareKit/CareKitTests/Calendar/TestWeekCalendarViewSynchronizer.swift index e6370f886..9c206d58b 100644 --- a/CareKit/CareKitTests/Calendar/TestWeekCalendarViewSynchronizer.swift +++ b/CareKit/CareKitTests/Calendar/TestWeekCalendarViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitUI import Foundation @@ -133,3 +134,4 @@ class TestWeekCalendarViewSynchronizer: XCTestCase { } } } +#endif diff --git a/CareKit/CareKitTests/Chart/TestCartesianChartViewSynchronizer.swift b/CareKit/CareKitTests/Chart/TestCartesianChartViewSynchronizer.swift index 6fd56f011..b8ff29031 100644 --- a/CareKit/CareKitTests/Chart/TestCartesianChartViewSynchronizer.swift +++ b/CareKit/CareKitTests/Chart/TestCartesianChartViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitUI import Foundation @@ -84,3 +85,4 @@ private extension OCKDataSeries { return OCKDataSeries(dataPoints: [], title: "") } } +#endif diff --git a/CareKit/CareKitTests/Chart/TestCustomChartViewSynchronizer.swift b/CareKit/CareKitTests/Chart/TestCustomChartViewSynchronizer.swift index 09de33106..1f1d60cc1 100644 --- a/CareKit/CareKitTests/Chart/TestCustomChartViewSynchronizer.swift +++ b/CareKit/CareKitTests/Chart/TestCustomChartViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitStore import CareKitUI @@ -99,3 +100,4 @@ private extension OCKDataSeries { return OCKDataSeries(dataPoints: [], title: "") } } +#endif diff --git a/CareKit/CareKitTests/Contact/TestContactListViewSynchronizer.swift b/CareKit/CareKitTests/Contact/TestContactListViewSynchronizer.swift index 2e772b2a8..e11ff6fb1 100644 --- a/CareKit/CareKitTests/Contact/TestContactListViewSynchronizer.swift +++ b/CareKit/CareKitTests/Contact/TestContactListViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKit import CareKitStore import CareKitUI @@ -196,3 +197,4 @@ private class MockViewSynchronizer: ViewSynchronizing { didUpdateView() } } +#endif diff --git a/CareKit/CareKitTests/Contact/TestCustomContactViewSynchronizer.swift b/CareKit/CareKitTests/Contact/TestCustomContactViewSynchronizer.swift index b2f7bd548..3c9b52fe0 100644 --- a/CareKit/CareKitTests/Contact/TestCustomContactViewSynchronizer.swift +++ b/CareKit/CareKitTests/Contact/TestCustomContactViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitStore import CareKitUI @@ -112,3 +113,4 @@ class TestCustomContactViewSynchronizer: XCTestCase { XCTAssertNil(view.text) } } +#endif diff --git a/CareKit/CareKitTests/Contact/TestDetailedContactViewSynchronizer.swift b/CareKit/CareKitTests/Contact/TestDetailedContactViewSynchronizer.swift index 4c90c7050..fb0a57564 100644 --- a/CareKit/CareKitTests/Contact/TestDetailedContactViewSynchronizer.swift +++ b/CareKit/CareKitTests/Contact/TestDetailedContactViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitStore import CareKitUI @@ -165,3 +166,4 @@ class TestDetailedContactViewSynchronizer: XCTestCase { XCTAssertTrue(view.messageButton.isHidden) } } +#endif diff --git a/CareKit/CareKitTests/Contact/TestSimpleContactViewSynchronizer.swift b/CareKit/CareKitTests/Contact/TestSimpleContactViewSynchronizer.swift index 7229c219b..d5b69fc7d 100644 --- a/CareKit/CareKitTests/Contact/TestSimpleContactViewSynchronizer.swift +++ b/CareKit/CareKitTests/Contact/TestSimpleContactViewSynchronizer.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKit import CareKitStore import CareKitUI @@ -90,3 +91,4 @@ class TestSimpleContactViewSynchronizer: XCTestCase { XCTAssertEqual(view.headerView.iconImageView?.image, UIImage(systemName: "person.crop.circle")) } } +#endif diff --git a/CareKit/CareKitTests/Higher Order/TestDailyTasksPageViewController.swift b/CareKit/CareKitTests/Higher Order/TestDailyTasksPageViewController.swift index d8b98f4a5..76b5a7713 100644 --- a/CareKit/CareKitTests/Higher Order/TestDailyTasksPageViewController.swift +++ b/CareKit/CareKitTests/Higher Order/TestDailyTasksPageViewController.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKit @testable import CareKitStore import CareKitUI @@ -102,3 +103,4 @@ class TestDailyTasksPageViewController: XCTestCase { XCTAssertNotNil(simpleViewController) } } +#endif diff --git a/CareKit/CareKitTests/Higher Order/TestListView.swift b/CareKit/CareKitTests/Higher Order/TestListView.swift index 349e66307..fca91b04a 100644 --- a/CareKit/CareKitTests/Higher Order/TestListView.swift +++ b/CareKit/CareKitTests/Higher Order/TestListView.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKit import Foundation import XCTest @@ -42,3 +43,4 @@ class TestListView: XCTestCase { XCTAssertEqual(view.contentView.backgroundColor, view.scrollView.backgroundColor) } } +#endif diff --git a/CareKit/CareKitTests/Higher Order/TestWeekCalendarPageViewController.swift b/CareKit/CareKitTests/Higher Order/TestWeekCalendarPageViewController.swift index 7bd51da59..66a81bed8 100644 --- a/CareKit/CareKitTests/Higher Order/TestWeekCalendarPageViewController.swift +++ b/CareKit/CareKitTests/Higher Order/TestWeekCalendarPageViewController.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKit import CareKitStore import Foundation @@ -88,3 +89,4 @@ private class MockWeekCalendarPageViewController: OCKWeekCalendarPageViewControl super.init(store: store) } } +#endif diff --git a/CareKit/CareKitTests/Synchronization/TestSynchronizedViewController.swift b/CareKit/CareKitTests/Synchronization/TestSynchronizedViewController.swift index f5d8aac12..de00d416d 100644 --- a/CareKit/CareKitTests/Synchronization/TestSynchronizedViewController.swift +++ b/CareKit/CareKitTests/Synchronization/TestSynchronizedViewController.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKit import AsyncAlgorithms @@ -154,3 +155,4 @@ private class MockSynchronizedViewController: SynchronizedViewController Date: Fri, 7 Apr 2023 12:25:51 -0400 Subject: [PATCH 11/59] remove comments --- .../CareKitStoreTests/Streaming/TestCoreDataSource.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift index 9ea69a1f5..9929eb8cd 100644 --- a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift +++ b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift @@ -31,7 +31,7 @@ import Combine import Foundation import XCTest -/* + @testable import CareKitStore class TestCoreDataQueryPublisher: XCTestCase { @@ -366,4 +366,3 @@ class TestCoreDataQueryPublisher: XCTestCase { return task } } -*/ From f672696dd737548e43d44e846500a20bdece7fee Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:00:53 -0400 Subject: [PATCH 12/59] test CI on watchOS --- .github/workflows/swift.yml | 5 ++++- CareKit/CareKit.xcodeproj/project.pbxproj | 6 ++++++ .../TestCareStoreFetchRequestController.swift | 2 +- CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj | 9 +++++++-- CareKitStore/CareKitStore.xcodeproj/project.pbxproj | 6 ++++++ CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 6 ++++++ 6 files changed, 30 insertions(+), 4 deletions(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 1b262ec78..cace38102 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -15,8 +15,11 @@ jobs: runs-on: macos-12 strategy: matrix: - destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max test'] + destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] + exclude: + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitUI' steps: - uses: actions/checkout@v2 - name: Set Xcode Version diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index 406b3642d..3f61b4ea7 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -1106,6 +1106,7 @@ 5196C801226F8F8F00F1C2A2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1125,6 +1126,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1135,6 +1138,7 @@ 5196C802226F8F8F00F1C2A2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1153,6 +1157,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift index f38fc80d7..e4e80113c 100644 --- a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift +++ b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift @@ -35,7 +35,7 @@ import AsyncAlgorithms import Combine import XCTest -@available(iOS 14, *) +@available(iOS 14, watchOS 7, *) class TestCareStoreFetchRequestController: XCTestCase { private let query = MockQuery(id: 0) diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj index 4a9818f74..c1f07eaae 100644 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -323,7 +323,6 @@ }; /* End PBXResourcesBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 0396EF32233D187800C28FC0 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -560,6 +559,7 @@ 0396EF4E233D187800C28FC0 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -572,6 +572,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -581,6 +583,7 @@ 0396EF4F233D187800C28FC0 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; @@ -593,6 +596,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index 6d68bedfb..949ef1f38 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -1432,6 +1432,7 @@ E784B9102232EED600736CA5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; @@ -1443,6 +1444,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.CareKitStoreTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1450,6 +1453,7 @@ E784B9112232EED600736CA5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; @@ -1461,6 +1465,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.CareKitStoreTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index 93aab4e73..30371d136 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -859,6 +859,7 @@ 512B013622C2F82900ABCB1D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; INFOPLIST_FILE = CareKitUITests/Info.plist; @@ -870,6 +871,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -878,6 +881,7 @@ 512B013722C2F82900ABCB1D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitUITests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -888,6 +892,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; From 741b0f25b150a243d29d8d02d81d75221033b9e2 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:11:22 -0400 Subject: [PATCH 13/59] Don't test watchOS on FHIR --- .github/workflows/swift.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index cace38102..ed3b543cd 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -19,7 +19,9 @@ jobs: scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] exclude: - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitUI' + scheme: 'CareKitUI' + - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' + scheme: 'CareKitFHIR' steps: - uses: actions/checkout@v2 - name: Set Xcode Version From 2f7b8d4205d7b3d6c8089dd51e0068b6c305a18c Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:12:31 -0400 Subject: [PATCH 14/59] revert FHIR tests back to iOS --- CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj index c1f07eaae..d37fa99b7 100644 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj @@ -572,7 +572,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -596,7 +596,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; From 3f5e441102924abd7db581f7d0f84d5934061f2e Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:34:00 -0400 Subject: [PATCH 15/59] add SPI and point to CareKit docs --- .github/workflows/swift.yml | 2 ++ .spi.yml | 9 +++++++++ README.md | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .spi.yml diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index ed3b543cd..38bf56212 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -26,5 +26,7 @@ jobs: - uses: actions/checkout@v2 - name: Set Xcode Version run: sudo xcode-select -s /Applications/Xcode_14.2.app + - name: Use multiple cores + run: defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1 - name: Build run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -verbose -workspace CKWorkspace.xcworkspace -scheme ${{ matrix.scheme }} -destination ${{ matrix.destination }} build test | xcpretty diff --git a/.spi.yml b/.spi.yml new file mode 100644 index 000000000..d76dda086 --- /dev/null +++ b/.spi.yml @@ -0,0 +1,9 @@ +version: 1 +external_links: + documentation: "https://carekit-apple.github.io/CareKit/documentation/carekit/" +builder: + configs: + - platform: ios + scheme: "CareKit" + - platform: watchos + scheme: "CareKit" diff --git a/README.md b/README.md index 3a54f5457..61692e8bd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # CareKit -[![License](https://img.shields.io/badge/license-BSD-green.svg?style=flat)](https://github.com/carekit-apple/CareKit#license) ![Swift](https://img.shields.io/badge/swift-5.0-brightgreen.svg) ![Xcode 11.0+](https://img.shields.io/badge/Xcode-11.0%2B-blue.svg) ![iOS 13.0+](https://img.shields.io/badge/iOS-13.0%2B-blue.svg) [![SPM](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) +[![License](https://img.shields.io/badge/license-BSD-green.svg?style=flat)](https://github.com/carekit-apple/CareKit#license) [![Swift Versions](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/carekit-apple/CareKit) [![OS's](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/carekit-apple/CareKit) ![Xcode 13.3+](https://img.shields.io/badge/Xcode-13.3%2B-blue.svg) [![SPM](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) CareKit™ is an open source software framework for creating apps that help people better understand and manage their health. The framework provides modules that you can use out of the box, or extended and customized for more targeted use cases. It's composed of three SPM packages which can each be imported separately. From 92a6c02517c4fc0a4fd1bf9d62ba27e9ce2e3917 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:37:58 -0400 Subject: [PATCH 16/59] update proj to latest Xcode --- CareKit/CareKit.xcodeproj/project.pbxproj | 35 +++++++++++++++---- .../xcshareddata/xcschemes/CareKit.xcscheme | 2 +- .../xcschemes/CareKitFHIR.xcscheme | 2 +- .../xcschemes/CareKitStore.xcscheme | 2 +- .../xcshareddata/xcschemes/CareKitUI.xcscheme | 2 +- 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index 3f61b4ea7..82313ae55 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ @@ -883,8 +883,9 @@ 8605A5B11C4F04EC00DD65FF /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1420; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = carekit.org; TargetAttributes = { 5196C7F8226F8F8F00F1C2A2 = { @@ -1121,7 +1122,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; @@ -1153,7 +1158,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1336,12 +1345,19 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKit; PRODUCT_NAME = "$(PROJECT_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1374,12 +1390,19 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKit; PRODUCT_NAME = "$(PROJECT_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/CareKit/CareKit.xcodeproj/xcshareddata/xcschemes/CareKit.xcscheme b/CareKit/CareKit.xcodeproj/xcshareddata/xcschemes/CareKit.xcscheme index ed17cc4f1..2452baaac 100644 --- a/CareKit/CareKit.xcodeproj/xcshareddata/xcschemes/CareKit.xcscheme +++ b/CareKit/CareKit.xcodeproj/xcshareddata/xcschemes/CareKit.xcscheme @@ -1,6 +1,6 @@ Date: Fri, 7 Apr 2023 13:38:18 -0400 Subject: [PATCH 17/59] update proj to latest Xcode --- CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj index d37fa99b7..cd34d8888 100644 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ @@ -26,7 +26,6 @@ 03C85E73233D7215002C5901 /* CareKitFHIRTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C85E72233D7215002C5901 /* CareKitFHIRTests.swift */; }; 03C85E76233D721F002C5901 /* R4PatientConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C85E75233D721F002C5901 /* R4PatientConverterTests.swift */; }; 03E5929123736D0D00B6E9DE /* DSTU2TaskConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E5929023736D0D00B6E9DE /* DSTU2TaskConverterTests.swift */; }; - 51266327291B1E0500C1D7DE /* Project-Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; }; 51373774299E051E000AA8E1 /* ModelsDSTU2 in Frameworks */ = {isa = PBXBuildFile; productRef = 51373773299E051E000AA8E1 /* ModelsDSTU2 */; }; 51373776299E051E000AA8E1 /* ModelsR4 in Frameworks */ = {isa = PBXBuildFile; productRef = 51373775299E051E000AA8E1 /* ModelsR4 */; }; E746B33A2378F55600278A95 /* OCKDSTU2ScheduleCoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E746B3392378F55600278A95 /* OCKDSTU2ScheduleCoder.swift */; }; @@ -269,8 +268,9 @@ 0396EF2D233D187800C28FC0 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1200; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = Apple; TargetAttributes = { 0396EF35233D187800C28FC0 = { @@ -310,7 +310,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 51266327291B1E0500C1D7DE /* Project-Shared.xcconfig in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -502,12 +501,14 @@ baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKitFHIR/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -516,6 +517,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitFHIR; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; RUN_DOCUMENTATION_COMPILER = YES; @@ -532,12 +535,14 @@ baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKitFHIR/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -546,6 +551,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitFHIR; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; RUN_DOCUMENTATION_COMPILER = YES; From 3ed479a1b11dcbd60f4aceadc46c5a43e0c60066 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:38:33 -0400 Subject: [PATCH 18/59] update proj to latest Xcode --- CareKitStore/CareKitStore.xcodeproj/project.pbxproj | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index 949ef1f38..6e404586a 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ @@ -927,8 +927,9 @@ E784B8EF2232EED600736CA5 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1010; - LastUpgradeCheck = 1420; + LastUpgradeCheck = 1430; TargetAttributes = { E784B8F72232EED600736CA5 = { CreatedOnToolsVersion = 10.1; @@ -1367,6 +1368,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1376,6 +1378,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitStore; PRODUCT_NAME = "$(PROJECT_NAME)"; RUN_DOCUMENTATION_COMPILER = YES; @@ -1405,6 +1409,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1414,6 +1419,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitStore; PRODUCT_NAME = "$(PROJECT_NAME)"; RUN_DOCUMENTATION_COMPILER = YES; From 2fda297117c7f935810a33407ec59e1d8cd6f5a3 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 13:38:46 -0400 Subject: [PATCH 19/59] update proj to latest Xcode --- CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index 30371d136..9e41b0eb6 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 53; objects = { /* Begin PBXBuildFile section */ @@ -663,8 +663,9 @@ 51742252224185290054E97C /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1420; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = Apple; TargetAttributes = { 512B012D22C2F82900ABCB1D = { @@ -1076,6 +1077,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitUI/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1085,6 +1087,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitUI; PRODUCT_NAME = "$(PROJECT_NAME)"; RUN_DOCUMENTATION_COMPILER = YES; @@ -1113,6 +1117,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; + ENABLE_MODULE_VERIFIER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitUI/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -1122,6 +1127,8 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitUI; PRODUCT_NAME = "$(PROJECT_NAME)"; RUN_DOCUMENTATION_COMPILER = YES; From 1a66556943fa384c597853e32ab7a19e9ddb44ca Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 14:11:12 -0400 Subject: [PATCH 20/59] Fix CareKitFHIR xcodeproj build and test on watchOS --- .github/workflows/swift.yml | 2 - CareKit/CareKit.xcodeproj/project.pbxproj | 4 +- .../CareKitFHIR.xcodeproj/project.pbxproj | 42 +++++++++++++++---- .../contents.xcworkspacedata | 7 ++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++ .../CareKitStore.xcodeproj/project.pbxproj | 14 +++++-- CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 10 ++++- 7 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 38bf56212..409c1ee47 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -20,8 +20,6 @@ jobs: exclude: - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' scheme: 'CareKitUI' - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitFHIR' steps: - uses: actions/checkout@v2 - name: Set Xcode Version diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index 82313ae55..86cc35380 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -1131,7 +1131,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1166,7 +1166,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj index cd34d8888..62557e915 100644 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj @@ -374,7 +374,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -428,7 +430,9 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; VERSIONING_SYSTEM = "apple-generic"; @@ -440,7 +444,9 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -487,7 +493,9 @@ MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; @@ -500,6 +508,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; @@ -522,11 +531,16 @@ PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitFHIR; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; RUN_DOCUMENTATION_COMPILER = YES; + SDKROOT = auto; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -534,6 +548,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266326291B1E0500C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; @@ -556,10 +571,15 @@ PRODUCT_BUNDLE_IDENTIFIER = org.carekit.CareKitFHIR; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; RUN_DOCUMENTATION_COMPILER = YES; + SDKROOT = auto; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; @@ -579,11 +599,14 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -603,10 +626,13 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.com.CareKitFHIRTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index 6e404586a..11a185a6d 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -1193,6 +1193,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266323291B1DE200C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1264,7 +1265,9 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; @@ -1278,6 +1281,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266323291B1DE200C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1342,7 +1346,9 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; @@ -1451,7 +1457,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.CareKitStoreTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1472,7 +1478,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.Apple.CareKitStoreTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "watchsimulator watchos macosx iphonesimulator iphoneos driverkit appletvsimulator appletvos"; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index 9e41b0eb6..8144cfa72 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -904,6 +904,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266314291B123B00C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; CLANG_ANALYZER_NONNULL = YES; @@ -975,7 +976,9 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; @@ -989,6 +992,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 51266314291B123B00C1D7DE /* Project-Shared.xcconfig */; buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ADDRESS_SANITIZER_CONTAINER_OVERFLOW = YES; CLANG_ANALYZER_NONNULL = YES; @@ -1053,7 +1057,9 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; RUN_CLANG_STATIC_ANALYZER = YES; - SDKROOT = iphoneos; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; + SUPPORTS_MACCATALYST = YES; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; From 5d2500ba9f19077d7c8e0bb9807469c4c11ef30e Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Fri, 7 Apr 2023 14:23:03 -0400 Subject: [PATCH 21/59] Use fulfillment in async XCTest in newer Xcode --- CareKit/CareKitTests/TestAnyEventStoreExtensions.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index 570a88670..ae29c71cf 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -118,6 +118,10 @@ class TestAnyEventStoreExtensions: XCTestCase { didUpdate.fulfill() } + #if compiler(>=5.8.0) + await fulfillment(of: [didUpdate], timeout: 2) + #else wait(for: [didUpdate], timeout: 2) + #endif } } From 38be8cee49697292e7b08a4c50e7fa67151cd5d5 Mon Sep 17 00:00:00 2001 From: Corey Date: Sat, 8 Apr 2023 13:56:11 -0400 Subject: [PATCH 22/59] Make DailyPageViewController store publicly readable --- .../ViewController/OCKDailyPageViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift b/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift index d5a7414f9..4f62c7171 100644 --- a/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift +++ b/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift @@ -81,7 +81,8 @@ UIPageViewControllerDataSource, UIPageViewControllerDelegate { @available(*, unavailable, renamed: "store") public var storeManager: OCKSynchronizedStoreManager! - let store: OCKAnyStoreProtocol + /// The store the view controller uses for synchronization. + public let store: OCKAnyStoreProtocol /// Page view managing ListViewControllers. private let pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) From 4bf2d81ea8acb54b6428a26dca796ceda5f05153 Mon Sep 17 00:00:00 2001 From: Corey Date: Sat, 8 Apr 2023 17:18:35 -0400 Subject: [PATCH 23/59] fix docs --- .../CareKit/Shared/Synchronization/CareStoreFetchRequest.swift | 2 +- .../ViewController/OCKDailyPageViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift index 1128bf883..3cbd801cb 100644 --- a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift +++ b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift @@ -55,7 +55,7 @@ import SwiftUI /// You can inject the store through the environment like this: /// /// ContentView() -/// .environment(\.careKitStore, store) +/// .environment(\.careStore, store) /// /// See the `OCKAnyStoreProtocol` and the `OCKStore` for more information about /// creating a CareKit store. diff --git a/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift b/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift index 4f62c7171..2c35534a2 100644 --- a/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift +++ b/CareKit/CareKit/iOS/Higher Order/ViewController/OCKDailyPageViewController.swift @@ -77,7 +77,7 @@ UIPageViewControllerDataSource, UIPageViewControllerDelegate { return weekCalendarPageViewController.selectedDate } - /// The store manager the view controller uses for synchronization + /// The store manager the view controller uses for synchronization. @available(*, unavailable, renamed: "store") public var storeManager: OCKSynchronizedStoreManager! From 863a5e8b3d224c23bff78929e01ae0f5027dcccf Mon Sep 17 00:00:00 2001 From: Corey Date: Sat, 8 Apr 2023 20:47:59 -0400 Subject: [PATCH 24/59] fix OCKCDPostalAddress CoreData init --- CareKitStore/CareKitStore/CoreData/OCKCDPostalAddress.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CareKitStore/CareKitStore/CoreData/OCKCDPostalAddress.swift b/CareKitStore/CareKitStore/CoreData/OCKCDPostalAddress.swift index 13d836c86..86770890c 100644 --- a/CareKitStore/CareKitStore/CoreData/OCKCDPostalAddress.swift +++ b/CareKitStore/CareKitStore/CoreData/OCKCDPostalAddress.swift @@ -41,8 +41,8 @@ class OCKCDPostalAddress: NSManagedObject { @NSManaged var country: String @NSManaged var isoCountryCode: String - init(address: OCKPostalAddress, context: NSManagedObjectContext) { - super.init(entity: Self.entity(), insertInto: context) + convenience init(address: OCKPostalAddress, context: NSManagedObjectContext) { + self.init(entity: Self.entity(), insertInto: context) street = address.street subLocality = address.subLocality city = address.city From 9434c082dc719aa128a04b32e2fa3c57ee137a1b Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 11:02:14 -0400 Subject: [PATCH 25/59] remove unnecessary check --- .../Synchronization/CareStoreFetchedResult+Extension.swift | 2 -- README.md | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchedResult+Extension.swift b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchedResult+Extension.swift index d7c4ca959..e7b1532f8 100644 --- a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchedResult+Extension.swift +++ b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchedResult+Extension.swift @@ -33,8 +33,6 @@ import Foundation extension CareStoreFetchedResult where Result == OCKAnyEvent { - @available(iOS 15, *) - @available(watchOS 8, *) func toggleBooleanOutcome() async throws -> OCKAnyOutcome { try await store.toggleBooleanOutcome(for: result) } diff --git a/README.md b/README.md index 61692e8bd..a5d0ff2bb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # CareKit -[![License](https://img.shields.io/badge/license-BSD-green.svg?style=flat)](https://github.com/carekit-apple/CareKit#license) [![Swift Versions](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/carekit-apple/CareKit) [![OS's](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/carekit-apple/CareKit) ![Xcode 13.3+](https://img.shields.io/badge/Xcode-13.3%2B-blue.svg) [![SPM](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) +[![License](https://img.shields.io/badge/license-BSD-green.svg?style=flat)](https://github.com/carekit-apple/CareKit#license) [![Swift Versions](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/carekit-apple/CareKit) [![OS's](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fcarekit-apple%2FCareKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/carekit-apple/CareKit) ![Xcode 14.0+](https://img.shields.io/badge/Xcode-14.0%2B-blue.svg) [![SPM](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) CareKit™ is an open source software framework for creating apps that help people better understand and manage their health. The framework provides modules that you can use out of the box, or extended and customized for more targeted use cases. It's composed of three SPM packages which can each be imported separately. From 35b78d5933c4a521bb8640594ed0ca6def4a9b79 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 11:03:41 -0400 Subject: [PATCH 26/59] simplify SPI --- .spi.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.spi.yml b/.spi.yml index d76dda086..38a09f526 100644 --- a/.spi.yml +++ b/.spi.yml @@ -1,9 +1,3 @@ version: 1 external_links: documentation: "https://carekit-apple.github.io/CareKit/documentation/carekit/" -builder: - configs: - - platform: ios - scheme: "CareKit" - - platform: watchos - scheme: "CareKit" From e99114c97467c167ee8fa9c34b709e47ccdcbde3 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 11:20:21 -0400 Subject: [PATCH 27/59] fix build warnings when testing --- CareKit/CareKit.xcodeproj/project.pbxproj | 4 ++-- CareKit/CareKitTests/TestAnyEventStoreExtensions.swift | 2 +- CareKitStore/CareKitStore.xcodeproj/project.pbxproj | 4 ++-- CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index 86cc35380..976483872 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -1136,7 +1136,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Debug; }; @@ -1169,7 +1169,7 @@ SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Release; }; diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index ae29c71cf..3adbe92f8 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -47,7 +47,7 @@ class TestAnyEventStoreExtensions: XCTestCase { let task = OCKTask.sample(uuid: UUID(), id: "taskA") let storedTask = try store.store.addTaskAndWait(task) let storedEvent = try store.fetchEventAndWait(forTask: storedTask, occurrence: 0) - let outcome = try await store.store.toggleBooleanOutcome(for: storedEvent.anyEvent) + let outcome = try await store.toggleBooleanOutcome(for: storedEvent.anyEvent) XCTAssertEqual(outcome.values.count, 1) XCTAssertEqual(outcome.values.first?.booleanValue, true) } diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index 11a185a6d..e016cbc7a 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -1459,7 +1459,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Debug; }; @@ -1480,7 +1480,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "watchsimulator watchos iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Release; }; diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index 8144cfa72..f5eab2a57 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -875,7 +875,7 @@ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Debug; }; @@ -896,7 +896,7 @@ SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SUPPORTS_MACCATALYST = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,4"; }; name = Release; }; From cee8e25308b541e90c9ef1257370cff7575179e2 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 11:38:49 -0400 Subject: [PATCH 28/59] Make OCKWeekCalendarPageViewController store public readable --- .../Calendar/Paging/OCKWeekCalendarPageViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CareKit/CareKit/iOS/Calendar/Paging/OCKWeekCalendarPageViewController.swift b/CareKit/CareKit/iOS/Calendar/Paging/OCKWeekCalendarPageViewController.swift index e7b69b3f3..27145ecd5 100644 --- a/CareKit/CareKit/iOS/Calendar/Paging/OCKWeekCalendarPageViewController.swift +++ b/CareKit/CareKit/iOS/Calendar/Paging/OCKWeekCalendarPageViewController.swift @@ -83,7 +83,8 @@ UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelega /// The initial date displayed when the view controller is loaded. private let startingDate = Date() - private let store: OCKAnyStoreProtocol + /// The store the view controller uses for synchronization. + public let store: OCKAnyStoreProtocol // MARK: - Life Cycle From 2b7741e6ed5f8847027c3b2799fffc3eb08662ea Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 12:06:19 -0400 Subject: [PATCH 29/59] Bump min SPM to Swift 5.7 --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 762cafbd1..5839797ef 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.6 +// swift-tools-version:5.7 import PackageDescription let package = Package( From c37c9a49229667cd09e67266bee8d7b4fd583e6b Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 12:33:35 -0400 Subject: [PATCH 30/59] build docs for each --- .spi.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.spi.yml b/.spi.yml index 38a09f526..2f7613c11 100644 --- a/.spi.yml +++ b/.spi.yml @@ -1,3 +1,11 @@ version: 1 external_links: documentation: "https://carekit-apple.github.io/CareKit/documentation/carekit/" +builder: + configs: + - documentation_targets: ["CareKit", "CareKitUI", "CareKitiStore", "CareKitFHIR"] + platform: ios + - platform: ios + scheme: "CareKit" + - platform: watchos + scheme: "CareKit" From c0b3dd14341b598ddd3d27f77e4a63221fdb5b02 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 12:44:44 -0400 Subject: [PATCH 31/59] nit --- .spi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.spi.yml b/.spi.yml index 2f7613c11..ef1b9295f 100644 --- a/.spi.yml +++ b/.spi.yml @@ -3,7 +3,7 @@ external_links: documentation: "https://carekit-apple.github.io/CareKit/documentation/carekit/" builder: configs: - - documentation_targets: ["CareKit", "CareKitUI", "CareKitiStore", "CareKitFHIR"] + - documentation_targets: ["CareKit", "CareKitUI", "CareKitStore", "CareKitFHIR"] platform: ios - platform: ios scheme: "CareKit" From 47482b74d48745a4fca89d80a10b08769bedfd58 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 9 Apr 2023 12:51:45 -0400 Subject: [PATCH 32/59] remove external links in spi --- .spi.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.spi.yml b/.spi.yml index ef1b9295f..4ef292f8b 100644 --- a/.spi.yml +++ b/.spi.yml @@ -1,6 +1,4 @@ version: 1 -external_links: - documentation: "https://carekit-apple.github.io/CareKit/documentation/carekit/" builder: configs: - documentation_targets: ["CareKit", "CareKitUI", "CareKitStore", "CareKitFHIR"] From 032abb22324bcd2b80d506aa708f5e035cf1c0a5 Mon Sep 17 00:00:00 2001 From: Corey Date: Mon, 10 Apr 2023 10:31:11 -0400 Subject: [PATCH 33/59] Set default value for calendar property in OCKScheduleElement --- CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index ac955d971..12baff8b0 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,7 +88,7 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private let calendar: Calendar + private var calendar = Calendar.current /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. @@ -132,8 +132,6 @@ public struct OCKScheduleElement: Codable, Equatable { public init(start: Date, end: Date?, interval: DateComponents, text: String? = nil, targetValues: [OCKOutcomeValue] = [], duration: Duration = .hours(1)) { - let calendar = Calendar.current - precondition(end == nil || start < end!, "Start date must be before the end date!") precondition(interval.movesForwardInTime(calendar: calendar), "Interval must not progress backwards in time!") @@ -143,7 +141,6 @@ public struct OCKScheduleElement: Codable, Equatable { self.text = text self.duration = duration self.targetValues = targetValues - self.calendar = calendar } /// Compute the Nth event of this schedule. From e7e9ffabad717da2a55a3d9f2cf94649184f9150 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 16:22:15 -0400 Subject: [PATCH 34/59] Add back tint color in #676 --- .../OCKContactViewResponder.swift | 9 ++ .../UIViewController+Extensions.swift | 4 + .../OCKSurveyTaskViewController.swift | 123 ++++++++++-------- .../OCKTaskViewController.swift | 14 ++ 4 files changed, 97 insertions(+), 53 deletions(-) diff --git a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift index 9e8c15814..8a25f52be 100644 --- a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift +++ b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift @@ -159,6 +159,15 @@ final class OCKContactViewResponder: NSObject, action: #selector(dismissViewController) ) + /* + TODO: Remove in the future. Explicitly setting the tint color here to support + current developers that have a SwiftUI lifecycle app and wrap this view + controller in a `UIViewControllerRepresentable` implementation...Tint color + is not propagated...etc. + */ + let tintColor = contactViewController.determineTintColor(from: contactViewController.view) + contactViewController.view.tintColor = tintColor + let navigationController = UINavigationController(rootViewController: contactViewController) presenter?.present(navigationController, animated: true) } diff --git a/CareKit/CareKit/iOS/Extensions/UIViewController+Extensions.swift b/CareKit/CareKit/iOS/Extensions/UIViewController+Extensions.swift index 6521c2afb..c2ffa5107 100644 --- a/CareKit/CareKit/iOS/Extensions/UIViewController+Extensions.swift +++ b/CareKit/CareKit/iOS/Extensions/UIViewController+Extensions.swift @@ -50,5 +50,9 @@ internal extension UIViewController { stackView.insertArrangedSubview(view, at: index, animated: animated) didMove(toParent: containerViewController) } + + func determineTintColor(from view: UIView) -> UIColor { + self.view.window?.tintColor ?? view.tintColor + } } #endif diff --git a/CareKit/CareKit/iOS/Task/View Controllers/OCKSurveyTaskViewController.swift b/CareKit/CareKit/iOS/Task/View Controllers/OCKSurveyTaskViewController.swift index d5063447b..2b36b5c1b 100644 --- a/CareKit/CareKit/iOS/Task/View Controllers/OCKSurveyTaskViewController.swift +++ b/CareKit/CareKit/iOS/Task/View Controllers/OCKSurveyTaskViewController.swift @@ -133,65 +133,81 @@ open class OCKSurveyTaskViewController: OCKTaskViewController Date: Mon, 10 Apr 2023 16:33:31 -0400 Subject: [PATCH 35/59] Fix contact tintColor in ContactView --- .../iOS/Contact/View Controllers/OCKContactViewResponder.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift index 8a25f52be..b6b6d4bdb 100644 --- a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift +++ b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift @@ -165,7 +165,7 @@ final class OCKContactViewResponder: NSObject, controller in a `UIViewControllerRepresentable` implementation...Tint color is not propagated...etc. */ - let tintColor = contactViewController.determineTintColor(from: contactViewController.view) + let tintColor = contactViewController.determineTintColor(from: contactView) contactViewController.view.tintColor = tintColor let navigationController = UINavigationController(rootViewController: contactViewController) From 644424b75df6cce0b51557aae2f0478e5c839b98 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 16:40:25 -0400 Subject: [PATCH 36/59] fix contact navbar tintColor --- .../iOS/Contact/View Controllers/OCKContactViewResponder.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift index b6b6d4bdb..fc5382919 100644 --- a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift +++ b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift @@ -167,6 +167,7 @@ final class OCKContactViewResponder: NSObject, */ let tintColor = contactViewController.determineTintColor(from: contactView) contactViewController.view.tintColor = tintColor + contactViewController.navigationController?.navigationBar.tintColor = tintColor let navigationController = UINavigationController(rootViewController: contactViewController) presenter?.present(navigationController, animated: true) From f8d0a813a3d03e7e26cc623e9d9d2c8a25525955 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 16:50:29 -0400 Subject: [PATCH 37/59] fix contact navbar tintColor --- .../iOS/Contact/View Controllers/OCKContactViewResponder.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift index fc5382919..5fa07ef52 100644 --- a/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift +++ b/CareKit/CareKit/iOS/Contact/View Controllers/OCKContactViewResponder.swift @@ -167,7 +167,7 @@ final class OCKContactViewResponder: NSObject, */ let tintColor = contactViewController.determineTintColor(from: contactView) contactViewController.view.tintColor = tintColor - contactViewController.navigationController?.navigationBar.tintColor = tintColor + contactViewController.navigationItem.rightBarButtonItem?.tintColor = tintColor let navigationController = UINavigationController(rootViewController: contactViewController) presenter?.present(navigationController, animated: true) From 38b9ef83b930f66daa329e9e1fd699d43340ea06 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 16:58:58 -0400 Subject: [PATCH 38/59] Encoding/decoding Calendar.current causes crash after delay --- .../CareKitStore/Structs/OCKScheduleElement.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index 12baff8b0..378addb02 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,8 +88,6 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private var calendar = Calendar.current - /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. public var text: String? @@ -132,6 +130,7 @@ public struct OCKScheduleElement: Codable, Equatable { public init(start: Date, end: Date?, interval: DateComponents, text: String? = nil, targetValues: [OCKOutcomeValue] = [], duration: Duration = .hours(1)) { + let calendar = Calendar.current precondition(end == nil || start < end!, "Start date must be before the end date!") precondition(interval.movesForwardInTime(calendar: calendar), "Interval must not progress backwards in time!") @@ -162,6 +161,7 @@ public struct OCKScheduleElement: Codable, Equatable { /// - Returns: a new instance of with all event times offset by the given value. public func offset(by dateComponents: DateComponents) -> OCKScheduleElement { + let calendar = Calendar.current let newStart = calendar.date(byAdding: dateComponents, to: start)! let newEnd = end == nil ? nil : calendar.date(byAdding: dateComponents, to: end!)! return OCKScheduleElement(start: newStart, end: newEnd, interval: interval, @@ -269,7 +269,7 @@ public struct OCKScheduleElement: Codable, Equatable { events.append(event) // Create a new event for the next iteration - let start = calendar.date(byAdding: interval, to: event.start)! + let start = Calendar.current.date(byAdding: interval, to: event.start)! nextEvent = computeEvent( on: start, @@ -292,6 +292,7 @@ public struct OCKScheduleElement: Codable, Equatable { switch duration { case .allDay: + let calendar = Calendar.current start = calendar.startOfDay(for: date) end = calendar.date(byAdding: DateComponents(day: 1, second: -1), to: start)! @@ -327,7 +328,7 @@ public struct OCKScheduleElement: Codable, Equatable { // All day events are valid if they start before or on the same day as the limit case .allDay: - + let calendar = Calendar.current // Subtract a second from the limit to ensure an exclusive end date let adjustedLimit = calendar.date(byAdding: .second, value: -1, to: limit)! let occursOnSameDayAsLimit = calendar.isDate(eventStart, inSameDayAs: adjustedLimit) From 27f525c654a83cf788e6b8bcbb93c6cf87ce10c6 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 17:32:04 -0400 Subject: [PATCH 39/59] Revery and test OCKScheduleElement --- .../CareKitStore/Structs/OCKScheduleElement.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index 378addb02..34b8ef8ab 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,6 +88,8 @@ public struct OCKScheduleElement: Codable, Equatable { } } + private let calendar: Calendar + /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. public var text: String? @@ -140,6 +142,7 @@ public struct OCKScheduleElement: Codable, Equatable { self.text = text self.duration = duration self.targetValues = targetValues + self.calendar = calendar } /// Compute the Nth event of this schedule. @@ -161,7 +164,6 @@ public struct OCKScheduleElement: Codable, Equatable { /// - Returns: a new instance of with all event times offset by the given value. public func offset(by dateComponents: DateComponents) -> OCKScheduleElement { - let calendar = Calendar.current let newStart = calendar.date(byAdding: dateComponents, to: start)! let newEnd = end == nil ? nil : calendar.date(byAdding: dateComponents, to: end!)! return OCKScheduleElement(start: newStart, end: newEnd, interval: interval, @@ -269,7 +271,7 @@ public struct OCKScheduleElement: Codable, Equatable { events.append(event) // Create a new event for the next iteration - let start = Calendar.current.date(byAdding: interval, to: event.start)! + let start = calendar.date(byAdding: interval, to: event.start)! nextEvent = computeEvent( on: start, @@ -292,7 +294,6 @@ public struct OCKScheduleElement: Codable, Equatable { switch duration { case .allDay: - let calendar = Calendar.current start = calendar.startOfDay(for: date) end = calendar.date(byAdding: DateComponents(day: 1, second: -1), to: start)! @@ -328,7 +329,7 @@ public struct OCKScheduleElement: Codable, Equatable { // All day events are valid if they start before or on the same day as the limit case .allDay: - let calendar = Calendar.current + // Subtract a second from the limit to ensure an exclusive end date let adjustedLimit = calendar.date(byAdding: .second, value: -1, to: limit)! let occursOnSameDayAsLimit = calendar.isDate(eventStart, inSameDayAs: adjustedLimit) From 3a431293294e84aa2c468c1465397e20209296e8 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Mon, 10 Apr 2023 17:45:21 -0400 Subject: [PATCH 40/59] revert decoding, seems to crash on Xcode 14.3, not 14.2 --- CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index 34b8ef8ab..12baff8b0 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,7 +88,7 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private let calendar: Calendar + private var calendar = Calendar.current /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. @@ -132,7 +132,6 @@ public struct OCKScheduleElement: Codable, Equatable { public init(start: Date, end: Date?, interval: DateComponents, text: String? = nil, targetValues: [OCKOutcomeValue] = [], duration: Duration = .hours(1)) { - let calendar = Calendar.current precondition(end == nil || start < end!, "Start date must be before the end date!") precondition(interval.movesForwardInTime(calendar: calendar), "Interval must not progress backwards in time!") @@ -142,7 +141,6 @@ public struct OCKScheduleElement: Codable, Equatable { self.text = text self.duration = duration self.targetValues = targetValues - self.calendar = calendar } /// Compute the Nth event of this schedule. From ff6ccbe7aa4bdbc496be0122d371c391e6ff2753 Mon Sep 17 00:00:00 2001 From: Gavi Rawson <51756298+gavirawson-apple@users.noreply.github.com> Date: Mon, 10 Apr 2023 20:58:07 -0700 Subject: [PATCH 41/59] Add-ons to PR with CareKit 3.0 beta improvements (#691) (#7) * Delete stale file * Use Swift Concurrency API for awaiting expectations --- .../TestAnyEventStoreExtensions.swift | 4 - .../Streaming/TestCoreDataQueryMonitor.swift | 2 +- .../Streaming/TestCoreDataSource.swift | 368 ------------------ 3 files changed, 1 insertion(+), 373 deletions(-) delete mode 100644 CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index 3adbe92f8..c499196a3 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -118,10 +118,6 @@ class TestAnyEventStoreExtensions: XCTestCase { didUpdate.fulfill() } - #if compiler(>=5.8.0) await fulfillment(of: [didUpdate], timeout: 2) - #else - wait(for: [didUpdate], timeout: 2) - #endif } } diff --git a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift index 1e2410497..d9a47bc8b 100644 --- a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift +++ b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift @@ -264,7 +264,7 @@ class TestCoreDataQueryMonitor: XCTestCase { monitor.startQuery() - wait(for: [didProduceResult, didDeleteTasks], timeout: 2) + await fulfillment(of: [didProduceResult, didDeleteTasks], timeout: 2) monitor.stopQuery() } diff --git a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift deleted file mode 100644 index 9929eb8cd..000000000 --- a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataSource.swift +++ /dev/null @@ -1,368 +0,0 @@ -/* - Copyright (c) 2022, Apple Inc. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - - 3. Neither the name of the copyright holder(s) nor the names of any contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. No license is granted to the trademarks of - the copyright holders even if such marks are included in this software. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -import Combine -import Foundation -import XCTest - -@testable import CareKitStore - -class TestCoreDataQueryPublisher: XCTestCase { - - private let store = OCKStore( - name: "CoreDataExecutorTests.Store", - type: .inMemory - ) - - override func setUpWithError() throws { - try super.setUpWithError() - try store.reset() - } - - func testInitialResultIsForwardedAndSorted() throws { - - // Add tasks to the store - - let expectedTasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - try store.addTasksAndWait(expectedTasks) - - // Validate the initial published result - - let didReceiveResult = XCTestExpectation(description: "Received result") - didReceiveResult.assertForOverFulfill = true - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: true), - sortDescriptors: [NSSortDescriptor(keyPath: \OCKCDTask.title, ascending: true)], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { observedTasks in - - let expectedTitles = expectedTasks.map(\.title) - let observedTitles = observedTasks.map(\.title) - XCTAssertEqual(expectedTitles, observedTitles) - - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - } - - func testResultIsForwardedWhenAddOccurs() throws { - - let expectedTasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - var didAddTasks = false - - let didReceiveResult = XCTestExpectation(description: "Result received") - didReceiveResult.assertForOverFulfill = true - didReceiveResult.expectedFulfillmentCount = 2 - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: true), - sortDescriptors: [NSSortDescriptor(keyPath: \OCKCDTask.title, ascending: true)], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { observedTasks in - - // Add the tasks if they have not yet been added - if !didAddTasks { - - XCTAssertEqual(observedTasks.count, 0) - - try! self.store.addTasksAndWait(expectedTasks) - didAddTasks = true - - // Validate the newly added tasks - } else { - - let expectedTitles = expectedTasks.map(\.title) - let observedTitles = observedTasks.map(\.title) - XCTAssertEqual(expectedTitles, observedTitles) - } - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - } - - func testResultIsForwardedWhenDeleteOccurs() throws { - - // Add tasks to the store - - let expectedTasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - try store.addTasksAndWait(expectedTasks) - - // Stream tasks from the store - - var didDeleteTasks = false - - let didReceiveResult = XCTestExpectation(description: "Result received") - didReceiveResult.assertForOverFulfill = true - didReceiveResult.expectedFulfillmentCount = 2 - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: true), - sortDescriptors: [NSSortDescriptor(keyPath: \OCKCDTask.title, ascending: true)], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { observedTasks in - - // Add the tasks if they have not yet been added - if !didDeleteTasks { - - XCTAssertEqual(observedTasks.count, expectedTasks.count) - - try! self.store.reset() - didDeleteTasks = true - - // Validate the newly deleted tasks - } else { - - XCTAssertEqual(observedTasks.count, 0) - } - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - } - - func testResultIsForwardedWhenUpdateOccurs() throws { - - // Add tasks to the store - - let originalTasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - let updatedTitles = ["taskC", "taskD"] - - try store.addTasksAndWait(originalTasks) - - // Stream tasks from the store - - var didUpdateTasks = false - - let didReceiveResult = XCTestExpectation(description: "Result received") - didReceiveResult.assertForOverFulfill = true - didReceiveResult.expectedFulfillmentCount = 2 - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: true), - sortDescriptors: [NSSortDescriptor(keyPath: \OCKCDTask.title, ascending: true)], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { observedTasks in - - // Update the tasks in the store - if !didUpdateTasks { - - XCTAssertEqual(observedTasks.count, originalTasks.count) - - let updatedTasks = observedTasks - .map { $0.makeTask() } - .enumerated() - .map { index, task -> OCKTask in - var updatedTask = task - updatedTask.title = updatedTitles[index] - updatedTask.effectiveDate = Date() - return updatedTask - } - - try! self.store.updateTasksAndWait(updatedTasks) - - didUpdateTasks = true - - // Validate the newly updated tasks - } else { - - let expectedTitles = - originalTasks.map(\.title) + - updatedTitles - - let observedTitles = observedTasks.map(\.title) - - XCTAssertEqual(expectedTitles, observedTitles) - } - - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - } - - func testIrrelevantChangeDoesNotTriggerResult() throws { - - // Add tasks to the store - - let tasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - try store.addTasksAndWait(tasks) - - // Stream tasks from the store - - let didReceiveResult = XCTestExpectation(description: "Result received") - didReceiveResult.assertForOverFulfill = true - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: false), - sortDescriptors: [], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { _ in - - try! self.store.reset() - - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - } - - func testCancelledStreamDoesNotTriggerResult() throws { - - // Add tasks to the store - - let tasks = [ - makeSampleTask(idAndTitle: "taskA"), - makeSampleTask(idAndTitle: "taskB") - ] - - try store.addTasksAndWait(tasks) - - // Stream tasks from the store - - let didReceiveResult = XCTestExpectation(description: "Result received") - didReceiveResult.assertForOverFulfill = true - - let coreDataSource = CoreDataSource( - OCKCDTask.self, - predicate: NSPredicate(value: true), - sortDescriptors: [], - context: store.context - ) - - let cancellable = QueryPublisher(dataSource: coreDataSource) - // Should never fail - .catch { error -> Empty<[OCKCDTask], Never> in - XCTFail(error.localizedDescription) - return Empty() - } - .sink { _ in - didReceiveResult.fulfill() - } - - wait(for: [didReceiveResult], timeout: 2) - cancellable.cancel() - - // Trigger a change to the observed tasks. SInk block - // should not get called. - try store.reset() - } - - // MARK: Utilities - - private func makeSampleTask(idAndTitle: String) -> OCKTask { - - let startOfDay = Calendar.current.startOfDay(for: Date()) - - let schedule = OCKSchedule - .dailyAtTime(hour: 7, minutes: 0, start: startOfDay, end: nil, text: nil) - - let task = OCKTask( - id: idAndTitle, - title: idAndTitle, - carePlanUUID: nil, - schedule: schedule - ) - - return task - } -} From 78f4bec84ee867f6bfad1c3ba1cb5115c8df6e0c Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Tue, 11 Apr 2023 09:01:09 -0400 Subject: [PATCH 42/59] clean up --- .gitignore | 1 + CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist | 8 -------- CareKit/CareKitTests/TestAnyEventStoreExtensions.swift | 4 ++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 -------- 4 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/.gitignore b/.gitignore index 7195b8387..2d24cc563 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # # Xcode build/ +IDEWorkspaceChecks.plist *.pbxuser !default.pbxuser *.mode1v3 diff --git a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/CareKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index c499196a3..3adbe92f8 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -118,6 +118,10 @@ class TestAnyEventStoreExtensions: XCTestCase { didUpdate.fulfill() } + #if compiler(>=5.8.0) await fulfillment(of: [didUpdate], timeout: 2) + #else + wait(for: [didUpdate], timeout: 2) + #endif } } diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - From 2712c6e8719196fd51071e90a9ed5ad4ac62d826 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Tue, 11 Apr 2023 09:09:07 -0400 Subject: [PATCH 43/59] fix tests --- .../Streaming/TestCoreDataQueryMonitor.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift index d9a47bc8b..268310c5f 100644 --- a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift +++ b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift @@ -214,6 +214,7 @@ class TestCoreDataQueryMonitor: XCTestCase { XCTAssertEqual(expectedTitles, observedTitles) } + #if compiler(>=5.8.0) func testIrrelevantChangeDoesNotProduceResult() async throws { // Add tasks to the store @@ -268,7 +269,8 @@ class TestCoreDataQueryMonitor: XCTestCase { monitor.stopQuery() } - + #endif + func testCancelledStreamDoesNotProduceResult() throws { // Add tasks to the store From 50b4d9f6dde1532340232448fe44146d42da1533 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Tue, 11 Apr 2023 17:47:07 -0400 Subject: [PATCH 44/59] test if self prevents crash as it works in debugger --- CareKitStore/CareKitStore/CoreData/OCKCDTask.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift b/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift index 4ee6d96ea..babf76f52 100644 --- a/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift +++ b/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift @@ -70,7 +70,7 @@ class OCKCDTask: OCKCDTaskBase { id: id, title: title, carePlanUUID: carePlan?.uuid, - schedule: OCKSchedule(composing: scheduleElements.map { $0.makeValue() }) + schedule: OCKSchedule(composing: self.scheduleElements.map { $0.makeValue() }) ) task.copyVersionedValues(from: self) From 6d65a07cc5db3bf668ad500ba4f71437e9e13bf8 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Tue, 11 Apr 2023 17:53:36 -0400 Subject: [PATCH 45/59] revert --- CareKitStore/CareKitStore/CoreData/OCKCDTask.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift b/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift index babf76f52..4ee6d96ea 100644 --- a/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift +++ b/CareKitStore/CareKitStore/CoreData/OCKCDTask.swift @@ -70,7 +70,7 @@ class OCKCDTask: OCKCDTaskBase { id: id, title: title, carePlanUUID: carePlan?.uuid, - schedule: OCKSchedule(composing: self.scheduleElements.map { $0.makeValue() }) + schedule: OCKSchedule(composing: scheduleElements.map { $0.makeValue() }) ) task.copyVersionedValues(from: self) From a742f62099a2cac0e49d12d5da570b5793a7591e Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Wed, 12 Apr 2023 08:47:06 -0400 Subject: [PATCH 46/59] Make calendar type property to skip encoding/decoding --- .../Structs/OCKScheduleElement.swift | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index 12baff8b0..d757b53f4 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,7 +88,7 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private var calendar = Calendar.current + private static var calendar = Calendar.current /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. @@ -133,9 +133,9 @@ public struct OCKScheduleElement: Codable, Equatable { targetValues: [OCKOutcomeValue] = [], duration: Duration = .hours(1)) { precondition(end == nil || start < end!, "Start date must be before the end date!") - precondition(interval.movesForwardInTime(calendar: calendar), "Interval must not progress backwards in time!") + precondition(interval.movesForwardInTime(calendar: Self.calendar), "Interval must not progress backwards in time!") - self.start = duration == .allDay ? calendar.startOfDay(for: start) : start + self.start = duration == .allDay ? Self.calendar.startOfDay(for: start) : start self.end = end self.interval = interval self.text = text @@ -162,8 +162,8 @@ public struct OCKScheduleElement: Codable, Equatable { /// - Returns: a new instance of with all event times offset by the given value. public func offset(by dateComponents: DateComponents) -> OCKScheduleElement { - let newStart = calendar.date(byAdding: dateComponents, to: start)! - let newEnd = end == nil ? nil : calendar.date(byAdding: dateComponents, to: end!)! + let newStart = Self.calendar.date(byAdding: dateComponents, to: start)! + let newEnd = end == nil ? nil : Self.calendar.date(byAdding: dateComponents, to: end!)! return OCKScheduleElement(start: newStart, end: newEnd, interval: interval, text: text, targetValues: targetValues, duration: duration) } @@ -269,7 +269,7 @@ public struct OCKScheduleElement: Codable, Equatable { events.append(event) // Create a new event for the next iteration - let start = calendar.date(byAdding: interval, to: event.start)! + let start = Self.calendar.date(byAdding: interval, to: event.start)! nextEvent = computeEvent( on: start, @@ -292,8 +292,8 @@ public struct OCKScheduleElement: Codable, Equatable { switch duration { case .allDay: - start = calendar.startOfDay(for: date) - end = calendar.date(byAdding: DateComponents(day: 1, second: -1), to: start)! + start = Self.calendar.startOfDay(for: date) + end = Self.calendar.date(byAdding: DateComponents(day: 1, second: -1), to: start)! case let .seconds(seconds): start = date @@ -329,8 +329,8 @@ public struct OCKScheduleElement: Codable, Equatable { case .allDay: // Subtract a second from the limit to ensure an exclusive end date - let adjustedLimit = calendar.date(byAdding: .second, value: -1, to: limit)! - let occursOnSameDayAsLimit = calendar.isDate(eventStart, inSameDayAs: adjustedLimit) + let adjustedLimit = Self.calendar.date(byAdding: .second, value: -1, to: limit)! + let occursOnSameDayAsLimit = Self.calendar.isDate(eventStart, inSameDayAs: adjustedLimit) return occursBeforeLimit || occursOnSameDayAsLimit } From e426d569523dc9bd48faecdc7a8970f460fd9791 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Wed, 12 Apr 2023 08:56:54 -0400 Subject: [PATCH 47/59] Call cancelStreamingTask on deinit --- .../Synchronization/CareStoreFetchRequestController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift index e7e2ecd5c..c21d27618 100644 --- a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift +++ b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift @@ -92,6 +92,10 @@ final class CareStoreFetchRequestController: ObservableObject { ) } + deinit { + cancelStreamingTask() + } + /// Update the current query that is either pending or streaming. If the query is pending /// make sure to call `streamResults(store:)` explicitly to begin the streaming process. func update(query: Query) { From ada41bba686ceada5e329d6a30ddeba38a87c92a Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Wed, 12 Apr 2023 10:02:28 -0400 Subject: [PATCH 48/59] remove print statements in tests --- .../TestCareStoreFetchRequestController.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift index e4e80113c..b08c789fa 100644 --- a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift +++ b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift @@ -176,8 +176,6 @@ class TestCareStoreFetchRequestController: XCTestCase { let storage = fetchedResults?.storage ?? [] observedResults.append(storage) - print(storage) - // Update the query. That will trigger a new computation of `fetchedResults`. controller.update(query: newQuery) @@ -231,8 +229,6 @@ class TestCareStoreFetchRequestController: XCTestCase { let storage = fetchedResults?.storage ?? [] observedResults.append(storage) - print(storage) - // Update the store. That will trigger a new computation of `fetchedResults`. controller.streamResults(from: newStore) @@ -279,8 +275,6 @@ class TestCareStoreFetchRequestController: XCTestCase { let storage = fetchedResults?.storage ?? [] observedResults.append(storage) - print(storage) - // Stream from the same store. That will not trigger a new computation of `fetchedResults`. controller.streamResults(from: self.store) From ef51eff56adf6525343637c00be577043db0736a Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Wed, 12 Apr 2023 10:43:00 -0400 Subject: [PATCH 49/59] testing single queue for startQuery streaming --- .../Streaming/CoreDataQueryMonitor.swift | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift b/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift index 1282c9c54..a862fa199 100644 --- a/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift +++ b/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift @@ -69,27 +69,29 @@ final class CoreDataQueryMonitor< // Create a controller that will be used to fetch Core Data entities - controller = NSFetchedResultsController( - fetchRequest: request, - managedObjectContext: context, - sectionNameKeyPath: nil, - cacheName: nil - ) - - controller?.delegate = self - - // Fetch the initial data from the Core Data store - - do { - try controller!.performFetch() - } catch { - os_log(.error, log: .store, "Query failed: %@", error as NSError) - resultHandler(.failure(error)) - return + DispatchQueue.main.async { + self.controller = NSFetchedResultsController( + fetchRequest: self.request, + managedObjectContext: self.context, + sectionNameKeyPath: nil, + cacheName: nil + ) + + self.controller?.delegate = self + + // Fetch the initial data from the Core Data store + + do { + try self.controller!.performFetch() + } catch { + os_log(.error, log: .store, "Query failed: %@", error as NSError) + self.resultHandler(.failure(error)) + return + } + + let result = self.controller!.fetchedObjects ?? [] + self.resultHandler(.success(result)) } - - let result = controller!.fetchedObjects ?? [] - resultHandler(.success(result)) } func stopQuery() { From 708d0ec751700d9dbb1316887ff7915b6260d6d7 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Wed, 12 Apr 2023 10:52:25 -0400 Subject: [PATCH 50/59] revert --- .../Streaming/CoreDataQueryMonitor.swift | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift b/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift index a862fa199..1282c9c54 100644 --- a/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift +++ b/CareKitStore/CareKitStore/Streaming/CoreDataQueryMonitor.swift @@ -69,29 +69,27 @@ final class CoreDataQueryMonitor< // Create a controller that will be used to fetch Core Data entities - DispatchQueue.main.async { - self.controller = NSFetchedResultsController( - fetchRequest: self.request, - managedObjectContext: self.context, - sectionNameKeyPath: nil, - cacheName: nil - ) - - self.controller?.delegate = self - - // Fetch the initial data from the Core Data store - - do { - try self.controller!.performFetch() - } catch { - os_log(.error, log: .store, "Query failed: %@", error as NSError) - self.resultHandler(.failure(error)) - return - } - - let result = self.controller!.fetchedObjects ?? [] - self.resultHandler(.success(result)) + controller = NSFetchedResultsController( + fetchRequest: request, + managedObjectContext: context, + sectionNameKeyPath: nil, + cacheName: nil + ) + + controller?.delegate = self + + // Fetch the initial data from the Core Data store + + do { + try controller!.performFetch() + } catch { + os_log(.error, log: .store, "Query failed: %@", error as NSError) + resultHandler(.failure(error)) + return } + + let result = controller!.fetchedObjects ?? [] + resultHandler(.success(result)) } func stopQuery() { From 636aaae6b586e1cbbb662de5bc3252dd53a49836 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 13 Apr 2023 10:53:56 -0400 Subject: [PATCH 51/59] Test holding stronger references from stream --- CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift b/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift index 12aa5a6ce..e8b3698f3 100644 --- a/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift +++ b/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift @@ -56,7 +56,11 @@ extension OCKStore { let tasks = coreDataTasks .map { tasks in - tasks.map { $0.makeTask() } + let tasks = tasks + return tasks.map { task in + let task = task + return task.makeTask() + } } // Wrap the final transformed stream to hide all implementation details from From 7839f08370d1e3aaa5947d4ab2c3910b8cb7fc4b Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 13 Apr 2023 11:16:48 -0400 Subject: [PATCH 52/59] test if AsyncAlgorithms 0.1.0 fixes reference issues --- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../CareKitStore.xcodeproj/project.pbxproj | 2 +- .../CoreData/OCKStore+Tasks.swift | 6 +- ...althKitPassthroughStore+EventsStream.swift | 2 +- .../OCKStoreCoordinator.swift | 2 +- ...TestHealthKitPassthroughStore+Events.swift | 6 +- .../TestPersistentStoreCoordinator.swift | 2 +- Package.resolved | 60 +++++++++---------- Package.swift | 2 +- 9 files changed, 40 insertions(+), 46 deletions(-) diff --git a/CKWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved b/CKWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved index dfb60b1d5..bf455053b 100644 --- a/CKWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/CKWorkspace.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-async-algorithms", "state" : { - "revision" : "aed5422380244498344a036b8d94e27f370d9a22", - "version" : "0.0.4" + "revision" : "9cfed92b026c524674ed869a4ff2dcfdeedf8a2a", + "version" : "0.1.0" } }, { diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index e016cbc7a..ee0a3e888 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -1522,7 +1522,7 @@ repositoryURL = "https://github.com/apple/swift-async-algorithms"; requirement = { kind = exactVersion; - version = 0.0.4; + version = 0.1.0; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift b/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift index e8b3698f3..12aa5a6ce 100644 --- a/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift +++ b/CareKitStore/CareKitStore/CoreData/OCKStore+Tasks.swift @@ -56,11 +56,7 @@ extension OCKStore { let tasks = coreDataTasks .map { tasks in - let tasks = tasks - return tasks.map { task in - let task = task - return task.makeTask() - } + tasks.map { $0.makeTask() } } // Wrap the final transformed stream to hide all implementation details from diff --git a/CareKitStore/CareKitStore/HealthKit/OCKHealthKitPassthroughStore+EventsStream.swift b/CareKitStore/CareKitStore/HealthKit/OCKHealthKitPassthroughStore+EventsStream.swift index f035054de..9ce8354cf 100644 --- a/CareKitStore/CareKitStore/HealthKit/OCKHealthKitPassthroughStore+EventsStream.swift +++ b/CareKitStore/CareKitStore/HealthKit/OCKHealthKitPassthroughStore+EventsStream.swift @@ -68,7 +68,7 @@ extension OCKHealthKitPassthroughStore { applyingChanges changes: @escaping ([Event]) -> SampleChanges, updateCumulativeSumOfSamples: @escaping UpdateCumulativeSumOfSamples ) -> AsyncFlatMapSequence, [[OCKHealthKitPassthroughStore.Task]]>, [PartialEvent]>, [OCKHealthKitPassthroughStore.Event]>, AsyncThrowingExclusiveReductionsSequence, SampleChanges>, [OCKHealthKitPassthroughStore.Event]> + AsyncThrowingMapSequence, [[OCKHealthKitPassthroughStore.Task]]>, [PartialEvent]>, [OCKHealthKitPassthroughStore.Event]>, AsyncThrowingExclusiveReductionsSequence, SampleChanges>, [OCKHealthKitPassthroughStore.Event]> > where SampleChanges.Element == SampleChange { diff --git a/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift b/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift index ee0cc08c8..0c8bf1fe9 100644 --- a/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift +++ b/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift @@ -208,7 +208,7 @@ open class OCKStoreCoordinator: OCKAnyStoreProtocol { // a single combined result is sent through the stream. // Create a stream that outputs a single empty result - let initialResults: AsyncLazySequence<[[T]]> = [[]].async + let initialResults: AsyncSyncSequence<[[T]]> = [[]].async let wrappedInitialResults = CareStoreQueryResults(wrapping: initialResults) let combinedResults = sequences.reduce(wrappedInitialResults) { partiallyCombinedResults, nextResults in diff --git a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift index de0026a71..0f08f114b 100644 --- a/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift +++ b/CareKitStore/CareKitStoreTests/OCKHealthKitStore/TestHealthKitPassthroughStore+Events.swift @@ -141,7 +141,7 @@ class TestHealthKitPassthroughStoreEvents: XCTestCase { func testInitialResultIsEmpty() async throws { - let noChanges: AsyncLazySequence<[SampleChange]> = [SampleChange()].async + let noChanges: AsyncSyncSequence<[SampleChange]> = [SampleChange()].async let query = OCKTaskQuery() @@ -173,7 +173,7 @@ class TestHealthKitPassthroughStoreEvents: XCTestCase { // Create a task query that does not include either of the existing tasks let query = OCKTaskQuery(id: "irrelevantTask") - let noChanges: AsyncLazySequence<[SampleChange]> = [].async + let noChanges: AsyncSyncSequence<[SampleChange]> = [].async let events = passthroughStore.events( matching: query, @@ -219,7 +219,7 @@ class TestHealthKitPassthroughStoreEvents: XCTestCase { let query = OCKTaskQuery(dateInterval: queryInterval) - let noChanges: AsyncLazySequence<[SampleChange]> = [].async + let noChanges: AsyncSyncSequence<[SampleChange]> = [].async let events = passthroughStore.events( matching: query, diff --git a/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift b/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift index 677f4e631..cbe01694e 100644 --- a/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift +++ b/CareKitStore/CareKitStoreTests/OCKStoreCoordinator/TestPersistentStoreCoordinator.swift @@ -41,7 +41,7 @@ class MockPatientStore: OCKPatientStore { patients = [] } - func patients(matching query: OCKPatientQuery) -> AsyncLazySequence<[[OCKPatient]]> { + func patients(matching query: OCKPatientQuery) -> AsyncSyncSequence<[[OCKPatient]]> { return [patients].async } diff --git a/Package.resolved b/Package.resolved index 0d0e064ef..ed6e24e42 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,34 +1,32 @@ { - "object": { - "pins": [ - { - "package": "FHIRModels", - "repositoryURL": "https://github.com/apple/FHIRModels.git", - "state": { - "branch": null, - "revision": "e115442fb3c5d44ffb1dc9b4e039b77fd143ad96", - "version": "0.4.0" - } - }, - { - "package": "AsyncAlgorithms", - "repositoryURL": "https://github.com/apple/swift-async-algorithms", - "state": { - "branch": null, - "revision": "aed5422380244498344a036b8d94e27f370d9a22", - "version": "0.0.4" - } - }, - { - "package": "swift-collections", - "repositoryURL": "https://github.com/apple/swift-collections.git", - "state": { - "branch": null, - "revision": "937e904258d22af6e447a0b72c0bc67583ef64a2", - "version": "1.0.4" - } + "pins" : [ + { + "identity" : "fhirmodels", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/FHIRModels.git", + "state" : { + "revision" : "e115442fb3c5d44ffb1dc9b4e039b77fd143ad96", + "version" : "0.4.0" } - ] - }, - "version": 1 + }, + { + "identity" : "swift-async-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-async-algorithms", + "state" : { + "revision" : "9cfed92b026c524674ed869a4ff2dcfdeedf8a2a", + "version" : "0.1.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "937e904258d22af6e447a0b72c0bc67583ef64a2", + "version" : "1.0.4" + } + } + ], + "version" : 2 } diff --git a/Package.swift b/Package.swift index 5839797ef..050706b33 100644 --- a/Package.swift +++ b/Package.swift @@ -29,7 +29,7 @@ let package = Package( ), .package( url: "https://github.com/apple/swift-async-algorithms", - exact: Version(0, 0, 4) + exact: Version(0, 1, 0) ) ], targets: [ From 38c496dfa85a7fa19a0d8107a423ef212f43f804 Mon Sep 17 00:00:00 2001 From: Corey Date: Sun, 16 Apr 2023 12:58:36 -0400 Subject: [PATCH 53/59] doc nits --- .../CoreData/Synchronization/OCKRevisionRecord.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CareKitStore/CareKitStore/CoreData/Synchronization/OCKRevisionRecord.swift b/CareKitStore/CareKitStore/CoreData/Synchronization/OCKRevisionRecord.swift index 8cebd6c0a..1b5fa9c74 100644 --- a/CareKitStore/CareKitStore/CoreData/Synchronization/OCKRevisionRecord.swift +++ b/CareKitStore/CareKitStore/CoreData/Synchronization/OCKRevisionRecord.swift @@ -45,8 +45,9 @@ public struct OCKRevisionRecord: Equatable, Codable { /// Create a new instance of `OCKRevisionRecord`. /// /// - Parameters: - /// - operation: The operation that was performed (add, update, or delete) - /// - entity: The entity that was modified + /// - entities: The entities that were modified. + /// - knowledgeVector: A knowledge vector indicating the last known state + /// of each other device by the device that authored this revision record. public init(entities: [OCKEntity], knowledgeVector: KnowledgeVector) { self.entities = entities self.knowledgeVector = knowledgeVector From 951d081defe565182e6a6eb849b63dada88e94c9 Mon Sep 17 00:00:00 2001 From: Corey Baker Date: Thu, 20 Apr 2023 09:39:29 -0400 Subject: [PATCH 54/59] fixes --- .github/workflows/swift.yml | 3 --- .spi.yml | 2 ++ CareKit/CareKit.xcodeproj/project.pbxproj | 20 ++++++++-------- .../CareStoreFetchRequest.swift | 8 ------- .../CareStoreFetchRequestController.swift | 3 --- .../TestCareStoreFetchRequestController.swift | 1 - .../TestAnyEventStoreExtensions.swift | 4 ++++ .../CareKitFHIR.xcodeproj/project.pbxproj | 14 ++++++----- .../CareKitStore.xcodeproj/project.pbxproj | 18 +++++++------- .../CareKitStore/Logging/Logger+Init.swift | 1 - .../OCKStoreCoordinator.swift | 4 ++-- .../Streaming/TestCoreDataQueryMonitor.swift | 4 ++++ CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 24 +++++++++++-------- .../Shared/Extensions/UIColor+Extension.swift | 2 ++ CareKitUI/CareKitUI/iOS/Link/LinkButton.swift | 2 -- CareKitUI/CareKitUI/iOS/Link/LinkView.swift | 4 ---- .../CareKitUITests/Link/TestLinkType.swift | 2 ++ .../CareKitUITests/Link/TestLinkView.swift | 3 ++- .../OCKResponsiveLayoutTests.swift | 2 ++ .../Task/TestGridTaskView.swift | 2 ++ .../Task/TestNumericProgressTaskView.swift | 2 ++ .../CareKitUITests/TestColorExtension.swift | 2 ++ .../CareKitUITests/TestStylableView.swift | 2 ++ .../contents.xcworkspacedata | 4 ---- Package.swift | 8 ++++++- 25 files changed, 77 insertions(+), 64 deletions(-) delete mode 100644 OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 409c1ee47..f18b9da96 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -17,9 +17,6 @@ jobs: matrix: destination: ['platform=iOS\ Simulator,OS=16.2,name=iPhone\ 14\ Pro\ Max', 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)'] scheme: ['CareKit', 'CareKitStore', 'CareKitUI', 'CareKitFHIR'] - exclude: - - destination: 'platform=watchOS\ Simulator,OS=9.1,name=Apple\ Watch\ Series\ 5\ \(40mm\)' - scheme: 'CareKitUI' steps: - uses: actions/checkout@v2 - name: Set Xcode Version diff --git a/.spi.yml b/.spi.yml index 4ef292f8b..9a410b55c 100644 --- a/.spi.yml +++ b/.spi.yml @@ -7,3 +7,5 @@ builder: scheme: "CareKit" - platform: watchos scheme: "CareKit" + - platform: macos + scheme: "CareKit" diff --git a/CareKit/CareKit.xcodeproj/project.pbxproj b/CareKit/CareKit.xcodeproj/project.pbxproj index 976483872..8e797f8b5 100644 --- a/CareKit/CareKit.xcodeproj/project.pbxproj +++ b/CareKit/CareKit.xcodeproj/project.pbxproj @@ -1121,7 +1121,7 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1157,7 +1157,7 @@ DEVELOPMENT_TEAM = ""; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = CareKitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1237,7 +1237,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -1251,7 +1251,7 @@ TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1313,7 +1313,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = NO; ONLY_ACTIVE_ARCH = NO; @@ -1327,7 +1327,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -1350,7 +1350,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1372,7 +1372,7 @@ "SWIFT_ACTIVE_COMPILATION_CONDITIONS[arch=*]" = DEBUG; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1395,7 +1395,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = CareKit/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1416,7 +1416,7 @@ SUPPORTS_UIKITFORMAC = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; diff --git a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift index 3cbd801cb..6543fe571 100644 --- a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift +++ b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequest.swift @@ -74,7 +74,6 @@ import SwiftUI /// ``` /// /// If you prefer to update the query date at a very specific time interval, see [`TimelineView`](https://www.google.com/search?client=safari&rls=en&q=timelineview&ie=UTF-8&oe=UTF-8&safari_group=3). -@available(iOS 14, watchOS 7, *) @propertyWrapper public struct CareStoreFetchRequest: DynamicProperty { @@ -132,7 +131,6 @@ public struct CareStoreFetchRequest: DynamicProperty { // MARK: - Fetching Store Entities -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyTask, Query == OCKTaskQuery @@ -155,7 +153,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyEvent, Query == OCKEventQuery @@ -178,7 +175,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyOutcome, Query == OCKOutcomeQuery @@ -201,7 +197,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyContact, Query == OCKContactQuery @@ -224,7 +219,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyPatient, Query == OCKPatientQuery @@ -247,7 +241,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) public extension CareStoreFetchRequest where Result == OCKAnyCarePlan, Query == OCKCarePlanQuery @@ -270,7 +263,6 @@ public extension CareStoreFetchRequest where } } -@available(iOS 14, watchOS 7, *) private extension CareStoreFetchRequest where Query: Equatable { init( diff --git a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift index c21d27618..0c63d598f 100644 --- a/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift +++ b/CareKit/CareKit/Shared/Synchronization/CareStoreFetchRequestController.swift @@ -39,7 +39,6 @@ import SwiftUI /// /// - The result is generic, and is computed based on the provided `Result`. /// Going the generic route allows us to create a single controller for all of the entity types in the CareKit store. -@available(iOS 14, watchOS 7, *) final class CareStoreFetchRequestController: ObservableObject { typealias ComputeResults = ( @@ -199,7 +198,6 @@ final class CareStoreFetchRequestController: ObservableObject { } } -@available(iOS 14, watchOS 7, *) private extension CareStoreFetchRequestController { /// The status of a data stream from the CareKit store. @@ -221,7 +219,6 @@ private extension CareStoreFetchRequestController { // duplicate queries. We could avoid this indirection by making the // original generic conform to Equatable, but that locks us into that // conformance in the public API. -@available(iOS 14, watchOS 7, *) extension CareStoreFetchRequestController where Query: Equatable { convenience init( diff --git a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift index b08c789fa..674180ad2 100644 --- a/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift +++ b/CareKit/CareKitTests/Synchronization/TestCareStoreFetchRequestController.swift @@ -35,7 +35,6 @@ import AsyncAlgorithms import Combine import XCTest -@available(iOS 14, watchOS 7, *) class TestCareStoreFetchRequestController: XCTestCase { private let query = MockQuery(id: 0) diff --git a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift index 3adbe92f8..cd8565d04 100644 --- a/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift +++ b/CareKit/CareKitTests/TestAnyEventStoreExtensions.swift @@ -118,6 +118,10 @@ class TestAnyEventStoreExtensions: XCTestCase { didUpdate.fulfill() } + /* + TODO: Remove in the future when macOS 13 image release for GitHub actions. + GitHub actions currently only supports macOS 12 and Xcode 14.2. + */ #if compiler(>=5.8.0) await fulfillment(of: [didUpdate], timeout: 2) #else diff --git a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj index 62557e915..629e26ec9 100644 --- a/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj +++ b/CareKitFHIR/CareKitFHIR.xcodeproj/project.pbxproj @@ -425,7 +425,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -437,6 +437,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -489,7 +490,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -501,6 +502,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -540,7 +542,7 @@ SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -579,7 +581,7 @@ SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -606,7 +608,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -632,7 +634,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; diff --git a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj index ee0a3e888..2706ebe3f 100644 --- a/CareKitStore/CareKitStore.xcodeproj/project.pbxproj +++ b/CareKitStore/CareKitStore.xcodeproj/project.pbxproj @@ -1259,7 +1259,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1274,6 +1274,7 @@ SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1341,7 +1342,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1357,6 +1358,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -1378,7 +1380,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1397,7 +1399,7 @@ SUPPORTS_UIKITFORMAC = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1419,7 +1421,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1438,7 +1440,7 @@ SUPPORTS_UIKITFORMAC = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -1449,7 +1451,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1470,7 +1472,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitStoreTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/CareKitStore/CareKitStore/Logging/Logger+Init.swift b/CareKitStore/CareKitStore/Logging/Logger+Init.swift index 2ce2b5ec2..81d3b7287 100644 --- a/CareKitStore/CareKitStore/Logging/Logger+Init.swift +++ b/CareKitStore/CareKitStore/Logging/Logger+Init.swift @@ -31,7 +31,6 @@ import Foundation import os.log -@available(iOS 14, watchOS 7, *) extension Logger { static var store: Logger? { diff --git a/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift b/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift index 0c8bf1fe9..08d33afa9 100644 --- a/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift +++ b/CareKitStore/CareKitStore/StoreCoordinator/OCKStoreCoordinator.swift @@ -315,7 +315,7 @@ open class OCKStoreCoordinator: OCKAnyStoreProtocol { open func taskStore(_ store: OCKAnyReadOnlyTaskStore, shouldHandleWritingTask task: OCKAnyTask) -> Bool { #if os(iOS) - if #available(iOS 15, *) { + if #available(iOS 15, watchOS 8, *) { // HealthKit stores should only respond to HealthKit tasks if store is OCKHealthKitPassthroughStore && !(task is OCKHealthKitTask) { return false } @@ -349,7 +349,7 @@ open class OCKStoreCoordinator: OCKAnyStoreProtocol { open func outcomeStore(_ store: OCKAnyReadOnlyOutcomeStore, shouldHandleWritingOutcome outcome: OCKAnyOutcome) -> Bool { #if os(iOS) - if #available(iOS 15, *) { + if #available(iOS 15, watchOS 8, *) { // Only the HK passthrough store should handle HK outcomes if outcome is OCKHealthKitOutcome || store is OCKHealthKitPassthroughStore { return store is OCKHealthKitPassthroughStore && outcome is OCKHealthKitOutcome diff --git a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift index 268310c5f..511bc5ae9 100644 --- a/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift +++ b/CareKitStore/CareKitStoreTests/Streaming/TestCoreDataQueryMonitor.swift @@ -214,6 +214,10 @@ class TestCoreDataQueryMonitor: XCTestCase { XCTAssertEqual(expectedTitles, observedTitles) } + /* + TODO: Remove in the future when macOS 13 image release for GitHub actions. + GitHub actions currently only supports macOS 12 and Xcode 14.2. + */ #if compiler(>=5.8.0) func testIrrelevantChangeDoesNotProduceResult() async throws { diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index f5eab2a57..5d20c75e1 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -864,7 +864,7 @@ CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; INFOPLIST_FILE = CareKitUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -872,8 +872,9 @@ ); PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; }; @@ -885,7 +886,7 @@ ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; CODE_SIGN_STYLE = Automatic; INFOPLIST_FILE = CareKitUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -893,8 +894,9 @@ ); PRODUCT_BUNDLE_IDENTIFIER = Apple.CareKitUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator watchos watchsimulator"; SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2,4"; }; @@ -970,7 +972,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -985,6 +987,7 @@ SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1052,7 +1055,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; MARKETING_VERSION = "$(VERSION_NUMBER)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1067,6 +1070,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -1087,7 +1091,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitUI/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1106,7 +1110,7 @@ SUPPORTS_UIKITFORMAC = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -1127,7 +1131,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "$(SRCROOT)/CareKitUI/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1146,7 +1150,7 @@ SUPPORTS_UIKITFORMAC = NO; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; TARGETED_DEVICE_FAMILY = "1,2,4"; - WATCHOS_DEPLOYMENT_TARGET = 6.0; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; diff --git a/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift b/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift index 859314cb1..d12db64a2 100644 --- a/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift +++ b/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import Foundation import UIKit @@ -48,3 +49,4 @@ extension UIColor { return UIColor(red: lightenedRed, green: lightenedGreen, blue: lightenedBlue, alpha: alpha) } } +#endif diff --git a/CareKitUI/CareKitUI/iOS/Link/LinkButton.swift b/CareKitUI/CareKitUI/iOS/Link/LinkButton.swift index d756f1cf2..4b1fb49cb 100644 --- a/CareKitUI/CareKitUI/iOS/Link/LinkButton.swift +++ b/CareKitUI/CareKitUI/iOS/Link/LinkButton.swift @@ -43,7 +43,6 @@ import SwiftUI /// | <Image> | /// +-------------------------------------------------+ /// ``` -@available(iOS 14, *) struct LinkButton<Label: View>: View { @State private var isInAppContentPresented = false @@ -98,7 +97,6 @@ struct LinkButton<Label: View>: View { } } -@available(iOS 14, *) extension LinkButton where Label == LinkLabel { /// Create an instance. diff --git a/CareKitUI/CareKitUI/iOS/Link/LinkView.swift b/CareKitUI/CareKitUI/iOS/Link/LinkView.swift index 89267cc37..0541e8f71 100644 --- a/CareKitUI/CareKitUI/iOS/Link/LinkView.swift +++ b/CareKitUI/CareKitUI/iOS/Link/LinkView.swift @@ -58,7 +58,6 @@ import SwiftUI /// | | /// +-------------------------------------------------------+ /// ``` -@available(iOS 14, *) public struct LinkView<Header: View>: View { @Environment(\.careKitStyle) @@ -122,7 +121,6 @@ public struct LinkView<Header: View>: View { } } -@available(iOS 14, *) public extension LinkView where Header == _LinkViewHeader { /// Create an instance. @@ -148,7 +146,6 @@ public extension LinkView where Header == _LinkViewHeader { } /// Default header used by a `LinkView`. -@available(iOS 14, *) public struct _LinkViewHeader: View { @Environment(\.careKitStyle) @@ -172,7 +169,6 @@ public struct _LinkViewHeader: View { } #if DEBUG -@available(iOS 14, *) struct LinkViewPreview: PreviewProvider { static var links: [LinkItem] = [ diff --git a/CareKitUI/CareKitUITests/Link/TestLinkType.swift b/CareKitUI/CareKitUITests/Link/TestLinkType.swift index d6a66c7c3..7a693a98c 100644 --- a/CareKitUI/CareKitUITests/Link/TestLinkType.swift +++ b/CareKitUI/CareKitUITests/Link/TestLinkType.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import Foundation @testable import CareKitUI @@ -87,3 +88,4 @@ class TestLinkType: XCTestCase { XCTAssertNil(observed) } } +#endif diff --git a/CareKitUI/CareKitUITests/Link/TestLinkView.swift b/CareKitUI/CareKitUITests/Link/TestLinkView.swift index dfe9a4c52..d8069812a 100644 --- a/CareKitUI/CareKitUITests/Link/TestLinkView.swift +++ b/CareKitUI/CareKitUITests/Link/TestLinkView.swift @@ -28,11 +28,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKitUI import SwiftUI import XCTest -@available(iOS 14, *) class TestLinkView: XCTestCase { private let text = Text("Hello World") @@ -51,3 +51,4 @@ class TestLinkView: XCTestCase { _ = LinkView(links: links, header: { }) } } +#endif diff --git a/CareKitUI/CareKitUITests/OCKResponsiveLayoutTests.swift b/CareKitUI/CareKitUITests/OCKResponsiveLayoutTests.swift index 4c6d9d482..6a8f0ee4d 100644 --- a/CareKitUI/CareKitUITests/OCKResponsiveLayoutTests.swift +++ b/CareKitUI/CareKitUITests/OCKResponsiveLayoutTests.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKitUI import XCTest @@ -291,3 +292,4 @@ class OCKResponsiveLayoutTests: XCTestCase { } } } +#endif diff --git a/CareKitUI/CareKitUITests/Task/TestGridTaskView.swift b/CareKitUI/CareKitUITests/Task/TestGridTaskView.swift index 3b98c9823..9b22e8c68 100644 --- a/CareKitUI/CareKitUITests/Task/TestGridTaskView.swift +++ b/CareKitUI/CareKitUITests/Task/TestGridTaskView.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKitUI import Foundation import XCTest @@ -64,3 +65,4 @@ public class TestGridTaskView: XCTestCase { XCTAssertEqual(observed, 100) } } +#endif diff --git a/CareKitUI/CareKitUITests/Task/TestNumericProgressTaskView.swift b/CareKitUI/CareKitUITests/Task/TestNumericProgressTaskView.swift index ee1f1d469..6ee2e2ce1 100644 --- a/CareKitUI/CareKitUITests/Task/TestNumericProgressTaskView.swift +++ b/CareKitUI/CareKitUITests/Task/TestNumericProgressTaskView.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) import CareKitUI import SwiftUI import XCTest @@ -46,3 +47,4 @@ class TestNumericProgressTaskView: XCTestCase { _ = NumericProgressTaskView(progress: text, goal: text, isComplete: true, header: { }) } } +#endif diff --git a/CareKitUI/CareKitUITests/TestColorExtension.swift b/CareKitUI/CareKitUITests/TestColorExtension.swift index 45dbc8424..918753300 100644 --- a/CareKitUI/CareKitUITests/TestColorExtension.swift +++ b/CareKitUI/CareKitUITests/TestColorExtension.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKitUI import Foundation import XCTest @@ -60,3 +61,4 @@ class TestColorExtension: XCTestCase { XCTAssertEqual(lightened, UIColor(red: 1, green: 1, blue: 1, alpha: 1)) } } +#endif diff --git a/CareKitUI/CareKitUITests/TestStylableView.swift b/CareKitUI/CareKitUITests/TestStylableView.swift index 60ba15b95..8ca757907 100644 --- a/CareKitUI/CareKitUITests/TestStylableView.swift +++ b/CareKitUI/CareKitUITests/TestStylableView.swift @@ -28,6 +28,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if !os(watchOS) @testable import CareKitUI import XCTest @@ -200,3 +201,4 @@ class TestStylableView: XCTestCase { XCTAssertEqual(innerView.layer.cornerRadius, MockOverridingView.cornerRadius) } } +#endif diff --git a/OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 94b2795e2..000000000 --- a/OCKCatalog/OCKCatalog.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Workspace - version = "1.0"> -</Workspace> diff --git a/Package.swift b/Package.swift index 050706b33..b388c446d 100644 --- a/Package.swift +++ b/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let package = Package( name: "CareKit", defaultLocalization: "en", - platforms: [.iOS(.v13), .macOS(.v10_15), .watchOS(.v6)], + platforms: [.iOS(.v14), .macOS(.v11), .watchOS(.v7)], products: [ .library( name: "CareKit", @@ -74,6 +74,12 @@ let package = Package( .process("CoreDataSchema/Migrations") ]), + .testTarget( + name: "CareKitUITests", + dependencies: ["CareKitUI"], + path: "CareKitUI/CareKitUITests", + exclude: ["Info.plist", "CareKitUI.xctestplan"]), + .testTarget( name: "CareKitFHIRTests", dependencies: ["CareKitFHIR"], From 5d108093a23f5d8d9b580664e3556b95049a39b7 Mon Sep 17 00:00:00 2001 From: Corey Baker <coreyearleon@icloud.com> Date: Thu, 20 Apr 2023 10:06:44 -0400 Subject: [PATCH 55/59] fix watchOS CareKitUI tests --- CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift | 2 -- CareKitUI/CareKitUITests/TestColorExtension.swift | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift b/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift index d12db64a2..859314cb1 100644 --- a/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift +++ b/CareKitUI/CareKitUI/Shared/Extensions/UIColor+Extension.swift @@ -28,7 +28,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if !os(watchOS) import Foundation import UIKit @@ -49,4 +48,3 @@ extension UIColor { return UIColor(red: lightenedRed, green: lightenedGreen, blue: lightenedBlue, alpha: alpha) } } -#endif diff --git a/CareKitUI/CareKitUITests/TestColorExtension.swift b/CareKitUI/CareKitUITests/TestColorExtension.swift index 918753300..45040bb87 100644 --- a/CareKitUI/CareKitUITests/TestColorExtension.swift +++ b/CareKitUI/CareKitUITests/TestColorExtension.swift @@ -28,7 +28,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if !os(watchOS) @testable import CareKitUI import Foundation import XCTest @@ -57,8 +56,7 @@ class TestColorExtension: XCTestCase { func testClamping() { let start = UIColor(red: 0, green: 0, blue: 0, alpha: 1) - let lightened = start.lightened(10) + let lightened = start.lightened(1) XCTAssertEqual(lightened, UIColor(red: 1, green: 1, blue: 1, alpha: 1)) } } -#endif From fdfcbf391156ce2098b9c521c8a0dc24d86ee1b3 Mon Sep 17 00:00:00 2001 From: Corey Baker <coreyearleon@icloud.com> Date: Thu, 20 Apr 2023 10:12:19 -0400 Subject: [PATCH 56/59] Switch calendar to computed property --- CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index d757b53f4..be17829b9 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,7 +88,9 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private static var calendar = Calendar.current + private static var calendar: Calendar = { + Calendar.current + }() /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc. From 225341b1785513785b7d4a9d4538c2dd48bc0554 Mon Sep 17 00:00:00 2001 From: Corey Baker <coreyearleon@icloud.com> Date: Thu, 20 Apr 2023 10:33:40 -0400 Subject: [PATCH 57/59] Add TestColorExtension to CareKitUITests in XC project --- CareKitUI/CareKitUI.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj index 5d20c75e1..9f4cf4e8c 100644 --- a/CareKitUI/CareKitUI.xcodeproj/project.pbxproj +++ b/CareKitUI/CareKitUI.xcodeproj/project.pbxproj @@ -107,6 +107,7 @@ 64E1BD4E2309FCF200DFFE52 /* OCKResponsiveLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64E1BD4D2309FCF200DFFE52 /* OCKResponsiveLayout.swift */; }; 64EEC2382318253B00B1012F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 64EEC2362318253B00B1012F /* Localizable.strings */; }; 64EEC23B231825DD00B1012F /* OCKLocalization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64EEC23A231825DD00B1012F /* OCKLocalization.swift */; }; + 70FC4F3229F18489007DF34F /* TestColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 511A854723E0CAA2002A2AFB /* TestColorExtension.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -726,6 +727,7 @@ 51052549244639B3004483D0 /* TestLinkView.swift in Sources */, 51746F2B2448B90B00B647E1 /* TestNumericProgressTaskView.swift in Sources */, 51AB06C222FE53E300B73FC2 /* TestStylableView.swift in Sources */, + 70FC4F3229F18489007DF34F /* TestColorExtension.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 698176a292e3077f7a30496c42f9e8392328930e Mon Sep 17 00:00:00 2001 From: Corey <coreyearleon@icloud.com> Date: Sat, 22 Apr 2023 15:16:53 -0400 Subject: [PATCH 58/59] Save second KnowledgeVector increment to prevent data loss --- .../Synchronization/OCKStore+Synchronization.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CareKitStore/CareKitStore/CoreData/Synchronization/OCKStore+Synchronization.swift b/CareKitStore/CareKitStore/CoreData/Synchronization/OCKStore+Synchronization.swift index ae282eb39..59fc65c22 100644 --- a/CareKitStore/CareKitStore/CoreData/Synchronization/OCKStore+Synchronization.swift +++ b/CareKitStore/CareKitStore/CoreData/Synchronization/OCKStore+Synchronization.swift @@ -215,8 +215,13 @@ extension OCKStore: OCKRemoteSynchronizationDelegate { self.context.knowledgeVector.increment( clockFor: self.context.clockID ) + + // 8. Lock in the changes. If this fails, all + // merged changes will be rolled back and + // we'll need to try again later. + try self.context.save() - // 8. Push conflict resolutions + local changes to remote + // 9. Push conflict resolutions + local changes to remote remote.pushRevisions( deviceRevisions: localRevisions, deviceKnowledge: localKnowledge) { error in @@ -225,7 +230,7 @@ extension OCKStore: OCKRemoteSynchronizationDelegate { os_log("Failed to push revision. %{private}@", log: .store, type: .error, error as NSError) } - // 9. The sync is still considered successful + // 10. The sync is still considered successful // even if the remote doesn't accept the // push. The next time we sync with it, it // will still have the same knowledge From b67404d9ba66e2acf2435ac79e239515fbf1d424 Mon Sep 17 00:00:00 2001 From: Corey <coreyearleon@icloud.com> Date: Tue, 25 Apr 2023 14:08:41 -0400 Subject: [PATCH 59/59] Update CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift Co-authored-by: Gavi Rawson <51756298+gavirawson-apple@users.noreply.github.com> --- CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift index be17829b9..855a2469d 100644 --- a/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift +++ b/CareKitStore/CareKitStore/Structs/OCKScheduleElement.swift @@ -88,9 +88,7 @@ public struct OCKScheduleElement: Codable, Equatable { } } - private static var calendar: Calendar = { - Calendar.current - }() + private static var calendar: Calendar { .current } /// An text about the time this element represents. /// e.g. before breakfast on Tuesdays, 5PM every day, etc.