diff --git a/Package.swift b/Package.swift index 80186894..c5eec08b 100644 --- a/Package.swift +++ b/Package.swift @@ -11,8 +11,8 @@ let package = Package( targets: [ .binaryTarget( name: "WordPressKit", - url: "https://github.com/user-attachments/files/16200320/WordPressKit.zip", - checksum: "fa2ddc1fedcc225beb23d23168043bd78bbd12d43e187cc0dd772aef8d81ee20" + url: "https://github.com/user-attachments/files/16200425/WordPressKit.zip", + checksum: "3ec44e1f08dea7851c9e52784e9378948a3fabc1742eced9e281305c23908343" ), ] ) diff --git a/Sources/CoreAPI/HTTPRequestBuilder.swift b/Sources/CoreAPI/HTTPRequestBuilder.swift index 506b8010..c230b7ef 100644 --- a/Sources/CoreAPI/HTTPRequestBuilder.swift +++ b/Sources/CoreAPI/HTTPRequestBuilder.swift @@ -5,8 +5,8 @@ import Foundation /// /// Calling this class's url related functions (the ones that changes path, query, etc) does not modify the /// original URL string. The URL will be perserved in the final result that's returned by the `build` function. -final class HTTPRequestBuilder { - enum Method: String, CaseIterable { +public final class HTTPRequestBuilder { + public enum Method: String, CaseIterable { case get = "GET" case post = "POST" case put = "PUT" diff --git a/Sources/CoreAPI/WordPressAPIError.swift b/Sources/CoreAPI/WordPressAPIError.swift index a4680b20..cd8493f0 100644 --- a/Sources/CoreAPI/WordPressAPIError.swift +++ b/Sources/CoreAPI/WordPressAPIError.swift @@ -1,6 +1,6 @@ import Foundation -public enum WordPressAPIError: Error where EndpointError: LocalizedError { +@frozen public enum WordPressAPIError: Error where EndpointError: LocalizedError { static var unknownErrorMessage: String { NSLocalizedString( "wordpress-api.error.unknown", diff --git a/Sources/CoreAPI/WordPressComRestApi.swift b/Sources/CoreAPI/WordPressComRestApi.swift index f5937ba6..8b96fb32 100644 --- a/Sources/CoreAPI/WordPressComRestApi.swift +++ b/Sources/CoreAPI/WordPressComRestApi.swift @@ -362,7 +362,7 @@ open class WordPressComRestApi: NSObject { return configuration } - func perform( + open func perform( _ method: HTTPRequestBuilder.Method, URLString: String, parameters: [String: AnyObject]? = nil, @@ -373,7 +373,7 @@ open class WordPressComRestApi: NSObject { } } - func perform( + open func perform( _ method: HTTPRequestBuilder.Method, URLString: String, parameters: [String: AnyObject]? = nil, diff --git a/Sources/CoreAPI/WordPressOrgXMLRPCApi.swift b/Sources/CoreAPI/WordPressOrgXMLRPCApi.swift index 58c57633..a997efd1 100644 --- a/Sources/CoreAPI/WordPressOrgXMLRPCApi.swift +++ b/Sources/CoreAPI/WordPressOrgXMLRPCApi.swift @@ -28,6 +28,10 @@ open class WordPressOrgXMLRPCApi: NSObject { /// @objc public static let minimumSupportedVersion = "4.0" + @objc public static var errorDomain: String { + wpxmlrpc.WPXMLRPCFaultErrorDomain + } + private lazy var urlSession: URLSession = makeSession(configuration: .default) private lazy var uploadURLSession: URLSession = { backgroundUploads diff --git a/Sources/WordPressKit/Models/AccountSettings.swift b/Sources/WordPressKit/Models/AccountSettings.swift index 7cf0ab20..91993fa4 100644 --- a/Sources/WordPressKit/Models/AccountSettings.swift +++ b/Sources/WordPressKit/Models/AccountSettings.swift @@ -53,7 +53,7 @@ public struct AccountSettings { } } -public enum AccountSettingsChange { +@frozen public enum AccountSettingsChange { case firstName(String) case lastName(String) case displayName(String) diff --git a/Sources/WordPressKit/Models/Activity.swift b/Sources/WordPressKit/Models/Activity.swift index cd6afb3a..66bb996b 100644 --- a/Sources/WordPressKit/Models/Activity.swift +++ b/Sources/WordPressKit/Models/Activity.swift @@ -182,7 +182,7 @@ public class ActivityGroup { public let name: String public let count: Int - init(_ groupKey: String, dictionary: [String: AnyObject]) throws { + public init(_ groupKey: String, dictionary: [String: AnyObject]) throws { guard let groupName = dictionary["name"] as? String else { throw Error.missingName } @@ -293,7 +293,7 @@ public class RestoreStatus { } public extension RestoreStatus { - enum Status: String { + @frozen enum Status: String { case queued case finished case running diff --git a/Sources/WordPressKit/Models/Atomic/AtomicLogs.swift b/Sources/WordPressKit/Models/Atomic/AtomicLogs.swift index bc04ca68..c0fcb7e3 100644 --- a/Sources/WordPressKit/Models/Atomic/AtomicLogs.swift +++ b/Sources/WordPressKit/Models/Atomic/AtomicLogs.swift @@ -9,7 +9,7 @@ public final class AtomicErrorLogEntry: Decodable { public let line: Int? public let timestamp: Date? - public enum Severity: String { + @frozen public enum Severity: String { case user = "User" case warning = "Warning" case deprecated = "Deprecated" diff --git a/Sources/WordPressKit/Models/Blaze/BlazeCampaign.swift b/Sources/WordPressKit/Models/Blaze/BlazeCampaign.swift index be303fc4..5ab9af98 100644 --- a/Sources/WordPressKit/Models/Blaze/BlazeCampaign.swift +++ b/Sources/WordPressKit/Models/Blaze/BlazeCampaign.swift @@ -44,7 +44,7 @@ public final class BlazeCampaign: Codable { case creativeHTML = "creativeHtml" } - public enum Status: String, Codable { + @frozen public enum Status: String, Codable { case scheduled case created case rejected diff --git a/Sources/WordPressKit/Models/JetpackBackup.swift b/Sources/WordPressKit/Models/JetpackBackup.swift index 2b8b0832..6bd56dc2 100644 --- a/Sources/WordPressKit/Models/JetpackBackup.swift +++ b/Sources/WordPressKit/Models/JetpackBackup.swift @@ -26,4 +26,15 @@ public struct JetpackBackup: Decodable { case url case validUntil } + + public init(backupPoint: Date, downloadID: Int, rewindID: String, startedAt: Date, progress: Int?, downloadCount: Int?, url: String?, validUntil: Date?) { + self.backupPoint = backupPoint + self.downloadID = downloadID + self.rewindID = rewindID + self.startedAt = startedAt + self.progress = progress + self.downloadCount = downloadCount + self.url = url + self.validUntil = validUntil + } } diff --git a/Sources/WordPressKit/Models/Plugins/PluginState.swift b/Sources/WordPressKit/Models/Plugins/PluginState.swift index 62f0dbea..8123998d 100644 --- a/Sources/WordPressKit/Models/Plugins/PluginState.swift +++ b/Sources/WordPressKit/Models/Plugins/PluginState.swift @@ -1,7 +1,7 @@ import Foundation public struct PluginState: Equatable, Codable { - public enum UpdateState: Equatable, Codable { + @frozen public enum UpdateState: Equatable, Codable { public static func ==(lhs: PluginState.UpdateState, rhs: PluginState.UpdateState) -> Bool { switch (lhs, rhs) { case (.updated, .updated): diff --git a/Sources/WordPressKit/Models/RemoteNotificationSettings.swift b/Sources/WordPressKit/Models/RemoteNotificationSettings.swift index 1c8cba2e..bb9f6632 100644 --- a/Sources/WordPressKit/Models/RemoteNotificationSettings.swift +++ b/Sources/WordPressKit/Models/RemoteNotificationSettings.swift @@ -21,7 +21,7 @@ open class RemoteNotificationSettings { /// Represents a communication channel that may post notifications to the user. /// - public enum Channel: Equatable { + @frozen public enum Channel: Equatable { case blog(blogId: Int) case other case wordPressCom diff --git a/Sources/WordPressKit/Models/Stats/Insights/StatsTagsAndCategoriesInsight.swift b/Sources/WordPressKit/Models/Stats/Insights/StatsTagsAndCategoriesInsight.swift index 8daaad19..4af5e2a4 100644 --- a/Sources/WordPressKit/Models/Stats/Insights/StatsTagsAndCategoriesInsight.swift +++ b/Sources/WordPressKit/Models/Stats/Insights/StatsTagsAndCategoriesInsight.swift @@ -13,7 +13,7 @@ extension StatsTagsAndCategoriesInsight: StatsInsightData { } public struct StatsTagAndCategory: Codable { - public enum Kind: String, Codable { + @frozen public enum Kind: String, Codable { case tag case category case folder diff --git a/Sources/WordPressKit/Models/Stats/Time Interval/StatsSummaryTimeIntervalData.swift b/Sources/WordPressKit/Models/Stats/Time Interval/StatsSummaryTimeIntervalData.swift index d24447fc..acefd4b7 100644 --- a/Sources/WordPressKit/Models/Stats/Time Interval/StatsSummaryTimeIntervalData.swift +++ b/Sources/WordPressKit/Models/Stats/Time Interval/StatsSummaryTimeIntervalData.swift @@ -1,11 +1,11 @@ -public enum StatsPeriodUnit: Int { +@frozen public enum StatsPeriodUnit: Int { case day case week case month case year } -public enum StatsSummaryType: Int { +@frozen public enum StatsSummaryType: Int { case views case visitors case likes diff --git a/Sources/WordPressKit/Models/WPTimeZone.swift b/Sources/WordPressKit/Models/WPTimeZone.swift index 8974acef..9654d2ad 100644 --- a/Sources/WordPressKit/Models/WPTimeZone.swift +++ b/Sources/WordPressKit/Models/WPTimeZone.swift @@ -30,6 +30,11 @@ public struct NamedTimeZone: WPTimeZone { public let label: String public let value: String + public init(label: String, value: String) { + self.label = label + self.value = value + } + public var gmtOffset: Float? { return nil } diff --git a/Sources/WordPressKit/Services/AnnouncementServiceRemote.swift b/Sources/WordPressKit/Services/AnnouncementServiceRemote.swift index 343680b3..fe5e24f2 100644 --- a/Sources/WordPressKit/Services/AnnouncementServiceRemote.swift +++ b/Sources/WordPressKit/Services/AnnouncementServiceRemote.swift @@ -1,9 +1,9 @@ import Foundation /// Retrieves feature announcements from the related endpoint -public class AnnouncementServiceRemote: ServiceRemoteWordPressComREST { +open class AnnouncementServiceRemote: ServiceRemoteWordPressComREST { - public func getAnnouncements(appId: String, + open func getAnnouncements(appId: String, appVersion: String, locale: String, completion: @escaping (Result<[Announcement], Error>) -> Void) { @@ -86,6 +86,18 @@ public struct Announcement: Codable { public let isLocalized: Bool public let responseLocale: String public let features: [Feature] + + public init(appVersionName: String, minimumAppVersion: String, maximumAppVersion: String, appVersionTargets: [String], detailsUrl: String, announcementVersion: String, isLocalized: Bool, responseLocale: String, features: [Feature]) { + self.appVersionName = appVersionName + self.minimumAppVersion = minimumAppVersion + self.maximumAppVersion = maximumAppVersion + self.appVersionTargets = appVersionTargets + self.detailsUrl = detailsUrl + self.announcementVersion = announcementVersion + self.isLocalized = isLocalized + self.responseLocale = responseLocale + self.features = features + } } public struct Feature: Codable { @@ -94,6 +106,14 @@ public struct Feature: Codable { public let icons: [FeatureIcon]? public let iconUrl: String public let iconBase64: String? + + public init(title: String, subtitle: String, icons: [FeatureIcon]?, iconUrl: String, iconBase64: String?) { + self.title = title + self.subtitle = subtitle + self.icons = icons + self.iconUrl = iconUrl + self.iconBase64 = iconBase64 + } } public struct FeatureIcon: Codable { diff --git a/Sources/WordPressKit/Services/AutomatedTransferService.swift b/Sources/WordPressKit/Services/AutomatedTransferService.swift index 168783e8..13b87ad6 100644 --- a/Sources/WordPressKit/Services/AutomatedTransferService.swift +++ b/Sources/WordPressKit/Services/AutomatedTransferService.swift @@ -3,11 +3,11 @@ import Foundation /// Class encapsualting all requests related to performing Automated Transfer operations. public class AutomatedTransferService: ServiceRemoteWordPressComREST { - public enum ResponseError: Error { + @frozen public enum ResponseError: Error { case decodingFailure } - public enum AutomatedTransferEligibilityError: Error { + @frozen public enum AutomatedTransferEligibilityError: Error { case unverifiedEmail case excessiveDiskSpaceUsage case noBusinessPlan diff --git a/Sources/WordPressKit/Services/PostServiceRemoteExtended.swift b/Sources/WordPressKit/Services/PostServiceRemoteExtended.swift index f5a6f1cb..700c1b33 100644 --- a/Sources/WordPressKit/Services/PostServiceRemoteExtended.swift +++ b/Sources/WordPressKit/Services/PostServiceRemoteExtended.swift @@ -23,7 +23,7 @@ public protocol PostServiceRemoteExtended: PostServiceRemote { func deletePost(withID postID: Int) async throws } -public enum PostServiceRemoteError: Error { +@frozen public enum PostServiceRemoteError: Error { /// 409 (Conflict) case conflict /// 404 (Not Found) diff --git a/Sources/WordPressKit/Services/QR Login/QRLoginServiceRemote.swift b/Sources/WordPressKit/Services/QR Login/QRLoginServiceRemote.swift index a84aa6ba..cad2fe17 100644 --- a/Sources/WordPressKit/Services/QR Login/QRLoginServiceRemote.swift +++ b/Sources/WordPressKit/Services/QR Login/QRLoginServiceRemote.swift @@ -46,7 +46,7 @@ open class QRLoginServiceRemote: ServiceRemoteWordPressComREST { } } -public enum QRLoginError { +@frozen public enum QRLoginError { case invalidData case expired diff --git a/Sources/WordPressKit/Services/ReaderServiceDeliveryFrequency.swift b/Sources/WordPressKit/Services/ReaderServiceDeliveryFrequency.swift index 96090898..b7d060a9 100644 --- a/Sources/WordPressKit/Services/ReaderServiceDeliveryFrequency.swift +++ b/Sources/WordPressKit/Services/ReaderServiceDeliveryFrequency.swift @@ -5,7 +5,7 @@ import Foundation /// - daily: daily frequency /// - instantly: instantly frequency /// - weekly: weekly frequency -public enum ReaderServiceDeliveryFrequency: String { +@frozen public enum ReaderServiceDeliveryFrequency: String { case daily case instantly case weekly diff --git a/Sources/WordPressKit/Services/WordPressComServiceRemote+SiteSegments.swift b/Sources/WordPressKit/Services/WordPressComServiceRemote+SiteSegments.swift index 179d0a21..63763e0e 100644 --- a/Sources/WordPressKit/Services/WordPressComServiceRemote+SiteSegments.swift +++ b/Sources/WordPressKit/Services/WordPressComServiceRemote+SiteSegments.swift @@ -79,7 +79,7 @@ public enum SiteSegmentsError: Error { /// - success: the site segments request succeeded with the accompanying result. /// - failure: the site segments request failed due to the accompanying error. /// -public enum SiteSegmentsResult { +@frozen public enum SiteSegmentsResult { case success([SiteSegment]) case failure(SiteSegmentsError) } diff --git a/WordPressKit.xcodeproj/project.pbxproj b/WordPressKit.xcodeproj/project.pbxproj index 8b7c462c..23851528 100644 --- a/WordPressKit.xcodeproj/project.pbxproj +++ b/WordPressKit.xcodeproj/project.pbxproj @@ -798,6 +798,7 @@ 0C1C08422B9CD8D200E52F8C /* PostServiceRemoteREST+Extended.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostServiceRemoteREST+Extended.swift"; sourceTree = ""; }; 0C1C08442B9CDB0B00E52F8C /* PostServiceRemoteXMLRPC+Extended.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostServiceRemoteXMLRPC+Extended.swift"; sourceTree = ""; }; 0C3A2A412A2E7BA500FD91D6 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + 0C6183C62C420A3700289E73 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 0C674E2F2BF3A91300F3B3D4 /* JetpackAIServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JetpackAIServiceRemote.swift; sourceTree = ""; }; 0C938A052C416789009BA7B2 /* Secret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Secret.swift; sourceTree = ""; }; 0C938A072C4167BB009BA7B2 /* NSString+XMLExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+XMLExtensions.h"; sourceTree = ""; }; @@ -2317,6 +2318,7 @@ 9368C7711EC5EF1B0092CE8E = { isa = PBXGroup; children = ( + 0C6183C62C420A3700289E73 /* Package.swift */, 3FE2E9432BB11413002CA2E1 /* Sources */, 3FE2E9442BB11592002CA2E1 /* Tests */, FFE247CD20CB1245002DF3A2 /* LICENSE */,