From af213ebbc2459bec8c234192e6ac5629e09aaf98 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:15:05 +1200 Subject: [PATCH 01/13] Delete WordPressData Xcode targets --- WordPress/WordPress.xcodeproj/project.pbxproj | 561 +----------------- .../xcshareddata/xcschemes/WordPress.xcscheme | 11 - .../xcschemes/WordPressData.xcscheme | 72 --- 3 files changed, 3 insertions(+), 641 deletions(-) delete mode 100644 WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPressData.xcscheme diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index ccc9e0f7a4a2..31675bdb599b 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -31,12 +31,9 @@ 0107E14D28FE9DB200DE87DB /* AppImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433840C622C2BA5B00CB13F8 /* AppImages.xcassets */; }; 0107E15928FEB10E00DE87DB /* JetpackIntents.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 0107E15428FE9DB200DE87DB /* JetpackIntents.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 099D768327D14B8E00F77EDE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 099D768127D14B8E00F77EDE /* InfoPlist.strings */; }; - 0C128FEA2D9ECE6200C69EBA /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; 0C235BD22C3862D400D0E163 /* XcodeTarget_WordPressTests in Frameworks */ = {isa = PBXBuildFile; productRef = 0C235BD12C3862D400D0E163 /* XcodeTarget_WordPressTests */; }; 0C28A01C2DAD7CFD00F81F20 /* XcodeTarget_App in Frameworks */ = {isa = PBXBuildFile; productRef = 0C28A01B2DAD7CFD00F81F20 /* XcodeTarget_App */; }; 0C28A0222DAD7EF600F81F20 /* XcodeTarget_Keystone in Frameworks */ = {isa = PBXBuildFile; productRef = 0C28A0212DAD7EF600F81F20 /* XcodeTarget_Keystone */; }; - 0C28C6392DAD830F00F81F20 /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 0C28C63A2DAD830F00F81F20 /* WordPressData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 0C4CE8492C2F418000B9EEAC /* AppImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433840C622C2BA5B00CB13F8 /* AppImages.xcassets */; }; 0C5A8A742D9B22F100C25301 /* Gutenberg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3902D2C4BA3008ACD86 /* Gutenberg.xcframework */; }; 0C5A8A752D9B22F100C25301 /* Gutenberg.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3902D2C4BA3008ACD86 /* Gutenberg.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -73,8 +70,6 @@ 0CCA995E2DAD76E00048F0A9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E1D91454134A853D0089019C /* Localizable.strings */; }; 0CECA92B2E043CEC00F4EE83 /* XcodeTarget_App in Frameworks */ = {isa = PBXBuildFile; productRef = 0CECA92A2E043CEC00F4EE83 /* XcodeTarget_App */; }; 0CECA92D2E043D0200F4EE83 /* XcodeTarget_App in Frameworks */ = {isa = PBXBuildFile; productRef = 0CECA92C2E043D0200F4EE83 /* XcodeTarget_App */; }; - 0CECA92E2E043D2800F4EE83 /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 0CECA92F2E043D2800F4EE83 /* WordPressData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 0CECA9332E043D3700F4EE83 /* WordPressAuthenticator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4AD953B42C21451700D0EEFA /* WordPressAuthenticator.framework */; }; 0CECA9342E043D3700F4EE83 /* WordPressAuthenticator.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4AD953B42C21451700D0EEFA /* WordPressAuthenticator.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 0CED2AD92D95BB46003015CF /* Gutenberg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3902D2C4BA3008ACD86 /* Gutenberg.xcframework */; }; @@ -91,11 +86,6 @@ 24E55D4F2CC9A5CD008D071D /* ImagePlayground.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E55D4D2CC9A5C8008D071D /* ImagePlayground.framework */; }; 296890780FE971DC00770264 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 296890770FE971DC00770264 /* Security.framework */; }; 374CB16215B93C0800DD0EBC /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 374CB16115B93C0800DD0EBC /* AudioToolbox.framework */; }; - 3F0F25A62D9BDB5800CD05D6 /* XcodeTarget_WordPressData in Frameworks */ = {isa = PBXBuildFile; productRef = 3F0F25A52D9BDB5800CD05D6 /* XcodeTarget_WordPressData */; }; - 3F0FD9FC2D9B92F700CD05D6 /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 3F0FD9FD2D9B92F700CD05D6 /* WordPressData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 3F0FDA002D9B930100CD05D6 /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 3F0FDA012D9B930100CD05D6 /* WordPressData.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3F1A64F62DA7A4B300786B92 /* Secrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24351253264DCA08009BB2B6 /* Secrets.swift */; }; 3F1AFCC22DA3AAEA00786B92 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F1AFCC12DA3AAE900786B92 /* WebKit.framework */; }; 3F46AAFE25BF5D6300CE2E98 /* Sites.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 3F46AB0225BF5D6300CE2E98 /* Sites.intentdefinition */; settings = {ATTRIBUTES = (codegen, ); }; }; @@ -119,9 +109,6 @@ 3F60D39B2D2C4BA4008ACD86 /* hermes.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3922D2C4BA3008ACD86 /* hermes.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 3F60D39C2D2C4BA4008ACD86 /* yoga.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3932D2C4BA4008ACD86 /* yoga.xcframework */; }; 3F60D39D2D2C4BA4008ACD86 /* yoga.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3F60D3932D2C4BA4008ACD86 /* yoga.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 3F7874622DA360840052F1BF /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 3F7AE0BD2D9B30A200AB4892 /* WordPressData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; }; - 3F7AE0E12D9B30A200AB4892 /* XcodeTarget_WordPressDataTests in Frameworks */ = {isa = PBXBuildFile; productRef = 3F7AE0E02D9B30A200AB4892 /* XcodeTarget_WordPressDataTests */; }; 433840C722C2BA5B00CB13F8 /* AppImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433840C622C2BA5B00CB13F8 /* AppImages.xcassets */; }; 433840C822C2BA6300CB13F8 /* AppImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433840C622C2BA5B00CB13F8 /* AppImages.xcassets */; }; 433840C922C2BA6400CB13F8 /* AppImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433840C622C2BA5B00CB13F8 /* AppImages.xcassets */; }; @@ -266,20 +253,6 @@ remoteGlobalIDString = 0107E13828FE9DB200DE87DB; remoteInfo = JetpackIntents; }; - 0C128FEC2D9ECE6200C69EBA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; - 0C28C63B2DAD830F00F81F20 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; 0C3313C42E0439A9000C3760 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -301,13 +274,6 @@ remoteGlobalIDString = 4AD953B32C21451700D0EEFA; remoteInfo = WordPressAuthenticator; }; - 0CECA9302E043D2800F4EE83 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; 0CECA9352E043D3700F4EE83 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -322,27 +288,6 @@ remoteGlobalIDString = 4AD953B32C21451700D0EEFA; remoteInfo = WordPressAuthenticator; }; - 3F0FD9FE2D9B92F700CD05D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; - 3F0FDA022D9B930100CD05D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; - 3F7AE0BE2D9B30A200AB4892 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3F7AE0B42D9B30A100AB4892; - remoteInfo = WordPressData; - }; 3FCFFAFD2994A949002840C9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -483,7 +428,6 @@ 0C5A8A772D9B22F100C25301 /* hermes.xcframework in Embed Frameworks */, 0C5A8A852D9B22F100C25301 /* yoga.xcframework in Embed Frameworks */, 0C5A8A7D2D9B22F100C25301 /* React.xcframework in Embed Frameworks */, - 0C28C63A2DAD830F00F81F20 /* WordPressData.framework in Embed Frameworks */, 0C5A8A7F2D9B22F100C25301 /* RNTAztecView.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -576,7 +520,6 @@ dstSubfolderSpec = 10; files = ( 0CECA9342E043D3700F4EE83 /* WordPressAuthenticator.framework in Embed Frameworks */, - 0CECA92F2E043D2800F4EE83 /* WordPressData.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -602,7 +545,6 @@ 3F60D3992D2C4BA4008ACD86 /* RNTAztecView.xcframework in Embed Frameworks */, 4AD953C82C21451700D0EEFA /* WordPressAuthenticator.framework in Embed Frameworks */, 3F60D3952D2C4BA4008ACD86 /* React.xcframework in Embed Frameworks */, - 3F0FD9FD2D9B92F700CD05D6 /* WordPressData.framework in Embed Frameworks */, 3F60D39B2D2C4BA4008ACD86 /* hermes.xcframework in Embed Frameworks */, 3F60D39D2D2C4BA4008ACD86 /* yoga.xcframework in Embed Frameworks */, ); @@ -619,7 +561,6 @@ 3F608F822D2D1A9E008ACD86 /* hermes.xcframework in Embed Frameworks */, 3F608F802D2D1A9E008ACD86 /* Gutenberg.xcframework in Embed Frameworks */, 3F608F842D2D1A9E008ACD86 /* React.xcframework in Embed Frameworks */, - 3F0FDA012D9B930100CD05D6 /* WordPressData.framework in Embed Frameworks */, 3F608F862D2D1A9E008ACD86 /* RNTAztecView.xcframework in Embed Frameworks */, 3F608F882D2D1A9E008ACD86 /* yoga.xcframework in Embed Frameworks */, ); @@ -769,8 +710,6 @@ 3F60D3912D2C4BA3008ACD86 /* RNTAztecView.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = RNTAztecView.xcframework; path = Frameworks/RNTAztecView.xcframework; sourceTree = ""; }; 3F60D3922D2C4BA3008ACD86 /* hermes.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = hermes.xcframework; path = Frameworks/hermes.xcframework; sourceTree = ""; }; 3F60D3932D2C4BA4008ACD86 /* yoga.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = yoga.xcframework; path = Frameworks/yoga.xcframework; sourceTree = ""; }; - 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WordPressData.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3F7AE0BC2D9B30A200AB4892 /* WordPressDataTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WordPressDataTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3F9DD3F62CC214BF00DF1760 /* Common.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.debug.xcconfig; sourceTree = ""; }; 3F9DD3F72CC2188400DF1760 /* Common.alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.alpha.xcconfig; sourceTree = ""; }; 3FA640652670CEFE0064401E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; @@ -1232,16 +1171,7 @@ path = Classes; sourceTree = ""; }; - 3F7AE0B62D9B30A100AB4892 /* WordPressData */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = WordPressData; - sourceTree = ""; - }; - 3F7AE0C22D9B30A200AB4892 /* WordPressDataTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = WordPressDataTests; - sourceTree = ""; - }; + 4A8280FE2E5FE9B60037E180 /* WordPressKitTests */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( @@ -1275,7 +1205,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0CECA92E2E043D2800F4EE83 /* WordPressData.framework in Frameworks */, 0CECA92B2E043CEC00F4EE83 /* XcodeTarget_App in Frameworks */, 0CECA9332E043D3700F4EE83 /* WordPressAuthenticator.framework in Frameworks */, ); @@ -1300,7 +1229,6 @@ 0C5A8A762D9B22F100C25301 /* hermes.xcframework in Frameworks */, 0C5A8A842D9B22F100C25301 /* yoga.xcframework in Frameworks */, 0C5A8A7C2D9B22F100C25301 /* React.xcframework in Frameworks */, - 0C28C6392DAD830F00F81F20 /* WordPressData.framework in Frameworks */, 0C5A8A7E2D9B22F100C25301 /* RNTAztecView.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1315,7 +1243,6 @@ 0CED2AE52D95BB46003015CF /* yoga.xcframework in Frameworks */, 3F1AFCC22DA3AAEA00786B92 /* WebKit.framework in Frameworks */, 0CED2ADD2D95BB46003015CF /* React.xcframework in Frameworks */, - 0C128FEA2D9ECE6200C69EBA /* WordPressData.framework in Frameworks */, 0CED2ADF2D95BB46003015CF /* RNTAztecView.xcframework in Frameworks */, 0C28A0222DAD7EF600F81F20 /* XcodeTarget_Keystone in Frameworks */, ); @@ -1347,7 +1274,6 @@ E10B3652158F2D3F00419A93 /* QuartzCore.framework in Frameworks */, 3F60D3942D2C4BA4008ACD86 /* React.xcframework in Frameworks */, 3F60D3982D2C4BA4008ACD86 /* RNTAztecView.xcframework in Frameworks */, - 3F0FD9FC2D9B92F700CD05D6 /* WordPressData.framework in Frameworks */, E1A386CB14DB063800954CF8 /* MediaPlayer.framework in Frameworks */, E1A386CA14DB05F700954CF8 /* CoreMedia.framework in Frameworks */, 3F60D3962D2C4BA4008ACD86 /* Gutenberg.xcframework in Frameworks */, @@ -1366,23 +1292,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3F7AE0B22D9B30A100AB4892 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3F0F25A62D9BDB5800CD05D6 /* XcodeTarget_WordPressData in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3F7AE0B92D9B30A200AB4892 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3F7AE0BD2D9B30A200AB4892 /* WordPressData.framework in Frameworks */, - 3F7AE0E12D9B30A200AB4892 /* XcodeTarget_WordPressDataTests in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 4A8280FA2E5FE9B60037E180 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1468,7 +1377,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3F7874622DA360840052F1BF /* WordPressData.framework in Frameworks */, 0C235BD22C3862D400D0E163 /* XcodeTarget_WordPressTests in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1504,7 +1412,6 @@ FABB26322602FC2C00C8785C /* Security.framework in Frameworks */, FABB26332602FC2C00C8785C /* MapKit.framework in Frameworks */, FABB26342602FC2C00C8785C /* CoreLocation.framework in Frameworks */, - 3F0FDA002D9B930100CD05D6 /* WordPressData.framework in Frameworks */, 0C6AC61C2C364A6600BF7600 /* XcodeTarget_App in Frameworks */, FABB26362602FC2C00C8785C /* CoreData.framework in Frameworks */, FABB26372602FC2C00C8785C /* CFNetwork.framework in Frameworks */, @@ -1544,7 +1451,7 @@ 0C73A9BD2DAEDFDE00CC0F3A /* KeystoneTests */, 0C3313C62E0439A9000C3760 /* MiniatureTests */, 0C5A1A042D9B080900C25301 /* WordPressAuthenticatorTests */, - 3F7AE0C22D9B30A200AB4892 /* WordPressDataTests */, + 4A8280FE2E5FE9B60037E180 /* WordPressKitTests */, ); name = Tests; @@ -1560,7 +1467,7 @@ 0C5C46FE2D98397A00F2CD55 /* Keystone */, 0C3313B82E0439A8000C3760 /* Miniature */, 0C238F782D9ADF0200981631 /* WordPressAuthenticator */, - 3F7AE0B62D9B30A100AB4892 /* WordPressData */, + 0C3E79892DB164B3000C7072 /* JetpackStatsWidgets */, ); name = Sources; @@ -1587,8 +1494,6 @@ 4AD953BB2C21451700D0EEFA /* WordPressAuthenticatorTests.xctest */, 0CED01702D95B897003015CF /* WordPress.framework */, 0C5A3F8C2D9B1E3700C25301 /* Reader.app */, - 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */, - 3F7AE0BC2D9B30A200AB4892 /* WordPressDataTests.xctest */, 0C3313B72E0439A8000C3760 /* Miniature.app */, 0C3313C32E0439A9000C3760 /* MiniatureTests.xctest */, 4A8280FD2E5FE9B60037E180 /* WordPressKitTests.xctest */, @@ -1955,13 +1860,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3F7AE0B02D9B30A100AB4892 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 4AD953AF2C21451700D0EEFA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2031,7 +1929,6 @@ buildRules = ( ); dependencies = ( - 0CECA9312E043D2800F4EE83 /* PBXTargetDependency */, 0CECA9362E043D3700F4EE83 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( @@ -2084,7 +1981,6 @@ dependencies = ( 0C5A8A7B2D9B22F100C25301 /* PBXTargetDependency */, 0C5A8A832D9B22F100C25301 /* PBXTargetDependency */, - 0C28C63C2DAD830F00F81F20 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 0C5A3FAB2D9B1EF400C25301 /* Reader */, @@ -2112,7 +2008,6 @@ ); dependencies = ( 0CED2AE42D95BB46003015CF /* PBXTargetDependency */, - 0C128FED2D9ECE6200C69EBA /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 0C5C46FE2D98397A00F2CD55 /* Keystone */, @@ -2148,7 +2043,6 @@ 7457667B202B558C00F42E40 /* PBXTargetDependency */, 7358E6BE210BD318002323EB /* PBXTargetDependency */, 4AD953C62C21451700D0EEFA /* PBXTargetDependency */, - 3F0FD9FF2D9B92F700CD05D6 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 0C3C98902DA04EF9009F3BFB /* WordPress */, @@ -2164,54 +2058,6 @@ productReference = 1D6058910D05DD3D006BFB54 /* WordPress.app */; productType = "com.apple.product-type.application"; }; - 3F7AE0B42D9B30A100AB4892 /* WordPressData */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3F7AE0D12D9B30A200AB4892 /* Build configuration list for PBXNativeTarget "WordPressData" */; - buildPhases = ( - 3F7AE0B02D9B30A100AB4892 /* Headers */, - 3F7AE0B12D9B30A100AB4892 /* Sources */, - 3F7AE0B22D9B30A100AB4892 /* Frameworks */, - 3F7AE0B32D9B30A100AB4892 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 3F7AE0B62D9B30A100AB4892 /* WordPressData */, - ); - name = WordPressData; - packageProductDependencies = ( - 3F0F25A52D9BDB5800CD05D6 /* XcodeTarget_WordPressData */, - ); - productName = WordPressData; - productReference = 3F7AE0B52D9B30A100AB4892 /* WordPressData.framework */; - productType = "com.apple.product-type.framework"; - }; - 3F7AE0BB2D9B30A200AB4892 /* WordPressDataTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 3F7AE0D22D9B30A200AB4892 /* Build configuration list for PBXNativeTarget "WordPressDataTests" */; - buildPhases = ( - 3F7AE0B82D9B30A200AB4892 /* Sources */, - 3F7AE0B92D9B30A200AB4892 /* Frameworks */, - 3F7AE0BA2D9B30A200AB4892 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3F7AE0BF2D9B30A200AB4892 /* PBXTargetDependency */, - ); - fileSystemSynchronizedGroups = ( - 3F7AE0C22D9B30A200AB4892 /* WordPressDataTests */, - ); - name = WordPressDataTests; - packageProductDependencies = ( - 3F7AE0E02D9B30A200AB4892 /* XcodeTarget_WordPressDataTests */, - ); - productName = WordPressDataTests; - productReference = 3F7AE0BC2D9B30A200AB4892 /* WordPressDataTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 4A8280FC2E5FE9B60037E180 /* WordPressKitTests */ = { isa = PBXNativeTarget; buildConfigurationList = 4A8281062E5FE9B70037E180 /* Build configuration list for PBXNativeTarget "WordPressKitTests" */; @@ -2497,7 +2343,6 @@ 8096219028E55F8600940A5D /* PBXTargetDependency */, 80F6D05F28EE88FC00953C1A /* PBXTargetDependency */, 4AD9555D2C21716A00D0EEFA /* PBXTargetDependency */, - 3F0FDA032D9B930100CD05D6 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 0C3C988F2DA04EEF009F3BFB /* Jetpack */, @@ -2575,13 +2420,6 @@ }; }; }; - 3F7AE0B42D9B30A100AB4892 = { - CreatedOnToolsVersion = 16.2; - LastSwiftMigration = 1620; - }; - 3F7AE0BB2D9B30A200AB4892 = { - CreatedOnToolsVersion = 16.2; - }; 4A8280FC2E5FE9B60037E180 = { CreatedOnToolsVersion = 16.4; TestTargetID = 1D6058900D05DD3D006BFB54; @@ -2716,8 +2554,6 @@ 4AD953B32C21451700D0EEFA /* WordPressAuthenticator */, 4AD953BA2C21451700D0EEFA /* WordPressAuthenticatorTests */, 0CED016F2D95B897003015CF /* Keystone */, - 3F7AE0B42D9B30A100AB4892 /* WordPressData */, - 3F7AE0BB2D9B30A200AB4892 /* WordPressDataTests */, 0C3313B62E0439A8000C3760 /* Miniature */, 0C3313C22E0439A9000C3760 /* MiniatureTests */, 4A8280FC2E5FE9B60037E180 /* WordPressKitTests */, @@ -2790,20 +2626,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3F7AE0B32D9B30A100AB4892 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3F7AE0BA2D9B30A200AB4892 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 4A8280FB2E5FE9B60037E180 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -3341,20 +3163,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3F7AE0B12D9B30A100AB4892 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3F7AE0B82D9B30A200AB4892 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 4A8280F92E5FE9B60037E180 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3487,16 +3295,6 @@ target = 0107E13828FE9DB200DE87DB /* JetpackIntents */; targetProxy = 0107E15628FEA03800DE87DB /* PBXContainerItemProxy */; }; - 0C128FED2D9ECE6200C69EBA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 0C128FEC2D9ECE6200C69EBA /* PBXContainerItemProxy */; - }; - 0C28C63C2DAD830F00F81F20 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 0C28C63B2DAD830F00F81F20 /* PBXContainerItemProxy */; - }; 0C3313C52E0439A9000C3760 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 0C3313B62E0439A8000C3760 /* Miniature */; @@ -3512,11 +3310,6 @@ target = 4AD953B32C21451700D0EEFA /* WordPressAuthenticator */; targetProxy = 0C5A8A822D9B22F100C25301 /* PBXContainerItemProxy */; }; - 0CECA9312E043D2800F4EE83 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 0CECA9302E043D2800F4EE83 /* PBXContainerItemProxy */; - }; 0CECA9362E043D3700F4EE83 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 4AD953B32C21451700D0EEFA /* WordPressAuthenticator */; @@ -3527,21 +3320,6 @@ target = 4AD953B32C21451700D0EEFA /* WordPressAuthenticator */; targetProxy = 0CED2AE32D95BB46003015CF /* PBXContainerItemProxy */; }; - 3F0FD9FF2D9B92F700CD05D6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 3F0FD9FE2D9B92F700CD05D6 /* PBXContainerItemProxy */; - }; - 3F0FDA032D9B930100CD05D6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 3F0FDA022D9B930100CD05D6 /* PBXContainerItemProxy */; - }; - 3F7AE0BF2D9B30A200AB4892 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 3F7AE0B42D9B30A100AB4892 /* WordPressData */; - targetProxy = 3F7AE0BE2D9B30A200AB4892 /* PBXContainerItemProxy */; - }; 3FCFFAFE2994A949002840C9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = FFA8E22A1F94E3DE0002170F /* SwiftLint */; @@ -4756,311 +4534,6 @@ }; name = Release; }; - 3F7AE0CA2D9B30A200AB4892 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3F9DD3F62CC214BF00DF1760 /* Common.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(BUILT_PRODUCTS_DIR)/$(PRODUCT_NAME).framework/Headers", - ); - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 WordPress. All rights reserved."; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressData; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WARNING_CFLAGS = ( - "$(inherited)", - "-Wno-quoted-include-in-framework-header", - ); - }; - name = Debug; - }; - 3F7AE0CB2D9B30A200AB4892 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C96AC202D92FC17000779B8 /* Common.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(BUILT_PRODUCTS_DIR)/$(PRODUCT_NAME).framework/Headers", - ); - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 WordPress. All rights reserved."; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressData; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WARNING_CFLAGS = ( - "$(inherited)", - "-Wno-quoted-include-in-framework-header", - ); - }; - name = Release; - }; - 3F7AE0CC2D9B30A200AB4892 /* Release-Alpha */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3F9DD3F72CC2188400DF1760 /* Common.alpha.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = ""; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_TREAT_WARNINGS_AS_ERRORS = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(BUILT_PRODUCTS_DIR)/$(PRODUCT_NAME).framework/Headers", - ); - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 WordPress. All rights reserved."; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressData; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WARNING_CFLAGS = ( - "$(inherited)", - "-Wno-quoted-include-in-framework-header", - ); - }; - name = "Release-Alpha"; - }; - 3F7AE0CD2D9B30A200AB4892 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3F9DD3F62CC214BF00DF1760 /* Common.debug.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressDataTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 3F7AE0CE2D9B30A200AB4892 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0C96AC202D92FC17000779B8 /* Common.release.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "Apple Distribution: Automattic, Inc. (PZYM8XX95Q)"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressDataTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 3F7AE0CF2D9B30A200AB4892 /* Release-Alpha */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3F9DD3F72CC2188400DF1760 /* Common.alpha.xcconfig */; - buildSettings = { - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_IDENTITY = "iPhone Distribution: Automattic, Inc."; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GENERATE_INFOPLIST_FILE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 1.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.automattic.WordPressDataTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Release-Alpha"; - }; 4A8281032E5FE9B60037E180 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F14B5F70208E648200439554 /* WordPress.debug.xcconfig */; @@ -7127,26 +6600,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3F7AE0D12D9B30A200AB4892 /* Build configuration list for PBXNativeTarget "WordPressData" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3F7AE0CA2D9B30A200AB4892 /* Debug */, - 3F7AE0CB2D9B30A200AB4892 /* Release */, - 3F7AE0CC2D9B30A200AB4892 /* Release-Alpha */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 3F7AE0D22D9B30A200AB4892 /* Build configuration list for PBXNativeTarget "WordPressDataTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3F7AE0CD2D9B30A200AB4892 /* Debug */, - 3F7AE0CE2D9B30A200AB4892 /* Release */, - 3F7AE0CF2D9B30A200AB4892 /* Release-Alpha */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 4A8281062E5FE9B70037E180 /* Build configuration list for PBXNativeTarget "WordPressKitTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -7376,14 +6829,6 @@ isa = XCSwiftPackageProductDependency; productName = XcodeTarget_WordPressAuthentificatorTests; }; - 3F0F25A52D9BDB5800CD05D6 /* XcodeTarget_WordPressData */ = { - isa = XCSwiftPackageProductDependency; - productName = XcodeTarget_WordPressData; - }; - 3F7AE0E02D9B30A200AB4892 /* XcodeTarget_WordPressDataTests */ = { - isa = XCSwiftPackageProductDependency; - productName = XcodeTarget_WordPressDataTests; - }; 4A8284AF2E5FECB00037E180 /* XcodeTarget_WordPressKitTests */ = { isa = XCSwiftPackageProductDependency; productName = XcodeTarget_WordPressKitTests; diff --git a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPress.xcscheme b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPress.xcscheme index a6b1da6f3212..ee464817952a 100644 --- a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPress.xcscheme +++ b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPress.xcscheme @@ -76,17 +76,6 @@ ReferencedContainer = "container:WordPress.xcodeproj"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From ffbdf1359e04e49c227da5c6263b3b0ab3613643 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:18:55 +1200 Subject: [PATCH 02/13] Move WordPressData sources and tests into Modules --- .../WordPressData/Blog+Extensions.swift | 0 .../Mapping/ReaderPost+Mapping.swift | 0 .../WordPress.xcdatamodeld/.xccurrentversion | 0 .../WordPress 100.xcdatamodel/contents | 0 .../WordPress 101.xcdatamodel/contents | 0 .../WordPress 102.xcdatamodel/contents | 0 .../WordPress 103.xcdatamodel/contents | 0 .../WordPress 104.xcdatamodel/contents | 0 .../WordPress 105.xcdatamodel/contents | 0 .../WordPress 106.xcdatamodel/contents | 0 .../WordPress 107.xcdatamodel/contents | 0 .../WordPress 108.xcdatamodel/contents | 0 .../WordPress 109.xcdatamodel/contents | 0 .../WordPress 110.xcdatamodel/contents | 0 .../WordPress 111.xcdatamodel/contents | 0 .../WordPress 112.xcdatamodel/contents | 0 .../WordPress 113.xcdatamodel/contents | 0 .../WordPress 114.xcdatamodel/contents | 0 .../WordPress 115.xcdatamodel/contents | 0 .../WordPress 116.xcdatamodel/contents | 0 .../WordPress 117.xcdatamodel/contents | 0 .../WordPress 118.xcdatamodel/contents | 0 .../WordPress 119.xcdatamodel/contents | 0 .../WordPress 120.xcdatamodel/contents | 0 .../WordPress 121.xcdatamodel/contents | 0 .../WordPress 122.xcdatamodel/contents | 0 .../WordPress 123.xcdatamodel/contents | 0 .../WordPress 124.xcdatamodel/contents | 0 .../WordPress 125.xcdatamodel/contents | 0 .../WordPress 126.xcdatamodel/contents | 0 .../WordPress 127.xcdatamodel/contents | 0 .../WordPress 128.xcdatamodel/contents | 0 .../WordPress 129.xcdatamodel/contents | 0 .../WordPress 130.xcdatamodel/contents | 0 .../WordPress 131.xcdatamodel/contents | 0 .../WordPress 132.xcdatamodel/contents | 0 .../WordPress 133.xcdatamodel/contents | 0 .../WordPress 134.xcdatamodel/contents | 0 .../WordPress 135.xcdatamodel/contents | 0 .../WordPress 136.xcdatamodel/contents | 0 .../WordPress 137.xcdatamodel/contents | 0 .../WordPress 138.xcdatamodel/contents | 0 .../WordPress 139.xcdatamodel/contents | 0 .../WordPress 140.xcdatamodel/contents | 0 .../WordPress 141.xcdatamodel/contents | 0 .../WordPress 142.xcdatamodel/contents | 0 .../WordPress 143.xcdatamodel/contents | 0 .../WordPress 144.xcdatamodel/contents | 0 .../WordPress 145.xcdatamodel/contents | 0 .../WordPress 146.xcdatamodel/contents | 0 .../WordPress 147.xcdatamodel/contents | 0 .../WordPress 148.xcdatamodel/contents | 0 .../WordPress 149.xcdatamodel/contents | 0 .../WordPress 150.xcdatamodel/contents | 0 .../WordPress 151.xcdatamodel/contents | 0 .../WordPress 152.xcdatamodel/contents | 0 .../WordPress 153.xcdatamodel/contents | 0 .../WordPress 154.xcdatamodel/contents | 0 .../WordPress 155.xcdatamodel/contents | 0 .../WordPress 156.xcdatamodel/contents | 0 .../WordPress 157.xcdatamodel/contents | 0 .../WordPress 158.xcdatamodel/contents | 0 .../Swift/AbstractPost+Autosave.swift | 0 .../Swift/AbstractPost+Blaze.swift | 0 .../AbstractPost+CoreDataProperties.swift | 0 .../Swift/AbstractPost+Local.swift | 0 .../Swift/AbstractPost+Searchable.swift | 0 .../AbstractPost+fixLocalMediaURLs.swift | 0 .../WordPressData/Swift/AbstractPost.swift | 0 .../WordPressData/Swift/AppEnvironment.swift | 0 .../WordPressData/Swift/Array+Page.swift | 0 .../Swift/AuthKeyMigration.swift | 0 .../Swift/BasePost+CoreDataProperties.swift | 0 .../Swift/BasePost+PostContentProvider.swift | 0 .../WordPressData/Swift/BasePost.swift | 0 ...ckEditorSettingElement+CoreDataClass.swift | 0 ...torSettingElement+CoreDataProperties.swift | 0 .../BlockEditorSettings+CoreDataClass.swift | 0 ...ockEditorSettings+CoreDataProperties.swift | 0 .../WordPressData/Swift/BlockedAuthor.swift | 0 .../WordPressData/Swift/BlockedSite.swift | 0 .../Swift/Blog+BlogAuthors.swift | 0 .../Swift/Blog+Capabilities.swift | 0 .../WordPressData/Swift/Blog+Creation.swift | 0 .../WordPressData/Swift/Blog+Features.swift | 0 .../Swift/Blog+HomepageSettings.swift | 0 .../WordPressData/Swift/Blog+Jetpack.swift | 0 .../WordPressData/Swift/Blog+Lookup.swift | 0 .../WordPressData/Swift/Blog+Options.swift | 0 .../WordPressData/Swift/Blog+Plans.swift | 0 .../WordPressData/Swift/Blog+Post.swift | 0 .../WordPressData/Swift/Blog+Quota.swift | 0 .../WordPressData/Swift/Blog+SelfHosted.swift | 0 .../WordPressData/Swift/Blog+Swift.swift | 0 .../Swift/Blog+WordPressComRestAPI.swift | 0 .../Sources}/WordPressData/Swift/Blog.swift | 0 .../WordPressData/Swift/BlogAuthor.swift | 0 .../WordPressData/Swift/BlogQuery.swift | 0 .../WordPressData/Swift/BlogSettings.swift | 0 .../Swift/BloggingPrompt+CoreDataClass.swift | 0 .../BloggingPrompt+CoreDataProperties.swift | 0 .../Swift/BloggingPromptRemoteObject.swift | 0 ...BloggingPromptSettings+CoreDataClass.swift | 0 ...ingPromptSettings+CoreDataProperties.swift | 0 ...ptSettingsReminderDays+CoreDataClass.swift | 0 ...tingsReminderDays+CoreDataProperties.swift | 0 .../Swift/BloggingPromptsAttribution.swift | 0 .../Swift/Bundle+WordPressData.swift | 0 .../Swift/Comment+CoreDataClass.swift | 0 .../Swift/Comment+CoreDataProperties.swift | 0 .../Swift/ContextManager+ErrorHandling.swift | 0 .../WordPressData/Swift/ContextManager.swift | 0 .../WordPressData/Swift/CoreDataHelper.swift | 0 .../Swift/CoreDataIterativeMigrator.swift | 0 .../WordPressData/Swift/CoreDataStack.swift | 0 .../Swift/CoreDataStackSwift.swift | 0 .../Swift/DiffAbstractValue.swift | 0 .../Swift/DiffContentValue.swift | 0 .../WordPressData/Swift/DiffTitleValue.swift | 0 .../Sources}/WordPressData/Swift/Domain.swift | 0 .../WordPressData/Swift/GravatarProfile.swift | 0 .../Swift/InviteLinks+CoreDataClass.swift | 0 .../InviteLinks+CoreDataProperties.swift | 0 .../WordPressData/Swift/JetpackState.swift | 0 .../Swift/LikeUser+CoreDataClass.swift | 0 .../Swift/LikeUser+CoreDataProperties.swift | 0 .../LikeUserPreferredBlog+CoreDataClass.swift | 0 ...UserPreferredBlog+CoreDataProperties.swift | 0 ...edAccountSettings+CoreDataProperties.swift | 0 .../Swift/ManagedAccountSettings.swift | 0 .../ManagedPerson+CoreDataProperties.swift | 0 .../WordPressData/Swift/ManagedPerson.swift | 0 .../WordPressData/Swift/Media+Blog.swift | 0 .../Sources}/WordPressData/Swift/Media.swift | 0 .../Swift/MediaFileManager.swift | 0 .../Swift/Menu+CoreDataProperties.swift | 0 .../Sources}/WordPressData/Swift/Menu.swift | 0 .../Swift/MenuItem+CoreDataProperties.swift | 0 .../WordPressData/Swift/MenuItem.swift | 0 .../WordPressData/Swift/MenuLocation.swift | 0 .../Swift/NSManagedObject+Lookup.swift | 0 .../WordPressData/Swift/NSManagedObject.swift | 0 .../WordPressData/Swift/Notification.swift | 0 .../Swift/NullBlogPropertySanitizer.swift | 0 .../Swift/Page+CoreDataProperties.swift | 0 .../Sources}/WordPressData/Swift/Page.swift | 0 .../PageTemplateCategory+CoreDataClass.swift | 0 ...eTemplateCategory+CoreDataProperties.swift | 0 .../PageTemplateLayout+CoreDataClass.swift | 0 ...ageTemplateLayout+CoreDataProperties.swift | 0 .../Sources}/WordPressData/Swift/Plan.swift | 0 .../WordPressData/Swift/PlanFeature.swift | 0 .../WordPressData/Swift/PlanGroup.swift | 0 .../Swift/Post+CoreDataProperties.swift | 0 .../Sources}/WordPressData/Swift/Post.swift | 0 .../Swift/PostCategory+CoreDataClass.swift | 0 .../PostCategory+CoreDataProperties.swift | 0 .../Swift/PostCategory+Creation.swift | 0 .../Swift/PostCategory+Lookup.swift | 0 .../WordPressData/Swift/PostMetadata.swift | 0 .../Swift/PostMetadataContainer.swift | 0 .../Swift/PostServiceRemoteFactory.swift | 0 .../Swift/PostTag+CoreDataClass.swift | 0 .../Swift/PostTag+CoreDataProperties.swift | 0 .../Swift/PostType+CoreDataClass.swift | 0 .../Swift/PostType+CoreDataProperties.swift | 0 .../WordPressData/Swift/PostVisibility.swift | 0 .../Swift/PublicizeConnection.swift | 0 .../Swift/PublicizeInfo+CoreDataClass.swift | 0 .../PublicizeInfo+CoreDataProperties.swift | 0 .../Swift/PublicizeService.swift | 0 .../Swift/ReaderAbstractTopic+Lookup.swift | 0 .../Swift/ReaderAbstractTopic.swift | 0 .../Swift/ReaderCard+CoreDataClass.swift | 0 .../Swift/ReaderCard+CoreDataProperties.swift | 0 .../Swift/ReaderCrossPostMeta.swift | 0 .../Swift/ReaderDefaultTopic.swift | 0 .../WordPressData/Swift/ReaderGapMarker.swift | 0 .../WordPressData/Swift/ReaderListTopic.swift | 0 .../Swift/ReaderPost+CoreDataProperties.swift | 0 .../WordPressData/Swift/ReaderPost.swift | 0 .../Swift/ReaderSearchTopic.swift | 0 .../Swift/ReaderSiteInfoSubscriptions.swift | 0 .../Swift/ReaderSiteTopic+Lookup.swift | 0 .../WordPressData/Swift/ReaderSiteTopic.swift | 0 .../WordPressData/Swift/ReaderTagTopic.swift | 0 .../WordPressData/Swift/ReaderTeamTopic.swift | 0 .../WordPressData/Swift/Revision.swift | 0 .../Swift/RevisionDiff+CoreData.swift | 0 .../WordPressData/Swift/RevisionDiff.swift | 0 .../Sources}/WordPressData/Swift/Role.swift | 0 .../Swift/SearchIdentifierGenerator.swift | 0 .../Swift/SearchableActivityConvertable.swift | 0 .../Swift/SearchableItemConvertable.swift | 0 .../Swift/SharedDataIssueSolver.swift | 0 .../Swift/SharingButton+Lookup.swift | 0 .../WordPressData/Swift/SharingButton.swift | 0 .../WordPressData/Swift/SiteInformation.swift | 0 .../Swift/SiteOrganizationType.swift | 0 .../Swift/SiteSuggestion+CoreDataClass.swift | 0 .../SiteSuggestion+CoreDataProperties.swift | 0 .../WordPressData/Swift/SiteTaxonomy.swift | 0 .../SourcePostAttribution+CoreDataClass.swift | 0 ...cePostAttribution+CoreDataProperties.swift | 0 .../WordPressData/Swift/Suggestion.swift | 0 .../Swift/TaggedManagedObjectID.swift | 0 .../Swift/Theme+CoreDataProperties.swift | 0 .../WordPressData/Swift/Theme+Swift.swift | 0 .../Sources}/WordPressData/Swift/Theme.swift | 0 .../WordPressData/Swift/ThemeIdHelper.swift | 0 .../WordPressData/Swift/UserSettings.swift | 0 .../Swift/UserSuggestion+Comparable.swift | 0 .../Swift/UserSuggestion+CoreDataClass.swift | 0 .../UserSuggestion+CoreDataProperties.swift | 0 .../Swift/WPAccount+Lookup.swift | 0 .../Swift/WPAccount+RestApi.swift | 0 .../WordPressData/Swift/WPAccount.swift | 0 .../Swift/WordPressComRestApi+Defaults.swift | 0 .../Swift/WordPressOrgRestApi+WordPress.swift | 0 .../WordPressData/WordPressDataDummy.swift | 0 .../Tests}/WordPressDataTests/BlogTests.swift | 0 .../ContextManagerTests.swift | 0 .../CoreDataHelperTests.swift | 0 .../CoreDataMigrationTests.swift | 0 .../Helpers/BlogBuilder.swift | 0 .../Helpers/ContextManager+Testing.swift | 0 .../Helpers/CoreDataTestCase.swift | 0 .../Helpers/MockAuthKeyMigration.swift | 0 .../Helpers/MockKeychainService.swift | 0 .../Helpers/NSError+TestHelpers.swift | 0 .../Helpers/PostBuilder.swift | 0 .../Helpers/WPAccount+Fixture.swift | 0 .../Mapping/ReaderPostMappingTests.swift | 0 .../WordPressDataTests/MediaTests.swift | 0 .../PostMetadataContainerTests.swift | 0 .../PostMetadataTests.swift | 0 .../WordPressDataTests/ReaderPostTests.swift | 0 .../TaggedManagedObjectIDTests.swift | 0 .../WordPressDataTests/WPAccountTests.swift | 0 .../WordPressDataTests.swift | 0 .../WordPressDataTests.xctestplan | 24 ------------------- 241 files changed, 24 deletions(-) rename {Sources => Modules/Sources}/WordPressData/Blog+Extensions.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Mapping/ReaderPost+Mapping.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/.xccurrentversion (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 100.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 101.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 102.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 103.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 104.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 105.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 106.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 107.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 108.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 109.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 110.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 111.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 112.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 113.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 114.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 115.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 116.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 117.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 118.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 119.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 120.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 121.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 122.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 123.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 124.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 125.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 126.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 127.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 128.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 129.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 130.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 131.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 132.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 133.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 134.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 135.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 136.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 137.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 138.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 139.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 140.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 141.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 142.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 143.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 144.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 145.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 146.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 147.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 148.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 149.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 150.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 151.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 152.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 153.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 154.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 156.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 157.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 158.xcdatamodel/contents (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+Autosave.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+Blaze.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+Local.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+Searchable.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost+fixLocalMediaURLs.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AbstractPost.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AppEnvironment.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Array+Page.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/AuthKeyMigration.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BasePost+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BasePost+PostContentProvider.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BasePost.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockEditorSettingElement+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockEditorSettingElement+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockEditorSettings+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockEditorSettings+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockedAuthor.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlockedSite.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+BlogAuthors.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Capabilities.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Creation.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Features.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+HomepageSettings.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Jetpack.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Options.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Plans.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Post.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Quota.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+SelfHosted.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+Swift.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog+WordPressComRestAPI.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Blog.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlogAuthor.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlogQuery.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BlogSettings.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPrompt+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPrompt+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptRemoteObject.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptSettings+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptSettings+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/BloggingPromptsAttribution.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Bundle+WordPressData.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Comment+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Comment+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ContextManager+ErrorHandling.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ContextManager.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/CoreDataHelper.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/CoreDataIterativeMigrator.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/CoreDataStack.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/CoreDataStackSwift.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/DiffAbstractValue.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/DiffContentValue.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/DiffTitleValue.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Domain.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/GravatarProfile.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/InviteLinks+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/InviteLinks+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/JetpackState.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/LikeUser+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/LikeUser+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/LikeUserPreferredBlog+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/LikeUserPreferredBlog+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ManagedAccountSettings+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ManagedAccountSettings.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ManagedPerson+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ManagedPerson.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Media+Blog.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Media.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/MediaFileManager.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Menu+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Menu.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/MenuItem+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/MenuItem.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/MenuLocation.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/NSManagedObject+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/NSManagedObject.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Notification.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/NullBlogPropertySanitizer.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Page+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Page.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PageTemplateCategory+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PageTemplateCategory+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PageTemplateLayout+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PageTemplateLayout+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Plan.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PlanFeature.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PlanGroup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Post+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Post.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostCategory+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostCategory+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostCategory+Creation.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostCategory+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostMetadata.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostMetadataContainer.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostServiceRemoteFactory.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostTag+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostTag+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostType+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostType+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PostVisibility.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PublicizeConnection.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PublicizeInfo+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/PublicizeService.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderAbstractTopic+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderAbstractTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderCard+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderCard+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderCrossPostMeta.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderDefaultTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderGapMarker.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderListTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderPost+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderPost.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderSearchTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderSiteTopic+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderSiteTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderTagTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ReaderTeamTopic.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Revision.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/RevisionDiff+CoreData.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/RevisionDiff.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Role.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SearchIdentifierGenerator.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SearchableActivityConvertable.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SearchableItemConvertable.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SharedDataIssueSolver.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SharingButton+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SharingButton.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SiteInformation.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SiteOrganizationType.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SiteSuggestion+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SiteSuggestion+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SiteTaxonomy.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SourcePostAttribution+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/SourcePostAttribution+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Suggestion.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/TaggedManagedObjectID.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Theme+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Theme+Swift.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/Theme.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/ThemeIdHelper.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/UserSettings.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/UserSuggestion+Comparable.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/UserSuggestion+CoreDataClass.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/UserSuggestion+CoreDataProperties.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/WPAccount+Lookup.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/WPAccount+RestApi.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/WPAccount.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/WordPressComRestApi+Defaults.swift (100%) rename {Sources => Modules/Sources}/WordPressData/Swift/WordPressOrgRestApi+WordPress.swift (100%) rename {Sources => Modules/Sources}/WordPressData/WordPressDataDummy.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/BlogTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/ContextManagerTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/CoreDataHelperTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/CoreDataMigrationTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/BlogBuilder.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/ContextManager+Testing.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/CoreDataTestCase.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/MockAuthKeyMigration.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/MockKeychainService.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/NSError+TestHelpers.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/PostBuilder.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Helpers/WPAccount+Fixture.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/Mapping/ReaderPostMappingTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/MediaTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/PostMetadataContainerTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/PostMetadataTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/ReaderPostTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/TaggedManagedObjectIDTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/WPAccountTests.swift (100%) rename {Tests => Modules/Tests}/WordPressDataTests/WordPressDataTests.swift (100%) delete mode 100644 Tests/WordPressDataTests/WordPressDataTests.xctestplan diff --git a/Sources/WordPressData/Blog+Extensions.swift b/Modules/Sources/WordPressData/Blog+Extensions.swift similarity index 100% rename from Sources/WordPressData/Blog+Extensions.swift rename to Modules/Sources/WordPressData/Blog+Extensions.swift diff --git a/Sources/WordPressData/Mapping/ReaderPost+Mapping.swift b/Modules/Sources/WordPressData/Mapping/ReaderPost+Mapping.swift similarity index 100% rename from Sources/WordPressData/Mapping/ReaderPost+Mapping.swift rename to Modules/Sources/WordPressData/Mapping/ReaderPost+Mapping.swift diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/.xccurrentversion b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/.xccurrentversion similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/.xccurrentversion rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/.xccurrentversion diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 100.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 100.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 100.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 100.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 101.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 101.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 101.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 101.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 102.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 102.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 102.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 102.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 103.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 103.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 103.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 103.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 104.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 104.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 104.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 104.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 105.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 105.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 105.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 105.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 106.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 106.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 106.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 106.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 107.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 107.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 107.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 107.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 108.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 108.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 108.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 108.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 109.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 109.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 109.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 109.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 110.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 110.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 110.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 110.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 111.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 111.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 111.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 111.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 112.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 112.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 112.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 112.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 113.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 113.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 113.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 113.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 114.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 114.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 114.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 114.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 115.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 115.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 115.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 115.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 116.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 116.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 116.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 116.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 117.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 117.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 117.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 117.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 118.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 118.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 118.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 118.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 119.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 119.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 119.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 119.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 120.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 120.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 120.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 120.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 121.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 121.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 121.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 121.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 122.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 122.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 122.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 122.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 123.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 123.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 123.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 123.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 124.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 124.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 124.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 124.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 125.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 125.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 125.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 125.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 126.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 126.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 126.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 126.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 127.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 127.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 127.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 127.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 128.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 128.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 128.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 128.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 129.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 129.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 129.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 129.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 130.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 130.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 130.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 130.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 131.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 131.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 131.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 131.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 132.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 132.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 132.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 132.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 133.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 133.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 133.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 133.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 134.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 134.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 134.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 134.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 135.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 135.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 135.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 135.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 136.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 136.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 136.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 136.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 137.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 137.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 137.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 137.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 138.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 138.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 138.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 138.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 139.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 139.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 139.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 139.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 140.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 140.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 140.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 140.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 141.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 141.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 141.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 141.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 142.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 142.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 142.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 142.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 143.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 143.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 143.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 143.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 144.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 144.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 144.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 144.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 145.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 145.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 145.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 145.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 146.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 146.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 146.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 146.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 147.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 147.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 147.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 147.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 148.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 148.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 148.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 148.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 149.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 149.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 149.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 149.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 150.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 150.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 150.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 150.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 151.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 151.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 151.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 151.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 152.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 152.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 152.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 152.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 153.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 153.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 153.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 153.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 154.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 154.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 154.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 154.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 156.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 156.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 156.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 156.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 157.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 157.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 157.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 157.xcdatamodel/contents diff --git a/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 158.xcdatamodel/contents b/Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 158.xcdatamodel/contents similarity index 100% rename from Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 158.xcdatamodel/contents rename to Modules/Sources/WordPressData/Resources/WordPress.xcdatamodeld/WordPress 158.xcdatamodel/contents diff --git a/Sources/WordPressData/Swift/AbstractPost+Autosave.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+Autosave.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+Autosave.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+Autosave.swift diff --git a/Sources/WordPressData/Swift/AbstractPost+Blaze.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+Blaze.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+Blaze.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+Blaze.swift diff --git a/Sources/WordPressData/Swift/AbstractPost+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/AbstractPost+Local.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+Local.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+Local.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+Local.swift diff --git a/Sources/WordPressData/Swift/AbstractPost+Searchable.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+Searchable.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+Searchable.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+Searchable.swift diff --git a/Sources/WordPressData/Swift/AbstractPost+fixLocalMediaURLs.swift b/Modules/Sources/WordPressData/Swift/AbstractPost+fixLocalMediaURLs.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost+fixLocalMediaURLs.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost+fixLocalMediaURLs.swift diff --git a/Sources/WordPressData/Swift/AbstractPost.swift b/Modules/Sources/WordPressData/Swift/AbstractPost.swift similarity index 100% rename from Sources/WordPressData/Swift/AbstractPost.swift rename to Modules/Sources/WordPressData/Swift/AbstractPost.swift diff --git a/Sources/WordPressData/Swift/AppEnvironment.swift b/Modules/Sources/WordPressData/Swift/AppEnvironment.swift similarity index 100% rename from Sources/WordPressData/Swift/AppEnvironment.swift rename to Modules/Sources/WordPressData/Swift/AppEnvironment.swift diff --git a/Sources/WordPressData/Swift/Array+Page.swift b/Modules/Sources/WordPressData/Swift/Array+Page.swift similarity index 100% rename from Sources/WordPressData/Swift/Array+Page.swift rename to Modules/Sources/WordPressData/Swift/Array+Page.swift diff --git a/Sources/WordPressData/Swift/AuthKeyMigration.swift b/Modules/Sources/WordPressData/Swift/AuthKeyMigration.swift similarity index 100% rename from Sources/WordPressData/Swift/AuthKeyMigration.swift rename to Modules/Sources/WordPressData/Swift/AuthKeyMigration.swift diff --git a/Sources/WordPressData/Swift/BasePost+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BasePost+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BasePost+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BasePost+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BasePost+PostContentProvider.swift b/Modules/Sources/WordPressData/Swift/BasePost+PostContentProvider.swift similarity index 100% rename from Sources/WordPressData/Swift/BasePost+PostContentProvider.swift rename to Modules/Sources/WordPressData/Swift/BasePost+PostContentProvider.swift diff --git a/Sources/WordPressData/Swift/BasePost.swift b/Modules/Sources/WordPressData/Swift/BasePost.swift similarity index 100% rename from Sources/WordPressData/Swift/BasePost.swift rename to Modules/Sources/WordPressData/Swift/BasePost.swift diff --git a/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BlockEditorSettingElement+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockEditorSettings+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockEditorSettings+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BlockEditorSettings+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BlockedAuthor.swift b/Modules/Sources/WordPressData/Swift/BlockedAuthor.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockedAuthor.swift rename to Modules/Sources/WordPressData/Swift/BlockedAuthor.swift diff --git a/Sources/WordPressData/Swift/BlockedSite.swift b/Modules/Sources/WordPressData/Swift/BlockedSite.swift similarity index 100% rename from Sources/WordPressData/Swift/BlockedSite.swift rename to Modules/Sources/WordPressData/Swift/BlockedSite.swift diff --git a/Sources/WordPressData/Swift/Blog+BlogAuthors.swift b/Modules/Sources/WordPressData/Swift/Blog+BlogAuthors.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+BlogAuthors.swift rename to Modules/Sources/WordPressData/Swift/Blog+BlogAuthors.swift diff --git a/Sources/WordPressData/Swift/Blog+Capabilities.swift b/Modules/Sources/WordPressData/Swift/Blog+Capabilities.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Capabilities.swift rename to Modules/Sources/WordPressData/Swift/Blog+Capabilities.swift diff --git a/Sources/WordPressData/Swift/Blog+Creation.swift b/Modules/Sources/WordPressData/Swift/Blog+Creation.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Creation.swift rename to Modules/Sources/WordPressData/Swift/Blog+Creation.swift diff --git a/Sources/WordPressData/Swift/Blog+Features.swift b/Modules/Sources/WordPressData/Swift/Blog+Features.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Features.swift rename to Modules/Sources/WordPressData/Swift/Blog+Features.swift diff --git a/Sources/WordPressData/Swift/Blog+HomepageSettings.swift b/Modules/Sources/WordPressData/Swift/Blog+HomepageSettings.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+HomepageSettings.swift rename to Modules/Sources/WordPressData/Swift/Blog+HomepageSettings.swift diff --git a/Sources/WordPressData/Swift/Blog+Jetpack.swift b/Modules/Sources/WordPressData/Swift/Blog+Jetpack.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Jetpack.swift rename to Modules/Sources/WordPressData/Swift/Blog+Jetpack.swift diff --git a/Sources/WordPressData/Swift/Blog+Lookup.swift b/Modules/Sources/WordPressData/Swift/Blog+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Lookup.swift rename to Modules/Sources/WordPressData/Swift/Blog+Lookup.swift diff --git a/Sources/WordPressData/Swift/Blog+Options.swift b/Modules/Sources/WordPressData/Swift/Blog+Options.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Options.swift rename to Modules/Sources/WordPressData/Swift/Blog+Options.swift diff --git a/Sources/WordPressData/Swift/Blog+Plans.swift b/Modules/Sources/WordPressData/Swift/Blog+Plans.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Plans.swift rename to Modules/Sources/WordPressData/Swift/Blog+Plans.swift diff --git a/Sources/WordPressData/Swift/Blog+Post.swift b/Modules/Sources/WordPressData/Swift/Blog+Post.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Post.swift rename to Modules/Sources/WordPressData/Swift/Blog+Post.swift diff --git a/Sources/WordPressData/Swift/Blog+Quota.swift b/Modules/Sources/WordPressData/Swift/Blog+Quota.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Quota.swift rename to Modules/Sources/WordPressData/Swift/Blog+Quota.swift diff --git a/Sources/WordPressData/Swift/Blog+SelfHosted.swift b/Modules/Sources/WordPressData/Swift/Blog+SelfHosted.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+SelfHosted.swift rename to Modules/Sources/WordPressData/Swift/Blog+SelfHosted.swift diff --git a/Sources/WordPressData/Swift/Blog+Swift.swift b/Modules/Sources/WordPressData/Swift/Blog+Swift.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+Swift.swift rename to Modules/Sources/WordPressData/Swift/Blog+Swift.swift diff --git a/Sources/WordPressData/Swift/Blog+WordPressComRestAPI.swift b/Modules/Sources/WordPressData/Swift/Blog+WordPressComRestAPI.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog+WordPressComRestAPI.swift rename to Modules/Sources/WordPressData/Swift/Blog+WordPressComRestAPI.swift diff --git a/Sources/WordPressData/Swift/Blog.swift b/Modules/Sources/WordPressData/Swift/Blog.swift similarity index 100% rename from Sources/WordPressData/Swift/Blog.swift rename to Modules/Sources/WordPressData/Swift/Blog.swift diff --git a/Sources/WordPressData/Swift/BlogAuthor.swift b/Modules/Sources/WordPressData/Swift/BlogAuthor.swift similarity index 100% rename from Sources/WordPressData/Swift/BlogAuthor.swift rename to Modules/Sources/WordPressData/Swift/BlogAuthor.swift diff --git a/Sources/WordPressData/Swift/BlogQuery.swift b/Modules/Sources/WordPressData/Swift/BlogQuery.swift similarity index 100% rename from Sources/WordPressData/Swift/BlogQuery.swift rename to Modules/Sources/WordPressData/Swift/BlogQuery.swift diff --git a/Sources/WordPressData/Swift/BlogSettings.swift b/Modules/Sources/WordPressData/Swift/BlogSettings.swift similarity index 100% rename from Sources/WordPressData/Swift/BlogSettings.swift rename to Modules/Sources/WordPressData/Swift/BlogSettings.swift diff --git a/Sources/WordPressData/Swift/BloggingPrompt+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/BloggingPrompt+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPrompt+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/BloggingPrompt+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/BloggingPrompt+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BloggingPrompt+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPrompt+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BloggingPrompt+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptRemoteObject.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptRemoteObject.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptRemoteObject.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptRemoteObject.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptSettings+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptSettingsReminderDays+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/BloggingPromptsAttribution.swift b/Modules/Sources/WordPressData/Swift/BloggingPromptsAttribution.swift similarity index 100% rename from Sources/WordPressData/Swift/BloggingPromptsAttribution.swift rename to Modules/Sources/WordPressData/Swift/BloggingPromptsAttribution.swift diff --git a/Sources/WordPressData/Swift/Bundle+WordPressData.swift b/Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift similarity index 100% rename from Sources/WordPressData/Swift/Bundle+WordPressData.swift rename to Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift diff --git a/Sources/WordPressData/Swift/Comment+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/Comment+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/Comment+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/Comment+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/Comment+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/Comment+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/Comment+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/Comment+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ContextManager+ErrorHandling.swift b/Modules/Sources/WordPressData/Swift/ContextManager+ErrorHandling.swift similarity index 100% rename from Sources/WordPressData/Swift/ContextManager+ErrorHandling.swift rename to Modules/Sources/WordPressData/Swift/ContextManager+ErrorHandling.swift diff --git a/Sources/WordPressData/Swift/ContextManager.swift b/Modules/Sources/WordPressData/Swift/ContextManager.swift similarity index 100% rename from Sources/WordPressData/Swift/ContextManager.swift rename to Modules/Sources/WordPressData/Swift/ContextManager.swift diff --git a/Sources/WordPressData/Swift/CoreDataHelper.swift b/Modules/Sources/WordPressData/Swift/CoreDataHelper.swift similarity index 100% rename from Sources/WordPressData/Swift/CoreDataHelper.swift rename to Modules/Sources/WordPressData/Swift/CoreDataHelper.swift diff --git a/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift b/Modules/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift similarity index 100% rename from Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift rename to Modules/Sources/WordPressData/Swift/CoreDataIterativeMigrator.swift diff --git a/Sources/WordPressData/Swift/CoreDataStack.swift b/Modules/Sources/WordPressData/Swift/CoreDataStack.swift similarity index 100% rename from Sources/WordPressData/Swift/CoreDataStack.swift rename to Modules/Sources/WordPressData/Swift/CoreDataStack.swift diff --git a/Sources/WordPressData/Swift/CoreDataStackSwift.swift b/Modules/Sources/WordPressData/Swift/CoreDataStackSwift.swift similarity index 100% rename from Sources/WordPressData/Swift/CoreDataStackSwift.swift rename to Modules/Sources/WordPressData/Swift/CoreDataStackSwift.swift diff --git a/Sources/WordPressData/Swift/DiffAbstractValue.swift b/Modules/Sources/WordPressData/Swift/DiffAbstractValue.swift similarity index 100% rename from Sources/WordPressData/Swift/DiffAbstractValue.swift rename to Modules/Sources/WordPressData/Swift/DiffAbstractValue.swift diff --git a/Sources/WordPressData/Swift/DiffContentValue.swift b/Modules/Sources/WordPressData/Swift/DiffContentValue.swift similarity index 100% rename from Sources/WordPressData/Swift/DiffContentValue.swift rename to Modules/Sources/WordPressData/Swift/DiffContentValue.swift diff --git a/Sources/WordPressData/Swift/DiffTitleValue.swift b/Modules/Sources/WordPressData/Swift/DiffTitleValue.swift similarity index 100% rename from Sources/WordPressData/Swift/DiffTitleValue.swift rename to Modules/Sources/WordPressData/Swift/DiffTitleValue.swift diff --git a/Sources/WordPressData/Swift/Domain.swift b/Modules/Sources/WordPressData/Swift/Domain.swift similarity index 100% rename from Sources/WordPressData/Swift/Domain.swift rename to Modules/Sources/WordPressData/Swift/Domain.swift diff --git a/Sources/WordPressData/Swift/GravatarProfile.swift b/Modules/Sources/WordPressData/Swift/GravatarProfile.swift similarity index 100% rename from Sources/WordPressData/Swift/GravatarProfile.swift rename to Modules/Sources/WordPressData/Swift/GravatarProfile.swift diff --git a/Sources/WordPressData/Swift/InviteLinks+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/InviteLinks+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/InviteLinks+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/InviteLinks+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/InviteLinks+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/InviteLinks+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/InviteLinks+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/InviteLinks+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/JetpackState.swift b/Modules/Sources/WordPressData/Swift/JetpackState.swift similarity index 100% rename from Sources/WordPressData/Swift/JetpackState.swift rename to Modules/Sources/WordPressData/Swift/JetpackState.swift diff --git a/Sources/WordPressData/Swift/LikeUser+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/LikeUser+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/LikeUser+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/LikeUser+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/LikeUser+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/LikeUser+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/LikeUser+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/LikeUser+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/LikeUserPreferredBlog+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ManagedAccountSettings+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/ManagedAccountSettings+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/ManagedAccountSettings+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/ManagedAccountSettings+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ManagedAccountSettings.swift b/Modules/Sources/WordPressData/Swift/ManagedAccountSettings.swift similarity index 100% rename from Sources/WordPressData/Swift/ManagedAccountSettings.swift rename to Modules/Sources/WordPressData/Swift/ManagedAccountSettings.swift diff --git a/Sources/WordPressData/Swift/ManagedPerson+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/ManagedPerson+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/ManagedPerson+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/ManagedPerson+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ManagedPerson.swift b/Modules/Sources/WordPressData/Swift/ManagedPerson.swift similarity index 100% rename from Sources/WordPressData/Swift/ManagedPerson.swift rename to Modules/Sources/WordPressData/Swift/ManagedPerson.swift diff --git a/Sources/WordPressData/Swift/Media+Blog.swift b/Modules/Sources/WordPressData/Swift/Media+Blog.swift similarity index 100% rename from Sources/WordPressData/Swift/Media+Blog.swift rename to Modules/Sources/WordPressData/Swift/Media+Blog.swift diff --git a/Sources/WordPressData/Swift/Media.swift b/Modules/Sources/WordPressData/Swift/Media.swift similarity index 100% rename from Sources/WordPressData/Swift/Media.swift rename to Modules/Sources/WordPressData/Swift/Media.swift diff --git a/Sources/WordPressData/Swift/MediaFileManager.swift b/Modules/Sources/WordPressData/Swift/MediaFileManager.swift similarity index 100% rename from Sources/WordPressData/Swift/MediaFileManager.swift rename to Modules/Sources/WordPressData/Swift/MediaFileManager.swift diff --git a/Sources/WordPressData/Swift/Menu+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/Menu+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/Menu+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/Menu+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Menu.swift b/Modules/Sources/WordPressData/Swift/Menu.swift similarity index 100% rename from Sources/WordPressData/Swift/Menu.swift rename to Modules/Sources/WordPressData/Swift/Menu.swift diff --git a/Sources/WordPressData/Swift/MenuItem+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/MenuItem+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/MenuItem+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/MenuItem+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/MenuItem.swift b/Modules/Sources/WordPressData/Swift/MenuItem.swift similarity index 100% rename from Sources/WordPressData/Swift/MenuItem.swift rename to Modules/Sources/WordPressData/Swift/MenuItem.swift diff --git a/Sources/WordPressData/Swift/MenuLocation.swift b/Modules/Sources/WordPressData/Swift/MenuLocation.swift similarity index 100% rename from Sources/WordPressData/Swift/MenuLocation.swift rename to Modules/Sources/WordPressData/Swift/MenuLocation.swift diff --git a/Sources/WordPressData/Swift/NSManagedObject+Lookup.swift b/Modules/Sources/WordPressData/Swift/NSManagedObject+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/NSManagedObject+Lookup.swift rename to Modules/Sources/WordPressData/Swift/NSManagedObject+Lookup.swift diff --git a/Sources/WordPressData/Swift/NSManagedObject.swift b/Modules/Sources/WordPressData/Swift/NSManagedObject.swift similarity index 100% rename from Sources/WordPressData/Swift/NSManagedObject.swift rename to Modules/Sources/WordPressData/Swift/NSManagedObject.swift diff --git a/Sources/WordPressData/Swift/Notification.swift b/Modules/Sources/WordPressData/Swift/Notification.swift similarity index 100% rename from Sources/WordPressData/Swift/Notification.swift rename to Modules/Sources/WordPressData/Swift/Notification.swift diff --git a/Sources/WordPressData/Swift/NullBlogPropertySanitizer.swift b/Modules/Sources/WordPressData/Swift/NullBlogPropertySanitizer.swift similarity index 100% rename from Sources/WordPressData/Swift/NullBlogPropertySanitizer.swift rename to Modules/Sources/WordPressData/Swift/NullBlogPropertySanitizer.swift diff --git a/Sources/WordPressData/Swift/Page+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/Page+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/Page+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/Page+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Page.swift b/Modules/Sources/WordPressData/Swift/Page.swift similarity index 100% rename from Sources/WordPressData/Swift/Page.swift rename to Modules/Sources/WordPressData/Swift/Page.swift diff --git a/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PageTemplateCategory+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PageTemplateCategory+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PageTemplateCategory+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PageTemplateLayout+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PageTemplateLayout+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PageTemplateLayout+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Plan.swift b/Modules/Sources/WordPressData/Swift/Plan.swift similarity index 100% rename from Sources/WordPressData/Swift/Plan.swift rename to Modules/Sources/WordPressData/Swift/Plan.swift diff --git a/Sources/WordPressData/Swift/PlanFeature.swift b/Modules/Sources/WordPressData/Swift/PlanFeature.swift similarity index 100% rename from Sources/WordPressData/Swift/PlanFeature.swift rename to Modules/Sources/WordPressData/Swift/PlanFeature.swift diff --git a/Sources/WordPressData/Swift/PlanGroup.swift b/Modules/Sources/WordPressData/Swift/PlanGroup.swift similarity index 100% rename from Sources/WordPressData/Swift/PlanGroup.swift rename to Modules/Sources/WordPressData/Swift/PlanGroup.swift diff --git a/Sources/WordPressData/Swift/Post+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/Post+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/Post+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/Post+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Post.swift b/Modules/Sources/WordPressData/Swift/Post.swift similarity index 100% rename from Sources/WordPressData/Swift/Post.swift rename to Modules/Sources/WordPressData/Swift/Post.swift diff --git a/Sources/WordPressData/Swift/PostCategory+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PostCategory+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PostCategory+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PostCategory+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PostCategory+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PostCategory+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PostCategory+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PostCategory+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/PostCategory+Creation.swift b/Modules/Sources/WordPressData/Swift/PostCategory+Creation.swift similarity index 100% rename from Sources/WordPressData/Swift/PostCategory+Creation.swift rename to Modules/Sources/WordPressData/Swift/PostCategory+Creation.swift diff --git a/Sources/WordPressData/Swift/PostCategory+Lookup.swift b/Modules/Sources/WordPressData/Swift/PostCategory+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/PostCategory+Lookup.swift rename to Modules/Sources/WordPressData/Swift/PostCategory+Lookup.swift diff --git a/Sources/WordPressData/Swift/PostMetadata.swift b/Modules/Sources/WordPressData/Swift/PostMetadata.swift similarity index 100% rename from Sources/WordPressData/Swift/PostMetadata.swift rename to Modules/Sources/WordPressData/Swift/PostMetadata.swift diff --git a/Sources/WordPressData/Swift/PostMetadataContainer.swift b/Modules/Sources/WordPressData/Swift/PostMetadataContainer.swift similarity index 100% rename from Sources/WordPressData/Swift/PostMetadataContainer.swift rename to Modules/Sources/WordPressData/Swift/PostMetadataContainer.swift diff --git a/Sources/WordPressData/Swift/PostServiceRemoteFactory.swift b/Modules/Sources/WordPressData/Swift/PostServiceRemoteFactory.swift similarity index 100% rename from Sources/WordPressData/Swift/PostServiceRemoteFactory.swift rename to Modules/Sources/WordPressData/Swift/PostServiceRemoteFactory.swift diff --git a/Sources/WordPressData/Swift/PostTag+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PostTag+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PostTag+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PostTag+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PostTag+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PostTag+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PostTag+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PostTag+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/PostType+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PostType+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PostType+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PostType+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PostType+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PostType+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PostType+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PostType+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/PostVisibility.swift b/Modules/Sources/WordPressData/Swift/PostVisibility.swift similarity index 100% rename from Sources/WordPressData/Swift/PostVisibility.swift rename to Modules/Sources/WordPressData/Swift/PostVisibility.swift diff --git a/Sources/WordPressData/Swift/PublicizeConnection.swift b/Modules/Sources/WordPressData/Swift/PublicizeConnection.swift similarity index 100% rename from Sources/WordPressData/Swift/PublicizeConnection.swift rename to Modules/Sources/WordPressData/Swift/PublicizeConnection.swift diff --git a/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/PublicizeInfo+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/PublicizeInfo+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/PublicizeInfo+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/PublicizeInfo+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/PublicizeInfo+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/PublicizeService.swift b/Modules/Sources/WordPressData/Swift/PublicizeService.swift similarity index 100% rename from Sources/WordPressData/Swift/PublicizeService.swift rename to Modules/Sources/WordPressData/Swift/PublicizeService.swift diff --git a/Sources/WordPressData/Swift/ReaderAbstractTopic+Lookup.swift b/Modules/Sources/WordPressData/Swift/ReaderAbstractTopic+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderAbstractTopic+Lookup.swift rename to Modules/Sources/WordPressData/Swift/ReaderAbstractTopic+Lookup.swift diff --git a/Sources/WordPressData/Swift/ReaderAbstractTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderAbstractTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderAbstractTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderAbstractTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/ReaderCard+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/ReaderCard+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/ReaderCard+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderCard+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/ReaderCard+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift b/Modules/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderCrossPostMeta.swift rename to Modules/Sources/WordPressData/Swift/ReaderCrossPostMeta.swift diff --git a/Sources/WordPressData/Swift/ReaderDefaultTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderDefaultTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderDefaultTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderDefaultTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderGapMarker.swift b/Modules/Sources/WordPressData/Swift/ReaderGapMarker.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderGapMarker.swift rename to Modules/Sources/WordPressData/Swift/ReaderGapMarker.swift diff --git a/Sources/WordPressData/Swift/ReaderListTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderListTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderListTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderListTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderPost+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/ReaderPost+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderPost+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/ReaderPost+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/ReaderPost.swift b/Modules/Sources/WordPressData/Swift/ReaderPost.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderPost.swift rename to Modules/Sources/WordPressData/Swift/ReaderPost.swift diff --git a/Sources/WordPressData/Swift/ReaderSearchTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderSearchTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderSearchTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderSearchTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift b/Modules/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift rename to Modules/Sources/WordPressData/Swift/ReaderSiteInfoSubscriptions.swift diff --git a/Sources/WordPressData/Swift/ReaderSiteTopic+Lookup.swift b/Modules/Sources/WordPressData/Swift/ReaderSiteTopic+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderSiteTopic+Lookup.swift rename to Modules/Sources/WordPressData/Swift/ReaderSiteTopic+Lookup.swift diff --git a/Sources/WordPressData/Swift/ReaderSiteTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderSiteTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderSiteTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderSiteTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderTagTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderTagTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderTagTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderTagTopic.swift diff --git a/Sources/WordPressData/Swift/ReaderTeamTopic.swift b/Modules/Sources/WordPressData/Swift/ReaderTeamTopic.swift similarity index 100% rename from Sources/WordPressData/Swift/ReaderTeamTopic.swift rename to Modules/Sources/WordPressData/Swift/ReaderTeamTopic.swift diff --git a/Sources/WordPressData/Swift/Revision.swift b/Modules/Sources/WordPressData/Swift/Revision.swift similarity index 100% rename from Sources/WordPressData/Swift/Revision.swift rename to Modules/Sources/WordPressData/Swift/Revision.swift diff --git a/Sources/WordPressData/Swift/RevisionDiff+CoreData.swift b/Modules/Sources/WordPressData/Swift/RevisionDiff+CoreData.swift similarity index 100% rename from Sources/WordPressData/Swift/RevisionDiff+CoreData.swift rename to Modules/Sources/WordPressData/Swift/RevisionDiff+CoreData.swift diff --git a/Sources/WordPressData/Swift/RevisionDiff.swift b/Modules/Sources/WordPressData/Swift/RevisionDiff.swift similarity index 100% rename from Sources/WordPressData/Swift/RevisionDiff.swift rename to Modules/Sources/WordPressData/Swift/RevisionDiff.swift diff --git a/Sources/WordPressData/Swift/Role.swift b/Modules/Sources/WordPressData/Swift/Role.swift similarity index 100% rename from Sources/WordPressData/Swift/Role.swift rename to Modules/Sources/WordPressData/Swift/Role.swift diff --git a/Sources/WordPressData/Swift/SearchIdentifierGenerator.swift b/Modules/Sources/WordPressData/Swift/SearchIdentifierGenerator.swift similarity index 100% rename from Sources/WordPressData/Swift/SearchIdentifierGenerator.swift rename to Modules/Sources/WordPressData/Swift/SearchIdentifierGenerator.swift diff --git a/Sources/WordPressData/Swift/SearchableActivityConvertable.swift b/Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift similarity index 100% rename from Sources/WordPressData/Swift/SearchableActivityConvertable.swift rename to Modules/Sources/WordPressData/Swift/SearchableActivityConvertable.swift diff --git a/Sources/WordPressData/Swift/SearchableItemConvertable.swift b/Modules/Sources/WordPressData/Swift/SearchableItemConvertable.swift similarity index 100% rename from Sources/WordPressData/Swift/SearchableItemConvertable.swift rename to Modules/Sources/WordPressData/Swift/SearchableItemConvertable.swift diff --git a/Sources/WordPressData/Swift/SharedDataIssueSolver.swift b/Modules/Sources/WordPressData/Swift/SharedDataIssueSolver.swift similarity index 100% rename from Sources/WordPressData/Swift/SharedDataIssueSolver.swift rename to Modules/Sources/WordPressData/Swift/SharedDataIssueSolver.swift diff --git a/Sources/WordPressData/Swift/SharingButton+Lookup.swift b/Modules/Sources/WordPressData/Swift/SharingButton+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/SharingButton+Lookup.swift rename to Modules/Sources/WordPressData/Swift/SharingButton+Lookup.swift diff --git a/Sources/WordPressData/Swift/SharingButton.swift b/Modules/Sources/WordPressData/Swift/SharingButton.swift similarity index 100% rename from Sources/WordPressData/Swift/SharingButton.swift rename to Modules/Sources/WordPressData/Swift/SharingButton.swift diff --git a/Sources/WordPressData/Swift/SiteInformation.swift b/Modules/Sources/WordPressData/Swift/SiteInformation.swift similarity index 100% rename from Sources/WordPressData/Swift/SiteInformation.swift rename to Modules/Sources/WordPressData/Swift/SiteInformation.swift diff --git a/Sources/WordPressData/Swift/SiteOrganizationType.swift b/Modules/Sources/WordPressData/Swift/SiteOrganizationType.swift similarity index 100% rename from Sources/WordPressData/Swift/SiteOrganizationType.swift rename to Modules/Sources/WordPressData/Swift/SiteOrganizationType.swift diff --git a/Sources/WordPressData/Swift/SiteSuggestion+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/SiteSuggestion+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/SiteSuggestion+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/SiteSuggestion+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/SiteSuggestion+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/SiteSuggestion+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/SiteSuggestion+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/SiteSuggestion+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/SiteTaxonomy.swift b/Modules/Sources/WordPressData/Swift/SiteTaxonomy.swift similarity index 100% rename from Sources/WordPressData/Swift/SiteTaxonomy.swift rename to Modules/Sources/WordPressData/Swift/SiteTaxonomy.swift diff --git a/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/SourcePostAttribution+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/SourcePostAttribution+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/SourcePostAttribution+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Suggestion.swift b/Modules/Sources/WordPressData/Swift/Suggestion.swift similarity index 100% rename from Sources/WordPressData/Swift/Suggestion.swift rename to Modules/Sources/WordPressData/Swift/Suggestion.swift diff --git a/Sources/WordPressData/Swift/TaggedManagedObjectID.swift b/Modules/Sources/WordPressData/Swift/TaggedManagedObjectID.swift similarity index 100% rename from Sources/WordPressData/Swift/TaggedManagedObjectID.swift rename to Modules/Sources/WordPressData/Swift/TaggedManagedObjectID.swift diff --git a/Sources/WordPressData/Swift/Theme+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/Theme+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/Theme+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/Theme+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/Theme+Swift.swift b/Modules/Sources/WordPressData/Swift/Theme+Swift.swift similarity index 100% rename from Sources/WordPressData/Swift/Theme+Swift.swift rename to Modules/Sources/WordPressData/Swift/Theme+Swift.swift diff --git a/Sources/WordPressData/Swift/Theme.swift b/Modules/Sources/WordPressData/Swift/Theme.swift similarity index 100% rename from Sources/WordPressData/Swift/Theme.swift rename to Modules/Sources/WordPressData/Swift/Theme.swift diff --git a/Sources/WordPressData/Swift/ThemeIdHelper.swift b/Modules/Sources/WordPressData/Swift/ThemeIdHelper.swift similarity index 100% rename from Sources/WordPressData/Swift/ThemeIdHelper.swift rename to Modules/Sources/WordPressData/Swift/ThemeIdHelper.swift diff --git a/Sources/WordPressData/Swift/UserSettings.swift b/Modules/Sources/WordPressData/Swift/UserSettings.swift similarity index 100% rename from Sources/WordPressData/Swift/UserSettings.swift rename to Modules/Sources/WordPressData/Swift/UserSettings.swift diff --git a/Sources/WordPressData/Swift/UserSuggestion+Comparable.swift b/Modules/Sources/WordPressData/Swift/UserSuggestion+Comparable.swift similarity index 100% rename from Sources/WordPressData/Swift/UserSuggestion+Comparable.swift rename to Modules/Sources/WordPressData/Swift/UserSuggestion+Comparable.swift diff --git a/Sources/WordPressData/Swift/UserSuggestion+CoreDataClass.swift b/Modules/Sources/WordPressData/Swift/UserSuggestion+CoreDataClass.swift similarity index 100% rename from Sources/WordPressData/Swift/UserSuggestion+CoreDataClass.swift rename to Modules/Sources/WordPressData/Swift/UserSuggestion+CoreDataClass.swift diff --git a/Sources/WordPressData/Swift/UserSuggestion+CoreDataProperties.swift b/Modules/Sources/WordPressData/Swift/UserSuggestion+CoreDataProperties.swift similarity index 100% rename from Sources/WordPressData/Swift/UserSuggestion+CoreDataProperties.swift rename to Modules/Sources/WordPressData/Swift/UserSuggestion+CoreDataProperties.swift diff --git a/Sources/WordPressData/Swift/WPAccount+Lookup.swift b/Modules/Sources/WordPressData/Swift/WPAccount+Lookup.swift similarity index 100% rename from Sources/WordPressData/Swift/WPAccount+Lookup.swift rename to Modules/Sources/WordPressData/Swift/WPAccount+Lookup.swift diff --git a/Sources/WordPressData/Swift/WPAccount+RestApi.swift b/Modules/Sources/WordPressData/Swift/WPAccount+RestApi.swift similarity index 100% rename from Sources/WordPressData/Swift/WPAccount+RestApi.swift rename to Modules/Sources/WordPressData/Swift/WPAccount+RestApi.swift diff --git a/Sources/WordPressData/Swift/WPAccount.swift b/Modules/Sources/WordPressData/Swift/WPAccount.swift similarity index 100% rename from Sources/WordPressData/Swift/WPAccount.swift rename to Modules/Sources/WordPressData/Swift/WPAccount.swift diff --git a/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift b/Modules/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift similarity index 100% rename from Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift rename to Modules/Sources/WordPressData/Swift/WordPressComRestApi+Defaults.swift diff --git a/Sources/WordPressData/Swift/WordPressOrgRestApi+WordPress.swift b/Modules/Sources/WordPressData/Swift/WordPressOrgRestApi+WordPress.swift similarity index 100% rename from Sources/WordPressData/Swift/WordPressOrgRestApi+WordPress.swift rename to Modules/Sources/WordPressData/Swift/WordPressOrgRestApi+WordPress.swift diff --git a/Sources/WordPressData/WordPressDataDummy.swift b/Modules/Sources/WordPressData/WordPressDataDummy.swift similarity index 100% rename from Sources/WordPressData/WordPressDataDummy.swift rename to Modules/Sources/WordPressData/WordPressDataDummy.swift diff --git a/Tests/WordPressDataTests/BlogTests.swift b/Modules/Tests/WordPressDataTests/BlogTests.swift similarity index 100% rename from Tests/WordPressDataTests/BlogTests.swift rename to Modules/Tests/WordPressDataTests/BlogTests.swift diff --git a/Tests/WordPressDataTests/ContextManagerTests.swift b/Modules/Tests/WordPressDataTests/ContextManagerTests.swift similarity index 100% rename from Tests/WordPressDataTests/ContextManagerTests.swift rename to Modules/Tests/WordPressDataTests/ContextManagerTests.swift diff --git a/Tests/WordPressDataTests/CoreDataHelperTests.swift b/Modules/Tests/WordPressDataTests/CoreDataHelperTests.swift similarity index 100% rename from Tests/WordPressDataTests/CoreDataHelperTests.swift rename to Modules/Tests/WordPressDataTests/CoreDataHelperTests.swift diff --git a/Tests/WordPressDataTests/CoreDataMigrationTests.swift b/Modules/Tests/WordPressDataTests/CoreDataMigrationTests.swift similarity index 100% rename from Tests/WordPressDataTests/CoreDataMigrationTests.swift rename to Modules/Tests/WordPressDataTests/CoreDataMigrationTests.swift diff --git a/Tests/WordPressDataTests/Helpers/BlogBuilder.swift b/Modules/Tests/WordPressDataTests/Helpers/BlogBuilder.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/BlogBuilder.swift rename to Modules/Tests/WordPressDataTests/Helpers/BlogBuilder.swift diff --git a/Tests/WordPressDataTests/Helpers/ContextManager+Testing.swift b/Modules/Tests/WordPressDataTests/Helpers/ContextManager+Testing.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/ContextManager+Testing.swift rename to Modules/Tests/WordPressDataTests/Helpers/ContextManager+Testing.swift diff --git a/Tests/WordPressDataTests/Helpers/CoreDataTestCase.swift b/Modules/Tests/WordPressDataTests/Helpers/CoreDataTestCase.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/CoreDataTestCase.swift rename to Modules/Tests/WordPressDataTests/Helpers/CoreDataTestCase.swift diff --git a/Tests/WordPressDataTests/Helpers/MockAuthKeyMigration.swift b/Modules/Tests/WordPressDataTests/Helpers/MockAuthKeyMigration.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/MockAuthKeyMigration.swift rename to Modules/Tests/WordPressDataTests/Helpers/MockAuthKeyMigration.swift diff --git a/Tests/WordPressDataTests/Helpers/MockKeychainService.swift b/Modules/Tests/WordPressDataTests/Helpers/MockKeychainService.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/MockKeychainService.swift rename to Modules/Tests/WordPressDataTests/Helpers/MockKeychainService.swift diff --git a/Tests/WordPressDataTests/Helpers/NSError+TestHelpers.swift b/Modules/Tests/WordPressDataTests/Helpers/NSError+TestHelpers.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/NSError+TestHelpers.swift rename to Modules/Tests/WordPressDataTests/Helpers/NSError+TestHelpers.swift diff --git a/Tests/WordPressDataTests/Helpers/PostBuilder.swift b/Modules/Tests/WordPressDataTests/Helpers/PostBuilder.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/PostBuilder.swift rename to Modules/Tests/WordPressDataTests/Helpers/PostBuilder.swift diff --git a/Tests/WordPressDataTests/Helpers/WPAccount+Fixture.swift b/Modules/Tests/WordPressDataTests/Helpers/WPAccount+Fixture.swift similarity index 100% rename from Tests/WordPressDataTests/Helpers/WPAccount+Fixture.swift rename to Modules/Tests/WordPressDataTests/Helpers/WPAccount+Fixture.swift diff --git a/Tests/WordPressDataTests/Mapping/ReaderPostMappingTests.swift b/Modules/Tests/WordPressDataTests/Mapping/ReaderPostMappingTests.swift similarity index 100% rename from Tests/WordPressDataTests/Mapping/ReaderPostMappingTests.swift rename to Modules/Tests/WordPressDataTests/Mapping/ReaderPostMappingTests.swift diff --git a/Tests/WordPressDataTests/MediaTests.swift b/Modules/Tests/WordPressDataTests/MediaTests.swift similarity index 100% rename from Tests/WordPressDataTests/MediaTests.swift rename to Modules/Tests/WordPressDataTests/MediaTests.swift diff --git a/Tests/WordPressDataTests/PostMetadataContainerTests.swift b/Modules/Tests/WordPressDataTests/PostMetadataContainerTests.swift similarity index 100% rename from Tests/WordPressDataTests/PostMetadataContainerTests.swift rename to Modules/Tests/WordPressDataTests/PostMetadataContainerTests.swift diff --git a/Tests/WordPressDataTests/PostMetadataTests.swift b/Modules/Tests/WordPressDataTests/PostMetadataTests.swift similarity index 100% rename from Tests/WordPressDataTests/PostMetadataTests.swift rename to Modules/Tests/WordPressDataTests/PostMetadataTests.swift diff --git a/Tests/WordPressDataTests/ReaderPostTests.swift b/Modules/Tests/WordPressDataTests/ReaderPostTests.swift similarity index 100% rename from Tests/WordPressDataTests/ReaderPostTests.swift rename to Modules/Tests/WordPressDataTests/ReaderPostTests.swift diff --git a/Tests/WordPressDataTests/TaggedManagedObjectIDTests.swift b/Modules/Tests/WordPressDataTests/TaggedManagedObjectIDTests.swift similarity index 100% rename from Tests/WordPressDataTests/TaggedManagedObjectIDTests.swift rename to Modules/Tests/WordPressDataTests/TaggedManagedObjectIDTests.swift diff --git a/Tests/WordPressDataTests/WPAccountTests.swift b/Modules/Tests/WordPressDataTests/WPAccountTests.swift similarity index 100% rename from Tests/WordPressDataTests/WPAccountTests.swift rename to Modules/Tests/WordPressDataTests/WPAccountTests.swift diff --git a/Tests/WordPressDataTests/WordPressDataTests.swift b/Modules/Tests/WordPressDataTests/WordPressDataTests.swift similarity index 100% rename from Tests/WordPressDataTests/WordPressDataTests.swift rename to Modules/Tests/WordPressDataTests/WordPressDataTests.swift diff --git a/Tests/WordPressDataTests/WordPressDataTests.xctestplan b/Tests/WordPressDataTests/WordPressDataTests.xctestplan deleted file mode 100644 index e9e4cb7b5528..000000000000 --- a/Tests/WordPressDataTests/WordPressDataTests.xctestplan +++ /dev/null @@ -1,24 +0,0 @@ -{ - "configurations" : [ - { - "id" : "4A78A2D0-FB06-481E-B333-C1BA9A78D4FE", - "name" : "Configuration 1", - "options" : { - - } - } - ], - "defaultOptions" : { - "testTimeoutsEnabled" : true - }, - "testTargets" : [ - { - "target" : { - "containerPath" : "container:WordPress.xcodeproj", - "identifier" : "3F7AE0BB2D9B30A200AB4892", - "name" : "WordPressDataTests" - } - } - ], - "version" : 1 -} From c8e0af37fb081651a8bf7c18a77aadb5b7300e89 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:21:27 +1200 Subject: [PATCH 03/13] Declare WordPressData as a Swift package target --- Modules/Package.swift | 59 ++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/Modules/Package.swift b/Modules/Package.swift index 2b30b7d48546..6a360561b497 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -26,6 +26,7 @@ let package = Package( .library(name: "WordPressCore", targets: ["WordPressCore"]), .library(name: "WordPressCoreProtocols", targets: ["WordPressCoreProtocols"]), .library(name: "WordPressKit", targets: ["WordPressKit"]), + .library(name: "WordPressData", targets: ["WordPressData"]), .library(name: "WordPressMediaLibrary", targets: ["WordPressMediaLibrary"]) ], dependencies: [ @@ -288,6 +289,29 @@ let package = Package( ], swiftSettings: [.swiftLanguageMode(.v5)] ), + .target( + name: "WordPressData", + dependencies: [ + "BuildSettingsKit", + "FormattableContentKit", + "SFHFKeychainUtils", + "WordPressShared", + "WordPressKit", + "WordPressUI", + .product(name: "CocoaLumberjack", package: "CocoaLumberjack"), + .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), + .product(name: "Gravatar", package: "Gravatar-SDK-iOS"), + .product(name: "NSURL-IDN", package: "NSURL-IDN"), + .product(name: "WordPressAPI", package: "wordpress-rs") + ], + resources: [.process("Resources")], + swiftSettings: [ + .swiftLanguageMode(.v5), + // The Xcode target this module replaced compiled bare slash regex + // literals (e.g. ReaderPost.swift); plain Swift 5 mode does not. + .enableUpcomingFeature("BareSlashRegexLiterals") + ] + ), .target( name: "WordPressReader", dependencies: [ @@ -328,6 +352,16 @@ let package = Package( dependencies: [.target(name: "WordPressShared")], swiftSettings: [.swiftLanguageMode(.v5)] ), + .testTarget( + name: "WordPressDataTests", + dependencies: [ + "WordPressData", + "WordPressKit", + "WordPressKitModels", + "WordPressShared" + ], + swiftSettings: [.swiftLanguageMode(.v5)] + ), .testTarget( name: "WordPressSharedObjCTests", dependencies: [.target(name: "WordPressShared"), .target(name: "WordPressTesting")], @@ -372,8 +406,6 @@ enum XcodeSupport { .library(name: "XcodeTarget_Keystone", targets: ["XcodeTarget_Keystone"]), .library(name: "XcodeTarget_WordPressTests", targets: ["XcodeTarget_WordPressTests"]), .library(name: "XcodeTarget_WordPressKitTests", targets: ["XcodeTarget_WordPressKitTests"]), - .library(name: "XcodeTarget_WordPressData", targets: ["XcodeTarget_WordPressData"]), - .library(name: "XcodeTarget_WordPressDataTests", targets: ["XcodeTarget_WordPressDataTests"]), .library(name: "XcodeTarget_WordPressAuthentificator", targets: ["XcodeTarget_WordPressAuthentificator"]), .library( name: "XcodeTarget_WordPressAuthentificatorTests", @@ -460,6 +492,7 @@ enum XcodeSupport { "WordPressUI", "WordPressCore", "WordPressKit", + "WordPressData", .product(name: "Alamofire", package: "Alamofire"), .product(name: "AutomatticAbout", package: "AutomatticAbout-swift"), .product(name: "AutomatticTracks", package: "Automattic-Tracks-iOS"), @@ -501,6 +534,7 @@ enum XcodeSupport { dependencies: testDependencies + [ "WordPressShared", "WordPressUI", + "WordPressData", .product(name: "Gravatar", package: "Gravatar-SDK-iOS"), // Needed by WordPressData because of how linkage works... // @@ -524,12 +558,6 @@ enum XcodeSupport { "WordPressKit" ] ), - .xcodeTarget( - "XcodeTarget_WordPressDataTests", - dependencies: [ - "WordPressKit" - ] - ), .xcodeTarget("XcodeTarget_WordPressAuthentificator", dependencies: wordPresAuthentificatorDependencies), .xcodeTarget( "XcodeTarget_WordPressAuthentificatorTests", @@ -607,21 +635,6 @@ enum XcodeSupport { dependencies: [ "UITestsFoundation" ] - ), - .xcodeTarget( - "XcodeTarget_WordPressData", - dependencies: [ - "BuildSettingsKit", - "FormattableContentKit", - "SFHFKeychainUtils", - "WordPressShared", - "WordPressKit", - .product(name: "CocoaLumberjack", package: "CocoaLumberjack"), - .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), - .product(name: "Gravatar", package: "Gravatar-SDK-iOS"), - .product(name: "NSURL-IDN", package: "NSURL-IDN"), - .product(name: "WordPressAPI", package: "wordpress-rs") - ] ) ] } From d0b2d94dcfc2be41b9d00d67dc2fd0cca1eb2cbb Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:29:06 +1200 Subject: [PATCH 04/13] Load WordPressData resources via Bundle.module --- .../Sources/WordPressData/Swift/Bundle+WordPressData.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift b/Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift index c0824c128d2a..21c1bd20c359 100644 --- a/Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift +++ b/Modules/Sources/WordPressData/Swift/Bundle+WordPressData.swift @@ -2,8 +2,6 @@ import Foundation extension Bundle { @objc public class var wordPressData: Bundle { - Bundle(for: BundleToken.self) + .module } } - -private final class BundleToken {} From 1cec11674439fd8ad5ea5c42c8cef7e05c74cb90 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:30:01 +1200 Subject: [PATCH 05/13] Point WordPressData scheme at the Modules package --- .../WordPressData.xctestplan | 24 +++++++ .../xcschemes/WordPressData.xcscheme | 72 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 Modules/Tests/WordPressDataTests/WordPressData.xctestplan create mode 100644 WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPressData.xcscheme diff --git a/Modules/Tests/WordPressDataTests/WordPressData.xctestplan b/Modules/Tests/WordPressDataTests/WordPressData.xctestplan new file mode 100644 index 000000000000..51423e2a7b8a --- /dev/null +++ b/Modules/Tests/WordPressDataTests/WordPressData.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "1CD15192-2579-4CD8-815F-86BF8B214099", + "name" : "Test Scheme Action", + "options" : { + + } + } + ], + "defaultOptions" : { + "testTimeoutsEnabled" : true + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:../Modules", + "identifier" : "WordPressDataTests", + "name" : "WordPressDataTests" + } + } + ], + "version" : 1 +} diff --git a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPressData.xcscheme b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPressData.xcscheme new file mode 100644 index 000000000000..d114bf9d0eea --- /dev/null +++ b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/WordPressData.xcscheme @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 412bf2d8b15aff59863149f61211c79d5e60be85 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:46:43 +1200 Subject: [PATCH 06/13] Expose WordPressData module map to the bridging header --- config/Common.xcconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config/Common.xcconfig b/config/Common.xcconfig index c568d7bb2f76..04a86420f71b 100644 --- a/config/Common.xcconfig +++ b/config/Common.xcconfig @@ -10,5 +10,6 @@ GCC_TREAT_WARNINGS_AS_ERRORS = NO // See https://forums.swift.org/t/swift-cant-see-objc-methods-that-include-package-symbols/65732/9 // Without this flag, Objective-C APIs that contains Swift types in WordPressKit will not be available -// to Swift code in the app target. -OTHER_SWIFT_FLAGS = $(inherited) -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKit.modulemap" -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKitModels.modulemap" -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKitObjC.modulemap" +// to Swift code in the app target. The WordPressData entry also lets the bridging header resolve +// `@import WordPressData;` now that WordPressData is a package module. +OTHER_SWIFT_FLAGS = $(inherited) -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKit.modulemap" -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKitModels.modulemap" -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressKitObjC.modulemap" -Xcc "-fmodule-map-file=${OBJROOT}/GeneratedModuleMaps-${PLATFORM_NAME}/WordPressData.modulemap" From c8ed83ece4f4f02f6f56feb212c13868628ad438 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 08:52:47 +1200 Subject: [PATCH 07/13] Remove WordPressData linkage workaround from WordPressTests shim --- Modules/Package.swift | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/Modules/Package.swift b/Modules/Package.swift index 6a360561b497..91cf1c7c6d52 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -532,22 +532,12 @@ enum XcodeSupport { .xcodeTarget( "XcodeTarget_WordPressTests", dependencies: testDependencies + [ + "FormattableContentKit", + "WordPressData", + "WordPressKit", "WordPressShared", "WordPressUI", - "WordPressData", .product(name: "Gravatar", package: "Gravatar-SDK-iOS"), - // Needed by WordPressData because of how linkage works... - // - "BuildSettingsKit", - "FormattableContentKit", - "SFHFKeychainUtils", - "WordPressKit", - .product(name: "CocoaLumberjack", package: "CocoaLumberjack"), - .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), - .product(name: "CocoaLumberjackSwiftLogBackend", package: "CocoaLumberjack"), - .product(name: "Logging", package: "swift-log"), - .product(name: "NSObject-SafeExpectations", package: "NSObject-SafeExpectations"), - .product(name: "NSURL-IDN", package: "NSURL-IDN"), .product(name: "WordPressAPI", package: "wordpress-rs") ] ), From 5c701985862029c13bb31bc2952143a48fcab88f Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 09:15:32 +1200 Subject: [PATCH 08/13] Format files before adding WordPressKit imports --- .../JetpackRemoteInstallViewController.swift | 24 ++-- .../JetpackRestoreStatusCoordinator.swift | 68 ++++++----- .../JetpackScanStatusViewModel.swift | 110 +++++++++++++----- 3 files changed, 137 insertions(+), 65 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift b/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift index 9fe6f2482598..9c25cdce7187 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift @@ -14,9 +14,11 @@ class JetpackRemoteInstallViewController: UIViewController { private let jetpackView = JetpackRemoteInstallStateView(nibName: "JetpackRemoteInstallStateView", bundle: .keystone) private let viewModel: JetpackRemoteInstallViewModel - init(blog: Blog, - delegate: JetpackRemoteInstallDelegate?, - viewModel: JetpackRemoteInstallViewModel = SelfHostedJetpackRemoteInstallViewModel()) { + init( + blog: Blog, + delegate: JetpackRemoteInstallDelegate?, + viewModel: JetpackRemoteInstallViewModel = SelfHostedJetpackRemoteInstallViewModel() + ) { self.blog = blog self.delegate = delegate self.viewModel = viewModel @@ -35,7 +37,10 @@ class JetpackRemoteInstallViewController: UIViewController { setupUI() } - override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { + override func willTransition( + to newCollection: UITraitCollection, + with coordinator: UIViewControllerTransitionCoordinator + ) { super.willTransition(to: newCollection, with: coordinator) jetpackView.toggleHidingImageView(for: newCollection) } @@ -46,9 +51,11 @@ class JetpackRemoteInstallViewController: UIViewController { private extension JetpackRemoteInstallViewController { func setupNavigationBar() { title = NSLocalizedString("Jetpack", comment: "Title for the Jetpack Installation") - navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, - target: self, - action: #selector(cancel)) + navigationItem.leftBarButtonItem = UIBarButtonItem( + barButtonSystemItem: .cancel, + target: self, + action: #selector(cancel) + ) } func setupUI() { @@ -175,7 +182,8 @@ extension JetpackInstallError { /// When the error is unknown, return the error title (if it exists) to get a more descriptive reason. var description: String { if let title, - type == .unknown { + type == .unknown + { return title } return type.rawValue diff --git a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift index 482ef989decb..e01105333af0 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift @@ -21,10 +21,12 @@ class JetpackRestoreStatusCoordinator { // MARK: - Init - init(site: JetpackSiteRef, - view: JetpackRestoreStatusView, - service: JetpackRestoreService? = nil, - coreDataStack: CoreDataStackSwift = ContextManager.shared) { + init( + site: JetpackSiteRef, + view: JetpackRestoreStatusView, + service: JetpackRestoreService? = nil, + coreDataStack: CoreDataStackSwift = ContextManager.shared + ) { self.service = service ?? JetpackRestoreService(coreDataStack: coreDataStack) self.site = site self.view = view @@ -58,34 +60,38 @@ class JetpackRestoreStatusCoordinator { } private func refreshRestoreStatus() { - service.getRewindStatus(for: self.site, success: { [weak self] rewindStatus in - guard let self, let restoreStatus = rewindStatus.restore else { - return + service.getRewindStatus( + for: self.site, + success: { [weak self] rewindStatus in + guard let self, let restoreStatus = rewindStatus.restore else { + return + } + + switch restoreStatus.status { + case .running, .queued: + self.view.render(rewindStatus) + case .finished: + self.view.showRestoreComplete() + case .fail: + self.view.showRestoreFailed() + } + }, + failure: { [weak self] error in + DDLogError("Error fetching rewind status object: \(error.localizedDescription)") + + guard let self else { + return + } + + if self.retryCount == Constants.maxRetryCount { + self.stopPolling() + self.view.showRestoreStatusUpdateFailed() + return + } + + self.retryCount += 1 } - - switch restoreStatus.status { - case .running, .queued: - self.view.render(rewindStatus) - case .finished: - self.view.showRestoreComplete() - case .fail: - self.view.showRestoreFailed() - } - }, failure: { [weak self] error in - DDLogError("Error fetching rewind status object: \(error.localizedDescription)") - - guard let self else { - return - } - - if self.retryCount == Constants.maxRetryCount { - self.stopPolling() - self.view.showRestoreStatusUpdateFailed() - return - } - - self.retryCount += 1 - }) + ) } } diff --git a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift index 7bc9dcf9818e..4ff50e8e081d 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift @@ -31,7 +31,9 @@ struct JetpackScanStatusViewModel { case .noThreats: let descriptionTitle: String - if let mostRecent = scan.mostRecent, let startDate = mostRecent.startDate, let duration = mostRecent.duration { + if let mostRecent = scan.mostRecent, let startDate = mostRecent.startDate, + let duration = mostRecent.duration + { // Calculate the end date of the scan which is the start date + the duration let lastScanDate = startDate.addingTimeInterval(duration) let dateString = Self.relativeTimeString(for: lastScanDate) @@ -79,10 +81,14 @@ struct JetpackScanStatusViewModel { secondaryButtonAction = .triggerScan if !scan.hasValidCredentials { - let warningString = String(format: Strings.enterServerCredentialsFormat, - Strings.enterServerCredentialsSubstring) - warningButtonTitle = HighlightedText(substring: Strings.enterServerCredentialsSubstring, - string: warningString) + let warningString = String( + format: Strings.enterServerCredentialsFormat, + Strings.enterServerCredentialsSubstring + ) + warningButtonTitle = HighlightedText( + substring: Strings.enterServerCredentialsSubstring, + string: warningString + ) warningButtonAction = .enterServerCredentials primaryButtonEnabled = false @@ -228,34 +234,86 @@ struct JetpackScanStatusViewModel { // MARK: - Localized Strings private struct Strings { - static let enterServerCredentialsSubstring = NSLocalizedString("Enter your server credentials", comment: "Error message displayed when site credentials aren't configured.") - static let enterServerCredentialsFormat = NSLocalizedString("%1$@ to fix threats.", comment: "Title for button when a site is missing server credentials. %1$@ is a placeholder for the string 'Enter your server credentials'.") - static let noThreatsTitle = NSLocalizedString("Don’t worry about a thing", comment: "Title for label when there are no threats on the users site") - static let noThreatsDescriptionFormat = NSLocalizedString("The last Jetpack scan ran %1$@ and did not find any risks.\n\nTo review your site again run a manual scan, or wait for Jetpack to scan your site later today.", comment: "Description for label when there are no threats on a users site and how long ago the scan ran.") - static let noThreatsDescription = NSLocalizedString("The last jetpack scan did not find any risks.\n\nTo review your site again run a manual scan, or wait for Jetpack to scan your site later today.", - comment: "Description that informs for label when there are no threats on a users site") - - static let hasThreatsTitle = NSLocalizedString("Your site may be at risk", comment: "Title for label when there are threats on the users site") - static let hasThreatsDescriptionFormat = NSLocalizedString("Jetpack Scan found %1$d potential threats with %2$@. Please review them below and take action or tap the fix all button. We are here to help if you need us.", comment: "Description for a label when there are threats on the site, displays the number of threats, and the site's title") - static let hasSingleThreatDescriptionFormat = NSLocalizedString("Jetpack Scan found 1 potential threat with %1$@. Please review them below and take action or tap the fix all button. We are here to help if you need us.", comment: "Description for a label when there is a single threat on the site, displays the site's title") - - static let preparingTitle = NSLocalizedString("Preparing to scan", comment: "Title for label when the preparing to scan the users site") - static let scanningTitle = NSLocalizedString("Scanning files", comment: "Title for label when the actively scanning the users site") - static let scanningDescription = NSLocalizedString("We will send you an email if security threats are found. In the meantime feel free to continue to use your site as normal, you can check back on progress at any time.", comment: "Description for label when the actively scanning the users site") - - static let errorTitle = NSLocalizedString("Something went wrong", comment: "Title for a label that appears when the scan failed") - static let errorDescription = NSLocalizedString("Jetpack Scan couldn't complete a scan of your site. Please check to see if your site is down – if it's not, try again. If it is, or if Jetpack Scan is still having problems, contact our support team.", comment: "Description for a label when the scan has failed") + static let enterServerCredentialsSubstring = NSLocalizedString( + "Enter your server credentials", + comment: "Error message displayed when site credentials aren't configured." + ) + static let enterServerCredentialsFormat = NSLocalizedString( + "%1$@ to fix threats.", + comment: + "Title for button when a site is missing server credentials. %1$@ is a placeholder for the string 'Enter your server credentials'." + ) + static let noThreatsTitle = NSLocalizedString( + "Don’t worry about a thing", + comment: "Title for label when there are no threats on the users site" + ) + static let noThreatsDescriptionFormat = NSLocalizedString( + "The last Jetpack scan ran %1$@ and did not find any risks.\n\nTo review your site again run a manual scan, or wait for Jetpack to scan your site later today.", + comment: "Description for label when there are no threats on a users site and how long ago the scan ran." + ) + static let noThreatsDescription = NSLocalizedString( + "The last jetpack scan did not find any risks.\n\nTo review your site again run a manual scan, or wait for Jetpack to scan your site later today.", + comment: "Description that informs for label when there are no threats on a users site" + ) + + static let hasThreatsTitle = NSLocalizedString( + "Your site may be at risk", + comment: "Title for label when there are threats on the users site" + ) + static let hasThreatsDescriptionFormat = NSLocalizedString( + "Jetpack Scan found %1$d potential threats with %2$@. Please review them below and take action or tap the fix all button. We are here to help if you need us.", + comment: + "Description for a label when there are threats on the site, displays the number of threats, and the site's title" + ) + static let hasSingleThreatDescriptionFormat = NSLocalizedString( + "Jetpack Scan found 1 potential threat with %1$@. Please review them below and take action or tap the fix all button. We are here to help if you need us.", + comment: "Description for a label when there is a single threat on the site, displays the site's title" + ) + + static let preparingTitle = NSLocalizedString( + "Preparing to scan", + comment: "Title for label when the preparing to scan the users site" + ) + static let scanningTitle = NSLocalizedString( + "Scanning files", + comment: "Title for label when the actively scanning the users site" + ) + static let scanningDescription = NSLocalizedString( + "We will send you an email if security threats are found. In the meantime feel free to continue to use your site as normal, you can check back on progress at any time.", + comment: "Description for label when the actively scanning the users site" + ) + + static let errorTitle = NSLocalizedString( + "Something went wrong", + comment: "Title for a label that appears when the scan failed" + ) + static let errorDescription = NSLocalizedString( + "Jetpack Scan couldn't complete a scan of your site. Please check to see if your site is down – if it's not, try again. If it is, or if Jetpack Scan is still having problems, contact our support team.", + comment: "Description for a label when the scan has failed" + ) struct fixing { - static let title = NSLocalizedString("Fixing Threats", comment: "Subtitle displayed while the server is fixing threats") - static let details = NSLocalizedString("We're hard at work in the background fixing these threats. In the meantime feel free to continue to use your site as normal, you can check back on progress at any time.", comment: "Detail text display informing the user that we're fixing threats") + static let title = NSLocalizedString( + "Fixing Threats", + comment: "Subtitle displayed while the server is fixing threats" + ) + static let details = NSLocalizedString( + "We're hard at work in the background fixing these threats. In the meantime feel free to continue to use your site as normal, you can check back on progress at any time.", + comment: "Detail text display informing the user that we're fixing threats" + ) } // Buttons - static let contactSupportTitle = NSLocalizedString("Contact Support", comment: "Button title that opens the support page") + static let contactSupportTitle = NSLocalizedString( + "Contact Support", + comment: "Button title that opens the support page" + ) static let retryScanTitle = NSLocalizedString("Retry Scan", comment: "Button title that triggers a scan") static let scanNowTitle = NSLocalizedString("Scan Now", comment: "Button title that triggers a scan") static let scanAgainTitle = NSLocalizedString("Scan Again", comment: "Button title that triggers a scan") - static let fixAllTitle = NSLocalizedString("Fix All", comment: "Button title that attempts to fix all fixable threats") + static let fixAllTitle = NSLocalizedString( + "Fix All", + comment: "Button title that attempts to fix all fixable threats" + ) } } From 7e41a970cea2983ccc9c26051495e7cb21007c8e Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 09:17:51 +1200 Subject: [PATCH 09/13] Format file before adding WordPressKit import --- .../RootViewCoordinator+WhatIsNew.swift | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift b/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift index 6d803f326bc4..bd0bd5930b37 100644 --- a/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift +++ b/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift @@ -15,27 +15,29 @@ extension RootViewCoordinator { } @objc func makeWhatIsNewPresenter() -> ScenePresenter { - return WhatIsNewScenePresenter(store: makeAnnouncementStore()) + WhatIsNewScenePresenter(store: makeAnnouncementStore()) } private func makeAnnouncementStore() -> AnnouncementsStore { - return CachedAnnouncementsStore(cache: makeCache(), service: makeAnnouncementsService()) + CachedAnnouncementsStore(cache: makeCache(), service: makeAnnouncementsService()) } private func makeAnnouncementsService() -> AnnouncementServiceRemote { - return AnnouncementServiceRemote(wordPressComRestApi: makeApi()) + AnnouncementServiceRemote(wordPressComRestApi: makeApi()) } private func makeCache() -> AnnouncementsCache { - return UserDefaultsAnnouncementsCache() + UserDefaultsAnnouncementsCache() } private func makeApi() -> WordPressComRestApi { let defaultAccount = try? WPAccount.lookupDefaultWordPressComAccount(in: ContextManager.shared.mainContext) let token: String? = defaultAccount?.authToken - return WordPressComRestApi.defaultApi(oAuthToken: token, - userAgent: WPUserAgent.wordPress(), - localeKey: WordPressComRestApi.LocaleKeyV2) + return WordPressComRestApi.defaultApi( + oAuthToken: token, + userAgent: WPUserAgent.wordPress(), + localeKey: WordPressComRestApi.LocaleKeyV2 + ) } } From f45e218caf0342f610bbb0cc305e426fc41883fa Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 09:21:55 +1200 Subject: [PATCH 10/13] Import WordPressKit where its types were used via implicit visibility When WordPressData was a dynamic framework, importing it implicitly exposed WordPressKit types to targets without a bridging header (the Keystone framework compile path). The Swift package module does not re-export its dependencies, so files using WordPressKit types need the explicit import. --- .../Jetpack/Install/JetpackRemoteInstallViewController.swift | 1 + .../Coordinators/JetpackRestoreStatusCoordinator.swift | 1 + .../Jetpack Scan/View Models/JetpackScanStatusViewModel.swift | 1 + .../Dependency container/RootViewCoordinator+WhatIsNew.swift | 1 + 4 files changed, 4 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift b/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift index 9c25cdce7187..446bc4f44927 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Install/JetpackRemoteInstallViewController.swift @@ -1,5 +1,6 @@ import UIKit import WordPressData +import WordPressKit import WordPressUI protocol JetpackRemoteInstallDelegate: AnyObject { diff --git a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift index e01105333af0..d482e8dc2e0b 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Restore/Restore Status/Coordinators/JetpackRestoreStatusCoordinator.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit protocol JetpackRestoreStatusView { func render(_ rewindStatus: RewindStatus) diff --git a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift index 4ff50e8e081d..ffa99801146b 100644 --- a/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift +++ b/WordPress/Classes/ViewRelated/Jetpack/Jetpack Scan/View Models/JetpackScanStatusViewModel.swift @@ -1,3 +1,4 @@ +import WordPressKit import WordPressShared struct JetpackScanStatusViewModel { diff --git a/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift b/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift index bd0bd5930b37..e4f604787974 100644 --- a/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift +++ b/WordPress/Classes/ViewRelated/WhatsNew/Dependency container/RootViewCoordinator+WhatIsNew.swift @@ -1,4 +1,5 @@ import WordPressData +import WordPressKit import WordPressShared /// dependency container for the What's New / Feature Announcements scene From d9e218ada7efdfea1373e07a49b04056dc294ed3 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 09:30:40 +1200 Subject: [PATCH 11/13] Format files before adding WordPressKit imports --- .../Models/ReaderListTopic+Creation.swift | 7 +- .../Services/CommentService+Swift.swift | 46 +-- .../Services/PushAuthenticationService.swift | 17 +- .../Services/ReaderPostStreamService.swift | 101 ++++--- .../Classes/Services/ReaderSiteService.swift | 34 ++- .../Classes/System/WordPressAppDelegate.swift | 198 ++++++++---- .../PushNotificationsManager.swift | 116 ++++--- .../SharingAccountViewController.swift | 73 +++-- .../SiteSettingsViewController+Swift.swift | 157 +++++++--- .../CompliancePopoverViewModel.swift | 8 +- ...ificationCommentDetailViewController.swift | 167 ++++++---- .../InvitePersonViewController.swift | 286 ++++++++++++------ .../PluginDirectoryViewController.swift | 17 +- .../SiteAssemblyWizardContent.swift | 23 +- .../StatsReferrersChartViewModel.swift | 40 ++- 15 files changed, 871 insertions(+), 419 deletions(-) diff --git a/WordPress/Classes/Models/ReaderListTopic+Creation.swift b/WordPress/Classes/Models/ReaderListTopic+Creation.swift index 49a745f8a261..f27bbe5a6976 100644 --- a/WordPress/Classes/Models/ReaderListTopic+Creation.swift +++ b/WordPress/Classes/Models/ReaderListTopic+Creation.swift @@ -7,8 +7,11 @@ extension ReaderListTopic { /// Returns an existing topic for the specified list, or creates one if one /// doesn't already exist. /// - static func named(_ listName: String, forUser user: String, in context: NSManagedObjectContext) -> ReaderListTopic? { - let remote = ReaderTopicServiceRemote(wordPressComRestApi: WordPressComRestApi.anonymousApi(userAgent: WPUserAgent.wordPress())) + static func named(_ listName: String, forUser user: String, in context: NSManagedObjectContext) -> ReaderListTopic? + { + let remote = ReaderTopicServiceRemote( + wordPressComRestApi: WordPressComRestApi.anonymousApi(userAgent: WPUserAgent.wordPress()) + ) let sanitizedListName = remote.slug(forTopicName: listName) ?? listName.lowercased() let sanitizedUser = user.lowercased() let path = remote.path(forEndpoint: "read/list/\(sanitizedUser)/\(sanitizedListName)/posts", withVersion: ._1_2) diff --git a/WordPress/Classes/Services/CommentService+Swift.swift b/WordPress/Classes/Services/CommentService+Swift.swift index 4ae4add16143..dfd44fff6a1b 100644 --- a/WordPress/Classes/Services/CommentService+Swift.swift +++ b/WordPress/Classes/Services/CommentService+Swift.swift @@ -13,11 +13,13 @@ extension CommentService { /// - accountService: Service dependency to fetch the current user's dotcom ID. /// - success: Closure called when the fetch succeeds. /// - failure: Closure called when the fetch fails. - func getLatestReplyID(for parentID: Int, - siteID: Int, - accountService: AccountService? = nil, - success: @escaping (Int) -> Void, - failure: @escaping (Error?) -> Void) { + func getLatestReplyID( + for parentID: Int, + siteID: Int, + accountService: AccountService? = nil, + success: @escaping (Int) -> Void, + failure: @escaping (Error?) -> Void + ) { guard let remote = restRemote(forSite: NSNumber(value: siteID)) else { DDLogError("Unable to create a REST remote to fetch comment replies.") failure(nil) @@ -34,9 +36,12 @@ extension CommentService { // Therefore, fetch all replies and filter for the current user here. remote.getCommentsV2(for: siteID, parameters: [.parent: parentID]) { remoteComments in // Filter for comments authored by the current user, and return the most recent commentID (if any). - success(remoteComments - .filter { $0.authorID == userID } - .max { $0.date < $1.date }?.commentID ?? 0) + success( + remoteComments + .filter { $0.authorID == userID } + .max { $0.date < $1.date }? + .commentID ?? 0 + ) } failure: { error in failure(error) } @@ -50,11 +55,12 @@ extension CommentService { /// - completion: The block executed after the replies are updated. func updateRepliesVisibility(for ancestorComment: Comment, completion: (() -> Void)? = nil) { guard let context = ancestorComment.managedObjectContext, - let post = ancestorComment.post as? ReaderPost, - let comments = post.comments else { - completion?() - return - } + let post = ancestorComment.post as? ReaderPost, + let comments = post.comments + else { + completion?() + return + } let isVisible = (ancestorComment.status == CommentStatusType.approved.description) @@ -66,11 +72,12 @@ extension CommentService { context.perform { comments.filter { comment in comment.parentID == ancestorComment.commentID - || comment.hierarchy - .split(separator: ".") - .compactMap({ Int32($0) }) - .contains(ancestorComment.commentID) - }.forEach { childComment in + || comment.hierarchy + .split(separator: ".") + .compactMap({ Int32($0) }) + .contains(ancestorComment.commentID) + } + .forEach { childComment in childComment.visibleOnReader = isVisible } @@ -84,7 +91,8 @@ extension CommentService { @objc(fetchPostsIfNeededForComments:inBlog:) public func fetchPostsIfNeeded(for comments: [RemoteComment], in blog: Blog) { // Find posts that do not exists locally. - let postIds = comments + let postIds = + comments .reduce(into: Set()) { result, comment in if let postId = comment.postID, comment.postTitle == nil { result.insert(postId) diff --git a/WordPress/Classes/Services/PushAuthenticationService.swift b/WordPress/Classes/Services/PushAuthenticationService.swift index d36de8ef4c15..808ab5160eb4 100644 --- a/WordPress/Classes/Services/PushAuthenticationService.swift +++ b/WordPress/Classes/Services/PushAuthenticationService.swift @@ -30,13 +30,16 @@ class PushAuthenticationService { return } - self.authenticationServiceRemote!.authorizeLogin(token, - success: { - completion(true) - }, - failure: { - completion(false) - }) + self.authenticationServiceRemote! + .authorizeLogin( + token, + success: { + completion(true) + }, + failure: { + completion(false) + } + ) } /// Helper method to get the WordPress.com REST Api, if any diff --git a/WordPress/Classes/Services/ReaderPostStreamService.swift b/WordPress/Classes/Services/ReaderPostStreamService.swift index 1988beb77cc5..47cbb45516d8 100644 --- a/WordPress/Classes/Services/ReaderPostStreamService.swift +++ b/WordPress/Classes/Services/ReaderPostStreamService.swift @@ -12,52 +12,76 @@ class ReaderPostStreamService { self.coreDataStack = coreDataStack } - func fetchPosts(for topic: ReaderTagTopic, isFirstPage: Bool = true, success: @escaping (Int, Bool) -> Void, failure: @escaping (Error?) -> Void) { + func fetchPosts( + for topic: ReaderTagTopic, + isFirstPage: Bool = true, + success: @escaping (Int, Bool) -> Void, + failure: @escaping (Error?) -> Void + ) { if isFirstPage { nextPageHandle = nil } let remoteService = ReaderPostServiceRemote.withDefaultApi() - remoteService.fetchPosts(for: [topic.slug], page: nextPageHandle, success: { posts, pageHandle in - var shouldBail = false - self.coreDataStack.performAndSave({ context in - guard let readerTopic = try? context.existingObject(with: topic.objectID) as? ReaderAbstractTopic else { - // if there was an error or the topic was deleted just bail. - shouldBail = true - return - } + remoteService.fetchPosts( + for: [topic.slug], + page: nextPageHandle, + success: { posts, pageHandle in + var shouldBail = false + self.coreDataStack.performAndSave( + { context in + guard + let readerTopic = try? context.existingObject(with: topic.objectID) as? ReaderAbstractTopic + else { + // if there was an error or the topic was deleted just bail. + shouldBail = true + return + } - self.nextPageHandle = pageHandle + self.nextPageHandle = pageHandle - if isFirstPage { - self.pageNumber = 1 - self.removePosts(forTopic: readerTopic, in: context) - } else { - self.pageNumber += 1 - } + if isFirstPage { + self.pageNumber = 1 + self.removePosts(forTopic: readerTopic, in: context) + } else { + self.pageNumber += 1 + } - posts.enumerated().forEach { index, remotePost in - let post = ReaderPost.createOrUpdate(with: remotePost, topic: readerTopic, context: context) - // To keep the API order - post.sortRank = NSNumber(value: Date().timeIntervalSinceReferenceDate - Double(((self.pageNumber * Constants.paginationMultiplier) + index))) - } + posts.enumerated() + .forEach { index, remotePost in + let post = ReaderPost.createOrUpdate( + with: remotePost, + topic: readerTopic, + context: context + ) + // To keep the API order + post.sortRank = NSNumber( + value: Date().timeIntervalSinceReferenceDate + - Double(((self.pageNumber * Constants.paginationMultiplier) + index)) + ) + } - // Clean up - let service = ReaderPostService(coreDataStack: self.coreDataStack) - service.deletePostsInExcessOfMaxAllowed(for: readerTopic) - service.deletePostsFromBlockedSites() - }, completion: { - if shouldBail { - success(0, false) - return - } + // Clean up + let service = ReaderPostService(coreDataStack: self.coreDataStack) + service.deletePostsInExcessOfMaxAllowed(for: readerTopic) + service.deletePostsFromBlockedSites() + }, + completion: { + if shouldBail { + success(0, false) + return + } - let hasMore = pageHandle != nil - success(posts.count, hasMore) - }, on: .main) - }, failure: { error in - failure(error) - }) + let hasMore = pageHandle != nil + success(posts.count, hasMore) + }, + on: .main + ) + }, + failure: { error in + failure(error) + } + ) } private func removePosts(forTopic topic: ReaderAbstractTopic, in context: NSManagedObjectContext) { @@ -73,8 +97,9 @@ class ReaderPostStreamService { // the content and all the metadata should be updated correctly later while preserving // `inUse` and `isSavedForLater`. guard let post = object as? ReaderPost, - !post.inUse, - !post.isSavedForLater else { + !post.inUse, + !post.isSavedForLater + else { continue } context.delete(post) diff --git a/WordPress/Classes/Services/ReaderSiteService.swift b/WordPress/Classes/Services/ReaderSiteService.swift index 5517e2d94f28..cf6843d0d5d6 100644 --- a/WordPress/Classes/Services/ReaderSiteService.swift +++ b/WordPress/Classes/Services/ReaderSiteService.swift @@ -10,12 +10,17 @@ import WordPressShared /// - blocked: Boolean value. `true` to block a site. `false` to unblock a site. /// - success: Closure called when the request succeeds. /// - failure: Closure called when the request fails. - func flagSite(withID id: NSNumber, asBlocked blocked: Bool, success: (() -> Void)? = nil, failure: ((Error?) -> Void)? = nil) { + func flagSite( + withID id: NSNumber, + asBlocked blocked: Bool, + success: (() -> Void)? = nil, + failure: ((Error?) -> Void)? = nil + ) { let queryResult: (NSNumber, WordPressComRestApi)? = self.coreDataStack.performQuery({ guard let defaultAccount = try? WPAccount.lookupDefaultWordPressComAccount(in: $0), - let api = defaultAccount.wordPressComRestApi, - let userID = defaultAccount.userID, - api.hasCredentials() + let api = defaultAccount.wordPressComRestApi, + let userID = defaultAccount.userID, + api.hasCredentials() else { return nil } @@ -35,18 +40,27 @@ import WordPressShared service.flagSite(withID: id.uintValue, asBlocked: blocked) { let properties: [String: Any] = [WPAppAnalyticsKeyBlogID: id] WPAnalytics.track(.readerSiteBlocked, withProperties: properties) - self.coreDataStack.performAndSave({ context in - self.flagSiteLocally(accountID: userID, siteID: id, asBlocked: blocked, in: context) - }, completion: { - success?() - }, on: .main) + self.coreDataStack.performAndSave( + { context in + self.flagSiteLocally(accountID: userID, siteID: id, asBlocked: blocked, in: context) + }, + completion: { + success?() + }, + on: .main + ) } failure: { error in self.flagPosts(fromSite: id, asBlocked: !blocked) failure?(error) } } - private func flagSiteLocally(accountID: NSNumber, siteID: NSNumber, asBlocked blocked: Bool, in context: NSManagedObjectContext) { + private func flagSiteLocally( + accountID: NSNumber, + siteID: NSNumber, + asBlocked blocked: Bool, + in context: NSManagedObjectContext + ) { if blocked { let blocked = BlockedSite.insert(into: context) blocked.accountID = accountID diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 7de881d30e7b..f620ba041607 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -26,9 +26,12 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { public var window: UIWindow? - let backgroundTasksCoordinator = BackgroundTasksCoordinator(tasks: [ - WeeklyRoundupBackgroundTask() - ], eventHandler: WordPressBackgroundTaskEventHandler()) + let backgroundTasksCoordinator = BackgroundTasksCoordinator( + tasks: [ + WeeklyRoundupBackgroundTask() + ], + eventHandler: WordPressBackgroundTaskEventHandler() + ) @objc lazy var windowManager: WindowManager = { @@ -55,7 +58,7 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { private let remoteConfigStore = RemoteConfigStore() private var mainContext: NSManagedObjectContext { - return ContextManager.shared.mainContext + ContextManager.shared.mainContext } private let loggingStack = WPLoggingStack.shared @@ -77,14 +80,17 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { // MARK: - Application lifecycle - public func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + public func application( + _ application: UIApplication, + willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { // We need to set up the swift-log logging system right after app launch, so that logs can be written // into the log handlers configured below. LoggingSystem.bootstrap { label in let ddLogHandlerFactory: (String) -> LogHandler = DDLogHandler.handlerFactory() return MultiplexLogHandler([ ddLogHandlerFactory(label), - ExtensiveLogger(label: label), + ExtensiveLogger(label: label) ]) } @@ -131,7 +137,10 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { return true } - public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + public func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { Loggers.app.info("didFinishLaunchingWithOptions state: \(application.applicationState)") ABTest.start() @@ -147,9 +156,10 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { // This was necessary to properly load fonts for the Stories editor. I believe external libraries may require this call to access fonts. let fonts = Bundle.main.urls(forResourcesWithExtension: "ttf", subdirectory: nil) - fonts?.forEach({ url in - CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) - }) + fonts? + .forEach({ url in + CTFontManagerRegisterFontsForURL(url as CFURL, .process, nil) + }) startObservingAppleIDCredentialRevoked() @@ -159,7 +169,8 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { } if let account = try? WPAccount.lookupDefaultWordPressComAccount(in: ContextManager.shared.mainContext) { - BlogSyncFacade().syncBlogs(for: account, success: { /* Do nothing */ }, failure: { _ in /* Do nothing */ }) + BlogSyncFacade() + .syncBlogs(for: account, success: { /* Do nothing */ }, failure: { _ in /* Do nothing */ }) } return true @@ -224,12 +235,20 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { GutenbergSettings().performGutenbergPhase2MigrationIfNeeded() } - public func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { + public func application( + _ application: UIApplication, + performActionFor shortcutItem: UIApplicationShortcutItem, + completionHandler: @escaping (Bool) -> Void + ) { let handler = WP3DTouchShortcutHandler() completionHandler(handler.handleShortcutItem(shortcutItem)) } - public func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { + public func application( + _ application: UIApplication, + handleEventsForBackgroundURLSession identifier: String, + completionHandler: @escaping () -> Void + ) { // 21-Oct-2017: We are only handling background URLSessions initiated by the share extension so there // is no need to inspect the identifier beyond the simple check here. let appGroupName = BuildSettings.current.appGroupName @@ -240,7 +259,11 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { } } - public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + public func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb { handleWebActivity(userActivity) } else { @@ -253,9 +276,13 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { // Note that this method only appears to be called for iPhone devices, not iPad. // This allows individual view controllers to cancel rotation if they need to. - public func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { + public func application( + _ application: UIApplication, + supportedInterfaceOrientationsFor window: UIWindow? + ) -> UIInterfaceOrientationMask { if let vc = window?.topmostPresentedViewController, - vc is OrientationLimited { + vc is OrientationLimited + { return vc.supportedInterfaceOrientations } @@ -281,13 +308,13 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { toggleExtraDebuggingIfNeeded() } -#if DEBUG + #if DEBUG KeychainTools.processKeychainDebugArguments() // Zendesk Logging CoreLogger.enabled = true CoreLogger.logLevel = .debug -#endif + #endif ZendeskUtils.setup() @@ -301,11 +328,12 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { } // Deferred tasks to speed up app launch - DispatchQueue.global(qos: .background).async { [weak self] in - self?.mergeDuplicateAccountsIfNeeded() - MediaCoordinator.shared.refreshMediaStatus() - MediaFileManager.clearUnusedMediaUploadFiles(onCompletion: nil, onError: nil) - } + DispatchQueue.global(qos: .background) + .async { [weak self] in + self?.mergeDuplicateAccountsIfNeeded() + MediaCoordinator.shared.refreshMediaStatus() + MediaFileManager.clearUnusedMediaUploadFiles(onCompletion: nil, onError: nil) + } DispatchQueue.main.asyncAfter(deadline: .now() + 3) { PostCoordinator.shared.initializeSync() @@ -352,29 +380,37 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { // MARK: - Helpers var runningInBackground: Bool { - return UIApplication.shared.applicationState == .background + UIApplication.shared.applicationState == .background } } /// Declares Notification Names extension Foundation.Notification.Name { static var applicationLaunchCompleted: Foundation.NSNotification.Name { - return Foundation.Notification.Name("org.wordpress.startup.completed") + Foundation.Notification.Name("org.wordpress.startup.completed") } } // MARK: - Push Notification Delegate extension WordPressAppDelegate { - public func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + public func application( + _ application: UIApplication, + didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data + ) { PushNotificationsManager.shared.registerDeviceToken(deviceToken) } - public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) + { PushNotificationsManager.shared.registrationDidFail(error as NSError) } - public func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + public func application( + _ application: UIApplication, + didReceiveRemoteNotification userInfo: [AnyHashable: Any], + fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void + ) { Loggers.app.info("\(self) \(#function)") PushNotificationsManager.shared.application( application, @@ -405,7 +441,12 @@ extension WordPressAppDelegate { func configureSelfHostedChallengeHandler() { WordPressOrgXMLRPCApi.onChallenge = { challenge, completionHandler in - guard let alertController = HTTPAuthenticationAlertController.controller(for: challenge, handler: completionHandler) else { + guard + let alertController = HTTPAuthenticationAlertController.controller( + for: challenge, + handler: completionHandler + ) + else { completionHandler(.performDefaultHandling, nil) return } @@ -433,25 +474,28 @@ extension WordPressAppDelegate { } func present(selfHostedSite blog: Blog, from navigationController: UINavigationController) { - self.authManager?.presentLoginEpilogue(in: navigationController, forSelfHostedSite: blog, source: nil) { - // Do nothing. - } + self.authManager? + .presentLoginEpilogue(in: navigationController, forSelfHostedSite: blog, source: nil) { + // Do nothing. + } } func handleWebActivity(_ activity: NSUserActivity) { // try to handle unauthenticated routes first. if activity.activityType == NSUserActivityTypeBrowsingWeb, - let url = activity.webpageURL, - UniversalLinkRouter.unauthenticated.canHandle(url: url) { + let url = activity.webpageURL, + UniversalLinkRouter.unauthenticated.canHandle(url: url) + { UniversalLinkRouter.unauthenticated.handle(url: url) return } guard AccountHelper.isLoggedIn, activity.activityType == NSUserActivityTypeBrowsingWeb, - let url = activity.webpageURL else { - FailureNavigationAction().failAndBounce(activity.webpageURL) - return + let url = activity.webpageURL + else { + FailureNavigationAction().failAndBounce(activity.webpageURL) + return } if QRLoginCoordinator.didHandle(url: url) { @@ -468,7 +512,8 @@ extension WordPressAppDelegate { /// /// Read more: https://github.com/wordpress-mobile/WordPress-iOS/issues/19755 if MigrationAppDetection.isCounterpartAppInstalled, - WPAdminConvertibleRouter.shared.canHandle(url: url) { + WPAdminConvertibleRouter.shared.canHandle(url: url) + { WPAdminConvertibleRouter.shared.handle(url: url) return } @@ -477,7 +522,9 @@ extension WordPressAppDelegate { } @objc func configureWordPressComApi() { - if let baseUrl = UserPersistentStoreFactory.instance().string(forKey: "wpcom-api-base-url"), let url = URL(string: baseUrl) { + if let baseUrl = UserPersistentStoreFactory.instance().string(forKey: "wpcom-api-base-url"), + let url = URL(string: baseUrl) + { AppEnvironment.replaceEnvironment(wordPressComApiBase: url) } } @@ -645,20 +692,26 @@ extension WordPressAppDelegate { func addNotificationObservers() { let nc = NotificationCenter.default - nc.addObserver(self, - selector: #selector(handleDefaultAccountChangedNotification(_:)), - name: NSNotification.Name.wpAccountDefaultWordPressComAccountChanged, - object: nil) + nc.addObserver( + self, + selector: #selector(handleDefaultAccountChangedNotification(_:)), + name: NSNotification.Name.wpAccountDefaultWordPressComAccountChanged, + object: nil + ) - nc.addObserver(self, - selector: #selector(handleLowMemoryWarningNotification(_:)), - name: UIApplication.didReceiveMemoryWarningNotification, - object: nil) + nc.addObserver( + self, + selector: #selector(handleLowMemoryWarningNotification(_:)), + name: UIApplication.didReceiveMemoryWarningNotification, + object: nil + ) - nc.addObserver(self, - selector: #selector(saveRecentSitesForExtensions), - name: .WPRecentSitesChanged, - object: nil) + nc.addObserver( + self, + selector: #selector(saveRecentSitesForExtensions), + name: .WPRecentSitesChanged, + object: nil + ) } @objc fileprivate func handleDefaultAccountChangedNotification(_ notification: NSNotification) { @@ -726,7 +779,9 @@ extension WordPressAppDelegate { func configureNotificationExtension() { - if let account = try? WPAccount.lookupDefaultWordPressComAccount(in: mainContext), let authToken = account.authToken, let userID = account.userID { + if let account = try? WPAccount.lookupDefaultWordPressComAccount(in: mainContext), + let authToken = account.authToken, let userID = account.userID + { let service = NotificationSupportService() service.storeToken(authToken) service.storeUsername(account.username) @@ -773,8 +828,10 @@ extension WordPressAppDelegate { // Get the Apple User ID from the keychain let appleUserID: String do { - appleUserID = try SFHFKeychainUtils.getPasswordForUsername(WPAppleIDKeychainUsernameKey, - andServiceName: WPAppleIDKeychainServiceName) + appleUserID = try SFHFKeychainUtils.getPasswordForUsername( + WPAppleIDKeychainUsernameKey, + andServiceName: WPAppleIDKeychainServiceName + ) } catch { Loggers.app.info("checkAppleIDCredentialState: No Apple ID found.") return @@ -793,7 +850,9 @@ extension WordPressAppDelegate { // An error exists only for the notFound state. // notFound is a valid state when logging in with an Apple account for the first time. if let error { - Loggers.app.debug("checkAppleIDCredentialState: Apple ID state not found: \(error.localizedDescription)") + Loggers.app.debug( + "checkAppleIDCredentialState: Apple ID state not found: \(error.localizedDescription)" + ) } break } @@ -826,8 +885,10 @@ extension WordPressAppDelegate { func removeAppleIDFromKeychain() { do { - try SFHFKeychainUtils.deleteItem(forUsername: WPAppleIDKeychainUsernameKey, - andServiceName: WPAppleIDKeychainServiceName) + try SFHFKeychainUtils.deleteItem( + forUsername: WPAppleIDKeychainUsernameKey, + andServiceName: WPAppleIDKeychainServiceName + ) } catch let error as NSError { if error.code != errSecItemNotFound { Loggers.app.error("Error while removing Apple User ID from keychain: \(error.localizedDescription)") @@ -846,14 +907,21 @@ extension WordPressAppDelegate { } let service = WordPressComSyncService() - service.syncWPCom(authToken: "valid_token", isJetpackLogin: false, onSuccess: { _ in - if let blog = try? BlogQuery().hostname(containing: wpComSiteAddress).blog(in: ContextManager.shared.mainContext) { - self.windowManager.showUI(for: blog) - } else { - fatalError("Can't find blog: \(wpComSiteAddress)") + service.syncWPCom( + authToken: "valid_token", + isJetpackLogin: false, + onSuccess: { _ in + if let blog = try? BlogQuery().hostname(containing: wpComSiteAddress) + .blog(in: ContextManager.shared.mainContext) + { + self.windowManager.showUI(for: blog) + } else { + fatalError("Can't find blog: \(wpComSiteAddress)") + } + }, + onFailure: { + fatalError("Can't sync blogs: \($0)") } - }, onFailure: { - fatalError("Can't sync blogs: \($0)") - }) + ) } } diff --git a/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift b/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift index 2ce03798aae6..52afbf52a2f1 100644 --- a/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift +++ b/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift @@ -24,7 +24,7 @@ public final class PushNotificationsManager: NSObject { /// @objc public var deviceToken: String? { get { - return UserPersistentStoreFactory.instance().string(forKey: Device.tokenKey) ?? String() + UserPersistentStoreFactory.instance().string(forKey: Device.tokenKey) ?? String() } set { UserPersistentStoreFactory.instance().set(newValue, forKey: Device.tokenKey) @@ -35,7 +35,7 @@ public final class PushNotificationsManager: NSObject { /// @objc public var deviceId: String? { get { - return UserPersistentStoreFactory.instance().string(forKey: Device.idKey) ?? String() + UserPersistentStoreFactory.instance().string(forKey: Device.idKey) ?? String() } set { UserPersistentStoreFactory.instance().set(newValue, forKey: Device.idKey) @@ -45,13 +45,13 @@ public final class PushNotificationsManager: NSObject { /// Returns the SharedApplication instance. This is meant for Unit Testing purposes. /// @objc public var sharedApplication: UIApplication { - return UIApplication.shared + UIApplication.shared } /// Returns the Application Execution State. This is meant for Unit Testing purposes. /// @objc public var applicationState: UIApplication.State { - return sharedApplication.applicationState + sharedApplication.applicationState } private var didRegisterForRemoteNotifications = false @@ -82,11 +82,12 @@ public final class PushNotificationsManager: NSObject { /// Checks asynchronously if Notifications are enabled in the Device's Settings, or not. /// @objc public func loadAuthorizationStatus(completion: @escaping ((_ authorized: UNAuthorizationStatus) -> Void)) { - UNUserNotificationCenter.current().getNotificationSettings { settings in - DispatchQueue.main.async { - completion(settings.authorizationStatus) + UNUserNotificationCenter.current() + .getNotificationSettings { settings in + DispatchQueue.main.async { + completion(settings.authorizationStatus) + } } - } } // MARK: - Token Setup @@ -119,12 +120,16 @@ public final class PushNotificationsManager: NSObject { // Register against WordPress.com let noteService = NotificationSettingsService(coreDataStack: ContextManager.shared) - noteService.registerDeviceForPushNotifications(newToken, success: { deviceId in - DDLogVerbose("Successfully registered Device ID \(deviceId) for Push Notifications") - self.deviceId = deviceId - }, failure: { error in - DDLogError("Unable to register Device for Push Notifications: \(error)") - }) + noteService.registerDeviceForPushNotifications( + newToken, + success: { deviceId in + DDLogVerbose("Successfully registered Device ID \(deviceId) for Push Notifications") + self.deviceId = deviceId + }, + failure: { error in + DDLogError("Unable to register Device for Push Notifications: \(error)") + } + ) } /// Perform cleanup when the registration for iOS notifications failed @@ -162,14 +167,18 @@ public final class PushNotificationsManager: NSObject { wordPressComRestApi: WordPressComRestApi.defaultV2Api(in: ContextManager.shared.mainContext) ) - noteService.unregisterDeviceForPushNotifications(knownDeviceId, success: { - DDLogInfo("Successfully unregistered Device ID \(knownDeviceId) for Push Notifications!") + noteService.unregisterDeviceForPushNotifications( + knownDeviceId, + success: { + DDLogInfo("Successfully unregistered Device ID \(knownDeviceId) for Push Notifications!") - self.deviceToken = nil - self.deviceId = nil - }, failure: { error in - DDLogError("Unable to unregister push for Device ID \(knownDeviceId): \(error)") - }) + self.deviceToken = nil + self.deviceId = nil + }, + failure: { error in + DDLogError("Unable to unregister push for Device ID \(knownDeviceId): \(error)") + } + ) } // MARK: - Handling Notifications @@ -181,7 +190,11 @@ public final class PushNotificationsManager: NSObject { /// - userInteraction: Indicates if the user interacted with the Push Notification /// - completionHandler: A callback, to be executed on completion /// - @objc public func handleNotification(_ userInfo: NSDictionary, userInteraction: Bool = false, completionHandler: ((UIBackgroundFetchResult) -> Void)?) { + @objc public func handleNotification( + _ userInfo: NSDictionary, + userInteraction: Bool = false, + completionHandler: ((UIBackgroundFetchResult) -> Void)? + ) { DDLogVerbose("Received push notification:\nPayload: \(userInfo)\n") DDLogVerbose("Current Application state: \(applicationState.rawValue)") @@ -196,10 +209,12 @@ public final class PushNotificationsManager: NSObject { } // Handling! - let handlers = [handleSupportNotification, - handleAuthenticationNotification, - handleInactiveNotification, - handleBackgroundNotification] + let handlers = [ + handleSupportNotification, + handleAuthenticationNotification, + handleInactiveNotification, + handleBackgroundNotification + ] for handler in handlers { if handler(userInfo, userInteraction, completionHandler) { @@ -215,7 +230,8 @@ public final class PushNotificationsManager: NSObject { func trackNotification(with userInfo: NSDictionary, response: UNNotificationResponse? = nil) { let event: WPAnalyticsStat? = { if let response { - return response.actionIdentifier == UNNotificationDefaultActionIdentifier ? .pushNotificationAlertPressed : nil + return response.actionIdentifier == UNNotificationDefaultActionIdentifier + ? .pushNotificationAlertPressed : nil } return .pushNotificationReceived }() @@ -245,7 +261,12 @@ public final class PushNotificationsManager: NSObject { private func registerForNotifications() { let notificationCenter = NotificationCenter.default - notificationCenter.addObserver(self, selector: #selector(setupRemoteNotifications), name: .WPAppUITypeChanged, object: nil) + notificationCenter.addObserver( + self, + selector: #selector(setupRemoteNotifications), + name: .WPAppUITypeChanged, + object: nil + ) } } @@ -264,11 +285,16 @@ extension PushNotificationsManager { /// /// - Returns: True when handled. False otherwise /// - @objc public func handleSupportNotification(_ userInfo: NSDictionary, userInteraction: Bool, completionHandler: ((UIBackgroundFetchResult) -> Void)?) -> Bool { + @objc public func handleSupportNotification( + _ userInfo: NSDictionary, + userInteraction: Bool, + completionHandler: ((UIBackgroundFetchResult) -> Void)? + ) -> Bool { guard let type = userInfo.string(forKey: ZendeskUtils.PushNotificationIdentifiers.key), - type == ZendeskUtils.PushNotificationIdentifiers.type else { - return false + type == ZendeskUtils.PushNotificationIdentifiers.type + else { + return false } DispatchQueue.main.async { ZendeskUtils.pushNotificationReceived() @@ -296,7 +322,11 @@ extension PushNotificationsManager { /// /// - Returns: True when handled. False otherwise /// - @objc public func handleAuthenticationNotification(_ userInfo: NSDictionary, userInteraction: Bool, completionHandler: ((UIBackgroundFetchResult) -> Void)?) -> Bool { + @objc public func handleAuthenticationNotification( + _ userInfo: NSDictionary, + userInteraction: Bool, + completionHandler: ((UIBackgroundFetchResult) -> Void)? + ) -> Bool { // WordPress.com Push Authentication Notification // Due to the Background Notifications entitlement, any given Push Notification's userInfo might be received // while the app is in BG, and when it's about to become active. In order to prevent UI glitches, let's skip @@ -320,7 +350,9 @@ extension PushNotificationsManager { if applicationState != .background || userInteraction { authenticationManager.handleAuthenticationNotification(userInfo) } else { - DDLogInfo("Skipping handling authentication notification due to app being in background or user not interacting with it.") + DDLogInfo( + "Skipping handling authentication notification due to app being in background or user not interacting with it." + ) } completionHandler?(.newData) @@ -353,7 +385,11 @@ extension PushNotificationsManager { /// /// - Returns: True when handled. False otherwise /// - @objc public func handleInactiveNotification(_ userInfo: NSDictionary, userInteraction: Bool, completionHandler: ((UIBackgroundFetchResult) -> Void)?) -> Bool { + @objc public func handleInactiveNotification( + _ userInfo: NSDictionary, + userInteraction: Bool, + completionHandler: ((UIBackgroundFetchResult) -> Void)? + ) -> Bool { guard applicationState == .inactive else { return false } @@ -379,7 +415,11 @@ extension PushNotificationsManager { /// /// - Returns: True when handled. False otherwise /// - @objc public func handleBackgroundNotification(_ userInfo: NSDictionary, userInteraction: Bool, completionHandler: ((UIBackgroundFetchResult) -> Void)?) -> Bool { + @objc public func handleBackgroundNotification( + _ userInfo: NSDictionary, + userInteraction: Bool, + completionHandler: ((UIBackgroundFetchResult) -> Void)? + ) -> Bool { guard userInfo.number(forKey: Notification.identifierKey)?.stringValue != nil else { return false } @@ -410,7 +450,11 @@ extension PushNotificationsManager { extension PushNotificationsManager: UIApplicationDelegate { - public func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + public func application( + _ application: UIApplication, + didReceiveRemoteNotification userInfo: [AnyHashable: Any], + fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void + ) { let dictionary = userInfo as NSDictionary self.trackNotification(with: dictionary) self.handleNotification(dictionary, completionHandler: completionHandler) diff --git a/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift b/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift index 39b536e22b2a..47b46d1fd4cf 100644 --- a/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift +++ b/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift @@ -26,7 +26,11 @@ import WordPressUI // MARK: - Lifecycle Methods - @objc public init(service: PublicizeService, connections: [KeyringConnection], existingConnections: [PublicizeConnection]?) { + @objc public init( + service: PublicizeService, + connections: [KeyringConnection], + existingConnections: [PublicizeConnection]? + ) { publicizeService = service keyringConnections = connections existingPublicizeConnections = existingConnections @@ -54,7 +58,12 @@ import WordPressUI /// fileprivate func configureNavbar() { let image = UIImage.gridicon(.cross) - let closeButton = UIBarButtonItem(image: image, style: .plain, target: self, action: #selector(SharingAccountViewController.handleCloseTapped(_:))) + let closeButton = UIBarButtonItem( + image: image, + style: .plain, + target: self, + action: #selector(SharingAccountViewController.handleCloseTapped(_:)) + ) closeButton.tintColor = UIAppColor.appBarTint navigationItem.leftBarButtonItem = closeButton } @@ -70,10 +79,15 @@ import WordPressUI } fileprivate func showNoResultsViewController() { - let title = NSLocalizedString("No Accounts Found", - comment: "Title of an error message. There were no third-party service accounts found to setup sharing.") - let message = NSLocalizedString("Sorry. The social service did not tell us which account could be used for sharing.", - comment: "An error message shown if a third-party social service does not specify any accounts that an be used with publicize sharing.") + let title = NSLocalizedString( + "No Accounts Found", + comment: "Title of an error message. There were no third-party service accounts found to setup sharing." + ) + let message = NSLocalizedString( + "Sorry. The social service did not tell us which account could be used for sharing.", + comment: + "An error message shown if a third-party social service does not specify any accounts that an be used with publicize sharing." + ) noResultsViewController.configure(title: title, subtitle: message) } @@ -111,7 +125,10 @@ import WordPressUI // Build the section for connected accounts rows = rowsForConnectedKeyringAccounts(connectedAccounts) if !rows.isEmpty { - let title = NSLocalizedString("Connected", comment: "Adjective. The title of a list of third-part sharing service account names.") + let title = NSLocalizedString( + "Connected", + comment: "Adjective. The title of a list of third-part sharing service account names." + ) let section = ImmuTableSection(headerText: title, rows: rows, footerText: nil) sections.append(section) } @@ -130,11 +147,21 @@ import WordPressUI return nil } - var title = NSLocalizedString("Connecting %@", comment: "Connecting is a verb. Title of Publicize account selection. The %@ is a placeholder for the service's name") + var title = NSLocalizedString( + "Connecting %@", + comment: + "Connecting is a verb. Title of Publicize account selection. The %@ is a placeholder for the service's name" + ) title = NSString(format: title as NSString, publicizeService.label) as String - let manyAccountFooter = NSLocalizedString("Select the account you would like to authorize. Note that your posts will be automatically shared to the selected account.", comment: "Instructional text about the Sharing feature.") - let oneAccountFooter = NSLocalizedString("Confirm this is the account you would like to authorize. Note that your posts will be automatically shared to this account.", comment: "Instructional text about the Sharing feature.") + let manyAccountFooter = NSLocalizedString( + "Select the account you would like to authorize. Note that your posts will be automatically shared to the selected account.", + comment: "Instructional text about the Sharing feature." + ) + let oneAccountFooter = NSLocalizedString( + "Confirm this is the account you would like to authorize. Note that your posts will be automatically shared to this account.", + comment: "Instructional text about the Sharing feature." + ) let footer = rows.count > 1 ? manyAccountFooter : oneAccountFooter return ImmuTableSection(headerText: title, rows: rows, footerText: footer) @@ -164,12 +191,15 @@ import WordPressUI /// - Returns: An ImmuTableAction instance. /// fileprivate func actionForRow(_ keyringAccount: KeyringAccount) -> ImmuTableAction { - return { [unowned self] _ in + { [unowned self] _ in self.tableView.deselectSelectedRowWithAnimation(true) - self.delegate?.sharingAccountViewController(self, - selectedKeyringConnection: keyringAccount.keyringConnection, - externalID: keyringAccount.externalID) + self.delegate? + .sharingAccountViewController( + self, + selectedKeyringConnection: keyringAccount.keyringConnection, + externalID: keyringAccount.externalID + ) } } @@ -202,10 +232,11 @@ import WordPressUI let keyringConnection = keyringAccount.keyringConnection for existingConnection in existingConnections { - if existingConnection.keyringConnectionID == keyringConnection.keyringID && - existingConnection.keyringConnectionUserID == keyringConnection.userID && - existingConnection.externalID == keyringAccount.externalIDForConnection { - return true + if existingConnection.keyringConnectionID == keyringConnection.keyringID + && existingConnection.keyringConnectionUserID == keyringConnection.userID + && existingConnection.externalID == keyringAccount.externalIDForConnection + { + return true } } @@ -244,5 +275,9 @@ import WordPressUI /// @objc public protocol SharingAccountSelectionDelegate: NSObjectProtocol { func didDismissSharingAccountViewController(_ controller: SharingAccountViewController) - func sharingAccountViewController(_ controller: SharingAccountViewController, selectedKeyringConnection keyringConnection: KeyringConnection, externalID: String?) + func sharingAccountViewController( + _ controller: SharingAccountViewController, + selectedKeyringConnection keyringConnection: KeyringConnection, + externalID: String? + ) } diff --git a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift index 1d54514fe65b..2ef5fe682859 100644 --- a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift +++ b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift @@ -17,8 +17,11 @@ extension SiteSettingsViewController { let onChange: (WordPress.SiteVisibility) -> Void var body: some View { - SettingsPickerListView(selection: $selection, values: WordPress.SiteVisibility.eligiblePickerValues(for: blog)) - .onChange(of: selection, perform: onChange) + SettingsPickerListView( + selection: $selection, + values: WordPress.SiteVisibility.eligiblePickerValues(for: blog) + ) + .onChange(of: selection, perform: onChange) } } let view = SiteSettingsPrivacyPicker(blog: blog, selection: blog.siteVisibility) { [weak self] in @@ -34,20 +37,20 @@ extension SiteSettingsViewController { @objc(showStartOverForBlog:) public func showStartOver(for blog: Blog) { - wpAssert(blog.supports(.siteManagement)) + wpAssert(blog.supports(.siteManagement)) - WPAppAnalytics.track(.siteSettingsStartOverAccessed, blog: blog) + WPAppAnalytics.track(.siteSettingsStartOverAccessed, blog: blog) - if SupportConfiguration.isStartOverSupportEnabled && blog.hasPaidPlan { - let startOverVC = StartOverViewController(blog: blog) - navigationController?.pushViewController(startOverVC, animated: true) - } else { - guard let targetURL = Constants.emptySiteSupportURL else { return } + if SupportConfiguration.isStartOverSupportEnabled && blog.hasPaidPlan { + let startOverVC = StartOverViewController(blog: blog) + navigationController?.pushViewController(startOverVC, animated: true) + } else { + guard let targetURL = Constants.emptySiteSupportURL else { return } - let webVC = WebViewControllerFactory.controller(url: targetURL, source: "site_settings_start_over") - let navigationVC = UINavigationController(rootViewController: webVC) - present(navigationVC, animated: true, completion: nil) - } + let webVC = WebViewControllerFactory.controller(url: targetURL, source: "site_settings_start_over") + let navigationVC = UINavigationController(rootViewController: webVC) + present(navigationVC, animated: true, completion: nil) + } } @objc public func showTagList() { @@ -66,7 +69,12 @@ extension SiteSettingsViewController { value: "Taxonomies Management", comment: "Feature name for managing terms and taxonomies in the app" ) - let rootView = ApplicationPasswordRequiredView(blog: self.blog, localizedFeatureName: feature, source: "taxonomies", presentingViewController: self) { client in + let rootView = ApplicationPasswordRequiredView( + blog: self.blog, + localizedFeatureName: feature, + source: "taxonomies", + presentingViewController: self + ) { client in SiteCustomTaxonomiesView(blog: self.blog, client: client) } viewController = UIHostingController(rootView: rootView) @@ -93,11 +101,12 @@ extension SiteSettingsViewController { if let timezoneString = settings.timezoneString?.nonEmptyString() { // Try to get a localized name from the system if let timeZone = TimeZone(identifier: timezoneString), - let name = timeZone.localizedName(for: .generic, locale: .current) { + let name = timeZone.localizedName(for: .generic, locale: .current) + { let formatter = DateFormatter() formatter.timeZone = timeZone - formatter.dateFormat = "ZZZZ" // "GMT-05:00" + formatter.dateFormat = "ZZZZ" // "GMT-05:00" let offsetString = formatter.string(from: Date()) return "\(name) (\(offsetString))" @@ -120,7 +129,11 @@ extension SiteSettingsViewController { // MARK: - Homepage Settings @objc public var homepageSettingsCell: SettingTableViewCell? { - let cell = SettingTableViewCell(label: NSLocalizedString("Homepage Settings", comment: "Label for Homepage Settings site settings section"), editable: true, reuseIdentifier: nil) + let cell = SettingTableViewCell( + label: NSLocalizedString("Homepage Settings", comment: "Label for Homepage Settings site settings section"), + editable: true, + reuseIdentifier: nil + ) cell?.textValue = blog.homepageType?.title return cell } @@ -138,8 +151,11 @@ extension SiteSettingsViewController { self?.blog.settings?.gmtOffset = newValue.gmtOffset as NSNumber? self?.blog.settings?.timezoneString = newValue.timezoneString self?.saveSettings() - self?.trackSettingsChange(fieldName: "timezone", - value: newValue.value as Any) + self? + .trackSettingsChange( + fieldName: "timezone", + value: newValue.value as Any + ) } let controller = UIHostingController(rootView: view) navigationController?.pushViewController(controller, animated: true) @@ -154,8 +170,10 @@ extension SiteSettingsViewController { let pickerViewController = SettingsPickerViewController(style: .insetGrouped) pickerViewController.title = NSLocalizedString("Posts per Page", comment: "Posts per Page Title") pickerViewController.switchVisible = false - pickerViewController.selectionText = NSLocalizedString("The number of posts to show per page.", - comment: "Text above the selection of the number of posts to show per blog page") + pickerViewController.selectionText = NSLocalizedString( + "The number of posts to show per page.", + comment: "Text above the selection of the number of posts to show per blog page" + ) pickerViewController.pickerFormat = NSLocalizedString("%d posts", comment: "Number of posts") pickerViewController.pickerMinimumValue = minNumberOfPostPerPage if let currentValue = blog.settings?.postsPerPage as? Int { @@ -190,8 +208,10 @@ extension SiteSettingsViewController { @objc(getTrafficSettingsSectionFooterView) public func trafficSettingsSectionFooterView() -> UIView { let footer = makeFooterView() - footer.textLabel?.text = NSLocalizedString("Your WordPress.com site supports the use of Accelerated Mobile Pages, a Google-led initiative that dramatically speeds up loading times on mobile devices.", - comment: "Footer for AMP Traffic Site Setting, should match Calypso.") + footer.textLabel?.text = NSLocalizedString( + "Your WordPress.com site supports the use of Accelerated Mobile Pages, a Google-led initiative that dramatically speeds up loading times on mobile devices.", + comment: "Footer for AMP Traffic Site Setting, should match Calypso." + ) footer.textLabel?.isUserInteractionEnabled = true let tap = UITapGestureRecognizer(target: self, action: #selector(handleAMPFooterTap(_:))) @@ -202,7 +222,10 @@ extension SiteSettingsViewController { @objc(getBlockEditorSectionFooterView) public func blockEditorSectionFooterView() -> UIView { let footer = makeFooterView() - footer.textLabel?.text = NSLocalizedString("Edit new posts and pages with the block editor.", comment: "Explanation for the option to enable the block editor") + footer.textLabel?.text = NSLocalizedString( + "Edit new posts and pages with the block editor.", + comment: "Explanation for the option to enable the block editor" + ) return footer } @@ -242,15 +265,16 @@ extension SiteSettingsViewController { } } - override open func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) { + override open func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) + { WPStyleGuide.configureTableViewSectionFooter(view) } // MARK: Private Properties - fileprivate var minNumberOfPostPerPage: Int { return 1 } - fileprivate var maxNumberOfPostPerPage: Int { return 1000 } - fileprivate var ampSupportURL: String { return "https://support.wordpress.com/amp-accelerated-mobile-pages/" } + fileprivate var minNumberOfPostPerPage: Int { 1 } + fileprivate var maxNumberOfPostPerPage: Int { 1000 } + fileprivate var ampSupportURL: String { "https://support.wordpress.com/amp-accelerated-mobile-pages/" } } // MARK: - General Settings Table Section Management @@ -287,7 +311,8 @@ extension SiteSettingsViewController { @objc public func tableView(_ tableView: UITableView, cellForGeneralSettingsInRow row: Int) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCellReuseIdentifier) as! SettingTableViewCell + let cell = + tableView.dequeueReusableCell(withIdentifier: SettingsTableViewCellReuseIdentifier) as! SettingTableViewCell switch generalSettingsRows[row] { case .title: @@ -328,7 +353,9 @@ extension SiteSettingsViewController { // MARK: - Cell Configuration private func configureCellForTitle(_ cell: SettingTableViewCell) { - let name = blog.settings?.name ?? NSLocalizedString("A title for the site", comment: "Placeholder text for the title of a site") + let name = + blog.settings?.name + ?? NSLocalizedString("A title for the site", comment: "Placeholder text for the title of a site") cell.editable = blog.isAdmin cell.textLabel?.text = NSLocalizedString("Site Title", comment: "Label for site title blog setting") @@ -336,7 +363,12 @@ extension SiteSettingsViewController { } private func configureCellForTagline(_ cell: SettingTableViewCell) { - let tagline = blog.settings?.tagline ?? NSLocalizedString("Explain what this site is about.", comment: "Placeholder text for the tagline of a site") + let tagline = + blog.settings?.tagline + ?? NSLocalizedString( + "Explain what this site is about.", + comment: "Placeholder text for the tagline of a site" + ) cell.editable = blog.isAdmin cell.textLabel?.text = NSLocalizedString("Tagline", comment: "Label for tagline blog setting") @@ -346,7 +378,10 @@ extension SiteSettingsViewController { private func configureCellForURL(_ cell: SettingTableViewCell) { let url: String = { guard let url = blog.url else { - return NSLocalizedString("http://my-site-address (URL)", comment: "(placeholder) Help the user enter a URL into the field") + return NSLocalizedString( + "http://my-site-address (URL)", + comment: "(placeholder) Help the user enter a URL into the field" + ) } return url @@ -371,7 +406,10 @@ extension SiteSettingsViewController { } else { // Since the settings can be nil, we need to handle the scenario... but it // really should not be possible to reach this line. - name = NSLocalizedString("Undefined", comment: "When the App can't figure out what language a blog is configured to use.") + name = NSLocalizedString( + "Undefined", + comment: "When the App can't figure out what language a blog is configured to use." + ) } cell.editable = blog.isAdmin @@ -395,12 +433,17 @@ extension SiteSettingsViewController { let siteTitleViewController = SettingsTextViewController( text: blog.settings?.name ?? "", placeholder: NSLocalizedString("A title for the site", comment: "Placeholder text for the title of a site"), - hint: "") + hint: "" + ) - siteTitleViewController.title = NSLocalizedString("Site Title", comment: "Title for screen that show site title editor") + siteTitleViewController.title = NSLocalizedString( + "Site Title", + comment: "Title for screen that show site title editor" + ) siteTitleViewController.onValueChanged = { [weak self] value in guard let self, - let cell = self.tableView.cellForRow(at: indexPath) else { + let cell = self.tableView.cellForRow(at: indexPath) + else { // No need to update anything if the cell doesn't exist. return } @@ -425,13 +468,24 @@ extension SiteSettingsViewController { let siteTaglineViewController = SettingsTextViewController( text: blog.settings?.tagline ?? "", - placeholder: NSLocalizedString("Explain what this site is about.", comment: "Placeholder text for the tagline of a site"), - hint: NSLocalizedString("In a few words, explain what this site is about.", comment: "Explain what is the purpose of the tagline")) + placeholder: NSLocalizedString( + "Explain what this site is about.", + comment: "Placeholder text for the tagline of a site" + ), + hint: NSLocalizedString( + "In a few words, explain what this site is about.", + comment: "Explain what is the purpose of the tagline" + ) + ) - siteTaglineViewController.title = NSLocalizedString("Tagline", comment: "Title for screen that show tagline editor") + siteTaglineViewController.title = NSLocalizedString( + "Tagline", + comment: "Title for screen that show tagline editor" + ) siteTaglineViewController.onValueChanged = { [weak self] value in guard let self, - let cell = self.tableView.cellForRow(at: indexPath) else { + let cell = self.tableView.cellForRow(at: indexPath) + else { // No need to update anything if the cell doesn't exist. return } @@ -451,26 +505,35 @@ extension SiteSettingsViewController { } func trackSettingsChange(fieldName: String, value: Any? = nil) { - WPAnalytics.trackSettingsChange("site_settings", - fieldName: fieldName, - value: value) + WPAnalytics.trackSettingsChange( + "site_settings", + fieldName: fieldName, + value: value + ) } } private extension SiteSettingsViewController { enum Strings { - static let privacyTitle = NSLocalizedString("siteSettings.privacy.title", value: "Privacy", comment: "Title for screen to select the privacy options for a blog") + static let privacyTitle = NSLocalizedString( + "siteSettings.privacy.title", + value: "Privacy", + comment: "Title for screen to select the privacy options for a blog" + ) static let themeStylesFooterBlockThemeSuggested = NSLocalizedString( "siteSettings.themeStyles.footer.blockThemeSuggested", - value: "Your site isn't using a Block Theme, so the editor might not match your content correctly. If things aren't looking right, you can disable editor styles.", - comment: "Explanation for why the 'Use theme styles' toggle is disabled when the site doesn't have a block theme" + value: + "Your site isn't using a Block Theme, so the editor might not match your content correctly. If things aren't looking right, you can disable editor styles.", + comment: + "Explanation for why the 'Use theme styles' toggle is disabled when the site doesn't have a block theme" ) static let themeStylesFooterGutenbergRequired = NSLocalizedString( "siteSettings.themeStyles.footer.gutenbergRequired", value: "Install the Gutenberg Plugin on your site to activate theme style support.", - comment: "Explanation for why the 'Use theme styles' toggle is disabled when the site doesn't have the Gutenberg plugin" + comment: + "Explanation for why the 'Use theme styles' toggle is disabled when the site doesn't have the Gutenberg plugin" ) static let themeStylesFooterEnabled = NSLocalizedString( diff --git a/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift b/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift index a71c4dcd03c8..c5c0318f5629 100644 --- a/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift +++ b/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift @@ -18,9 +18,11 @@ class CompliancePopoverViewModel: ObservableObject { // MARK: - Init - init(defaults: UserDefaults, - contextManager: ContextManager, - analyticsTracker: PrivacySettingsAnalyticsTracking = PrivacySettingsAnalyticsTracker()) { + init( + defaults: UserDefaults, + contextManager: ContextManager, + analyticsTracker: PrivacySettingsAnalyticsTracking = PrivacySettingsAnalyticsTracker() + ) { self.defaults = defaults self.analyticsTracker = analyticsTracker self.contextManager = contextManager diff --git a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift index 519ed70e2b85..df4204d1704d 100644 --- a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift +++ b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift @@ -44,14 +44,30 @@ class NotificationCommentDetailViewController: UIViewController, NoResultsViewHo // MARK: - Notification Navigation Buttons private lazy var nextButton: UIBarButtonItem = { - let button = UIBarButtonItem(image: UIImage(systemName: "chevron.up"), style: .plain, target: self, action: #selector(nextButtonTapped)) - button.accessibilityLabel = NSLocalizedString("Next notification", comment: "Accessibility label for the next notification button") + let button = UIBarButtonItem( + image: UIImage(systemName: "chevron.up"), + style: .plain, + target: self, + action: #selector(nextButtonTapped) + ) + button.accessibilityLabel = NSLocalizedString( + "Next notification", + comment: "Accessibility label for the next notification button" + ) return button }() private lazy var previousButton: UIBarButtonItem = { - let button = UIBarButtonItem(image: UIImage(systemName: "chevron.down"), style: .plain, target: self, action: #selector(previousButtonTapped)) - button.accessibilityLabel = NSLocalizedString("Previous notification", comment: "Accessibility label for the previous notification button") + let button = UIBarButtonItem( + image: UIImage(systemName: "chevron.down"), + style: .plain, + target: self, + action: #selector(previousButtonTapped) + ) + button.accessibilityLabel = NSLocalizedString( + "Previous notification", + comment: "Accessibility label for the previous notification button" + ) return button }() @@ -67,13 +83,17 @@ class NotificationCommentDetailViewController: UIViewController, NoResultsViewHo } } - private let errorTitle = NSLocalizedString("Error loading the comment", - comment: "Text displayed when there is a failure loading notification comments.") + private let errorTitle = NSLocalizedString( + "Error loading the comment", + comment: "Text displayed when there is a failure loading notification comments." + ) // MARK: - Init - init(notification: WordPressData.Notification, - notificationDelegate: CommentDetailsNotificationDelegate) { + init( + notification: WordPressData.Notification, + notificationDelegate: CommentDetailsNotificationDelegate + ) { self.notification = notification self.notificationDelegate = notificationDelegate super.init(nibName: nil, bundle: nil) @@ -168,27 +188,35 @@ private extension NotificationCommentDetailViewController { return } - self.fetchParentCommentIfNeeded(completion: { - self.fetchComment(self.commentID, completion: { comment in - guard let comment else { - self.showErrorView(title: NoResults.errorTitle, subtitle: NoResults.errorSubtitle) - return - } - self.comment = comment - }, failure: { error in + self.fetchParentCommentIfNeeded( + completion: { + self.fetchComment( + self.commentID, + completion: { comment in + guard let comment else { + self.showErrorView(title: NoResults.errorTitle, subtitle: NoResults.errorSubtitle) + return + } + self.comment = comment + }, + failure: { error in + self.showErrorView(error: error) + } + ) + }, + failure: { error in self.showErrorView(error: error) - }) - }, failure: { error in - self.showErrorView(error: error) - }) + } + ) }) } private func showErrorView(error: Error?) { let errorMessage: String? = { guard let error = error as? NSError, - error.domain == WordPressComRestApiEndpointError.errorDomain, - error.code == WordPressComRestApiErrorCode.authorizationRequired.rawValue else { + error.domain == WordPressComRestApiEndpointError.errorDomain, + error.code == WordPressComRestApiErrorCode.authorizationRequired.rawValue + else { return nil } return Strings.fetchCommentDetailsFromPrivateBlogErrorMessage @@ -200,11 +228,12 @@ private extension NotificationCommentDetailViewController { // The post is only needed if there is no Blog. guard blog == nil, - let postID = notification.metaPostID, - let siteID = notification.metaSiteID else { - completion() - return - } + let postID = notification.metaPostID, + let siteID = notification.metaSiteID + else { + completion() + return + } if let post = try? ReaderPost.lookup(withID: postID, forSiteWithID: siteID, in: managedObjectContext) { self.post = post @@ -212,16 +241,19 @@ private extension NotificationCommentDetailViewController { return } - postService.fetchPost(postID.uintValue, - forSite: siteID.uintValue, - isFeed: false, - success: { [weak self] post in - self?.post = post - completion() - }, failure: { [weak self] _ in - self?.post = nil - completion() - }) + postService.fetchPost( + postID.uintValue, + forSite: siteID.uintValue, + isFeed: false, + success: { [weak self] post in + self?.post = post + completion() + }, + failure: { [weak self] _ in + self?.post = nil + completion() + } + ) } func loadCommentFromCache(_ commentID: NSNumber?) -> Comment? { @@ -241,7 +273,11 @@ private extension NotificationCommentDetailViewController { return nil } - func fetchComment(_ commentID: NSNumber?, completion: @escaping (Comment?) -> Void, failure: @escaping (Error?) -> Void) { + func fetchComment( + _ commentID: NSNumber?, + completion: @escaping (Comment?) -> Void, + failure: @escaping (Error?) -> Void + ) { guard let commentID else { DDLogError("Notification Comment: unable to fetch comment due to missing commentID.") failure(nil) @@ -249,20 +285,30 @@ private extension NotificationCommentDetailViewController { } if let blog { - commentService.loadComment(withID: commentID, for: blog, success: { comment in - completion(comment) - }, failure: { error in - failure(error) - }) + commentService.loadComment( + withID: commentID, + for: blog, + success: { comment in + completion(comment) + }, + failure: { error in + failure(error) + } + ) return } if let post { - commentService.loadComment(withID: commentID, for: post, success: { comment in - completion(comment) - }, failure: { error in - failure(error) - }) + commentService.loadComment( + withID: commentID, + for: post, + success: { comment in + completion(comment) + }, + failure: { error in + failure(error) + } + ) return } @@ -272,10 +318,11 @@ private extension NotificationCommentDetailViewController { func fetchParentCommentIfNeeded(completion: @escaping () -> Void, failure: @escaping (Error?) -> Void) { // If the comment has a parent and it is not cached, fetch it so the details header is correct. guard let parentID = notification.metaParentID, - loadCommentFromCache(parentID) == nil else { - completion() - return - } + loadCommentFromCache(parentID) == nil + else { + completion() + return + } fetchComment(parentID, completion: { _ in completion() }, failure: { failure($0) }) } @@ -287,7 +334,11 @@ private extension NotificationCommentDetailViewController { detailsVC.showNoResultsView(title: "", accessoryView: NoResultsViewController.loadingAccessoryView()) } else { hideNoResults() - configureAndDisplayNoResults(on: view, title: "", accessoryView: NoResultsViewController.loadingAccessoryView()) + configureAndDisplayNoResults( + on: view, + title: "", + accessoryView: NoResultsViewController.loadingAccessoryView() + ) } } @@ -301,8 +352,14 @@ private extension NotificationCommentDetailViewController { } struct NoResults { - static let errorTitle = NSLocalizedString("Oops", comment: "Title for the view when there's an error loading a comment.") - static let errorSubtitle = NSLocalizedString("There was an error loading the comment.", comment: "Text displayed when there is a failure loading a comment.") + static let errorTitle = NSLocalizedString( + "Oops", + comment: "Title for the view when there's an error loading a comment." + ) + static let errorSubtitle = NSLocalizedString( + "There was an error loading the comment.", + comment: "Text displayed when there is a failure loading a comment." + ) static let imageName = "wp-illustration-notifications" } diff --git a/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift b/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift index 7a2a23333ab0..075ce7cabd7e 100644 --- a/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift +++ b/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift @@ -83,7 +83,7 @@ class InvitePersonViewController: UITableViewController { private var sortedInviteLinks: [InviteLinks] { let links = Array(blog.inviteLinks ?? []) return availableRoles.compactMap { role -> InviteLinks? in - return links.first { link -> Bool in + links.first { link -> Bool in link.role == role.slug } } @@ -212,7 +212,10 @@ class InvitePersonViewController: UITableViewController { guard Section.inviteLink == Section(rawValue: section) else { return nil } - return NSLocalizedString("Invite Link", comment: "Title for the Invite Link section of the Invite Person screen.") + return NSLocalizedString( + "Invite Link", + comment: "Title for the Invite Link section of the Invite Person screen." + ) } override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { @@ -220,7 +223,8 @@ class InvitePersonViewController: UITableViewController { var footerText = sectionType?.footerText if sectionType == .message, - let footerFormat = footerText { + let footerFormat = footerText + { footerText = String(format: footerFormat, messageCharacterLimit) } @@ -287,7 +291,10 @@ class InvitePersonViewController: UITableViewController { let title = NSLocalizedString("Recipient", comment: "Invite Person: Email or Username Edition Title") let placeholder = NSLocalizedString("Email or Username…", comment: "A placeholder for the username textfield.") - let hint = NSLocalizedString("Email or Username of the person that should receive your invitation.", comment: "Username Placeholder") + let hint = NSLocalizedString( + "Email or Username of the person that should receive your invitation.", + comment: "Username Placeholder" + ) textViewController.title = title textViewController.text = usernameOrEmail @@ -321,7 +328,10 @@ class InvitePersonViewController: UITableViewController { } let title = NSLocalizedString("Message", comment: "Invite Message Editor's Title") - let hintFormat = NSLocalizedString("Optional message up to %1$d characters to be included in the invitation.", comment: "Invite: Message Hint. %1$d is the maximum number of characters allowed.") + let hintFormat = NSLocalizedString( + "Optional message up to %1$d characters to be included in the invitation.", + comment: "Invite: Message Hint. %1$d is the maximum number of characters allowed." + ) let hint = String(format: hintFormat, messageCharacterLimit) textViewController.title = title @@ -368,11 +378,18 @@ class InvitePersonViewController: UITableViewController { return NSLocalizedString("Learn more about roles", comment: "Footer text for Invite People role field.") case .message: // messageCharacterLimit cannot be accessed here, so the caller will insert it in the string. - return NSLocalizedString("Optional: Enter a custom message up to %1$d characters to be sent with your invitation.", comment: "Footer text for Invite People message field. %1$d is the maximum number of characters allowed.") + return NSLocalizedString( + "Optional: Enter a custom message up to %1$d characters to be sent with your invitation.", + comment: + "Footer text for Invite People message field. %1$d is the maximum number of characters allowed." + ) case .inviteLink: - return NSLocalizedString("invite_people_invite_link_footer", - value: "Use this link to onboard your team members without having to invite them one by one. Anybody visiting this URL will be able to sign up to your organization, even if they received the link from somebody else, so make sure that you share it with trusted people.", - comment: "Footer text for Invite Links section of the Invite People screen.") + return NSLocalizedString( + "invite_people_invite_link_footer", + value: + "Use this link to onboard your team members without having to invite them one by one. Anybody visiting this URL will be able to sign up to your organization, even if they received the link from somebody else, so make sure that you share it with trusted people.", + comment: "Footer text for Invite Links section of the Invite People screen." + ) default: return nil } @@ -421,20 +438,29 @@ extension InvitePersonViewController { return } - service.sendInvitation(recipient, role: role, message: message, success: { - let success = NSLocalizedString("Invitation Sent!", comment: "The app successfully sent an invitation") - SVProgressHUD.showDismissibleSuccess(status: success) - - WPAnalytics.track(.peopleUserInvited, properties: ["role": role], blog: blog) - }, failure: { _ in - self.handleSendError() { - self.sendInvitation(blog, recipient: recipient, role: role, message: message) + service.sendInvitation( + recipient, + role: role, + message: message, + success: { + let success = NSLocalizedString("Invitation Sent!", comment: "The app successfully sent an invitation") + SVProgressHUD.showDismissibleSuccess(status: success) + + WPAnalytics.track(.peopleUserInvited, properties: ["role": role], blog: blog) + }, + failure: { _ in + self.handleSendError() { + self.sendInvitation(blog, recipient: recipient, role: role, message: message) + } } - }) + ) } @objc func handleSendError(_ onRetry: @escaping (() -> Void)) { - let message = NSLocalizedString("There has been an unexpected error while sending your Invitation", comment: "Invite Failed Message") + let message = NSLocalizedString( + "There has been an unexpected error while sending your Invitation", + comment: "Invite Failed Message" + ) let cancelText = NSLocalizedString("Cancel", comment: "Cancels an Action") let retryText = NSLocalizedString("Try Again", comment: "Retries an Action") @@ -491,20 +517,25 @@ private extension InvitePersonViewController { return } - service.validateInvitation(usernameOrEmail, role: role.slug, success: { [weak self] in - guard self?.shouldHandleValidationResponse(usernameOrEmail) == true else { - return - } + service.validateInvitation( + usernameOrEmail, + role: role.slug, + success: { [weak self] in + guard self?.shouldHandleValidationResponse(usernameOrEmail) == true else { + return + } - self?.sendActionEnabled = true - }, failure: { [weak self] error in - guard self?.shouldHandleValidationResponse(usernameOrEmail) == true else { - return - } + self?.sendActionEnabled = true + }, + failure: { [weak self] error in + guard self?.shouldHandleValidationResponse(usernameOrEmail) == true else { + return + } - self?.sendActionEnabled = false - self?.handleValidationError(error) - }) + self?.sendActionEnabled = false + self?.handleValidationError(error) + } + ) } func shouldHandleValidationResponse(_ requestUsernameOrEmail: String) -> Bool { @@ -519,12 +550,18 @@ private extension InvitePersonViewController { } let messageMap: [PeopleServiceRemote.ResponseError: String] = [ - .invalidInputError: NSLocalizedString("The specified user cannot be found. Please, verify if it's correctly spelt.", - comment: "People: Invitation Error"), - .userAlreadyHasRoleError: NSLocalizedString("The user already has the specified role. Please, try assigning a different role.", - comment: "People: Invitation Error"), - .unknownError: NSLocalizedString("Unknown error has occurred", - comment: "People: Invitation Error") + .invalidInputError: NSLocalizedString( + "The specified user cannot be found. Please, verify if it's correctly spelt.", + comment: "People: Invitation Error" + ), + .userAlreadyHasRoleError: NSLocalizedString( + "The user already has the specified role. Please, try assigning a different role.", + comment: "People: Invitation Error" + ), + .unknownError: NSLocalizedString( + "Unknown error has occurred", + comment: "People: Invitation Error" + ) ] let message = messageMap[error] ?? messageMap[.unknownError]! @@ -537,7 +574,7 @@ private extension InvitePersonViewController { var sendActionEnabled: Bool { get { - return navigationItem.rightBarButtonItem?.isEnabled ?? false + navigationItem.rightBarButtonItem?.isEnabled ?? false } set { navigationItem.rightBarButtonItem?.isEnabled = newValue @@ -567,7 +604,10 @@ private extension InvitePersonViewController { func refreshGenerateShareCell() { if blog.inviteLinks?.isEmpty == true { - generateShareCell.textLabel?.text = NSLocalizedString("Generate new link", comment: "Title. A call to action to generate a new invite link.") + generateShareCell.textLabel?.text = NSLocalizedString( + "Generate new link", + comment: "Title. A call to action to generate a new invite link." + ) generateShareCell.textLabel?.font = WPStyleGuide.tableviewTextFont() } else { generateShareCell.textLabel?.attributedText = createAttributedShareInviteText() @@ -588,11 +628,16 @@ private extension InvitePersonViewController { let image = UIImage.gridicon(.shareiOS) let attachment = NSTextAttachment(image: image) - attachment.bounds = CGRect(x: 0, - y: (font.capHeight - image.size.height) / 2, - width: image.size.width, - height: image.size.height) - let textStr = NSAttributedString(string: NSLocalizedString("Share invite link", comment: "Title. A call to action to share an invite link."), attributes: textAttributes) + attachment.bounds = CGRect( + x: 0, + y: (font.capHeight - image.size.height) / 2, + width: image.size.width, + height: image.size.height + ) + let textStr = NSAttributedString( + string: NSLocalizedString("Share invite link", comment: "Title. A call to action to share an invite link."), + attributes: textAttributes + ) let attrStr = NSMutableAttributedString(attachment: attachment) attrStr.append(NSAttributedString(string: " ")) attrStr.append(textStr) @@ -604,7 +649,10 @@ private extension InvitePersonViewController { return } - currentInviteCell.textLabel?.text = NSLocalizedString("Role", comment: "Title. Indicates the user role an invite link is for.") + currentInviteCell.textLabel?.text = NSLocalizedString( + "Role", + comment: "Title. Indicates the user role an invite link is for." + ) currentInviteCell.textLabel?.textColor = .label // sortedInviteLinks and availableRoles should be complimentary. We can cheat a little and @@ -624,7 +672,10 @@ private extension InvitePersonViewController { return } - expirationCell.textLabel?.text = NSLocalizedString("Expires on", comment: "Title. Indicates an expiration date.") + expirationCell.textLabel?.text = NSLocalizedString( + "Expires on", + comment: "Title. Indicates an expiration date." + ) expirationCell.textLabel?.textColor = .label let formatter = DateFormatter() @@ -636,7 +687,10 @@ private extension InvitePersonViewController { } func refreshDisableLinkCell() { - disableLinksCell.textLabel?.text = NSLocalizedString("Disable invite link", comment: "Title. A call to action to disable invite links.") + disableLinksCell.textLabel?.text = NSLocalizedString( + "Disable invite link", + comment: "Title. A call to action to disable invite links." + ) disableLinksCell.textLabel?.font = WPStyleGuide.tableviewTextFont() disableLinksCell.textLabel?.textColor = UIAppColor.error disableLinksCell.textLabel?.textAlignment = .center @@ -647,16 +701,21 @@ private extension InvitePersonViewController { return } let service = PeopleService(blog: blog, coreDataStack: ContextManager.shared) - service?.fetchInviteLinks(siteID, success: { [weak self] _ in - self?.bumpStat(event: .inviteLinksGetStatus, error: nil) - self?.updatingInviteLinks = false - self?.tableView.reloadData() - }, failure: { [weak self] error in - // Fail silently. - self?.bumpStat(event: .inviteLinksGetStatus, error: error) - self?.updatingInviteLinks = false - DDLogError("Error syncing invite links. \(error)") - }) + service? + .fetchInviteLinks( + siteID, + success: { [weak self] _ in + self?.bumpStat(event: .inviteLinksGetStatus, error: nil) + self?.updatingInviteLinks = false + self?.tableView.reloadData() + }, + failure: { [weak self] error in + // Fail silently. + self?.bumpStat(event: .inviteLinksGetStatus, error: error) + self?.updatingInviteLinks = false + DDLogError("Error syncing invite links. \(error)") + } + ) } func generateInviteLinks() { @@ -668,16 +727,27 @@ private extension InvitePersonViewController { } updatingInviteLinks = true let service = PeopleService(blog: blog, coreDataStack: ContextManager.shared) - service?.generateInviteLinks(siteID, success: { [weak self] _ in - self?.bumpStat(event: .inviteLinksGenerate, error: nil) - self?.updatingInviteLinks = false - self?.tableView.reloadData() - }, failure: { [weak self] error in - self?.bumpStat(event: .inviteLinksGenerate, error: error) - self?.updatingInviteLinks = false - self?.displayNotice(title: NSLocalizedString("Unable to create new invite links.", comment: "An error message shown when there is an issue creating new invite links.")) - DDLogError("Error generating invite links. \(error)") - }) + service? + .generateInviteLinks( + siteID, + success: { [weak self] _ in + self?.bumpStat(event: .inviteLinksGenerate, error: nil) + self?.updatingInviteLinks = false + self?.tableView.reloadData() + }, + failure: { [weak self] error in + self?.bumpStat(event: .inviteLinksGenerate, error: error) + self?.updatingInviteLinks = false + self? + .displayNotice( + title: NSLocalizedString( + "Unable to create new invite links.", + comment: "An error message shown when there is an issue creating new invite links." + ) + ) + DDLogError("Error generating invite links. \(error)") + } + ) } func shareInviteLink() { @@ -698,12 +768,25 @@ private extension InvitePersonViewController { return } - let title = NSLocalizedString("Disable invite link", comment: "Title. Title of a prompt to disable group invite links.") - let message = NSLocalizedString("Once this invite link is disabled, nobody will be able to use it to join your team. Are you sure?", comment: "Warning message about disabling group invite links.") + let title = NSLocalizedString( + "Disable invite link", + comment: "Title. Title of a prompt to disable group invite links." + ) + let message = NSLocalizedString( + "Once this invite link is disabled, nobody will be able to use it to join your team. Are you sure?", + comment: "Warning message about disabling group invite links." + ) let controller = UIAlertController(title: title, message: message, preferredStyle: .alert) - controller.addCancelActionWithTitle(NSLocalizedString("Cancel", comment: "Title. Title of a cancel button. Tapping disnisses an alert.")) - let action = UIAlertAction(title: NSLocalizedString("Disable", comment: "Title. Title of a button that will disable group invite links when tapped."), - style: .destructive) { [weak self] _ in + controller.addCancelActionWithTitle( + NSLocalizedString("Cancel", comment: "Title. Title of a cancel button. Tapping disnisses an alert.") + ) + let action = UIAlertAction( + title: NSLocalizedString( + "Disable", + comment: "Title. Title of a button that will disable group invite links when tapped." + ), + style: .destructive + ) { [weak self] _ in self?.disableInviteLinks() } controller.addAction(action) @@ -717,16 +800,27 @@ private extension InvitePersonViewController { } updatingInviteLinks = true let service = PeopleService(blog: blog, coreDataStack: ContextManager.shared) - service?.disableInviteLinks(siteID, success: { [weak self] in - self?.bumpStat(event: .inviteLinksDisable, error: nil) - self?.updatingInviteLinks = false - self?.tableView.reloadData() - }, failure: { [weak self] error in - self?.bumpStat(event: .inviteLinksDisable, error: error) - self?.updatingInviteLinks = false - self?.displayNotice(title: NSLocalizedString("Unable to disable invite links.", comment: "An error message shown when there is an issue creating new invite links.")) - DDLogError("Error disabling invite links. \(error)") - }) + service? + .disableInviteLinks( + siteID, + success: { [weak self] in + self?.bumpStat(event: .inviteLinksDisable, error: nil) + self?.updatingInviteLinks = false + self?.tableView.reloadData() + }, + failure: { [weak self] error in + self?.bumpStat(event: .inviteLinksDisable, error: error) + self?.updatingInviteLinks = false + self? + .displayNotice( + title: NSLocalizedString( + "Unable to disable invite links.", + comment: "An error message shown when there is an issue creating new invite links." + ) + ) + DDLogError("Error disabling invite links. \(error)") + } + ) } func handleInviteLinkRowTapped(indexPath: IndexPath) { @@ -791,7 +885,10 @@ private extension InvitePersonViewController { } func setupPlaceholderLabel() { - placeholderLabel.text = NSLocalizedString("Custom message…", comment: "Placeholder for Invite People message field.") + placeholderLabel.text = NSLocalizedString( + "Custom message…", + comment: "Placeholder for Invite People message field." + ) placeholderLabel.font = WPStyleGuide.tableviewTextFont() placeholderLabel.textColor = UIColor.placeholderText // TODO - find the real answer here } @@ -799,14 +896,18 @@ private extension InvitePersonViewController { func setupNavigationBar() { title = NSLocalizedString("Invite People", comment: "Invite People Title") - navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, - target: self, - action: #selector(cancelWasPressed)) + navigationItem.leftBarButtonItem = UIBarButtonItem( + barButtonSystemItem: .cancel, + target: self, + action: #selector(cancelWasPressed) + ) - navigationItem.rightBarButtonItem = UIBarButtonItem(title: NSLocalizedString("Invite", comment: "Send Person Invite"), - style: .plain, - target: self, - action: #selector(sendWasPressed)) + navigationItem.rightBarButtonItem = UIBarButtonItem( + title: NSLocalizedString("Invite", comment: "Send Person Invite"), + style: .plain, + target: self, + action: #selector(sendWasPressed) + ) // By default, Send is disabled navigationItem.rightBarButtonItem?.isEnabled = false @@ -827,7 +928,10 @@ private extension InvitePersonViewController { func refreshUsernameCell() { guard let usernameOrEmail = usernameOrEmail?.nonEmptyString() else { - usernameCell.textLabel?.text = NSLocalizedString("Email or Username…", comment: "Invite Username Placeholder") + usernameCell.textLabel?.text = NSLocalizedString( + "Email or Username…", + comment: "Invite Username Placeholder" + ) usernameCell.textLabel?.textColor = .placeholderText return } diff --git a/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift b/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift index 46ee01728029..8425d3b88767 100644 --- a/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift @@ -39,8 +39,10 @@ class PluginDirectoryViewController: UITableViewController { tableView.estimatedRowHeight = Constants.rowHeight tableView.separatorInset = Constants.separatorInset - ImmuTable.registerRows([CollectionViewContainerRow.self], - tableView: tableView) + ImmuTable.registerRows( + [CollectionViewContainerRow.self], + tableView: tableView + ) tableViewModel = viewModel.tableViewModel(presenter: self) navigationItem.searchController = searchController @@ -81,11 +83,11 @@ class PluginDirectoryViewController: UITableViewController { extension PluginDirectoryViewController { override func numberOfSections(in tableView: UITableView) -> Int { - return tableViewModel.sections.count + tableViewModel.sections.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return tableViewModel.sections[section].rows.count + tableViewModel.sections[section].rows.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -103,11 +105,11 @@ extension PluginDirectoryViewController { } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 0 + 0 } override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return 0 + 0 } } @@ -120,7 +122,8 @@ extension PluginDirectoryViewController: UISearchControllerDelegate { extension PluginDirectoryViewController: UISearchResultsUpdating { func updateSearchResults(for searchController: UISearchController) { guard let pluginListViewController = searchController.searchResultsController as? PluginListViewController, - let searchedText = searchController.searchBar.text else { + let searchedText = searchController.searchBar.text + else { return } diff --git a/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift b/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift index b3cb8423b0af..45ac9e452639 100644 --- a/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift +++ b/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift @@ -19,7 +19,10 @@ final class SiteAssemblyWizardContent: UIViewController { private let service: SiteAssemblyService /// Displays the domain and plan checkout web view. - private lazy var siteCreationPurchasingController = SiteCreationPurchasingWebFlowController(viewController: self, origin: .siteCreation) + private lazy var siteCreationPurchasingController = SiteCreationPurchasingWebFlowController( + viewController: self, + origin: .siteCreation + ) /// The new `Blog`, if successfully created; `nil` otherwise. private var createdBlog: Blog? @@ -127,10 +130,11 @@ final class SiteAssemblyWizardContent: UIViewController { SiteCreationAnalyticsHelper.trackSiteCreationSuccess(self.siteCreator.design) } if status == .succeeded, - shouldPerformPurchasingStep, - let domain = self.siteCreator.address, - let planId = self.siteCreator.planId, - let blog = self.createdBlog { + shouldPerformPurchasingStep, + let domain = self.siteCreator.address, + let planId = self.siteCreator.planId, + let blog = self.createdBlog + { self.attemptPurchasing(domain: domain, planId: planId, site: blog) } else { self.contentView.status = status @@ -140,7 +144,8 @@ final class SiteAssemblyWizardContent: UIViewController { /// The site must be created before attempting plan and/or domain purchasing. private func attemptPurchasing(domain: DomainSuggestion, planId: Int, site: Blog) { - self.siteCreationPurchasingController.purchase(domain: domain, planId: planId, site: site) { [weak self] result in + self.siteCreationPurchasingController.purchase(domain: domain, planId: planId, site: site) { + [weak self] result in guard let self else { return } @@ -165,8 +170,10 @@ final class SiteAssemblyWizardContent: UIViewController { private func installButtonViewController() { buttonViewController.delegate = self - let primaryButtonText = NSLocalizedString("Done", - comment: "Tapping a button with this label allows the user to exit the Site Creation flow") + let primaryButtonText = NSLocalizedString( + "Done", + comment: "Tapping a button with this label allows the user to exit the Site Creation flow" + ) buttonViewController.setButtonTitles(primary: primaryButtonText) contentView.buttonContainerView = buttonViewController.view diff --git a/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift b/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift index 5da0fdcbaade..aef3909bf2e9 100644 --- a/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift +++ b/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift @@ -23,7 +23,9 @@ struct StatsReferrersChartViewModel { allReferrers.remove(at: wpIndex) } - if let searchIndex = allReferrers.firstIndex(where: { $0.title.contains(Constants.searchEnginesReferrerGroupTitle) }) { + if let searchIndex = allReferrers.firstIndex(where: { + $0.title.contains(Constants.searchEnginesReferrerGroupTitle) + }) { topReferrers.append(allReferrers[searchIndex]) allReferrers.remove(at: searchIndex) } @@ -34,13 +36,14 @@ struct StatsReferrersChartViewModel { } // Create segments for each referrer - var segments = topReferrers.enumerated().map({ index, item in - return DonutChartView.Segment( - title: Constants.referrersTitlesMap[item.title] ?? item.title, - value: CGFloat(item.viewsCount), - color: Constants.referrersSegmentColors[index] - ) - }) + var segments = topReferrers.enumerated() + .map({ index, item in + DonutChartView.Segment( + title: Constants.referrersTitlesMap[item.title] ?? item.title, + value: CGFloat(item.viewsCount), + color: Constants.referrersSegmentColors[index] + ) + }) // Create a segment for all remaining referrers – "Other" let otherCount = allReferrers.map({ $0.viewsCount }).reduce(0, +) + referrers.otherReferrerViewsCount @@ -52,7 +55,11 @@ struct StatsReferrersChartViewModel { segments.append(otherSegment) let chartView = DonutChartView() - chartView.configure(title: Constants.chartTitle, totalCount: CGFloat(referrers.totalReferrerViewsCount), segments: segments) + chartView.configure( + title: Constants.chartTitle, + totalCount: CGFloat(referrers.totalReferrerViewsCount), + segments: segments + ) chartView.translatesAutoresizingMaskIntoConstraints = false chartView.heightAnchor.constraint(greaterThanOrEqualToConstant: Constants.chartHeight).isActive = true return chartView @@ -63,8 +70,14 @@ struct StatsReferrersChartViewModel { // These first two titles are not localized as they're used for string matching against the API response. static let wpComReferrerGroupTitle = "WordPress.com Reader" static let searchEnginesReferrerGroupTitle = "Search Engines" - static let otherReferrerGroupTitle = NSLocalizedString("Other", comment: "Title of Stats section that shows referrer traffic from other sources.") - static let chartTitle = NSLocalizedString("Views", comment: "Title for chart showing site views from various referrer sources.") + static let otherReferrerGroupTitle = NSLocalizedString( + "Other", + comment: "Title of Stats section that shows referrer traffic from other sources." + ) + static let chartTitle = NSLocalizedString( + "Views", + comment: "Title for chart showing site views from various referrer sources." + ) static let referrersMaxGroupCount = 3 static let referrersSegmentColors: [UIColor] = [ @@ -75,7 +88,10 @@ struct StatsReferrersChartViewModel { static let referrersTitlesMap = [ "WordPress.com Reader": "WordPress", - "Search Engines": NSLocalizedString("Search", comment: "Title of Stats section that shows search engine referrer traffic.") + "Search Engines": NSLocalizedString( + "Search", + comment: "Title of Stats section that shows search engine referrer traffic." + ) ] static let chartHeight: CGFloat = 231.0 From a5f883e8f5ae2ee1806669e52527254936f71a96 Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 09:31:01 +1200 Subject: [PATCH 12/13] Add WordPressKit imports flagged by static sweep Same implicit-visibility issue as the previous commit: these files use WordPressKit types but relied on the WordPressData framework exposing them transitively in the Keystone build. Found by sweeping app sources for WordPressKit type usage without an import, since the local Keystone build halts on a pre-existing Xcode 26.5 issue before reaching them. --- WordPress/Classes/Models/ReaderListTopic+Creation.swift | 1 + WordPress/Classes/Services/CommentService+Swift.swift | 1 + WordPress/Classes/Services/PushAuthenticationService.swift | 1 + WordPress/Classes/Services/ReaderPostStreamService.swift | 1 + WordPress/Classes/Services/ReaderSiteService.swift | 1 + WordPress/Classes/System/WordPressAppDelegate.swift | 1 + .../Classes/Utility/Notifications/PushNotificationsManager.swift | 1 + .../Classes/ViewRelated/Activity/ActivityStringFormatting.swift | 1 + .../ViewRelated/Blog/Sharing/SharingAccountViewController.swift | 1 + .../Blog/Site Settings/SiteSettingsViewController+Swift.swift | 1 + .../ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift | 1 + .../Controllers/NotificationCommentDetailViewController.swift | 1 + .../People/Controllers/InvitePersonViewController.swift | 1 + .../Plugins/Controllers/PluginDirectoryViewController.swift | 1 + .../Site Creation/Final Assembly/SiteAssemblyWizardContent.swift | 1 + .../Shared Views/Stats Detail/StatsReferrersChartViewModel.swift | 1 + 16 files changed, 16 insertions(+) diff --git a/WordPress/Classes/Models/ReaderListTopic+Creation.swift b/WordPress/Classes/Models/ReaderListTopic+Creation.swift index f27bbe5a6976..9bd35b62161b 100644 --- a/WordPress/Classes/Models/ReaderListTopic+Creation.swift +++ b/WordPress/Classes/Models/ReaderListTopic+Creation.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit import WordPressShared extension ReaderListTopic { diff --git a/WordPress/Classes/Services/CommentService+Swift.swift b/WordPress/Classes/Services/CommentService+Swift.swift index dfd44fff6a1b..cab4805e67a0 100644 --- a/WordPress/Classes/Services/CommentService+Swift.swift +++ b/WordPress/Classes/Services/CommentService+Swift.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit /// Encapsulates actions related to fetching reply comments. /// diff --git a/WordPress/Classes/Services/PushAuthenticationService.swift b/WordPress/Classes/Services/PushAuthenticationService.swift index 808ab5160eb4..35614dc2eaf9 100644 --- a/WordPress/Classes/Services/PushAuthenticationService.swift +++ b/WordPress/Classes/Services/PushAuthenticationService.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit import WordPressShared /// The purpose of this service is to encapsulate the Restful API that performs Mobile 2FA diff --git a/WordPress/Classes/Services/ReaderPostStreamService.swift b/WordPress/Classes/Services/ReaderPostStreamService.swift index 47cbb45516d8..cae16d8533a9 100644 --- a/WordPress/Classes/Services/ReaderPostStreamService.swift +++ b/WordPress/Classes/Services/ReaderPostStreamService.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit class ReaderPostStreamService { diff --git a/WordPress/Classes/Services/ReaderSiteService.swift b/WordPress/Classes/Services/ReaderSiteService.swift index cf6843d0d5d6..7df0a69d7645 100644 --- a/WordPress/Classes/Services/ReaderSiteService.swift +++ b/WordPress/Classes/Services/ReaderSiteService.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit import WordPressShared @objc extension ReaderSiteService { diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index f620ba041607..4b279331c7c7 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -16,6 +16,7 @@ import UIKit import WebKit import WordPressAuthenticator import WordPressData +import WordPressKit import WordPressShared import WordPressUI import ZendeskCoreSDK diff --git a/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift b/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift index 52afbf52a2f1..2edd785ce75e 100644 --- a/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift +++ b/WordPress/Classes/Utility/Notifications/PushNotificationsManager.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit import WordPressShared import NSObject_SafeExpectations import UserNotifications diff --git a/WordPress/Classes/ViewRelated/Activity/ActivityStringFormatting.swift b/WordPress/Classes/ViewRelated/Activity/ActivityStringFormatting.swift index fad2dced2f21..b930b2fc0b81 100644 --- a/WordPress/Classes/ViewRelated/Activity/ActivityStringFormatting.swift +++ b/WordPress/Classes/ViewRelated/Activity/ActivityStringFormatting.swift @@ -1,5 +1,6 @@ import Foundation import WordPressData +import WordPressKit struct ActivityStringFormatting { private static let agentString = NSLocalizedString( diff --git a/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift b/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift index 47b46d1fd4cf..d8d733c4a367 100644 --- a/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift +++ b/WordPress/Classes/ViewRelated/Blog/Sharing/SharingAccountViewController.swift @@ -1,6 +1,7 @@ import UIKit import Gridicons import WordPressData +import WordPressKit import WordPressShared import WordPressUI diff --git a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift index 2ef5fe682859..c18bb409465a 100644 --- a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift +++ b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift @@ -2,6 +2,7 @@ import Foundation import SwiftUI import WordPressData import WordPressFlux +import WordPressKit import WordPressShared import WordPressAPI import WordPressAPIInternal diff --git a/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift b/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift index c5c0318f5629..9d57b6f49215 100644 --- a/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift +++ b/WordPress/Classes/ViewRelated/EEUUSCompliance/CompliancePopoverViewModel.swift @@ -1,6 +1,7 @@ import Foundation import UIKit import WordPressData +import WordPressKit import WordPressUI class CompliancePopoverViewModel: ObservableObject { diff --git a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift index df4204d1704d..2148f478e888 100644 --- a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift +++ b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationCommentDetailViewController.swift @@ -1,5 +1,6 @@ import UIKit import WordPressData +import WordPressKit import WordPressUI class NotificationCommentDetailViewController: UIViewController, NoResultsViewHost { diff --git a/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift b/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift index 075ce7cabd7e..c5e857117e40 100644 --- a/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift +++ b/WordPress/Classes/ViewRelated/People/Controllers/InvitePersonViewController.swift @@ -1,6 +1,7 @@ import UIKit import SVProgressHUD import WordPressData +import WordPressKit import WordPressUI /// Allows the user to Invite Followers / Users diff --git a/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift b/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift index 8425d3b88767..4c4ee4a83fb0 100644 --- a/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift +++ b/WordPress/Classes/ViewRelated/Plugins/Controllers/PluginDirectoryViewController.swift @@ -1,5 +1,6 @@ import UIKit import WordPressFlux +import WordPressKit import WordPressUI import Gridicons diff --git a/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift b/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift index 45ac9e452639..84b43ee38fc8 100644 --- a/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift +++ b/WordPress/Classes/ViewRelated/Site Creation/Final Assembly/SiteAssemblyWizardContent.swift @@ -1,5 +1,6 @@ import UIKit import WordPressData +import WordPressKit import WordPressShared import WordPressAuthenticator diff --git a/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift b/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift index aef3909bf2e9..4cd064c0b360 100644 --- a/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift +++ b/WordPress/Classes/ViewRelated/Stats/Shared Views/Stats Detail/StatsReferrersChartViewModel.swift @@ -1,4 +1,5 @@ import UIKit +import WordPressKit import WordPressUI struct StatsReferrersChartViewModel { From cd78310c42858173cca72f43ce61573f4a49440d Mon Sep 17 00:00:00 2001 From: Tony Li Date: Wed, 10 Jun 2026 11:15:46 +1200 Subject: [PATCH 13/13] Break up long function signatures to satisfy both swift-format and SwiftLint swift-format moves the opening brace to its own line when a long signature stays on one line, which violates SwiftLint's opening_brace rule. Multi-line parameter lists keep both tools happy. --- WordPress/Classes/Models/ReaderListTopic+Creation.swift | 7 +++++-- WordPress/Classes/System/WordPressAppDelegate.swift | 6 ++++-- .../Site Settings/SiteSettingsViewController+Swift.swift | 7 +++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/Models/ReaderListTopic+Creation.swift b/WordPress/Classes/Models/ReaderListTopic+Creation.swift index 9bd35b62161b..e97f75e451c5 100644 --- a/WordPress/Classes/Models/ReaderListTopic+Creation.swift +++ b/WordPress/Classes/Models/ReaderListTopic+Creation.swift @@ -8,8 +8,11 @@ extension ReaderListTopic { /// Returns an existing topic for the specified list, or creates one if one /// doesn't already exist. /// - static func named(_ listName: String, forUser user: String, in context: NSManagedObjectContext) -> ReaderListTopic? - { + static func named( + _ listName: String, + forUser user: String, + in context: NSManagedObjectContext + ) -> ReaderListTopic? { let remote = ReaderTopicServiceRemote( wordPressComRestApi: WordPressComRestApi.anonymousApi(userAgent: WPUserAgent.wordPress()) ) diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 4b279331c7c7..3cb25c248f36 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -402,8 +402,10 @@ extension WordPressAppDelegate { PushNotificationsManager.shared.registerDeviceToken(deviceToken) } - public func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) - { + public func application( + _ application: UIApplication, + didFailToRegisterForRemoteNotificationsWithError error: Error + ) { PushNotificationsManager.shared.registrationDidFail(error as NSError) } diff --git a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift index c18bb409465a..a96aafabeff8 100644 --- a/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift +++ b/WordPress/Classes/ViewRelated/Blog/Site Settings/SiteSettingsViewController+Swift.swift @@ -266,8 +266,11 @@ extension SiteSettingsViewController { } } - override open func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) - { + override open func tableView( + _ tableView: UITableView, + willDisplayFooterView view: UIView, + forSection section: Int + ) { WPStyleGuide.configureTableViewSectionFooter(view) }