Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 7e912cd

Browse files
committed
Merge branch 'trunk' into http-request-builder-unify-query-and-form
2 parents 59bd717 + 5673524 commit 7e912cd

40 files changed

+1122
-485
lines changed

CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ _None._
3434

3535
### Breaking Changes
3636

37-
_None._
37+
- `WordPressComRestApiError` is renamed to `WordPressRestApiErrorCode`, and no longer conforms to `Swift.Error`. [#696]
3838

3939
### New Features
4040

@@ -46,6 +46,18 @@ _None._
4646

4747
### Internal Changes
4848

49+
_None._
50+
51+
## 11.0.0
52+
53+
### Breaking Changes
54+
55+
- `WordPressComRestApi` initialisers now accept a `baseURL: URL` parameter instead of `baseUrlString: String`. [#691]
56+
- Removed the async functions in `WordPressComRestApi`. [#692]
57+
- URL parameters in `WordPressComOAuthClient` initialisers are now declared as `URL` type, instead of `String`. [#698]
58+
59+
### Internal Changes
60+
4961
- Refactor WP.com authentication API requests. [#660, #661, #681]
5062

5163
## 10.0.0

WordPressKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Pod::Spec.new do |s|
44
s.name = 'WordPressKit'
5-
s.version = '10.0.0'
5+
s.version = '11.0.0'
66

77
s.summary = 'WordPressKit offers a clean and simple WordPress.com and WordPress.org API.'
88
s.description = <<-DESC

WordPressKit.xcodeproj/project.pbxproj

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,16 @@
150150
4A11239A2B19269A004690CF /* WordPressAPIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123992B19269A004690CF /* WordPressAPIError.swift */; };
151151
4A11239C2B1926B7004690CF /* HTTPRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */; };
152152
4A11239E2B1926D1004690CF /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239D2B1926D1004690CF /* HTTPClient.swift */; };
153+
4A1123A02B196821004690CF /* MultipartForm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A11239F2B196821004690CF /* MultipartForm.swift */; };
154+
4A1123A22B19690C004690CF /* MultipartFormTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1123A12B19690C004690CF /* MultipartFormTests.swift */; };
153155
4A1DEF44293051BC00322608 /* LoggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF43293051BC00322608 /* LoggingTests.swift */; };
154156
4A1DEF46293051C600322608 /* LoggingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1DEF45293051C600322608 /* LoggingTests.m */; };
155157
4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */; };
158+
4A57A6812B549144008D0660 /* WordPressComRestApiTests+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */; };
159+
4A57A6832B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */; };
160+
4A57A6872B54C68C008D0660 /* Constants.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A57A6852B54C68C008D0660 /* Constants.h */; settings = {ATTRIBUTES = (Public, ); }; };
161+
4A57A6882B54C68C008D0660 /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A57A6862B54C68C008D0660 /* Constants.m */; };
162+
4A5BC1A82B59DE6600C7D037 /* Either.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5BC1A72B59DE6600C7D037 /* Either.swift */; };
156163
4A68E3CD29404181004AC3DC /* RemoteBlog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CC29404181004AC3DC /* RemoteBlog.swift */; };
157164
4A68E3CF29404289004AC3DC /* RemoteBlogOptionsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */; };
158165
4A68E3D329406AA0004AC3DC /* RemoteMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */; };
@@ -398,7 +405,6 @@
398405
8B749E8225AF7DDA00023F03 /* JetpackCapabilitiesServiceRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B749E8125AF7DDA00023F03 /* JetpackCapabilitiesServiceRemoteTests.swift */; };
399406
8B749E8625AF808600023F03 /* jetpack-capabilities-107159616-success.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B749E8525AF808600023F03 /* jetpack-capabilities-107159616-success.json */; };
400407
8B749E8A25AF819700023F03 /* jetpack-capabilities-malformed.json in Resources */ = {isa = PBXBuildFile; fileRef = 8B749E8925AF819700023F03 /* jetpack-capabilities-malformed.json */; };
401-
8B9F0CAE2762414F00DBE144 /* WordPressComRestApiTests+AsyncAwait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B9F0CAD2762414F00DBE144 /* WordPressComRestApiTests+AsyncAwait.swift */; };
402408
8BB5F62127A99A2000B2FFAF /* DashboardServiceRemote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB5F62027A99A2000B2FFAF /* DashboardServiceRemote.swift */; };
403409
8BB5F62427A9A5D100B2FFAF /* DashboardServiceRemoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BB5F62327A9A5D100B2FFAF /* DashboardServiceRemoteTests.swift */; };
404410
8BB5F62827A9B12800B2FFAF /* dashboard-200-with-drafts-and-scheduled-posts.json in Resources */ = {isa = PBXBuildFile; fileRef = 8BB5F62727A9B12800B2FFAF /* dashboard-200-with-drafts-and-scheduled-posts.json */; };
@@ -859,9 +865,16 @@
859865
4A1123992B19269A004690CF /* WordPressAPIError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordPressAPIError.swift; sourceTree = "<group>"; };
860866
4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPRequestBuilder.swift; sourceTree = "<group>"; };
861867
4A11239D2B1926D1004690CF /* HTTPClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = "<group>"; };
868+
4A11239F2B196821004690CF /* MultipartForm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartForm.swift; sourceTree = "<group>"; };
869+
4A1123A12B19690C004690CF /* MultipartFormTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartFormTests.swift; sourceTree = "<group>"; };
862870
4A1DEF43293051BC00322608 /* LoggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingTests.swift; sourceTree = "<group>"; };
863871
4A1DEF45293051C600322608 /* LoggingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoggingTests.m; sourceTree = "<group>"; };
864872
4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordPressAPIErrorTests.swift; sourceTree = "<group>"; };
873+
4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WordPressComRestApiTests+Error.swift"; sourceTree = "<group>"; };
874+
4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WordPressAPIError+NSErrorBrdige.swift"; sourceTree = "<group>"; };
875+
4A57A6852B54C68C008D0660 /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Constants.h; sourceTree = "<group>"; };
876+
4A57A6862B54C68C008D0660 /* Constants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Constants.m; sourceTree = "<group>"; };
877+
4A5BC1A72B59DE6600C7D037 /* Either.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Either.swift; sourceTree = "<group>"; };
865878
4A68E3CC29404181004AC3DC /* RemoteBlog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlog.swift; sourceTree = "<group>"; };
866879
4A68E3CE29404289004AC3DC /* RemoteBlogOptionsHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteBlogOptionsHelper.swift; sourceTree = "<group>"; };
867880
4A68E3D029406AA0004AC3DC /* RemoteMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteMenu.swift; sourceTree = "<group>"; };
@@ -1109,7 +1122,6 @@
11091122
8B749E8125AF7DDA00023F03 /* JetpackCapabilitiesServiceRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JetpackCapabilitiesServiceRemoteTests.swift; sourceTree = "<group>"; };
11101123
8B749E8525AF808600023F03 /* jetpack-capabilities-107159616-success.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "jetpack-capabilities-107159616-success.json"; sourceTree = "<group>"; };
11111124
8B749E8925AF819700023F03 /* jetpack-capabilities-malformed.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "jetpack-capabilities-malformed.json"; sourceTree = "<group>"; };
1112-
8B9F0CAD2762414F00DBE144 /* WordPressComRestApiTests+AsyncAwait.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WordPressComRestApiTests+AsyncAwait.swift"; sourceTree = "<group>"; };
11131125
8BB5F62027A99A2000B2FFAF /* DashboardServiceRemote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardServiceRemote.swift; sourceTree = "<group>"; };
11141126
8BB5F62327A9A5D100B2FFAF /* DashboardServiceRemoteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DashboardServiceRemoteTests.swift; sourceTree = "<group>"; };
11151127
8BB5F62727A9B12800B2FFAF /* dashboard-200-with-drafts-and-scheduled-posts.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "dashboard-200-with-drafts-and-scheduled-posts.json"; sourceTree = "<group>"; };
@@ -1843,8 +1855,8 @@
18431855
57A38E502624F7D000472480 /* WordPressAPI */,
18441856
FFE247A620C891D1002DF3A2 /* WordPressComOAuthClientTests.swift */,
18451857
74B335D91F06F3D60053A184 /* WordPressComRestApiTests.swift */,
1846-
8B9F0CAD2762414F00DBE144 /* WordPressComRestApiTests+AsyncAwait.swift */,
18471858
73B3DAD521FBB20D00B2CF18 /* WordPressComRestApiTests+Locale.swift */,
1859+
4A57A6802B549144008D0660 /* WordPressComRestApiTests+Error.swift */,
18481860
FFA4D4A82423B10A00BF5180 /* WordPressOrgRestApiTests.swift */,
18491861
74B335DB1F06F4180053A184 /* WordPressOrgXMLRPCApiTests.swift */,
18501862
740B23D51F17F7C100067A2A /* XMLRPCTestable.swift */,
@@ -2464,6 +2476,7 @@
24642476
4A11239D2B1926D1004690CF /* HTTPClient.swift */,
24652477
4A11239B2B1926B7004690CF /* HTTPRequestBuilder.swift */,
24662478
4A1123992B19269A004690CF /* WordPressAPIError.swift */,
2479+
4A57A6822B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift */,
24672480
);
24682481
name = WordPressAPI;
24692482
sourceTree = "<group>";
@@ -2480,8 +2493,12 @@
24802493
57BCD3D326209D9500292CB3 /* AppTransportSecuritySettings.swift */,
24812494
465F88A1263B325C00F4C950 /* ChecksumUtil.swift */,
24822495
3F3195AC266FF94B00397EE7 /* ZendeskMetadata.swift */,
2496+
4A11239F2B196821004690CF /* MultipartForm.swift */,
24832497
4AE278432B2FAF6200E4D9B1 /* HTTPProtocolHelpers.swift */,
24842498
3F391E192B50F3EB007975C4 /* Result+Callback.swift */,
2499+
4A5BC1A72B59DE6600C7D037 /* Either.swift */,
2500+
4A57A6852B54C68C008D0660 /* Constants.h */,
2501+
4A57A6862B54C68C008D0660 /* Constants.m */,
24852502
);
24862503
name = Utility;
24872504
sourceTree = "<group>";
@@ -2671,6 +2688,7 @@
26712688
803DE81028FFA9C4007D4E9C /* RemoteConfigRemoteTests.swift */,
26722689
4A1DEF43293051BC00322608 /* LoggingTests.swift */,
26732690
4A1DEF45293051C600322608 /* LoggingTests.m */,
2691+
4A1123A12B19690C004690CF /* MultipartFormTests.swift */,
26742692
4A6B4A832B26974F00802316 /* HTTPRequestBuilderTests.swift */,
26752693
4A6B4A852B269D0C00802316 /* URLSessionHelperTests.swift */,
26762694
4A40F6542B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift */,
@@ -2764,6 +2782,7 @@
27642782
740B23C41F17EE8000067A2A /* RemotePost.h in Headers */,
27652783
740B23C21F17EE8000067A2A /* RemotePostCategory.h in Headers */,
27662784
B5A4822F20AC6C1A009D95F6 /* WPKitLogging.h in Headers */,
2785+
4A57A6872B54C68C008D0660 /* Constants.h in Headers */,
27672786
9309995B1F16616A00F006A1 /* RemoteTheme.h in Headers */,
27682787
1A4F98672279A87D00D86E8E /* WPKit-Swift.h in Headers */,
27692788
93F50A371F226B9300B5BEBA /* WordPressComServiceRemote.h in Headers */,
@@ -3331,6 +3350,7 @@
33313350
93BD277E1EE73944002BB00B /* NSDate+WordPressJSON.m in Sources */,
33323351
8B2F4BED24ABCAEF0056C08A /* Decodable+Dictionary.swift in Sources */,
33333352
E194CB731FBDEF6500B0A8B8 /* PluginState.swift in Sources */,
3353+
4A57A6882B54C68C008D0660 /* Constants.m in Sources */,
33343354
404057D6221C92660060250C /* StatsTopClicksTimeIntervalData.swift in Sources */,
33353355
9AF4F2FC218331DC00570E4B /* PostServiceRemoteREST+Revisions.swift in Sources */,
33363356
F4B0F4732ACAF498003ABC61 /* DomainsServiceRemote+AllDomains.swift in Sources */,
@@ -3375,6 +3395,7 @@
33753395
4A11239C2B1926B7004690CF /* HTTPRequestBuilder.swift in Sources */,
33763396
40E7FEB1220FB3B60032834E /* StatsAnnualAndMostPopularTimeInsight.swift in Sources */,
33773397
3F758FD324F6C68200BBA2FC /* AnnouncementServiceRemote.swift in Sources */,
3398+
4A1123A02B196821004690CF /* MultipartForm.swift in Sources */,
33783399
FAB4F32324EC072700F259BA /* ReaderPostServiceRemote+Subscriptions.swift in Sources */,
33793400
82FFBF561F460DD400F4573F /* BlogJetpackSettingsServiceRemote.swift in Sources */,
33803401
3297E15625645C7D00287D21 /* JetpackCredentials.swift in Sources */,
@@ -3427,6 +3448,7 @@
34273448
436D563C2118E18D00CEAA33 /* WPState.swift in Sources */,
34283449
439A44DA2107C93000795ED7 /* RemotePlan_ApiVersion1_3.swift in Sources */,
34293450
93BD27811EE73944002BB00B /* WordPressOrgXMLRPCApi.swift in Sources */,
3451+
4A57A6832B54A326008D0660 /* WordPressAPIError+NSErrorBrdige.swift in Sources */,
34303452
439A44D62107C66A00795ED7 /* JSONDecoderExtension.swift in Sources */,
34313453
B5A4822B20AC6C0B009D95F6 /* WPKitLogging.swift in Sources */,
34323454
B5A4822E20AC6C1A009D95F6 /* WPKitLogging.m in Sources */,
@@ -3464,6 +3486,7 @@
34643486
436D5641211B7F4400CEAA33 /* DomainContactInformation.swift in Sources */,
34653487
FA28A3D6259079960082C7B0 /* JetpackRestoreTypes.swift in Sources */,
34663488
32FC20CE255DCC6100CD0A7B /* JetpackScanThreat.swift in Sources */,
3489+
4A5BC1A82B59DE6600C7D037 /* Either.swift in Sources */,
34673490
FE50965F2A2E42A500DDD071 /* JetpackSocialServiceRemote.swift in Sources */,
34683491
3F3195AD266FF94B00397EE7 /* ZendeskMetadata.swift in Sources */,
34693492
40A71C6E220E1D8E002E3D25 /* StatsServiceRemoteV2.swift in Sources */,
@@ -3495,6 +3518,7 @@
34953518
74155E251EF87DDF00A06AEA /* ServiceRemoteRESTTests.m in Sources */,
34963519
46ABD0EA262EEE0400C7FF24 /* AppTransportSecuritySettingsTests.swift in Sources */,
34973520
74D67F0A1F15C24C0010C5ED /* PeopleServiceRemoteTests.swift in Sources */,
3521+
4A1123A22B19690C004690CF /* MultipartFormTests.swift in Sources */,
34983522
9F3E0BAE20873836009CB5BA /* ReaderTopicServiceRemoteTest+Subscriptions.swift in Sources */,
34993523
BA0637ED2492382200AF8419 /* PluginStateTests.swift in Sources */,
35003524
7328420621CD798A00126755 /* WordPressComServiceRemoteTests+SiteCreation.swift in Sources */,
@@ -3552,6 +3576,7 @@
35523576
FFE247A720C891D1002DF3A2 /* WordPressComOAuthClientTests.swift in Sources */,
35533577
93AB06041EE8838400EF8764 /* RemoteTestCase.swift in Sources */,
35543578
4A40F6552B2A5A1A0015DA77 /* WordPressAPIErrorTests.swift in Sources */,
3579+
4A57A6812B549144008D0660 /* WordPressComRestApiTests+Error.swift in Sources */,
35553580
BA2A78FA24A486D300BB6F53 /* SitePluginTests.swift in Sources */,
35563581
465F88A7263B371D00F4C950 /* BlockEditorSettingsServiceRemoteTests.swift in Sources */,
35573582
93BD27411EE73311002BB00B /* AccountServiceRemoteRESTTests.swift in Sources */,
@@ -3593,7 +3618,6 @@
35933618
4A05E7AC2B35048A00C25E3B /* RSDParserTests.swift in Sources */,
35943619
46ABD0E0262EED3D00C7FF24 /* WordPressOrgXMLRPCValidatorTests.swift in Sources */,
35953620
D813437621F6D70D0060D99A /* SiteSegmentsResponseDecodingTests.swift in Sources */,
3596-
8B9F0CAE2762414F00DBE144 /* WordPressComRestApiTests+AsyncAwait.swift in Sources */,
35973621
436D56382118DC4B00CEAA33 /* TransactionsServiceRemoteTests.swift in Sources */,
35983622
9F3E0BA82087355E009CB5BA /* RemoteReaderSiteInfoSubscriptionTests.swift in Sources */,
35993623
BA62CFE924B592E000978BE1 /* DynamicMockProvider.swift in Sources */,

