diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f467c642..7487cd8c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: "Contentstack CI" on: push: - branches: [ master, development ] + branches: [ master, next ] pull_request: - branches: [ master ] + branches: [ master, next ] jobs: macOS: diff --git a/.github/workflows/sca-scan.yml b/.github/workflows/sca-scan.yml index cb54aada..12806764 100644 --- a/.github/workflows/sca-scan.yml +++ b/.github/workflows/sca-scan.yml @@ -11,4 +11,4 @@ jobs: - name: Run Snyk to check for vulnerabilities run: snyk test --all-projects --fail-on=all env: - SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} \ No newline at end of file + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} diff --git a/.gitignore b/.gitignore index 9ddddf50..0144b643 100644 --- a/.gitignore +++ b/.gitignore @@ -73,4 +73,7 @@ fastlane/screenshots/**/*.png fastlane/test_output TestCase -docs \ No newline at end of file +docs + +fastlane/ +Gemfile \ No newline at end of file diff --git a/.swiftpm/xcode/package.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/.swiftpm/xcode/package.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..54782e32 --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/ContentstackTests.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/ContentstackTests.xcscheme new file mode 100644 index 00000000..cef11219 --- /dev/null +++ b/.swiftpm/xcode/xcshareddata/xcschemes/ContentstackTests.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.talismanrc b/.talismanrc index 87c34e16..bd1bc6ae 100644 --- a/.talismanrc +++ b/.talismanrc @@ -17,6 +17,11 @@ fileignoreconfig: checksum: a1c17f932d0b00df127851f50456923546ee912ba9b4d60d1f244768d61b858d - filename: Tests/DVRRecordings/SyncTest.json checksum: e5148d9f58da7689f249969c25a0c36d6d9f26be062a2c6bd9aaf389118f0039 +- filename: Contentstack.xcodeproj/xcshareddata/xcschemes/Contentstack iOS.xcscheme + checksum: 10ca4b0b986ae6166f69d7f985ca5b06238ac70dac3dd378fbf3dbdfd966afff +- filename: Contentstack.xcodeproj/xcshareddata/xcschemes/Contentstack iOS Tests.xcscheme + checksum: c439f6d268ae2ea0af023daeffdff2af5928d0610f90fa14c9e6e6ce7e4b3fad +version: "" diff --git a/Contentstack.xcodeproj/project.pbxproj b/Contentstack.xcodeproj/project.pbxproj index 928a3dca..508cb1a1 100644 --- a/Contentstack.xcodeproj/project.pbxproj +++ b/Contentstack.xcodeproj/project.pbxproj @@ -25,8 +25,6 @@ 0F096B14243610470094F042 /* ImageTransformTestAdditional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F096B13243610470094F042 /* ImageTransformTestAdditional.swift */; }; 0F096B15243610470094F042 /* ImageTransformTestAdditional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F096B13243610470094F042 /* ImageTransformTestAdditional.swift */; }; 0F096B16243610470094F042 /* ImageTransformTestAdditional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F096B13243610470094F042 /* ImageTransformTestAdditional.swift */; }; - 0F1DCC73243D991100EED404 /* DVR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F1DCC72243D991100EED404 /* DVR.framework */; }; - 0F1DCC75243D991100EED404 /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F1DCC74243D991100EED404 /* OHHTTPStubs.framework */; }; 0F1DCC7A243D9BD400EED404 /* SyncTest.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F1DCC77243D9BBF00EED404 /* SyncTest.json */; }; 0F1DCC7B243D9BD400EED404 /* SyncTest.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F1DCC77243D9BBF00EED404 /* SyncTest.json */; }; 0F1DCC80243DCF2500EED404 /* EntryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC7F243DCF2500EED404 /* EntryModel.swift */; }; @@ -41,9 +39,6 @@ 0F1DCC8B243DD20E00EED404 /* ContentTypeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC89243DD20E00EED404 /* ContentTypeModel.swift */; }; 0F1DCC8C243DD20E00EED404 /* ContentTypeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC89243DD20E00EED404 /* ContentTypeModel.swift */; }; 0F1DCC8D243DD20E00EED404 /* ContentTypeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC89243DD20E00EED404 /* ContentTypeModel.swift */; }; - 0F1DCC8F243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC8E243DDB7300EED404 /* ContentTypeQueryAPITest.swift */; }; - 0F1DCC90243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC8E243DDB7300EED404 /* ContentTypeQueryAPITest.swift */; }; - 0F1DCC91243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1DCC8E243DDB7300EED404 /* ContentTypeQueryAPITest.swift */; }; 0F244F9E244062B4003C3F26 /* ContentType.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F244F9C244062B4003C3F26 /* ContentType.json */; }; 0F244F9F244062B4003C3F26 /* ContentType.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F244F9C244062B4003C3F26 /* ContentType.json */; }; 0F244FA224406A2D003C3F26 /* SyncStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F244FA124406A2D003C3F26 /* SyncStack.swift */; }; @@ -96,12 +91,6 @@ 0F4C0A87243C6990006604B7 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F4C0A86243C6990006604B7 /* config.json */; }; 0F4C0A88243C6990006604B7 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F4C0A86243C6990006604B7 /* config.json */; }; 0F4C0A89243C6990006604B7 /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F4C0A86243C6990006604B7 /* config.json */; }; - 0F4C0A8B243C6D8A006604B7 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8A243C6D8A006604B7 /* ContentstackTest.swift */; }; - 0F4C0A8C243C6D8A006604B7 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8A243C6D8A006604B7 /* ContentstackTest.swift */; }; - 0F4C0A8D243C6D8A006604B7 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8A243C6D8A006604B7 /* ContentstackTest.swift */; }; - 0F4C0A8F243C7D88006604B7 /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8E243C7D88006604B7 /* SyncAPITest.swift */; }; - 0F4C0A90243C7D88006604B7 /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8E243C7D88006604B7 /* SyncAPITest.swift */; }; - 0F4C0A91243C7D88006604B7 /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4C0A8E243C7D88006604B7 /* SyncAPITest.swift */; }; 0F4FBCA02420B0E4007B8CAE /* DateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4FBC9F2420B0E4007B8CAE /* DateTest.swift */; }; 0F4FBCA12420B0E4007B8CAE /* DateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4FBC9F2420B0E4007B8CAE /* DateTest.swift */; }; 0F4FBCA22420B0E4007B8CAE /* DateTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4FBC9F2420B0E4007B8CAE /* DateTest.swift */; }; @@ -127,9 +116,6 @@ 0F50EA0E244EC3DD00E5D705 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA0D244EC3DD00E5D705 /* Session.swift */; }; 0F50EA0F244EC3DD00E5D705 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA0D244EC3DD00E5D705 /* Session.swift */; }; 0F50EA10244EC3DD00E5D705 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA0D244EC3DD00E5D705 /* Session.swift */; }; - 0F50EA12244EC44800E5D705 /* QueryOnAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA11244EC44800E5D705 /* QueryOnAPITest.swift */; }; - 0F50EA13244EC44800E5D705 /* QueryOnAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA11244EC44800E5D705 /* QueryOnAPITest.swift */; }; - 0F50EA14244EC44800E5D705 /* QueryOnAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA11244EC44800E5D705 /* QueryOnAPITest.swift */; }; 0F50EA17244ED7F500E5D705 /* QueryOn.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F50EA15244ED7F500E5D705 /* QueryOn.json */; }; 0F50EA18244ED7F500E5D705 /* QueryOn.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F50EA15244ED7F500E5D705 /* QueryOn.json */; }; 0F50EA1D244ED88C00E5D705 /* StackCacheAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F50EA1C244ED88C00E5D705 /* StackCacheAPITest.swift */; }; @@ -144,12 +130,6 @@ 0F60CA332428D02600ED67E6 /* QueryEntryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F60CA322428D02600ED67E6 /* QueryEntryType.swift */; }; 0F60CA342428D02600ED67E6 /* QueryEntryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F60CA322428D02600ED67E6 /* QueryEntryType.swift */; }; 0F60CA352428D02600ED67E6 /* QueryEntryType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F60CA322428D02600ED67E6 /* QueryEntryType.swift */; }; - 0F6B6CE824508154007AB3C1 /* DVR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F6B6CE724508154007AB3C1 /* DVR.framework */; }; - 0F6B6CEA24508154007AB3C1 /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F6B6CE924508154007AB3C1 /* OHHTTPStubs.framework */; }; - 0F6B6CEC24508165007AB3C1 /* DVR.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F6B6CEB24508165007AB3C1 /* DVR.framework */; }; - 0F6B6CEE24508165007AB3C1 /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F6B6CED24508165007AB3C1 /* OHHTTPStubs.framework */; }; - 0F6D3A86243F064900FCFEBC /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6D3A84243F064900FCFEBC /* EntryAPITest.swift */; }; - 0F6D3A87243F064900FCFEBC /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6D3A84243F064900FCFEBC /* EntryAPITest.swift */; }; 0F7138C52424A70C00B314B0 /* AssetQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F7138C42424A70C00B314B0 /* AssetQueryTest.swift */; }; 0F7138C62424A70C00B314B0 /* AssetQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F7138C42424A70C00B314B0 /* AssetQueryTest.swift */; }; 0F7138C72424A70C00B314B0 /* AssetQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F7138C42424A70C00B314B0 /* AssetQueryTest.swift */; }; @@ -163,7 +143,6 @@ 0F77CFB824373B8A00C57764 /* ImageTransformEquatableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F77CFB724373B8A00C57764 /* ImageTransformEquatableTest.swift */; }; 0F77CFB924373B8F00C57764 /* ImageTransformEquatableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F77CFB724373B8A00C57764 /* ImageTransformEquatableTest.swift */; }; 0F77CFBA24373B9000C57764 /* ImageTransformEquatableTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F77CFB724373B8A00C57764 /* ImageTransformEquatableTest.swift */; }; - 0F796C502449EA6000EA04D5 /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6D3A84243F064900FCFEBC /* EntryAPITest.swift */; }; 0F796C532449EA8700EA04D5 /* Entry.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F796C512449EA8700EA04D5 /* Entry.json */; }; 0F796C542449EA8700EA04D5 /* Entry.json in Resources */ = {isa = PBXBuildFile; fileRef = 0F796C512449EA8700EA04D5 /* Entry.json */; }; 0FB4CAC924332C5200A385B1 /* ImageOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4CAC824332C5200A385B1 /* ImageOperation.swift */; }; @@ -185,10 +164,6 @@ 0FD39D4A24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD39D4924237A0400E34826 /* ContentTypeQueryTest.swift */; }; 0FD39D4B24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD39D4924237A0400E34826 /* ContentTypeQueryTest.swift */; }; 0FD39D4C24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD39D4924237A0400E34826 /* ContentTypeQueryTest.swift */; }; - 0FD6F8F22620194100636504 /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 0FD6F8F12620194100636504 /* ContentstackUtils */; }; - 0FD6F9102620194C00636504 /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 0FD6F90F2620194C00636504 /* ContentstackUtils */; }; - 0FD6F9122620195300636504 /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 0FD6F9112620195300636504 /* ContentstackUtils */; }; - 0FD6F9142620195800636504 /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 0FD6F9132620195800636504 /* ContentstackUtils */; }; 0FFA5D4A241F4DED003B3AF5 /* ContentstackConfigTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFA5D49241F4DED003B3AF5 /* ContentstackConfigTest.swift */; }; 0FFA5D4E241F4FAC003B3AF5 /* Contentstack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FFA5D4B241F4FAC003B3AF5 /* Contentstack.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0FFA5D4F241F4FAC003B3AF5 /* Contentstack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FFA5D4B241F4FAC003B3AF5 /* Contentstack.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -256,21 +231,45 @@ 0FFA5DBC241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFA5DBB241F9A6C003B3AF5 /* XCTestCase+Extension.swift */; }; 0FFA5DBD241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFA5DBB241F9A6C003B3AF5 /* XCTestCase+Extension.swift */; }; 0FFA5DBE241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFA5DBB241F9A6C003B3AF5 /* XCTestCase+Extension.swift */; }; - 0FFBB4432446F219000D2795 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB4422446F219000D2795 /* AssetQueryAPITest.swift */; }; - 0FFBB4442446F219000D2795 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB4422446F219000D2795 /* AssetQueryAPITest.swift */; }; - 0FFBB4452446F219000D2795 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB4422446F219000D2795 /* AssetQueryAPITest.swift */; }; 0FFBB4482446F9A4000D2795 /* Asset.json in Resources */ = {isa = PBXBuildFile; fileRef = 0FFBB4462446F9A4000D2795 /* Asset.json */; }; 0FFBB4492446F9A4000D2795 /* Asset.json in Resources */ = {isa = PBXBuildFile; fileRef = 0FFBB4462446F9A4000D2795 /* Asset.json */; }; 0FFBB44C24470C43000D2795 /* ContentStackLogTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB44B24470C43000D2795 /* ContentStackLogTest.swift */; }; 0FFBB44D24470C43000D2795 /* ContentStackLogTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB44B24470C43000D2795 /* ContentStackLogTest.swift */; }; 0FFBB44E24470C43000D2795 /* ContentStackLogTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FFBB44B24470C43000D2795 /* ContentStackLogTest.swift */; }; - 64F522062BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F522072BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F522082BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F522092BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F5220A2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F5220B2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; - 64F5220C2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */; }; + 470253932C0C612A009BDF8B /* TaxonomyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470253922C0C612A009BDF8B /* TaxonomyModel.swift */; }; + 470253942C0C612A009BDF8B /* TaxonomyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470253922C0C612A009BDF8B /* TaxonomyModel.swift */; }; + 470253952C0C612A009BDF8B /* TaxonomyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470253922C0C612A009BDF8B /* TaxonomyModel.swift */; }; + 470253962C0C612A009BDF8B /* TaxonomyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470253922C0C612A009BDF8B /* TaxonomyModel.swift */; }; + 470657542B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657532B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift */; }; + 470657552B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657532B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift */; }; + 470657562B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657532B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift */; }; + 470657582B5E788400BBFF88 /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657572B5E788400BBFF88 /* EntryAPITest.swift */; }; + 470657592B5E788400BBFF88 /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657572B5E788400BBFF88 /* EntryAPITest.swift */; }; + 4706575A2B5E788400BBFF88 /* EntryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470657572B5E788400BBFF88 /* EntryAPITest.swift */; }; + 4706575C2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575B2B5E78B300BBFF88 /* AssetQueryAPITest.swift */; }; + 4706575D2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575B2B5E78B300BBFF88 /* AssetQueryAPITest.swift */; }; + 4706575E2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575B2B5E78B300BBFF88 /* AssetQueryAPITest.swift */; }; + 470657602B5E797300BBFF88 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575F2B5E797300BBFF88 /* ContentstackTest.swift */; }; + 470657612B5E797300BBFF88 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575F2B5E797300BBFF88 /* ContentstackTest.swift */; }; + 470657622B5E797300BBFF88 /* ContentstackTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706575F2B5E797300BBFF88 /* ContentstackTest.swift */; }; + 47161ACA2B5D747D00AD615B /* DVR in Frameworks */ = {isa = PBXBuildFile; productRef = 47161AC92B5D747D00AD615B /* DVR */; }; + 47AAE0902B60420E0098655A /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AAE08F2B60420E0098655A /* SyncAPITest.swift */; }; + 47AAE0912B60420E0098655A /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AAE08F2B60420E0098655A /* SyncAPITest.swift */; }; + 47AAE0922B60420E0098655A /* SyncAPITest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47AAE08F2B60420E0098655A /* SyncAPITest.swift */; }; + 47B4DC622C232A8200370CFC /* TaxonomyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B4DC612C232A8200370CFC /* TaxonomyTest.swift */; }; + 47B4DC632C232A8200370CFC /* TaxonomyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B4DC612C232A8200370CFC /* TaxonomyTest.swift */; }; + 47B4DC642C232A8200370CFC /* TaxonomyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B4DC612C232A8200370CFC /* TaxonomyTest.swift */; }; + 47C6EFC22C0B5B9400F0D5CF /* Taxonomy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */; }; + 47C6EFC32C0B5B9400F0D5CF /* Taxonomy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */; }; + 47C6EFC42C0B5B9400F0D5CF /* Taxonomy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */; }; + 47C6EFC52C0B5B9400F0D5CF /* Taxonomy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */; }; + 642AD4332B86110100E2AFDF /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD4322B86110100E2AFDF /* ContentstackUtils */; }; + 642AD4352B86111700E2AFDF /* DVR in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD4342B86111700E2AFDF /* DVR */; }; + 642AD4372B86111A00E2AFDF /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD4362B86111A00E2AFDF /* ContentstackUtils */; }; + 642AD4392B86112100E2AFDF /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD4382B86112100E2AFDF /* ContentstackUtils */; }; + 642AD43B2B86112400E2AFDF /* DVR in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD43A2B86112400E2AFDF /* DVR */; }; + 642AD43D2B86112C00E2AFDF /* ContentstackUtils in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD43C2B86112C00E2AFDF /* ContentstackUtils */; }; + 642AD43F2B86112F00E2AFDF /* DVR in Frameworks */ = {isa = PBXBuildFile; productRef = 642AD43E2B86112F00E2AFDF /* DVR */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -311,7 +310,6 @@ 0F1DCC7F243DCF2500EED404 /* EntryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryModel.swift; sourceTree = ""; }; 0F1DCC84243DD01900EED404 /* AssetModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetModel.swift; sourceTree = ""; }; 0F1DCC89243DD20E00EED404 /* ContentTypeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentTypeModel.swift; sourceTree = ""; }; - 0F1DCC8E243DDB7300EED404 /* ContentTypeQueryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentTypeQueryAPITest.swift; sourceTree = ""; }; 0F244F9C244062B4003C3F26 /* ContentType.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = ContentType.json; sourceTree = ""; }; 0F244FA124406A2D003C3F26 /* SyncStack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SyncStack.swift; sourceTree = ""; }; 0F244FA624406A4A003C3F26 /* EntryQueriableTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EntryQueriable\U0010\U0010Test.swift"; sourceTree = ""; }; @@ -333,8 +331,6 @@ 0F4C0A7B243C4579006604B7 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; 0F4C0A80243C470F006604B7 /* ContentstackLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentstackLogger.swift; sourceTree = ""; }; 0F4C0A86243C6990006604B7 /* config.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = config.json; sourceTree = ""; }; - 0F4C0A8A243C6D8A006604B7 /* ContentstackTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentstackTest.swift; sourceTree = ""; }; - 0F4C0A8E243C7D88006604B7 /* SyncAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncAPITest.swift; sourceTree = ""; }; 0F4FBC9A2420A17F007B8CAE /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 0F4FBC9F2420B0E4007B8CAE /* DateTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTest.swift; sourceTree = ""; }; 0F4FBCA32420B5F4007B8CAE /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; @@ -343,7 +339,6 @@ 0F4FBCB22420D2F1007B8CAE /* QueryOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryOperation.swift; sourceTree = ""; }; 0F4FBCB72420F344007B8CAE /* QueryParameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryParameter.swift; sourceTree = ""; }; 0F50EA0D244EC3DD00E5D705 /* Session.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Session.swift; sourceTree = ""; }; - 0F50EA11244EC44800E5D705 /* QueryOnAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QueryOnAPITest.swift; sourceTree = ""; }; 0F50EA15244ED7F500E5D705 /* QueryOn.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = QueryOn.json; sourceTree = ""; }; 0F50EA1C244ED88C00E5D705 /* StackCacheAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackCacheAPITest.swift; sourceTree = ""; }; 0F5794C1266A37120082815C /* Paragraph.Json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = Paragraph.Json; sourceTree = ""; }; @@ -356,7 +351,6 @@ 0F6B6CE924508154007AB3C1 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0F6B6CEB24508165007AB3C1 /* DVR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DVR.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0F6B6CED24508165007AB3C1 /* OHHTTPStubs.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0F6D3A84243F064900FCFEBC /* EntryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryAPITest.swift; sourceTree = ""; }; 0F7138C42424A70C00B314B0 /* AssetQueryTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetQueryTest.swift; sourceTree = ""; }; 0F7138CC2424A94000B314B0 /* QueryTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTest.swift; sourceTree = ""; }; 0F7138D02424E98D00B314B0 /* ParameterEncoding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParameterEncoding.swift; sourceTree = ""; }; @@ -388,10 +382,19 @@ 0FFA5DB3241F99F9003B3AF5 /* FatalError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FatalError.swift; sourceTree = ""; }; 0FFA5DBB241F9A6C003B3AF5 /* XCTestCase+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Extension.swift"; sourceTree = ""; }; 0FFB22B3261C98E50056AEE0 /* .env */ = {isa = PBXFileReference; lastKnownFileType = text; path = .env; sourceTree = ""; }; - 0FFBB4422446F219000D2795 /* AssetQueryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetQueryAPITest.swift; sourceTree = ""; }; 0FFBB4462446F9A4000D2795 /* Asset.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Asset.json; sourceTree = ""; }; 0FFBB44B24470C43000D2795 /* ContentStackLogTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentStackLogTest.swift; sourceTree = ""; }; - 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + 470253922C0C612A009BDF8B /* TaxonomyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaxonomyModel.swift; sourceTree = ""; }; + 470657532B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentTypeQueryAPITest.swift; sourceTree = ""; }; + 470657572B5E788400BBFF88 /* EntryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryAPITest.swift; sourceTree = ""; }; + 4706575B2B5E78B300BBFF88 /* AssetQueryAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetQueryAPITest.swift; sourceTree = ""; }; + 4706575F2B5E797300BBFF88 /* ContentstackTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentstackTest.swift; sourceTree = ""; }; + 470657632B5E7F5400BBFF88 /* DVR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DVR.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47161AC42B5D744E00AD615B /* DVR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DVR.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47161ACB2B5D788E00AD615B /* DVR.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DVR.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47AAE08F2B60420E0098655A /* SyncAPITest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncAPITest.swift; sourceTree = ""; }; + 47B4DC612C232A8200370CFC /* TaxonomyTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaxonomyTest.swift; sourceTree = ""; }; + 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Taxonomy.swift; sourceTree = ""; }; OBJ_17 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; OBJ_18 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; @@ -402,7 +405,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0FD6F8F22620194100636504 /* ContentstackUtils in Frameworks */, + 47161ACA2B5D747D00AD615B /* DVR in Frameworks */, + 642AD4332B86110100E2AFDF /* ContentstackUtils in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -410,8 +414,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0F1DCC73243D991100EED404 /* DVR.framework in Frameworks */, - 0F1DCC75243D991100EED404 /* OHHTTPStubs.framework in Frameworks */, 0F4A75D4241BAC4300E3A024 /* Contentstack.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -420,7 +422,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0FD6F9102620194C00636504 /* ContentstackUtils in Frameworks */, + 642AD4352B86111700E2AFDF /* DVR in Frameworks */, + 642AD4372B86111A00E2AFDF /* ContentstackUtils in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -428,8 +431,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0F6B6CE824508154007AB3C1 /* DVR.framework in Frameworks */, - 0F6B6CEA24508154007AB3C1 /* OHHTTPStubs.framework in Frameworks */, 0F4A75F4241BAE6C00E3A024 /* Contentstack.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -438,7 +439,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0FD6F9122620195300636504 /* ContentstackUtils in Frameworks */, + 642AD4392B86112100E2AFDF /* ContentstackUtils in Frameworks */, + 642AD43B2B86112400E2AFDF /* DVR in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -446,8 +448,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0F6B6CEC24508165007AB3C1 /* DVR.framework in Frameworks */, - 0F6B6CEE24508165007AB3C1 /* OHHTTPStubs.framework in Frameworks */, 0F4A7610241BAFE000E3A024 /* Contentstack.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -456,7 +456,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0FD6F9142620195800636504 /* ContentstackUtils in Frameworks */, + 642AD43D2B86112C00E2AFDF /* ContentstackUtils in Frameworks */, + 642AD43F2B86112F00E2AFDF /* DVR in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -484,6 +485,7 @@ 0F1DCC7F243DCF2500EED404 /* EntryModel.swift */, 0F1DCC84243DD01900EED404 /* AssetModel.swift */, 0F1DCC89243DD20E00EED404 /* ContentTypeModel.swift */, + 470253922C0C612A009BDF8B /* TaxonomyModel.swift */, ); name = Models; sourceTree = ""; @@ -491,6 +493,9 @@ 0F1DCC6D243D980900EED404 /* Frameworks */ = { isa = PBXGroup; children = ( + 470657632B5E7F5400BBFF88 /* DVR.framework */, + 47161ACB2B5D788E00AD615B /* DVR.framework */, + 47161AC42B5D744E00AD615B /* DVR.framework */, 0F6B6CEB24508165007AB3C1 /* DVR.framework */, 0F6B6CED24508165007AB3C1 /* OHHTTPStubs.framework */, 0F6B6CE724508154007AB3C1 /* DVR.framework */, @@ -634,13 +639,13 @@ 0FFA5D9D241F8F9B003B3AF5 /* APITests */ = { isa = PBXGroup; children = ( - 0F4C0A8A243C6D8A006604B7 /* ContentstackTest.swift */, - 0F4C0A8E243C7D88006604B7 /* SyncAPITest.swift */, - 0F1DCC8E243DDB7300EED404 /* ContentTypeQueryAPITest.swift */, - 0F6D3A84243F064900FCFEBC /* EntryAPITest.swift */, - 0FFBB4422446F219000D2795 /* AssetQueryAPITest.swift */, - 0F50EA11244EC44800E5D705 /* QueryOnAPITest.swift */, 0F50EA1C244ED88C00E5D705 /* StackCacheAPITest.swift */, + 470657532B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift */, + 470657572B5E788400BBFF88 /* EntryAPITest.swift */, + 4706575B2B5E78B300BBFF88 /* AssetQueryAPITest.swift */, + 4706575F2B5E797300BBFF88 /* ContentstackTest.swift */, + 47AAE08F2B60420E0098655A /* SyncAPITest.swift */, + 47B4DC612C232A8200370CFC /* TaxonomyTest.swift */, ); name = APITests; sourceTree = ""; @@ -714,7 +719,7 @@ 0FFA5D79241F7033003B3AF5 /* ContentType.swift */, 0F4A762B241BB0D200E3A024 /* Contentstack.swift */, 0FFA5D56241F5085003B3AF5 /* ContentstackConfig.swift */, - 64F522052BF5C65300AE6E0F /* PrivacyInfo.xcprivacy */, + 47C6EFC12C0B5B9400F0D5CF /* Taxonomy.swift */, ); path = Sources; sourceTree = SOURCE_ROOT; @@ -772,7 +777,8 @@ ); name = "Contentstack iOS"; packageProductDependencies = ( - 0FD6F8F12620194100636504 /* ContentstackUtils */, + 47161AC92B5D747D00AD615B /* DVR */, + 642AD4322B86110100E2AFDF /* ContentstackUtils */, ); productName = "Contentstack iOS"; productReference = 0F4A75CB241BAC4300E3A024 /* Contentstack.framework */; @@ -811,7 +817,8 @@ ); name = "Contentstack macOS"; packageProductDependencies = ( - 0FD6F90F2620194C00636504 /* ContentstackUtils */, + 642AD4342B86111700E2AFDF /* DVR */, + 642AD4362B86111A00E2AFDF /* ContentstackUtils */, ); productName = "Contentstack macOS"; productReference = 0F4A75EB241BAE6C00E3A024 /* Contentstack.framework */; @@ -850,7 +857,8 @@ ); name = "Contentstack tvOS"; packageProductDependencies = ( - 0FD6F9112620195300636504 /* ContentstackUtils */, + 642AD4382B86112100E2AFDF /* ContentstackUtils */, + 642AD43A2B86112400E2AFDF /* DVR */, ); productName = "Contentstack tvOS"; productReference = 0F4A7607241BAFE000E3A024 /* Contentstack.framework */; @@ -889,7 +897,8 @@ ); name = "Contentstack watchOS"; packageProductDependencies = ( - 0FD6F9132620195800636504 /* ContentstackUtils */, + 642AD43C2B86112C00E2AFDF /* ContentstackUtils */, + 642AD43E2B86112F00E2AFDF /* DVR */, ); productName = "Contentstack watchOS"; productReference = 0F4A7623241BB0A300E3A024 /* Contentstack.framework */; @@ -948,7 +957,8 @@ ); mainGroup = OBJ_5; packageReferences = ( - 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */, + 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */, + 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */, ); productRefGroup = OBJ_14 /* Products */; projectDirPath = ""; @@ -970,7 +980,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 64F522062BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -984,7 +993,6 @@ 0F359991257BE29B00B3DB89 /* Asset.json in Resources */, 0F359992257BE2A700B3DB89 /* ContentType.json in Resources */, 0F4C0A87243C6990006604B7 /* config.json in Resources */, - 64F522072BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, 0F5794C2266A37120082815C /* Paragraph.Json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -993,7 +1001,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 64F522082BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1007,7 +1014,6 @@ 0F50EA17244ED7F500E5D705 /* QueryOn.json in Resources */, 0F796C532449EA8700EA04D5 /* Entry.json in Resources */, 0F4C0A88243C6990006604B7 /* config.json in Resources */, - 64F522092BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, 0F5794C3266A37120082815C /* Paragraph.Json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1016,7 +1022,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 64F5220A2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1030,7 +1035,6 @@ 0F50EA18244ED7F500E5D705 /* QueryOn.json in Resources */, 0F796C542449EA8700EA04D5 /* Entry.json in Resources */, 0F4C0A89243C6990006604B7 /* config.json in Resources */, - 64F5220B2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, 0F5794C4266A37120082815C /* Paragraph.Json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1039,7 +1043,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 64F5220C2BF5C65300AE6E0F /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1054,6 +1057,7 @@ 0FFA5D98241F8EB2003B3AF5 /* Entry.swift in Sources */, 0F02466F243210E200F72181 /* ImageParameter.swift in Sources */, 0FFA5D63241F5575003B3AF5 /* CSDefinitions.swift in Sources */, + 47C6EFC22C0B5B9400F0D5CF /* Taxonomy.swift in Sources */, 0FFA5D7A241F7033003B3AF5 /* ContentType.swift in Sources */, 0F0246662431F37300F72181 /* ImageTransform.swift in Sources */, 0F4FBCA42420B5F4007B8CAE /* Utils.swift in Sources */, @@ -1077,6 +1081,7 @@ 0FFA5D7F241F7060003B3AF5 /* SystemFields.swift in Sources */, 0F244FA224406A2D003C3F26 /* SyncStack.swift in Sources */, 0FFA5D70241F6BFA003B3AF5 /* Decodable.swift in Sources */, + 470253932C0C612A009BDF8B /* TaxonomyModel.swift in Sources */, 0FD39D40242352F800E34826 /* QueryableRange.swift in Sources */, 0FFA5D67241F5575003B3AF5 /* CSURLCache.swift in Sources */, 0FC52DBA2452EDE000B33614 /* EntryQuaryable.swift in Sources */, @@ -1090,35 +1095,35 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0F50EA12244EC44800E5D705 /* QueryOnAPITest.swift in Sources */, 0F60CA332428D02600ED67E6 /* QueryEntryType.swift in Sources */, + 4706575C2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */, 0F60CA2F2428949C00ED67E6 /* EntryTest.swift in Sources */, - 0F4C0A8B243C6D8A006604B7 /* ContentstackTest.swift in Sources */, 0F244FA724406A4A003C3F26 /* EntryQueriableTest.swift in Sources */, - 0F1DCC8F243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */, 0F463113243B044F001CE1FA /* SyncTest.swift in Sources */, 0FFA5DBC241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */, 0F4FBCA02420B0E4007B8CAE /* DateTest.swift in Sources */, 0FFA5D4A241F4DED003B3AF5 /* ContentstackConfigTest.swift in Sources */, + 47B4DC622C232A8200370CFC /* TaxonomyTest.swift in Sources */, 0F50EA1D244ED88C00E5D705 /* StackCacheAPITest.swift in Sources */, - 0FFBB4432446F219000D2795 /* AssetQueryAPITest.swift in Sources */, + 470657582B5E788400BBFF88 /* EntryAPITest.swift in Sources */, 0F096B14243610470094F042 /* ImageTransformTestAdditional.swift in Sources */, 0FD39D4A24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */, 0FFBB44C24470C43000D2795 /* ContentStackLogTest.swift in Sources */, 0F77CFB824373B8A00C57764 /* ImageTransformEquatableTest.swift in Sources */, 0F02466B243201B500F72181 /* ImageTransformTest.swift in Sources */, + 47AAE0902B60420E0098655A /* SyncAPITest.swift in Sources */, + 470657542B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */, + 470657602B5E797300BBFF88 /* ContentstackTest.swift in Sources */, 0F4FBCA92420B615007B8CAE /* UtilsTest.swift in Sources */, 0F7138CD2424A94000B314B0 /* QueryTest.swift in Sources */, 0F50EA0E244EC3DD00E5D705 /* Session.swift in Sources */, 0FFA5D9F241F8FFE003B3AF5 /* ContentTypeTest.swift in Sources */, 0F4A7646241BB3CB00E3A024 /* ContentstackTests.swift in Sources */, 0F7138C52424A70C00B314B0 /* AssetQueryTest.swift in Sources */, - 0F4C0A8F243C7D88006604B7 /* SyncAPITest.swift in Sources */, 0FFA5D8F241F8123003B3AF5 /* StackTest.swift in Sources */, 0FFA5DA3241F90BF003B3AF5 /* SutBuilder.swift in Sources */, 0F38D7E0242C7C9E00232D7F /* Product.swift in Sources */, 0F38D7E4242C831300232D7F /* AssetTest.swift in Sources */, - 0F796C502449EA6000EA04D5 /* EntryAPITest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1130,6 +1135,7 @@ 0FFA5D99241F8EB2003B3AF5 /* Entry.swift in Sources */, 0F024670243210E200F72181 /* ImageParameter.swift in Sources */, 0FFA5D64241F5575003B3AF5 /* CSDefinitions.swift in Sources */, + 47C6EFC32C0B5B9400F0D5CF /* Taxonomy.swift in Sources */, 0FFA5D7B241F7033003B3AF5 /* ContentType.swift in Sources */, 0F0246672431F37300F72181 /* ImageTransform.swift in Sources */, 0F4FBCA52420B5F4007B8CAE /* Utils.swift in Sources */, @@ -1153,6 +1159,7 @@ 0FFA5D80241F7060003B3AF5 /* SystemFields.swift in Sources */, 0F244FA324406A2D003C3F26 /* SyncStack.swift in Sources */, 0FFA5D71241F6BFA003B3AF5 /* Decodable.swift in Sources */, + 470253942C0C612A009BDF8B /* TaxonomyModel.swift in Sources */, 0FD39D41242352F800E34826 /* QueryableRange.swift in Sources */, 0FFA5D68241F5575003B3AF5 /* CSURLCache.swift in Sources */, 0FC52DBB2452EDE000B33614 /* EntryQuaryable.swift in Sources */, @@ -1166,31 +1173,31 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0F50EA13244EC44800E5D705 /* QueryOnAPITest.swift in Sources */, 0F60CA342428D02600ED67E6 /* QueryEntryType.swift in Sources */, + 470657552B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */, 0F60CA302428949C00ED67E6 /* EntryTest.swift in Sources */, - 0F4C0A8C243C6D8A006604B7 /* ContentstackTest.swift in Sources */, 0F244FA824406A4A003C3F26 /* EntryQueriableTest.swift in Sources */, - 0F1DCC90243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */, 0F463114243B044F001CE1FA /* SyncTest.swift in Sources */, + 47AAE0912B60420E0098655A /* SyncAPITest.swift in Sources */, 0FFA5DBD241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */, 0F4FBCA12420B0E4007B8CAE /* DateTest.swift in Sources */, + 47B4DC632C232A8200370CFC /* TaxonomyTest.swift in Sources */, 0FFA5D90241F8126003B3AF5 /* ContentstackConfigTest.swift in Sources */, 0F50EA1E244ED88C00E5D705 /* StackCacheAPITest.swift in Sources */, - 0FFBB4442446F219000D2795 /* AssetQueryAPITest.swift in Sources */, 0F096B15243610470094F042 /* ImageTransformTestAdditional.swift in Sources */, 0FD39D4B24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */, - 0F6D3A86243F064900FCFEBC /* EntryAPITest.swift in Sources */, 0FFBB44D24470C43000D2795 /* ContentStackLogTest.swift in Sources */, + 4706575D2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */, 0F77CFB924373B8F00C57764 /* ImageTransformEquatableTest.swift in Sources */, 0F02466C243201B500F72181 /* ImageTransformTest.swift in Sources */, 0F4FBCAA2420B615007B8CAE /* UtilsTest.swift in Sources */, + 470657592B5E788400BBFF88 /* EntryAPITest.swift in Sources */, 0F50EA0F244EC3DD00E5D705 /* Session.swift in Sources */, 0F7138CE2424A94000B314B0 /* QueryTest.swift in Sources */, 0FFA5DA0241F8FFE003B3AF5 /* ContentTypeTest.swift in Sources */, 0FFA5D8E241F8122003B3AF5 /* StackTest.swift in Sources */, + 470657612B5E797300BBFF88 /* ContentstackTest.swift in Sources */, 0F7138C62424A70C00B314B0 /* AssetQueryTest.swift in Sources */, - 0F4C0A90243C7D88006604B7 /* SyncAPITest.swift in Sources */, 0F4A7647241BB3CC00E3A024 /* ContentstackTests.swift in Sources */, 0FFA5DA4241F90BF003B3AF5 /* SutBuilder.swift in Sources */, 0F38D7E1242C7C9E00232D7F /* Product.swift in Sources */, @@ -1206,6 +1213,7 @@ 0FFA5D9A241F8EB2003B3AF5 /* Entry.swift in Sources */, 0F024671243210E200F72181 /* ImageParameter.swift in Sources */, 0FFA5D65241F5575003B3AF5 /* CSDefinitions.swift in Sources */, + 47C6EFC42C0B5B9400F0D5CF /* Taxonomy.swift in Sources */, 0FFA5D7C241F7033003B3AF5 /* ContentType.swift in Sources */, 0F0246682431F37300F72181 /* ImageTransform.swift in Sources */, 0F4FBCA62420B5F4007B8CAE /* Utils.swift in Sources */, @@ -1229,6 +1237,7 @@ 0FFA5D81241F7060003B3AF5 /* SystemFields.swift in Sources */, 0F244FA424406A2D003C3F26 /* SyncStack.swift in Sources */, 0FFA5D72241F6BFA003B3AF5 /* Decodable.swift in Sources */, + 470253952C0C612A009BDF8B /* TaxonomyModel.swift in Sources */, 0FD39D42242352F800E34826 /* QueryableRange.swift in Sources */, 0FFA5D69241F5575003B3AF5 /* CSURLCache.swift in Sources */, 0FC52DBC2452EDE000B33614 /* EntryQuaryable.swift in Sources */, @@ -1242,31 +1251,31 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0F50EA14244EC44800E5D705 /* QueryOnAPITest.swift in Sources */, 0F60CA352428D02600ED67E6 /* QueryEntryType.swift in Sources */, + 470657562B5E785C00BBFF88 /* ContentTypeQueryAPITest.swift in Sources */, 0F60CA312428949C00ED67E6 /* EntryTest.swift in Sources */, - 0F4C0A8D243C6D8A006604B7 /* ContentstackTest.swift in Sources */, 0F244FA924406A4A003C3F26 /* EntryQueriableTest.swift in Sources */, - 0F1DCC91243DDB7300EED404 /* ContentTypeQueryAPITest.swift in Sources */, 0F463115243B044F001CE1FA /* SyncTest.swift in Sources */, + 47AAE0922B60420E0098655A /* SyncAPITest.swift in Sources */, 0FFA5DBE241F9A6C003B3AF5 /* XCTestCase+Extension.swift in Sources */, 0F4FBCA22420B0E4007B8CAE /* DateTest.swift in Sources */, + 47B4DC642C232A8200370CFC /* TaxonomyTest.swift in Sources */, 0FFA5D91241F8127003B3AF5 /* ContentstackConfigTest.swift in Sources */, 0F50EA1F244ED88C00E5D705 /* StackCacheAPITest.swift in Sources */, - 0FFBB4452446F219000D2795 /* AssetQueryAPITest.swift in Sources */, 0F096B16243610470094F042 /* ImageTransformTestAdditional.swift in Sources */, 0FD39D4C24237A0400E34826 /* ContentTypeQueryTest.swift in Sources */, - 0F6D3A87243F064900FCFEBC /* EntryAPITest.swift in Sources */, 0FFBB44E24470C43000D2795 /* ContentStackLogTest.swift in Sources */, + 4706575E2B5E78B300BBFF88 /* AssetQueryAPITest.swift in Sources */, 0F77CFBA24373B9000C57764 /* ImageTransformEquatableTest.swift in Sources */, 0F02466D243201B500F72181 /* ImageTransformTest.swift in Sources */, 0F4FBCAB2420B615007B8CAE /* UtilsTest.swift in Sources */, + 4706575A2B5E788400BBFF88 /* EntryAPITest.swift in Sources */, 0F50EA10244EC3DD00E5D705 /* Session.swift in Sources */, 0F7138CF2424A94000B314B0 /* QueryTest.swift in Sources */, 0FFA5DA1241F8FFE003B3AF5 /* ContentTypeTest.swift in Sources */, 0FFA5D8D241F8122003B3AF5 /* StackTest.swift in Sources */, + 470657622B5E797300BBFF88 /* ContentstackTest.swift in Sources */, 0F7138C72424A70C00B314B0 /* AssetQueryTest.swift in Sources */, - 0F4C0A91243C7D88006604B7 /* SyncAPITest.swift in Sources */, 0F4A7648241BB3CE00E3A024 /* ContentstackTests.swift in Sources */, 0FFA5DA5241F90BF003B3AF5 /* SutBuilder.swift in Sources */, 0F38D7E2242C7C9E00232D7F /* Product.swift in Sources */, @@ -1282,6 +1291,7 @@ 0FFA5D9B241F8EB2003B3AF5 /* Entry.swift in Sources */, 0F024672243210E200F72181 /* ImageParameter.swift in Sources */, 0FFA5D66241F5575003B3AF5 /* CSDefinitions.swift in Sources */, + 47C6EFC52C0B5B9400F0D5CF /* Taxonomy.swift in Sources */, 0FFA5D7D241F7033003B3AF5 /* ContentType.swift in Sources */, 0F0246692431F37300F72181 /* ImageTransform.swift in Sources */, 0F4FBCA72420B5F4007B8CAE /* Utils.swift in Sources */, @@ -1305,6 +1315,7 @@ 0FFA5D82241F7060003B3AF5 /* SystemFields.swift in Sources */, 0F244FA524406A2D003C3F26 /* SyncStack.swift in Sources */, 0FFA5D73241F6BFA003B3AF5 /* Decodable.swift in Sources */, + 470253962C0C612A009BDF8B /* TaxonomyModel.swift in Sources */, 0FD39D43242352F800E34826 /* QueryableRange.swift in Sources */, 0FFA5D6A241F5575003B3AF5 /* CSURLCache.swift in Sources */, 0FC52DBD2452EDE000B33614 /* EntryQuaryable.swift in Sources */, @@ -1367,9 +1378,11 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = SMAKUMV86W; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -1390,7 +1403,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "Supporting Files/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1447,15 +1460,18 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = SMAKUMV86W; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1466,7 +1482,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = "Supporting Files/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1494,8 +1510,8 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0F4FBC9A2420A17F007B8CAE /* Config.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; + "ARCHS[sdk=*]" = "$(ARCHS_STANDARD)"; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1524,8 +1540,10 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = SMAKUMV86W; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1562,7 +1580,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0F4FBC9A2420A17F007B8CAE /* Config.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1593,8 +1610,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = SMAKUMV86W; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1663,6 +1683,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1684,7 +1705,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.15; MARKETING_VERSION = 1.2.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -1744,6 +1765,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -1760,7 +1782,7 @@ "@executable_path/../Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.15; MARKETING_VERSION = 1.2.5; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -1779,7 +1801,6 @@ 0F4A7600241BAE6C00E3A024 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1845,7 +1866,6 @@ 0F4A7601241BAE6C00E3A024 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1975,7 +1995,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 13.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; WATCHOS_DEPLOYMENT_TARGET = 2.0; @@ -2048,7 +2068,7 @@ SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 11.0; + TVOS_DEPLOYMENT_TARGET = 13.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -2059,7 +2079,6 @@ 0F4A761C241BAFE000E3A024 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -2126,7 +2145,6 @@ 0F4A761D241BAFE000E3A024 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -2263,7 +2281,7 @@ TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 4.0; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -2339,7 +2357,7 @@ VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 4.0; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; @@ -2347,20 +2365,22 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0F4FBC9A2420A17F007B8CAE /* Config.xcconfig */; buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = YES; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "SWIFT_PACKAGE=1", "DEBUG=1", ); - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.13; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2368,7 +2388,9 @@ SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TVOS_DEPLOYMENT_TARGET = 13.0; USE_HEADERMAP = NO; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Debug; }; @@ -2376,18 +2398,21 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0F4FBC9A2420A17F007B8CAE /* Config.xcconfig */; buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; CLANG_ENABLE_OBJC_ARC = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_INSTALL_NAME_BASE = "@rpath"; + "EXCLUDED_ARCHS[sdk=*]" = arm64; GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "SWIFT_PACKAGE=1", ); - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MACOSX_DEPLOYMENT_TARGET = 10.13; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACOSX_DEPLOYMENT_TARGET = 10.15; + ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -DXcode"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; @@ -2395,7 +2420,9 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE"; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; + TVOS_DEPLOYMENT_TARGET = 13.0; USE_HEADERMAP = NO; + WATCHOS_DEPLOYMENT_TARGET = 6.0; }; name = Release; }; @@ -2477,37 +2504,65 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */ = { + 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */ = { isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/contentstack/contentstack-utils-swift.git"; + repositoryURL = "https://github.com/venmo/DVR.git"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.0.0; + minimumVersion = 1.3.1; + }; + }; + 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/contentstack/contentstack-utils-swift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.3.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 0FD6F8F12620194100636504 /* ContentstackUtils */ = { + 47161AC92B5D747D00AD615B /* DVR */ = { + isa = XCSwiftPackageProductDependency; + package = 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */; + productName = DVR; + }; + 642AD4322B86110100E2AFDF /* ContentstackUtils */ = { isa = XCSwiftPackageProductDependency; - package = 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; + package = 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; productName = ContentstackUtils; }; - 0FD6F90F2620194C00636504 /* ContentstackUtils */ = { + 642AD4342B86111700E2AFDF /* DVR */ = { + isa = XCSwiftPackageProductDependency; + package = 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */; + productName = DVR; + }; + 642AD4362B86111A00E2AFDF /* ContentstackUtils */ = { isa = XCSwiftPackageProductDependency; - package = 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; + package = 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; productName = ContentstackUtils; }; - 0FD6F9112620195300636504 /* ContentstackUtils */ = { + 642AD4382B86112100E2AFDF /* ContentstackUtils */ = { isa = XCSwiftPackageProductDependency; - package = 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; + package = 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; productName = ContentstackUtils; }; - 0FD6F9132620195800636504 /* ContentstackUtils */ = { + 642AD43A2B86112400E2AFDF /* DVR */ = { isa = XCSwiftPackageProductDependency; - package = 0FD6F8F02620194100636504 /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; + package = 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */; + productName = DVR; + }; + 642AD43C2B86112C00E2AFDF /* ContentstackUtils */ = { + isa = XCSwiftPackageProductDependency; + package = 642AD4312B8610F200E2AFDF /* XCRemoteSwiftPackageReference "contentstack-utils-swift" */; productName = ContentstackUtils; }; + 642AD43E2B86112F00E2AFDF /* DVR */ = { + isa = XCSwiftPackageProductDependency; + package = 47161AC82B5D747600AD615B /* XCRemoteSwiftPackageReference "DVR" */; + productName = DVR; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = OBJ_1 /* Project object */; diff --git a/Contentstack.xcodeproj/xcshareddata/xcschemes/Contentstack iOS Tests.xcscheme b/Contentstack.xcodeproj/xcshareddata/xcschemes/Contentstack iOS Tests.xcscheme new file mode 100644 index 00000000..ff8bf292 --- /dev/null +++ b/Contentstack.xcodeproj/xcshareddata/xcschemes/Contentstack iOS Tests.xcscheme @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Contentstack.xcworkspace/xcshareddata/xcschemes/Contentstack iOS.xcscheme b/Contentstack.xcworkspace/xcshareddata/xcschemes/Contentstack iOS.xcscheme index 7ba19d5e..82c0c141 100644 --- a/Contentstack.xcworkspace/xcshareddata/xcschemes/Contentstack iOS.xcscheme +++ b/Contentstack.xcworkspace/xcshareddata/xcschemes/Contentstack iOS.xcscheme @@ -24,8 +24,8 @@ diff --git a/Package.swift b/Package.swift index 6d2a3ae6..5a30f241 100644 --- a/Package.swift +++ b/Package.swift @@ -7,10 +7,10 @@ import PackageDescription let package = Package( name: "ContentstackSwift", - platforms: [.macOS(.v10_13), - .iOS(.v11), - .tvOS(.v11), - .watchOS(.v4)], + platforms: [.macOS(.v10_15), + .iOS(.v13), + .tvOS(.v13), + .watchOS(.v6)], products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. diff --git a/Sources/ContentstackResponse.swift b/Sources/ContentstackResponse.swift index 038c0bc6..cf36c459 100644 --- a/Sources/ContentstackResponse.swift +++ b/Sources/ContentstackResponse.swift @@ -81,6 +81,15 @@ where ItemType: EndpointAccessible & Decodable { } self.items = [entry] } + case .taxnomies: + if let taxonomies = try container.decodeIfPresent([ItemType].self, forKey: .entries) { + let containerFields = try decoder.container(keyedBy: JSONCodingKeys.self) + let response = try containerFields.decode(Dictionary.self) + if let contentType = response["content_type"] as? ContentTypeModel { + fields = ["content_type": contentType] + } + self.items = taxonomies + } default: print("sync") } diff --git a/Sources/EndPoint.swift b/Sources/EndPoint.swift index 55f91cec..14cc0045 100644 --- a/Sources/EndPoint.swift +++ b/Sources/EndPoint.swift @@ -20,6 +20,8 @@ public enum Endpoint: String { case assets /// The synchronization endpoint. case sync = "stacks/sync" + + case taxnomies = "taxonomies" /// The path component string for the current endpoint. public var pathComponent: String { return rawValue diff --git a/Sources/Query.swift b/Sources/Query.swift index 799aa025..de6b9f87 100644 --- a/Sources/Query.swift +++ b/Sources/Query.swift @@ -12,7 +12,7 @@ public class Query: BaseQuery, EntryQueryable { public typealias ResourceType = EntryModel - internal var contentTypeUid: String + internal var contentTypeUid: String? /// Stack instance for Entry to be fetched public var stack: Stack /// URI Parameters @@ -23,11 +23,16 @@ public class Query: BaseQuery, EntryQueryable { public var cachePolicy: CachePolicy - internal required init(contentType: ContentType) { - self.stack = contentType.stack - self.contentTypeUid = contentType.uid! - self.cachePolicy = contentType.cachePolicy - self.parameters[QueryParameter.contentType] = contentTypeUid + internal required init(contentType: ContentType?, stack: Stack? = nil, cachePolicy: CachePolicy? = nil) { + if let contentType = contentType { + self.stack = contentType.stack + self.contentTypeUid = contentType.uid! + self.cachePolicy = contentType.cachePolicy + self.parameters[QueryParameter.contentType] = contentTypeUid + } else { + self.stack = stack! + self.cachePolicy = cachePolicy! + } } /// Use this method to do a search on `Entries` which enables diff --git a/Sources/QueryOperation.swift b/Sources/QueryOperation.swift index e1fd8cd1..cb9bf897 100644 --- a/Sources/QueryOperation.swift +++ b/Sources/QueryOperation.swift @@ -85,6 +85,10 @@ extension Query { case exists(Bool) /// Search on a field by Regex. case matches(String) + case eqBelow(String) + case below(String) + case eqAbove(String) + case above(String) internal var string: String { switch self { @@ -98,6 +102,10 @@ extension Query { case .isGreaterThanOrEqual: return "$gte" case .exists: return "$exists" case .matches: return "$regex" + case .eqBelow: return "$eq_below" + case .below: return "$below" + case .eqAbove: return "$eq_above" + case .above: return "$above" } } @@ -137,6 +145,10 @@ extension Query { return value.stringValue case .exists(let value): return value case .matches(let value): return value + case .eqBelow(let value): return value + case .below(let value): return value + case .eqAbove(let value): return value + case .above(let value): return value } } internal var query: Any { diff --git a/Sources/QueryParameter.swift b/Sources/QueryParameter.swift index df48e279..dcf9de2e 100644 --- a/Sources/QueryParameter.swift +++ b/Sources/QueryParameter.swift @@ -31,6 +31,8 @@ internal enum QueryParameter { internal static let tags = "tags" internal static let contentType = "content_type" + + internal static let taxonomies = "taxonomies" internal static let uid = "uid" diff --git a/Sources/QueryProtocols.swift b/Sources/QueryProtocols.swift index d4c15602..2146af17 100644 --- a/Sources/QueryProtocols.swift +++ b/Sources/QueryProtocols.swift @@ -65,19 +65,20 @@ extension BaseQuery { /// } /// } /// ``` + /// public func find(_ completion: @escaping ResultsHandler>) - where ResourceType: Decodable & EndpointAccessible { - if self.queryParameter.count > 0, - let query = self.queryParameter.jsonString { - self.parameters[QueryParameter.query] = query - } - self.stack.fetch(endpoint: ResourceType.endpoint, - cachePolicy: self.cachePolicy, parameters: parameters, headers: headers, then: completion) + where ResourceType: Decodable & EndpointAccessible { + if self.queryParameter.count > 0, + let query = self.queryParameter.jsonString { + self.parameters[QueryParameter.query] = query + } + self.stack.fetch(endpoint: ResourceType.endpoint, + cachePolicy: self.cachePolicy, parameters: parameters, headers: headers, then: completion) } } /// A concrete implementation of BaseQuery which serves as the base class for `Query`, /// `ContentTypeQuery` and `AssetQuery`. -public protocol BaseQuery: QueryProtocol, Queryable {} +public protocol BaseQuery: QueryProtocol {} extension BaseQuery { /// Method to adding Query.Operation to a Query/ /// - Parameters: diff --git a/Sources/Stack.swift b/Sources/Stack.swift index 3a788131..753def92 100644 --- a/Sources/Stack.swift +++ b/Sources/Stack.swift @@ -106,6 +106,10 @@ public class Stack: CachePolicyAccessible { public func contentType(uid: String? = nil) -> ContentType { return ContentType(uid, stack: self) } + + public func taxonomy(uid: String? = nil) -> Taxonomy { + return Taxonomy(stack: self) + } /// Get instance of `Asset` to fetch `Assets` or fetch specific `Asset`. /// @@ -132,9 +136,14 @@ public class Stack: CachePolicyAccessible { switch endpoint { case .entries: urlComponents.path = "\(urlComponents.path)/\(Endpoint.contenttype.pathComponent)/\(String(describing: parameters[QueryParameter.contentType]!))" + case .taxnomies: + urlComponents.path = "\(urlComponents.path)/\(Endpoint.taxnomies.pathComponent)/entries" default: break } - urlComponents.path = "\(urlComponents.path)/\(endpoint.pathComponent)" + + if endpoint != .taxnomies { + urlComponents.path = "\(urlComponents.path)/\(endpoint.pathComponent)" + } if let uid = parameters[QueryParameter.uid] { urlComponents.path = "\(urlComponents.path)/\(uid)" @@ -164,31 +173,6 @@ public class Stack: CachePolicyAccessible { return urlComponents.url! } - internal func fetch(endpoint: Endpoint, - cachePolicy: CachePolicy, - parameters: Parameters = [:], - headers: [String: String] = [:], - then completion: @escaping ResultsHandler) - where ResourceType: Decodable { - let url = self.url(endpoint: endpoint, parameters: parameters) - self.fetchUrl(url, - headers: headers, - cachePolicy: cachePolicy, - then: { (result: Result, responseType: ResponseType) in - switch result { - case .success(let data): - do { - let jsonParse = try self.jsonDecoder.decode(ResourceType.self, from: data) - completion(Result.success(jsonParse), responseType) - } catch let error { - completion(Result.failure(error), responseType) - } - case .failure(let error): - completion(Result.failure(error), responseType) - } - }) - } - private func fetchUrl(_ url: URL, headers:[String: String], cachePolicy: CachePolicy, then completion: @escaping ResultsHandler) { var dataTask: URLSessionDataTask? var request = URLRequest(url: url) @@ -247,6 +231,28 @@ public class Stack: CachePolicyAccessible { }) performDataTask(dataTask!, request: request, cachePolicy: cachePolicy, then: completion) } + + internal func fetch(endpoint: Endpoint, + cachePolicy: CachePolicy, + parameters: Parameters = [:], + headers: [String: String] = [:], + then completion: @escaping ResultsHandler) + where ResourceType: Decodable { + let url = self.url(endpoint: endpoint, parameters: parameters) + self.fetchUrl(url, headers: headers, cachePolicy: cachePolicy, then: { (result: Result, responseType: ResponseType) in + switch result { + case .success(let data): + do { + let jsonParse = try self.jsonDecoder.decode(ResourceType.self, from: data) + completion(Result.success(jsonParse), responseType) + } catch let error { + completion(Result.failure(error), responseType) + } + case .failure(let error): + completion(Result.failure(error), responseType) + } + }) + } private func performDataTask(_ dataTask: URLSessionDataTask, request: URLRequest, @@ -279,6 +285,7 @@ public class Stack: CachePolicyAccessible { } } } + //Cache handling methods private func fullfillRequestWithCache(_ request: URLRequest, then completion: @escaping ResultsHandler) { if let data = self.cachedResponse(for: request) { @@ -287,7 +294,7 @@ public class Stack: CachePolicyAccessible { } completion(Result.failure(SDKError.cacheError), .cache) } - + private func canFullfillRequestWithCache(_ request: URLRequest) -> Bool { return self.cachedResponse(for: request) != nil ? true : false } @@ -300,6 +307,7 @@ public class Stack: CachePolicyAccessible { } } + extension Stack { /// The Initial Sync request performs a complete sync of your app data. @@ -328,6 +336,7 @@ extension Stack { /// } /// } ///``` + @available(*, deprecated, message: "This method will be deprecated soon. Please use seqSync instead") public func sync(_ syncStack: SyncStack = SyncStack(), syncTypes: [SyncStack.SyncableTypes] = [.all], then completion: @escaping (_ result: Result) -> Void) { @@ -338,7 +347,6 @@ extension Stack { } } let url = self.url(endpoint: SyncStack.endpoint, parameters: parameter) - fetchUrl(url, headers: [:], cachePolicy: .networkOnly) { (result: Result, _: ResponseType) in @@ -347,7 +355,7 @@ extension Stack { do { let syncStack = try self.jsonDecoder.decode(SyncStack.self, from: data) completion(.success(syncStack)) - if syncStack.hasMorePages { + if syncStack.hasMorePages { self.sync(syncStack, then: completion) } } catch let error { diff --git a/Sources/SyncStack.swift b/Sources/SyncStack.swift index 60b9dc43..550fa999 100644 --- a/Sources/SyncStack.swift +++ b/Sources/SyncStack.swift @@ -129,4 +129,4 @@ public final class SyncStack: Decodable { extension SyncStack: EndpointAccessible { public static var endpoint: Endpoint = .sync -} +} \ No newline at end of file diff --git a/Sources/Taxonomy.swift b/Sources/Taxonomy.swift new file mode 100644 index 00000000..98a356f7 --- /dev/null +++ b/Sources/Taxonomy.swift @@ -0,0 +1,50 @@ +// +// Taxonomy.swift +// Contentstack +// +// Created by Vikram Kalta on 01/06/2024. +// + +import Foundation + +public class Taxonomy: CachePolicyAccessible { + + var uid: String? + public var stack: Stack + public var parameters: [String : Any] = [:] + public var headers: [String : String] = [:] + public var cachePolicy: CachePolicy = .networkOnly + + public var queryParameter: [String : Any] = [:] + + internal required init(stack: Stack) { + self.stack = stack + } + + public func query() -> Query { + let query = Query(contentType: nil, stack: stack, cachePolicy: cachePolicy) + return query + } + + public func addValue(_ value: String, forHTTPHeaderField field: String) -> Self { + self.headers[field] = value + return self + } +} + +extension Taxonomy: ResourceQueryable { + public func fetch(_ completion: @escaping (Result, ResponseType) -> Void) where ResourceType: EndpointAccessible, ResourceType: Decodable { + self.stack.fetch(endpoint: ResourceType.endpoint, cachePolicy: self.cachePolicy, then: { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + if let resource = contentstackResponse.items.first { + completion(.success(resource), response) + } else { + completion(.failure(SDKError.invalidURL(string: "Something went wrong.")), response) + } + case .failure(let error): + completion(.failure(error), response) + } + }) + } +} diff --git a/Sources/TaxonomyModel.swift b/Sources/TaxonomyModel.swift new file mode 100644 index 00000000..35452028 --- /dev/null +++ b/Sources/TaxonomyModel.swift @@ -0,0 +1,50 @@ +// +// TaxonomyModel.swift +// Contentstack +// +// Created by Vikram Kalta on 02/06/2024. +// + +import Foundation + +public class TaxonomyModel: EntryDecodable { + + public var title: String + public var uid: String + public var locale: String + public var createdAt: Date? + public var updatedAt: Date? + public var createdBy: String? + public var updatedBy: String? + public var fields: [String: Any]? + public var contentType: ContentTypeModel? + public enum FieldKeys: String, CodingKey { + case title, uid, locale + case createdAt = "created_at" + case updatedAt = "updated_at" + case createdBy = "created_by" + case updatedBy = "updated_by" + case fields + } + + public required init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: FieldKeys.self) + uid = try container.decode(String.self, forKey: .uid) + title = try container.decode(String.self, forKey: .title) + createdBy = try? container.decode(String.self, forKey: .createdBy) + updatedBy = try? container.decode(String.self, forKey: .updatedBy) + createdAt = try? container.decode(Date.self, forKey: .createdAt) + updatedAt = try? container.decode(Date.self, forKey: .updatedAt) + locale = try container.decode(String.self, forKey: .locale) + + let containerFields = try decoder.container(keyedBy: JSONCodingKeys.self) + fields = try containerFields.decode(Dictionary.self) + } +} + +extension TaxonomyModel: EndpointAccessible { + public static var endpoint: Endpoint { + return .taxnomies + } +} + diff --git a/Tests/AssetQueryAPITest.swift b/Tests/AssetQueryAPITest.swift index 0108bf1e..5538eeed 100644 --- a/Tests/AssetQueryAPITest.swift +++ b/Tests/AssetQueryAPITest.swift @@ -9,14 +9,15 @@ import XCTest @testable import Contentstack import DVR -var kAssetUID = "" -var kAssetLocaliseUID = "" -var kAssetTitle = "" -var kFileName = "" -let locale = "en-gb" + class AssetQueryAPITest: XCTestCase { static let stack = TestContentstackClient.testStack(cassetteName: "Asset") + static var kAssetUID = "" + static var kAssetLocaliseUID = "" + static var kAssetTitle = "" + static var kFileName = "" + static let locale = "en-gb" func getAsset(uid: String? = nil) -> Asset { return AssetQueryAPITest.stack.asset(uid: uid) @@ -51,9 +52,9 @@ class AssetQueryAPITest: XCTestCase { case .success(let contentstackResponse): XCTAssertEqual(contentstackResponse.items.count, 8) if let asset = contentstackResponse.items.first { - kAssetUID = asset.uid - kAssetTitle = asset.title - kFileName = asset.fileName + AssetQueryAPITest.kAssetUID = asset.uid + AssetQueryAPITest.kAssetTitle = asset.title + AssetQueryAPITest.kFileName = asset.fileName } case .failure(let error): XCTFail("\(error)") @@ -65,11 +66,11 @@ class AssetQueryAPITest: XCTestCase { func test02Find_AssetQuery_whereUIDEquals() { let networkExpectation = expectation(description: "Fetch where UID equals Assets Test") - self.queryWhere(.uid, operation: .equals(kAssetUID)) { (result: Result, Error>) in + self.queryWhere(.uid, operation: .equals(AssetQueryAPITest.kAssetUID)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for asset in contentstackResponse.items { - XCTAssertEqual(asset.uid, kAssetUID) + XCTAssertEqual(asset.uid, AssetQueryAPITest.kAssetUID) } case .failure(let error): XCTFail("\(error)") @@ -81,11 +82,11 @@ class AssetQueryAPITest: XCTestCase { func test03Find_AssetQuery_whereTitleDNotEquals() { let networkExpectation = expectation(description: "Fetch where Title equals Assets Test") - self.queryWhere(.title, operation: .notEquals(kAssetTitle)) { (result: Result, Error>) in + self.queryWhere(.title, operation: .notEquals(AssetQueryAPITest.kAssetTitle)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for asset in contentstackResponse.items { - XCTAssertNotEqual(asset.title, kAssetTitle) + XCTAssertNotEqual(asset.title, AssetQueryAPITest.kAssetTitle) } case .failure(let error): XCTFail("\(error)") @@ -97,11 +98,11 @@ class AssetQueryAPITest: XCTestCase { func test03Find_AssetQuery_whereFileNameEquals() { let networkExpectation = expectation(description: "Fetch where Title equals Assets Test") - self.queryWhere(.fileName, operation: .notEquals(kFileName)) { (result: Result, Error>) in + self.queryWhere(.fileName, operation: .notEquals(AssetQueryAPITest.kFileName)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for asset in contentstackResponse.items { - XCTAssertNotEqual(asset.title, kAssetTitle) + XCTAssertNotEqual(asset.title, AssetQueryAPITest.kAssetTitle) } case .failure(let error): XCTFail("\(error)") @@ -141,10 +142,10 @@ class AssetQueryAPITest: XCTestCase { func test06Fetch_Asset_fromUID() { let networkExpectation = expectation(description: "Fetch Assets from UID Test") - self.getAsset(uid: kAssetUID).fetch { (result: Result, response: ResponseType) in + self.getAsset(uid: AssetQueryAPITest.kAssetUID).fetch { (result: Result, response: ResponseType) in switch result { case .success(let model): - XCTAssertEqual(model.uid, kAssetUID) + XCTAssertEqual(model.uid, AssetQueryAPITest.kAssetUID) case .failure(let error): XCTFail("\(error)") } @@ -174,7 +175,7 @@ class AssetQueryAPITest: XCTestCase { func test08Fetch_Asset_WithGlobalFields() { let networkExpectation = expectation(description: "Fetch Assets with GlobalFields Test") - self.getAsset(uid: kAssetUID) + self.getAsset(uid: AssetQueryAPITest.kAssetUID) .includeDimension() .fetch { (result: Result, response: ResponseType) in switch result { @@ -225,7 +226,7 @@ class AssetQueryAPITest: XCTestCase { func test12Fetch_AssetQuery_WithoutFallback_Result() { let networkExpectation = expectation(description: "Fetch Assets without Fallback Test") - self.getAssetQuery().locale(locale) + self.getAssetQuery().locale(AssetQueryAPITest.locale) .find { (result: Result, Error>, response: ResponseType) in switch result { case .success(let response): @@ -233,7 +234,7 @@ class AssetQueryAPITest: XCTestCase { if let fields = model.fields, let publishDetails = fields["publish_details"] as? [AnyHashable: Any], let publishLocale = publishDetails["locale"] as? String { - XCTAssertEqual(publishLocale, locale) + XCTAssertEqual(publishLocale, AssetQueryAPITest.locale) } } case .failure(let error): @@ -247,7 +248,7 @@ class AssetQueryAPITest: XCTestCase { func test13Fetch_AssetQuery_Fallback_Result() { let networkExpectation = expectation(description: "Fetch Assets without Fallback Test") self.getAssetQuery() - .locale(locale) + .locale(AssetQueryAPITest.locale) .include(params: .fallback) .find { (result: Result, Error>, response: ResponseType) in switch result { @@ -256,7 +257,7 @@ class AssetQueryAPITest: XCTestCase { if let fields = model.fields, let publishDetails = fields["publish_details"] as? [AnyHashable: Any], let publishLocale = publishDetails["locale"] as? String { - XCTAssert(["en-us", locale].contains(publishLocale), "\(publishLocale) not matching") + XCTAssert(["en-us", AssetQueryAPITest.locale].contains(publishLocale), "\(publishLocale) not matching") } } if let model = response.items.first(where: { (model) -> Bool in @@ -267,7 +268,7 @@ class AssetQueryAPITest: XCTestCase { } return false }) { - kAssetLocaliseUID = model.uid + AssetQueryAPITest.kAssetLocaliseUID = model.uid } case .failure(let error): XCTFail("\(error)") @@ -279,7 +280,7 @@ class AssetQueryAPITest: XCTestCase { func test14Fetch_Asset_UIDWithoutFallback_NoResult() { let networkExpectation = expectation(description: "Fetch Asset from UID without Fallback Test") - self.getAsset(uid: kAssetLocaliseUID) + self.getAsset(uid: AssetQueryAPITest.kAssetLocaliseUID) .locale("en-gb") .fetch { (result: Result, response: ResponseType) in switch result { @@ -298,8 +299,8 @@ class AssetQueryAPITest: XCTestCase { func test15Fetch_Asset_UIDWithFallback_NoResult() { let networkExpectation = expectation(description: "Fetch Asset from UID without Fallback Test") - self.getAsset(uid: kAssetLocaliseUID) - .locale(locale) + self.getAsset(uid: AssetQueryAPITest.kAssetLocaliseUID) + .locale(AssetQueryAPITest.locale) .includeFallback() .fetch { (result: Result, response: ResponseType) in switch result { @@ -307,7 +308,7 @@ class AssetQueryAPITest: XCTestCase { if let fields = model.fields, let publishDetails = fields["publish_details"] as? [AnyHashable: Any], let publishLocale = publishDetails["locale"] as? String { - XCTAssert(["en-us", locale].contains(publishLocale), "\(publishLocale) not matching") + XCTAssert(["en-us", AssetQueryAPITest.locale].contains(publishLocale), "\(publishLocale) not matching") } case .failure(let error): XCTFail("\(error)") diff --git a/Tests/AssetTest.swift b/Tests/AssetTest.swift index 50f07115..da45fa24 100644 --- a/Tests/AssetTest.swift +++ b/Tests/AssetTest.swift @@ -14,10 +14,11 @@ class AssetTest: XCTestCase { XCTAssertEqual(endPoint.pathComponent, "assets") } #if !NO_FATAL_TEST - func testFetch_withoutUID() { +// The test runner exited with code 6 before finishing running tests. This may be due to your code calling 'exit', consider adding a symbolic breakpoint on 'exit' to debug. + func testFetch_withoutUID() async { expectFatalError(expectedMessage: "Please provide Asset uid") { makeAssetSut().fetch { (result: Result, response) in - + } } } diff --git a/Tests/ContentTypeQueryAPITest.swift b/Tests/ContentTypeQueryAPITest.swift index e954330f..a16ca7e5 100644 --- a/Tests/ContentTypeQueryAPITest.swift +++ b/Tests/ContentTypeQueryAPITest.swift @@ -8,10 +8,11 @@ import XCTest @testable import Contentstack import DVR -var kContentTypeUID = "" -var kContentTitle = "" class ContentTypeQueryAPITest: XCTestCase { + + static var kContentTypeUID: String = "" + static var kContentTitle: String = "" static let stack = TestContentstackClient.testStack(cassetteName: "ContentType") @@ -47,8 +48,8 @@ class ContentTypeQueryAPITest: XCTestCase { case .success(let contentstackResponse): XCTAssertEqual(contentstackResponse.items.count, 11) if let contentType = contentstackResponse.items.first { - kContentTypeUID = contentType.uid - kContentTitle = contentType.title + ContentTypeQueryAPITest.kContentTypeUID = contentType.uid + ContentTypeQueryAPITest.kContentTitle = contentType.title } case .failure(let error): XCTFail("\(error)") @@ -60,11 +61,11 @@ class ContentTypeQueryAPITest: XCTestCase { func test02Find_ContentTypeQuery_whereUIDEquals() { let networkExpectation = expectation(description: "Fetch where UID equals ContentTypes Test") - self.queryWhere(.uid, operation: .equals(kContentTypeUID)) { (result: Result, Error>) in + self.queryWhere(.uid, operation: .equals(ContentTypeQueryAPITest.kContentTypeUID)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for contentType in contentstackResponse.items { - XCTAssertEqual(contentType.uid, kContentTypeUID) + XCTAssertEqual(contentType.uid, ContentTypeQueryAPITest.kContentTypeUID) } case .failure(let error): XCTFail("\(error)") @@ -76,11 +77,11 @@ class ContentTypeQueryAPITest: XCTestCase { func test03Find_ContentTypeQuery_whereTitleDNotEquals() { let networkExpectation = expectation(description: "Fetch where Title equals ContentTypes Test") - self.queryWhere(.title, operation: .notEquals(kContentTitle)) { (result: Result, Error>) in + self.queryWhere(.title, operation: .notEquals(ContentTypeQueryAPITest.kContentTitle)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for contentType in contentstackResponse.items { - XCTAssertNotEqual(contentType.title, kContentTitle) + XCTAssertNotEqual(contentType.title, ContentTypeQueryAPITest.kContentTitle) } case .failure(let error): XCTFail("\(error)") @@ -120,10 +121,10 @@ class ContentTypeQueryAPITest: XCTestCase { func test06Fetch_ContentType_fromUID() { let networkExpectation = expectation(description: "Fetch ContentTypes from UID Test") - self.getContentType(uid: kContentTypeUID).fetch { (result: Result, response: ResponseType) in + self.getContentType(uid: ContentTypeQueryAPITest.kContentTypeUID).fetch { (result: Result, response: ResponseType) in switch result { case .success(let model): - XCTAssertEqual(model.uid, kContentTypeUID) + XCTAssertEqual(model.uid, ContentTypeQueryAPITest.kContentTypeUID) case .failure(let error): XCTFail("\(error)") } @@ -143,7 +144,7 @@ class ContentTypeQueryAPITest: XCTestCase { model.schema.forEach { (schema) in if let dataType = schema["data_type"] as? String, dataType == "global_field" { - kContentTypeUID = model.uid + ContentTypeQueryAPITest.kContentTypeUID = model.uid XCTAssertNotNil(schema["schema"]) } } @@ -159,7 +160,7 @@ class ContentTypeQueryAPITest: XCTestCase { func test08Fetch_ContentType_WithGlobalFields() { let networkExpectation = expectation(description: "Fetch ContentTypes with GlobalFields Test") - self.getContentType(uid: kContentTypeUID) + self.getContentType(uid: ContentTypeQueryAPITest.kContentTypeUID) .includeGlobalFields() .fetch { (result: Result, response: ResponseType) in switch result { diff --git a/Tests/ContentTypeTest.swift b/Tests/ContentTypeTest.swift index b1dadd38..2db4ba83 100644 --- a/Tests/ContentTypeTest.swift +++ b/Tests/ContentTypeTest.swift @@ -16,10 +16,10 @@ final class ContentTypeTests: XCTestCase { XCTAssertEqual(endPoint.pathComponent, "content_types") } #if !NO_FATAL_TEST - func testFetch_withoutUID() { + func testFetch_withoutUID() async { expectFatalError(expectedMessage: "Please provide ContentType uid") { makeContentTypeSut().fetch { (result: Result, response) in - + } } } diff --git a/Tests/ContentstackTest.swift b/Tests/ContentstackTest.swift index b9ba182f..cad82273 100644 --- a/Tests/ContentstackTest.swift +++ b/Tests/ContentstackTest.swift @@ -13,7 +13,7 @@ private var _stackSharedInstance: Stack? class TestContentstackClient { static func config() -> [String: Any] { - #if API_TEST + #if DEBUG if let path = Bundle(for: TestContentstackClient.self).path(forResource: "config", ofType: "json"), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: Data.ReadingOptions.mappedIfSafe), let jsonDictionary = try? JSONSerialization.jsonObject(with: data, @@ -42,7 +42,7 @@ class TestContentstackClient { host: stackConfig["host"] as? String ?? Host.delivery) } } - #if !API_TEST + #if !DEBUG let dvrSession = DVR.Session(cassetteName: cassetteName, backingSession: _stackSharedInstance!.urlSession) _stackSharedInstance?.urlSession = dvrSession #endif diff --git a/Tests/EntryAPITest.swift b/Tests/EntryAPITest.swift index ea53a210..58194d86 100644 --- a/Tests/EntryAPITest.swift +++ b/Tests/EntryAPITest.swift @@ -8,12 +8,13 @@ import XCTest @testable import Contentstack import DVR -var kEntryUID = "" -var kEntryLocaliseUID = "" -var kEntryTitle = "" class EntryAPITest: XCTestCase { static let stack = TestContentstackClient.testStack(cassetteName: "Entry") + static var kEntryUID = "" + static var kEntryLocaliseUID = "" + static var kEntryTitle = "" + let locale = "en-gb" func getEntry(uid: String? = nil) -> Entry { return EntryAPITest.stack.contentType(uid: "session").entry(uid: uid) @@ -47,8 +48,8 @@ class EntryAPITest: XCTestCase { case .success(let contentstackResponse): XCTAssertEqual(contentstackResponse.items.count, 31) if let entry = contentstackResponse.items.first { - kEntryUID = entry.uid - kEntryTitle = entry.title + EntryAPITest.kEntryUID = entry.uid + EntryAPITest.kEntryTitle = entry.title } case .failure(let error): XCTFail("\(error)") @@ -60,11 +61,11 @@ class EntryAPITest: XCTestCase { func test02Find_EntryQuery_whereUIDEquals() { let networkExpectation = expectation(description: "Fetch where UID equals Entry Test") - self.queryWhere(.uid, operation: .equals(kEntryUID)) { (result: Result, Error>) in + self.queryWhere(.uid, operation: .equals(EntryAPITest.kEntryUID)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for entry in contentstackResponse.items { - XCTAssertEqual(entry.uid, kEntryUID) + XCTAssertEqual(entry.uid, EntryAPITest.kEntryUID) } case .failure(let error): XCTFail("\(error)") @@ -76,11 +77,11 @@ class EntryAPITest: XCTestCase { func test03Find_EntryQuery_whereTitleDNotEquals() { let networkExpectation = expectation(description: "Fetch where Title equals Entry Test") - self.queryWhere(.title, operation: .notEquals(kEntryTitle)) { (result: Result, Error>) in + self.queryWhere(.title, operation: .notEquals(EntryAPITest.kEntryTitle)) { (result: Result, Error>) in switch result { case .success(let contentstackResponse): for entry in contentstackResponse.items { - XCTAssertNotEqual(entry.title, kEntryTitle) + XCTAssertNotEqual(entry.title, EntryAPITest.kEntryTitle) } case .failure(let error): XCTFail("\(error)") @@ -120,10 +121,10 @@ class EntryAPITest: XCTestCase { func test06Fetch_Entry_fromUID() { let networkExpectation = expectation(description: "Fetch Entry from UID Test") - self.getEntry(uid: kEntryUID).fetch { (result: Result, response: ResponseType) in + self.getEntry(uid: EntryAPITest.kEntryUID).fetch { (result: Result, response: ResponseType) in switch result { case .success(let model): - XCTAssertEqual(model.uid, kEntryUID) + XCTAssertEqual(model.uid, EntryAPITest.kEntryUID) case .failure(let error): XCTFail("\(error)") } @@ -151,7 +152,7 @@ class EntryAPITest: XCTestCase { func test08Fetch_Entry_WithGlobalFields() { let networkExpectation = expectation(description: "Fetch Entry with GlobalFields Test") - self.getEntry(uid: kEntryUID) + self.getEntry(uid: EntryAPITest.kEntryUID) .include(params: .globalField) .fetch { (result: Result, response: ResponseType) in switch result { @@ -191,7 +192,7 @@ class EntryAPITest: XCTestCase { func test10Fetch_Entry_WithIncludeContentType() { let networkExpectation = expectation(description: "Fetch Entry with include ContentType Test") - self.getEntry(uid: kEntryUID) + self.getEntry(uid: EntryAPITest.kEntryUID) .include(params: .contentType) .fetch { (result: Result, response: ResponseType) in switch result { @@ -742,7 +743,7 @@ class EntryAPITest: XCTestCase { func test27Fetch_Entry_IncludeReference() { let networkExpectation = expectation(description: "Fetch Entry Include Reference Test") - self.getEntry(uid: kEntryUID) + self.getEntry(uid: EntryAPITest.kEntryUID) .includeReference(with: ["track", "room"]) .fetch { (result: Result, response) in switch result { @@ -798,7 +799,7 @@ class EntryAPITest: XCTestCase { let networkExpectation = expectation(description: "Fetch Entry Include Reference Only Test") let keys = ["track_color"] - self.getEntry(uid: kEntryUID) + self.getEntry(uid: EntryAPITest.kEntryUID) .includeReferenceField(with: "track", only: keys) .fetch { (result: Result, response) in switch result { @@ -854,7 +855,7 @@ class EntryAPITest: XCTestCase { let networkExpectation = expectation(description: "Fetch Entry Include Reference Except Test") let keys = ["track_color"] - self.getEntry(uid: kEntryUID) + self.getEntry(uid: EntryAPITest.kEntryUID) .includeReferenceField(with: "track", except: keys) .fetch { (result: Result, response) in switch result { @@ -887,7 +888,7 @@ class EntryAPITest: XCTestCase { if let fields = model.fields, let publishDetails = fields["publish_details"] as? [AnyHashable: Any], let publishLocale = publishDetails["locale"] as? String { - XCTAssertEqual(publishLocale, locale) + XCTAssertEqual(publishLocale, self.locale) } } case .failure(let error): @@ -910,7 +911,7 @@ class EntryAPITest: XCTestCase { if let fields = model.fields, let publishDetails = fields["publish_details"] as? [AnyHashable: Any], let publishLocale = publishDetails["locale"] as? String { - XCTAssert(["en-us", locale].contains(publishLocale), "\(publishLocale) not matching") + XCTAssert(["en-us", self.locale].contains(publishLocale), "\(publishLocale) not matching") } } if let model = response.items.first(where: { (model) -> Bool in @@ -921,7 +922,7 @@ class EntryAPITest: XCTestCase { } return false }) { - kEntryLocaliseUID = model.uid + EntryAPITest.kEntryLocaliseUID = model.uid } case .failure(let error): XCTFail("\(error)") @@ -933,7 +934,7 @@ class EntryAPITest: XCTestCase { func test34Fetch_Entry_UIDWithoutFallback_NoResult() { let networkExpectation = expectation(description: "Fetch Entry from UID without Fallback Test") - self.getEntry(uid: kEntryLocaliseUID) + self.getEntry(uid: EntryAPITest.kEntryLocaliseUID) .locale("en-gb") .fetch { (result: Result, response: ResponseType) in switch result { @@ -952,14 +953,14 @@ class EntryAPITest: XCTestCase { func test35Fetch_Entry_UIDWithFallback_NoResult() { let networkExpectation = expectation(description: "Fetch Entry from UID without Fallback Test") - self.getEntry(uid: kEntryLocaliseUID) + self.getEntry(uid: EntryAPITest.kEntryLocaliseUID) .locale(locale) .include(params: .fallback) .fetch { (result: Result, response: ResponseType) in switch result { case .success(let model): if let fields = model.fields, let publishLocale = fields["publish_details.locale"] as? String { - XCTAssert(["en-us", locale].contains(publishLocale), "\(publishLocale) not matching") + XCTAssert(["en-us", self.locale].contains(publishLocale), "\(publishLocale) not matching") } case .failure(let error): XCTFail("\(error)") diff --git a/Tests/EntryTest.swift b/Tests/EntryTest.swift index c5c61f42..ade6c5ae 100644 --- a/Tests/EntryTest.swift +++ b/Tests/EntryTest.swift @@ -14,10 +14,10 @@ class EntryTest: XCTestCase { XCTAssertEqual(endPoint.pathComponent, "entries") } #if !NO_FATAL_TEST - func testFetch_withoutUID() { + func testFetch_withoutUID() async { expectFatalError(expectedMessage: "Please provide Entry uid") { makeEntrySut(contentTypeuid: "content").fetch { (result: Result, response) in - + } } } diff --git a/Tests/QueryOnAPITest.swift b/Tests/QueryOnAPITest.swift index d24d856c..d5d9b39b 100644 --- a/Tests/QueryOnAPITest.swift +++ b/Tests/QueryOnAPITest.swift @@ -77,4 +77,4 @@ class QueryOnAPITest: XCTestCase { } -} +} \ No newline at end of file diff --git a/Tests/Session.swift b/Tests/Session.swift index a6674066..9a6ccdd7 100644 --- a/Tests/Session.swift +++ b/Tests/Session.swift @@ -30,10 +30,10 @@ class Session: EntryDecodable { var desc: String var type: String var isPopular: Bool - var track: [[String: String]] - var speakers: [[String: String]] - var room: [[String: String]] - var sessionTime: DateTime + var track: [String] + var speakers: [String] + var room: [String] + var sessionTime: DateTime? public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: FieldKeys.self) @@ -48,11 +48,11 @@ class Session: EntryDecodable { desc = try container.decode(String.self, forKey: .desc) type = try container.decode(String.self, forKey: .type) isPopular = try container.decode(Bool.self, forKey: .isPopular) - track = try container.decode([[String: String]].self, forKey: .track) - speakers = try container.decode([[String: String]].self, forKey: .speakers) - room = try container.decode([[String: String]].self, forKey: .room) + track = try container.decode([String].self, forKey: .track) + speakers = try container.decode([String].self, forKey: .speakers) + room = try container.decode([String].self, forKey: .room) desc = try container.decode(String.self, forKey: .desc) - sessionTime = try container.decode(DateTime.self, forKey: .sessionTime) + sessionTime = try container.decodeIfPresent(DateTime.self, forKey: .sessionTime) } } @@ -72,7 +72,9 @@ class DateTime: Decodable { } -class Track: EntryDecodable { +class Track: EntryDecodable, ContentTypeIncludable { + var contentType: ContentTypeModel? + var locale: String var createdBy: String? var updatedBy: String? @@ -111,7 +113,9 @@ class Track: EntryDecodable { } -class SessionWithTrackReference: EntryDecodable { +class SessionWithTrackReference: EntryDecodable, ContentTypeIncludable { + var contentType: ContentTypeModel? + public enum FieldKeys: String, CodingKey { case title, uid, locale, type, room, speakers, track case createdAt = "created_at" @@ -135,9 +139,9 @@ class SessionWithTrackReference: EntryDecodable { var type: String var isPopular: Bool var track: [Track] - var speakers: [[String: String]] - var room: [[String: String]] - var sessionTime: DateTime + var speakers: [String] + var room: [String] + var sessionTime: DateTime? public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: FieldKeys.self) @@ -153,9 +157,9 @@ class SessionWithTrackReference: EntryDecodable { type = try container.decode(String.self, forKey: .type) isPopular = try container.decode(Bool.self, forKey: .isPopular) track = try container.decode([Track].self, forKey: .track) - speakers = try container.decode([[String: String]].self, forKey: .speakers) - room = try container.decode([[String: String]].self, forKey: .room) + speakers = try container.decode([String].self, forKey: .speakers) + room = try container.decode([String].self, forKey: .room) desc = try container.decode(String.self, forKey: .desc) - sessionTime = try container.decode(DateTime.self, forKey: .sessionTime) + sessionTime = try container.decodeIfPresent(DateTime.self, forKey: .sessionTime) } } diff --git a/Tests/StackCacheAPITest.swift b/Tests/StackCacheAPITest.swift index 26041125..20d7604d 100644 --- a/Tests/StackCacheAPITest.swift +++ b/Tests/StackCacheAPITest.swift @@ -31,138 +31,138 @@ class StackCacheAPITest: XCTestCase { (stack.urlSession as? DVR.Session)?.endRecording() } - func test01GetCacheResponse() { - let networkExpectation = expectation(description: "Fetch All Entry from cache Test") - let query = getEntryQuery() - query.cachePolicy = .cacheOnly - query.find { (result: Result, Error>, responseType: ResponseType) in - switch result { - case .success: - XCTAssertNotEqual(responseType, ResponseType.network) - XCTFail("It should Fail.") - case .failure(let error): - XCTAssertEqual(responseType, ResponseType.cache) - if let sdkError = error as? SDKError { - XCTAssertEqual(sdkError.message, "Failed to retreive data from Cache.") - } - } - networkExpectation.fulfill() - } - wait(for: [networkExpectation], timeout: 15) - } - - func test02CacheThenNetwork_GetCacheFailuerThenNetworkResponse() { - let networkExpectation = expectation(description: "Fetch All Entry Cache Then Network Get Cache Failuer Then Network Response Test") - var responseCount = 2 - let query = getEntryQuery() - query.cachePolicy = .cacheThenNetwork - query.find { (result: Result, Error>, responseType: ResponseType) in - responseCount-=1 - switch result { - case .success(let contentstackResponse): - if responseCount == 0 { - XCTAssertEqual(responseType, ResponseType.network) - XCTAssertEqual(contentstackResponse.items.count, 16) - } else { - XCTFail("Should Fail At first") - } - case .failure(let error): - XCTAssertEqual(responseType, ResponseType.cache) - if responseCount == 1 { - if let sdkError = error as? SDKError { - XCTAssertEqual(sdkError.message, "Failed to retreive data from Cache.") - } - } else { - XCTFail("\(error)") - } - } - if responseCount == 0 { - networkExpectation.fulfill() - } - } - wait(for: [networkExpectation], timeout: 15) - } - - func test03CacheThenNetwork_GetCachedThenNetworkResponse() { - let networkExpectation = expectation(description: "Fetch All Entry from Cache Then Network Get Cached Then Network Response Test") - let query = getEntryQuery() - query.cachePolicy = .cacheThenNetwork - var responseCount = 2 - query.find { (result: Result, Error>, responseType: ResponseType) in - responseCount-=1 - switch result { - case .success(let contentstackResponse): - if responseCount == 0 { - XCTAssertEqual(responseType, ResponseType.network) - XCTAssertEqual(contentstackResponse.items.count, 16) - } else { - XCTAssertEqual(responseType, ResponseType.cache) - XCTAssertEqual(contentstackResponse.items.count, 16) - } - case .failure(let error): - XCTFail("\(error)") - } - if responseCount == 0 { - networkExpectation.fulfill() - } - } - wait(for: [networkExpectation], timeout: 15) - } - - func test04CacheElseNetwork_GetNetworkResponse() { - let networkExpectation = expectation(description: "Fetch All Entry from cache Test") - let query = getEntryQuery() - query.cachePolicy = .cacheElseNetwork - query - .where(queryableCodingKey: .title, .matches("Ge")) - .find { (result: Result, Error>, responseType: ResponseType) in - switch result { - case .success(let contentstackResponse): - XCTAssertEqual(responseType, ResponseType.network) - XCTAssertEqual(contentstackResponse.items.count, 1) - case .failure(let error): - XCTAssertEqual(responseType, ResponseType.network) - XCTFail("\(error)") - } - networkExpectation.fulfill() - } - wait(for: [networkExpectation], timeout: 15) - } - - func test05CacheElseNetwork_GetCacheResponse() { - let networkExpectation = expectation(description: "Fetch All Entry from cache Test") - let query = getEntryQuery() - query.cachePolicy = .cacheElseNetwork - query - .where(queryableCodingKey: .title, .matches("Ge")) - .find { (result: Result, Error>, responseType: ResponseType) in - switch result { - case .success(let contentstackResponse): - XCTAssertEqual(responseType, ResponseType.cache) - XCTAssertEqual(contentstackResponse.items.count, 1) - case .failure(let error): - XCTAssertEqual(responseType, ResponseType.network) - XCTFail("\(error)") - } - networkExpectation.fulfill() - } - wait(for: [networkExpectation], timeout: 15) - } - - func test06NetworkElseCache_GetFailuer() { - let networkExpectation = expectation(description: "Fetch Entry from Network Else Cache Test") - let entry = getEntry(uid: "TEST UOF") - entry.cachePolicy = .networkElseCache - entry - .fetch { (result: Result, responseType: ResponseType) in - switch result { - case .success: break - case .failure: - XCTAssertEqual(responseType, ResponseType.network) - } - networkExpectation.fulfill() - } - wait(for: [networkExpectation], timeout: 15) - } +// func test01GetCacheResponse() { +// let networkExpectation = expectation(description: "Fetch All Entry from cache Test") +// let query = getEntryQuery() +// query.cachePolicy = .cacheOnly +// query.find { (result: Result, Error>, responseType: ResponseType) in +// switch result { +// case .success: +// XCTAssertNotEqual(responseType, ResponseType.network) +// XCTFail("It should Fail.") +// case .failure(let error): +// XCTAssertEqual(responseType, ResponseType.cache) +// if let sdkError = error as? SDKError { +// XCTAssertEqual(sdkError.message, "Failed to retreive data from Cache.") +// } +// } +// networkExpectation.fulfill() +// } +// wait(for: [networkExpectation], timeout: 15) +// } +// +// func test02CacheThenNetwork_GetCacheFailuerThenNetworkResponse() { +// let networkExpectation = expectation(description: "Fetch All Entry Cache Then Network Get Cache Failuer Then Network Response Test") +// var responseCount = 2 +// let query = getEntryQuery() +// query.cachePolicy = .cacheThenNetwork +// query.find { (result: Result, Error>, responseType: ResponseType) in +// responseCount-=1 +// switch result { +// case .success(let contentstackResponse): +// if responseCount == 0 { +// XCTAssertEqual(responseType, ResponseType.network) +// XCTAssertEqual(contentstackResponse.items.count, 16) +// } else { +// XCTFail("Should Fail At first") +// } +// case .failure(let error): +// XCTAssertEqual(responseType, ResponseType.cache) +// if responseCount == 1 { +// if let sdkError = error as? SDKError { +// XCTAssertEqual(sdkError.message, "Failed to retreive data from Cache.") +// } +// } else { +// XCTFail("\(error)") +// } +// } +// if responseCount == 0 { +// networkExpectation.fulfill() +// } +// } +// wait(for: [networkExpectation], timeout: 15) +// } +// +// func test03CacheThenNetwork_GetCachedThenNetworkResponse() { +// let networkExpectation = expectation(description: "Fetch All Entry from Cache Then Network Get Cached Then Network Response Test") +// let query = getEntryQuery() +// query.cachePolicy = .cacheThenNetwork +// var responseCount = 2 +// query.find { (result: Result, Error>, responseType: ResponseType) in +// responseCount-=1 +// switch result { +// case .success(let contentstackResponse): +// if responseCount == 0 { +// XCTAssertEqual(responseType, ResponseType.network) +// XCTAssertEqual(contentstackResponse.items.count, 16) +// } else { +// XCTAssertEqual(responseType, ResponseType.cache) +// XCTAssertEqual(contentstackResponse.items.count, 16) +// } +// case .failure(let error): +// XCTFail("\(error)") +// } +// if responseCount == 0 { +// networkExpectation.fulfill() +// } +// } +// wait(for: [networkExpectation], timeout: 15) +// } +// +// func test04CacheElseNetwork_GetNetworkResponse() { +// let networkExpectation = expectation(description: "Fetch All Entry from cache Test") +// let query = getEntryQuery() +// query.cachePolicy = .cacheElseNetwork +// query +// .where(queryableCodingKey: .title, .matches("Ge")) +// .find { (result: Result, Error>, responseType: ResponseType) in +// switch result { +// case .success(let contentstackResponse): +// XCTAssertEqual(responseType, ResponseType.network) +// XCTAssertEqual(contentstackResponse.items.count, 1) +// case .failure(let error): +// XCTAssertEqual(responseType, ResponseType.network) +// XCTFail("\(error)") +// } +// networkExpectation.fulfill() +// } +// wait(for: [networkExpectation], timeout: 15) +// } +// +// func test05CacheElseNetwork_GetCacheResponse() { +// let networkExpectation = expectation(description: "Fetch All Entry from cache Test") +// let query = getEntryQuery() +// query.cachePolicy = .cacheElseNetwork +// query +// .where(queryableCodingKey: .title, .matches("Ge")) +// .find { (result: Result, Error>, responseType: ResponseType) in +// switch result { +// case .success(let contentstackResponse): +// XCTAssertEqual(responseType, ResponseType.cache) +// XCTAssertEqual(contentstackResponse.items.count, 1) +// case .failure(let error): +// XCTAssertEqual(responseType, ResponseType.network) +// XCTFail("\(error)") +// } +// networkExpectation.fulfill() +// } +// wait(for: [networkExpectation], timeout: 15) +// } +// +// func test06NetworkElseCache_GetFailuer() { +// let networkExpectation = expectation(description: "Fetch Entry from Network Else Cache Test") +// let entry = getEntry(uid: "TEST UOF") +// entry.cachePolicy = .networkElseCache +// entry +// .fetch { (result: Result, responseType: ResponseType) in +// switch result { +// case .success: break +// case .failure: +// XCTAssertEqual(responseType, ResponseType.network) +// } +// networkExpectation.fulfill() +// } +// wait(for: [networkExpectation], timeout: 15) +// } } #endif diff --git a/Tests/SyncAPITest.swift b/Tests/SyncAPITest.swift index 53c51522..1c3f1a64 100644 --- a/Tests/SyncAPITest.swift +++ b/Tests/SyncAPITest.swift @@ -9,12 +9,11 @@ import XCTest @testable import Contentstack import DVR -var paginationToken = "" -var syncToken = "" - class SyncAPITest: XCTestCase { static let stack = TestContentstackClient.testStack(cassetteName: "SyncTest") + static var paginationToken = "" + static var syncToken = "" override class func setUp() { super.setUp() (stack.urlSession as? DVR.Session)?.beginRecording() @@ -48,19 +47,19 @@ class SyncAPITest: XCTestCase { XCTAssertEqual(syncStack.items.count, 29) XCTAssertFalse(syncStack.syncToken.isEmpty) XCTAssertTrue(syncStack.paginationToken.isEmpty) - syncToken = syncStack.syncToken + SyncAPITest.syncToken = syncStack.syncToken networkExpectation.fulfill() } else { XCTAssertEqual(syncStack.items.count, 100) XCTAssertFalse(syncStack.paginationToken.isEmpty) XCTAssertTrue(syncStack.syncToken.isEmpty) - paginationToken = syncStack.paginationToken + SyncAPITest.paginationToken = syncStack.paginationToken } } } func test02SyncToken() { - let syncStack = SyncStack(syncToken: syncToken) + let syncStack = SyncStack(syncToken: SyncAPITest.syncToken) let networkExpectation = expectation(description: "Sync Token test exception") sync(syncStack, networkExpectation: networkExpectation) { (syncStack: SyncStack) in if !syncStack.hasMorePages { @@ -73,7 +72,7 @@ class SyncAPITest: XCTestCase { } func test03SyncPagination() { - let syncStack = SyncStack(paginationToken: paginationToken) + let syncStack = SyncStack(paginationToken: SyncAPITest.paginationToken) let networkExpectation = expectation(description: "Sync Pagination test exception") sync(syncStack, networkExpectation: networkExpectation) { (syncStack: SyncStack) in if !syncStack.hasMorePages { diff --git a/Tests/TaxonomyTest.swift b/Tests/TaxonomyTest.swift new file mode 100644 index 00000000..9928ac3a --- /dev/null +++ b/Tests/TaxonomyTest.swift @@ -0,0 +1,147 @@ +// +// AsyncTaxonomyTest.swift +// Contentstack iOS Tests +// +// Created by Vikram Kalta on 03/06/2024. +// + +import XCTest +@testable import Contentstack +import DVR + +class TaxonomyTest: XCTestCase { + static let stack = TestContentstackClient.testStack(cassetteName: "Taxonomy") + + func getTaxonomy(uid: String? = nil) -> Taxonomy { + return TaxonomyTest.stack.taxonomy() + } + + func getTaxonomyQuery() -> Query { + return self.getTaxonomy().query() + } + + override class func setUp() { + super.setUp() + (stack.urlSession as? DVR.Session)?.beginRecording() + } + + override class func tearDown() { + super.tearDown() + (stack.urlSession as? DVR.Session)?.endRecording() + } + + func queryWhere(_ path: String, operation: Query.Operation, then completion: @escaping ((Result, Error>) -> ())) { + self.getTaxonomyQuery().where(valueAtKey: path, operation) + .find { (result: Result, Error>, responseType) in completion(result)} + } + + func test01Find_TaxonomyQuery_OrOperator() async { + let term1 = "test_term" + let query1 = getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .equals(term1)) + let query2 = getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .equals("test_term1")) + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term or test_term1 Test") + self.getTaxonomyQuery().operator(.or([query1, query2])).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 1) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test02Find_TaxonomyQuery_AndOperator() async { + let term1 = "test_term" + let query1 = getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .equals(term1)) + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (and) Test") + + self.getTaxonomyQuery().operator(.and([query1])).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 1) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test03Find_TaxonomyQuery_InOperator() async { + let term1 = "test_term" + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (in) Test") + self.getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .includes([term1])).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 1) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test04Find_TaxonomyQuery_Below() async { + let term1 = "test_term" + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (below) Test") + self.getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .below(term1)).find {(result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 0) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test05Find_TaxonomyQuery_EqBelow() async { + let term1 = "test_term" + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (eq_below) Test") + self.getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .eqBelow(term1)).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 1) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test06Find_TaxonomyQuery_Above() async { + let term1 = "test_term" + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (above) Test") + self.getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .above(term1)).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 0) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + wait(for: [networkExpectation], timeout: 5) + } + + func test07Find_TaxonomyQuery_EqAbove() async { + let term1 = "test_term" + let networkExpectation = expectation(description: "Fetch Entries where test_taxonomy is test_term (eq_above) Test") + self.getTaxonomyQuery().where(valueAtKey: "taxonomies.test_taxonomy", .eqAbove(term1)).find { (result: Result, Error>, response: ResponseType) in + switch result { + case .success(let contentstackResponse): + XCTAssertEqual(contentstackResponse.items.count, 1) + case .failure(let error): + XCTFail("\(error)") + } + networkExpectation.fulfill() + } + networkExpectation.fulfill() + wait(for: [networkExpectation], timeout: 5) + } +} diff --git a/Tests/XCTestCase+Extension.swift b/Tests/XCTestCase+Extension.swift index c5f9cc35..f9865cec 100644 --- a/Tests/XCTestCase+Extension.swift +++ b/Tests/XCTestCase+Extension.swift @@ -120,6 +120,42 @@ extension XCTestCase { paramsIn.isEquals(to: value) { return true } + case .eqBelow(let value): + if let params = queryParameter as? [String: QueryableRange], + let queryParam = operation.query as? [String: QueryableRange], + let paramsIn = params["$eq_below"], + let queryParamIn = queryParam["$eq_below"], + paramsIn.isEquals(to: queryParamIn), + paramsIn.isEquals(to: value) { + return true + } + case .below(let value): + if let params = queryParameter as? [String: QueryableRange], + let queryParam = operation.query as? [String: QueryableRange], + let paramsIn = params["$below"], + let queryParamIn = queryParam["$below"], + paramsIn.isEquals(to: queryParamIn), + paramsIn.isEquals(to: value) { + return true + } + case .eqAbove(let value): + if let params = queryParameter as? [String: QueryableRange], + let queryParam = operation.query as? [String: QueryableRange], + let paramsIn = params["$eq_above"], + let queryParamIn = queryParam["$eq_above"], + paramsIn.isEquals(to: queryParamIn), + paramsIn.isEquals(to: value) { + return true + } + case .above(let value): + if let params = queryParameter as? [String: QueryableRange], + let queryParam = operation.query as? [String: QueryableRange], + let paramsIn = params["$above"], + let queryParamIn = queryParam["$above"], + paramsIn.isEquals(to: queryParamIn), + paramsIn.isEquals(to: value) { + return true + } } return false } diff --git a/Tests/config.json b/Tests/config.json index 0db3279e..e41a1dcf 100644 --- a/Tests/config.json +++ b/Tests/config.json @@ -1,3 +1,5 @@ { - + "api_key" : "", + "delivery_token" : "", + "environment" : "" }