WordPressKit/ActivityServiceRemote.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ open class ActivityServiceRemote: ServiceRemoteWordPressComREST {
154154
}, failure: { error, _ in
155155
// FIXME: A hack to support free WPCom sites and Rewind. Should be obsolote as soon as the backend
156156
// stops returning 412's for those sites.
157-
if let error = error as? WordPressComRestApiError, error == WordPressComRestApiError.preconditionFailure {
157+
if error.domain == WordPressComRestApiEndpointError.errorDomain, error.code == WordPressComRestApiErrorCode.preconditionFailure.rawValue {
158158
let status = RewindStatus(state: .unavailable)
159159
success(status)
160160
return

WordPressKit/Constants.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#import <Foundation/Foundation.h>
2+
3+
NS_ASSUME_NONNULL_BEGIN
4+
5+
FOUNDATION_EXTERN NSString *WordPressComRestApiErrorDomain;
6+
7+
NS_ASSUME_NONNULL_END

WordPressKit/Constants.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#import "Constants.h"
2+
3+
/// Error domain of `NSError` instances that are converted from `WordPressComRestApiEndpointError`
4+
/// and `WordPressAPIError<WordPressComRestApiEndpointError>` instances.
5+
///
6+
/// See `extension WordPressComRestApiEndpointError: CustomNSError` for context.
7+
NSString *WordPressComRestApiErrorDomain = @"WordPressKit.WordPressComRestApiError";

WordPressKit/Either.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Foundation
2+
3+
enum Either<L, R> {
4+
case left(L)
5+
case right(R)
6+
7+
func map<T>(left: (L) -> T, right: (R) -> T) -> T {
8+
switch self {
9+
case let .left(value):
10+
return left(value)
11+
case let .right(value):
12+
return right(value)
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)