Skip to content

Commit de433d3

Browse files
committed
Implement RemoteBlogSettings conversion to NSDictionary in Swift
1 parent b0d9444 commit de433d3

File tree

3 files changed

+114
-61
lines changed

3 files changed

+114
-61
lines changed

Sources/WordPressKit/Models/RemoteBlogSettings.swift

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,68 @@ public class RemoteBlogSettings: NSObject {
294294
sharingDisabledReblogs = rawSettings.number(forKey: CodingKeys.sharingDisabledReblogs.rawValue)
295295
}
296296

297+
@objc
298+
public var dictionaryRepresentation: NSDictionary {
299+
let parameters = NSMutableDictionary()
300+
301+
// name and tagline/description use different keys...
302+
name.ifSome { parameters.setValue($0, forKey: "blogname") }
303+
tagline.ifSome { parameters.setValue($0, forKey: "blogdescription") }
304+
305+
privacy.ifSome { parameters.setValue($0, forKey: CodingKeys.privacy.rawValue) }
306+
languageID.ifSome { parameters.setValue($0, forKey: CodingKeys.languageID.rawValue) }
307+
iconMediaID.ifSome { parameters.setValue($0, forKey: CodingKeys.iconMediaID.rawValue) }
308+
gmtOffset.ifSome { parameters.setValue($0, forKey: CodingKeys.gmtOffset.rawValue) }
309+
timezoneString.ifSome { parameters.setValue($0, forKey: CodingKeys.timezoneString.rawValue) }
310+
311+
defaultCategoryID.ifSome { parameters.setValue($0, forKey: CodingKeys.defaultCategory.rawValue) }
312+
defaultPostFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.defaultPostFormat.rawValue) }
313+
dateFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.dateFormat.rawValue) }
314+
timeFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.timeFormat.rawValue) }
315+
startOfWeek.ifSome { parameters.setValue($0, forKey: CodingKeys.startOfWeek.rawValue) }
316+
postsPerPage.ifSome { parameters.setValue($0, forKey: CodingKeys.postsPerPage.rawValue) }
317+
318+
commentsAllowed.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsAllowed.rawValue) }
319+
commentsBlocklistKeys.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsBlocklistKeys.rawValue) }
320+
commentsCloseAutomatically.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsCloseAutomatically.rawValue) }
321+
commentsCloseAutomaticallyAfterDays.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsCloseAutomaticallyAfterDays.rawValue) }
322+
commentsFromKnownUsersAllowlisted.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsKnownUsersAllowlist.rawValue) }
323+
commentsMaximumLinks.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsMaxLinks.rawValue) }
324+
commentsModerationKeys.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsModerationKeys.rawValue) }
325+
commentsPagingEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsPagingEnabled.rawValue) }
326+
commentsPageSize.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsPageSize.rawValue) }
327+
commentsRequireManualModeration.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireModeration.rawValue) }
328+
commentsRequireNameAndEmail.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireNameAndEmail.rawValue) }
329+
commentsRequireRegistration.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireRegistration.rawValue) }
330+
commentsSortOrder.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsSortOrder.rawValue) }
331+
commentsThreadingEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsThreadingEnabled.rawValue) }
332+
commentsThreadingDepth.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsThreadingDepth.rawValue) }
333+
334+
pingbackOutboundEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.pingbackOutbound.rawValue) }
335+
pingbackInboundEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.pingbackInbound.rawValue) }
336+
337+
// Note: releatedPostsAllowed was not set in the Objective-C implementation.
338+
// There was no comment about it, so I assumed it was simply something that was never noticed.
339+
relatedPostsAllowed.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsAllowed.rawValue) }
340+
relatedPostsEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsEnabled.rawValue) }
341+
relatedPostsShowHeadline.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsShowHeadline.rawValue) }
342+
relatedPostsShowThumbnails.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsShowThumbnails.rawValue) }
343+
344+
// Note: ampSupported was not set in the Objective-C implementation.
345+
// There was no comment about it, so I assumed it was simply something that was never noticed.
346+
ampSupported.ifSome { parameters.setValue($0, forKey: CodingKeys.ampSupported.rawValue) }
347+
ampEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.ampEnabled.rawValue) }
348+
349+
sharingButtonStyle.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingButtonStyle.rawValue) }
350+
sharingLabel.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingLabel.rawValue) }
351+
sharingTwitterName.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingTwitterName.rawValue) }
352+
sharingCommentLikesEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingCommentLikesEnabled.rawValue) }
353+
sharingDisabledLikes.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingDisabledLikes.rawValue) }
354+
sharingDisabledReblogs.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingDisabledReblogs.rawValue) }
355+
356+
return parameters
357+
}
358+
297359
// MARK: - Helpers
298360

299361
/// Computed property, meant to help conversion from Remote / String-Based values, into their Integer counterparts
@@ -312,3 +374,12 @@ public class RemoteBlogSettings: NSObject {
312374
private static let AscendingStringValue = "asc"
313375
private static let DescendingStringValue = "desc"
314376
}
377+
378+
private extension Optional {
379+
380+
func ifSome(_ body: (Wrapped) -> Void) {
381+
guard case .some(let value) = self else { return }
382+
383+
body(value)
384+
}
385+
}

Sources/WordPressKit/Services/BlogServiceRemoteREST.m

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -381,58 +381,7 @@ - (RemoteBlogSettings *)remoteBlogSettingFromJSONDictionary:(NSDictionary *)json
381381

382382
- (NSDictionary *)remoteSettingsToDictionary:(RemoteBlogSettings *)settings
383383
{
384-
NSParameterAssert(settings);
385-
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
386-
387-
[parameters setValueIfNotNil:settings.name forKey:RemoteBlogNameForUpdateKey];
388-
[parameters setValueIfNotNil:settings.tagline forKey:RemoteBlogTaglineForUpdateKey];
389-
[parameters setValueIfNotNil:settings.privacy forKey:RemoteBlogPrivacyKey];
390-
[parameters setValueIfNotNil:settings.languageID forKey:RemoteBlogLanguageKey];
391-
[parameters setValueIfNotNil:settings.iconMediaID forKey:RemoteBlogIconKey];
392-
[parameters setValueIfNotNil:settings.gmtOffset forKey:RemoteBlogGMTOffsetKey];
393-
[parameters setValueIfNotNil:settings.timezoneString forKey:RemoteBlogTimezoneStringKey];
394-
395-
[parameters setValueIfNotNil:settings.defaultCategoryID forKey:RemoteBlogDefaultCategoryKey];
396-
[parameters setValueIfNotNil:settings.defaultPostFormat forKey:RemoteBlogDefaultPostFormatKey];
397-
[parameters setValueIfNotNil:settings.dateFormat forKey:RemoteBlogDateFormatKey];
398-
[parameters setValueIfNotNil:settings.timeFormat forKey:RemoteBlogTimeFormatKey];
399-
[parameters setValueIfNotNil:settings.startOfWeek forKey:RemoteBlogStartOfWeekKey];
400-
[parameters setValueIfNotNil:settings.postsPerPage forKey:RemoteBlogPostsPerPageKey];
401-
402-
[parameters setValueIfNotNil:settings.commentsAllowed forKey:RemoteBlogCommentsAllowedKey];
403-
[parameters setValueIfNotNil:settings.commentsBlocklistKeys forKey:RemoteBlogCommentsBlocklistKeys];
404-
[parameters setValueIfNotNil:settings.commentsCloseAutomatically forKey:RemoteBlogCommentsCloseAutomaticallyKey];
405-
[parameters setValueIfNotNil:settings.commentsCloseAutomaticallyAfterDays forKey:RemoteBlogCommentsCloseAutomaticallyAfterDaysKey];
406-
[parameters setValueIfNotNil:settings.commentsFromKnownUsersAllowlisted forKey:RemoteBlogCommentsKnownUsersAllowlistKey];
407-
[parameters setValueIfNotNil:settings.commentsMaximumLinks forKey:RemoteBlogCommentsMaxLinksKey];
408-
[parameters setValueIfNotNil:settings.commentsModerationKeys forKey:RemoteBlogCommentsModerationKeys];
409-
[parameters setValueIfNotNil:settings.commentsPagingEnabled forKey:RemoteBlogCommentsPagingEnabledKey];
410-
[parameters setValueIfNotNil:settings.commentsPageSize forKey:RemoteBlogCommentsPageSizeKey];
411-
[parameters setValueIfNotNil:settings.commentsRequireManualModeration forKey:RemoteBlogCommentsRequireModerationKey];
412-
[parameters setValueIfNotNil:settings.commentsRequireNameAndEmail forKey:RemoteBlogCommentsRequireNameAndEmailKey];
413-
[parameters setValueIfNotNil:settings.commentsRequireRegistration forKey:RemoteBlogCommentsRequireRegistrationKey];
414-
[parameters setValueIfNotNil:settings.commentsSortOrder forKey:RemoteBlogCommentsSortOrderKey];
415-
[parameters setValueIfNotNil:settings.commentsThreadingEnabled forKey:RemoteBlogCommentsThreadingEnabledKey];
416-
[parameters setValueIfNotNil:settings.commentsThreadingDepth forKey:RemoteBlogCommentsThreadingDepthKey];
417-
418-
[parameters setValueIfNotNil:settings.pingbackOutboundEnabled forKey:RemoteBlogCommentsPingbackOutboundKey];
419-
[parameters setValueIfNotNil:settings.pingbackInboundEnabled forKey:RemoteBlogCommentsPingbackInboundKey];
420-
421-
[parameters setValueIfNotNil:settings.relatedPostsEnabled forKey:RemoteBlogRelatedPostsEnabledKey];
422-
[parameters setValueIfNotNil:settings.relatedPostsShowHeadline forKey:RemoteBlogRelatedPostsShowHeadlineKey];
423-
[parameters setValueIfNotNil:settings.relatedPostsShowThumbnails forKey:RemoteBlogRelatedPostsShowThumbnailsKey];
424-
425-
[parameters setValueIfNotNil:settings.ampEnabled forKey:RemoteBlogAmpEnabledKey];
426-
427-
// Sharing
428-
[parameters setValueIfNotNil:settings.sharingButtonStyle forKey:RemoteBlogSharingButtonStyle];
429-
[parameters setValueIfNotNil:settings.sharingLabel forKey:RemoteBlogSharingLabel];
430-
[parameters setValueIfNotNil:settings.sharingTwitterName forKey:RemoteBlogSharingTwitterName];
431-
[parameters setValueIfNotNil:settings.sharingCommentLikesEnabled forKey:RemoteBlogSharingCommentLikesEnabled];
432-
[parameters setValueIfNotNil:settings.sharingDisabledLikes forKey:RemoteBlogSharingDisabledLikes];
433-
[parameters setValueIfNotNil:settings.sharingDisabledReblogs forKey:RemoteBlogSharingDisabledReblogs];
434-
435-
return parameters;
384+
return [settings dictionaryRepresentation];
436385
}
437386

438387
@end

Tests/WordPressKitTests/Tests/RemoteBlogSettingsTests.swift

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,25 +60,58 @@ final class RemoteBlogSettingsTests: XCTestCase {
6060
// Rather than creating an object and checking the resulting NSDictionary,
6161
// let's load one, convert it, then compare the source and converted dictionaries
6262
let json = try loadJSONSettings()
63-
// FIXME: The init logic is currently in BlogServiceRemoteREST. We'll test it from there first, then update the test with the new location.
64-
let blogService = BlogServiceRemoteREST(wordPressComRestApi: MockWordPressComRestApi(), siteID: 0)
65-
let settings = try XCTUnwrap(blogService.remoteBlogSetting(fromJSONDictionary: json))
63+
let settings = try XCTUnwrap(RemoteBlogSettings(jsonDictionary: json as NSDictionary))
6664

67-
let dictionary = try XCTUnwrap(blogService.remoteSettings(toDictionary: settings))
65+
let dictionary = try XCTUnwrap(settings.dictionaryRepresentation)
6866

69-
// name and tagline have different keys when encoded...
70-
XCTAssertEqual(dictionary["blogname"] as? String, settings.name) // from JSON this is "name"
71-
XCTAssertEqual(dictionary["blogdescription"] as? String, settings.tagline) // from JSON this is "description"
72-
// Flattened settings properties
67+
// defaultPostFormat has custom encoding, so let's test it explicitly.
68+
// Note that here we're obviously testing only one of the possible paths.
69+
XCTAssertEqual(dictionary["default_post_format"] as? String, settings.defaultPostFormat)
70+
71+
XCTAssertEqual(dictionary["blogname"] as? String, settings.name) // "name" in JSON
72+
XCTAssertEqual(dictionary["blogdescription"] as? String, settings.tagline) // "description" in JSON
7373
XCTAssertEqual(dictionary["blog_public"] as? NSNumber, settings.privacy)
7474
XCTAssertEqual(dictionary["lang_id"] as? NSNumber, settings.languageID)
7575
XCTAssertEqual(dictionary["site_icon"] as? NSNumber, settings.iconMediaID)
7676
XCTAssertEqual(dictionary["gmt_offset"] as? NSNumber, settings.gmtOffset)
77-
// And so on...
77+
XCTAssertEqual(dictionary["timezone_string"] as? String, settings.timezoneString)
78+
XCTAssertEqual(dictionary["default_category"] as? NSNumber, settings.defaultCategoryID)
7879

7980
// defaultPostFormat has custom encoding, so let's test it explicitly.
8081
// Note that here we're obviously testing only one of the possible paths.
8182
XCTAssertEqual(dictionary["default_post_format"] as? String, settings.defaultPostFormat)
83+
84+
XCTAssertEqual(dictionary["date_format"] as? String, settings.dateFormat)
85+
XCTAssertEqual(dictionary["time_format"] as? String, settings.timeFormat)
86+
XCTAssertEqual(dictionary["start_of_week"] as? String, settings.startOfWeek)
87+
XCTAssertEqual(dictionary["posts_per_page"] as? NSNumber, settings.postsPerPage)
88+
XCTAssertEqual(dictionary["default_comment_status"] as? NSNumber, settings.commentsAllowed)
89+
XCTAssertEqual(dictionary["blacklist_keys"] as? String, settings.commentsBlocklistKeys)
90+
XCTAssertEqual(dictionary["close_comments_for_old_posts"] as? NSNumber, settings.commentsCloseAutomatically)
91+
XCTAssertEqual(dictionary["close_comments_days_old"] as? NSNumber, settings.commentsCloseAutomaticallyAfterDays)
92+
XCTAssertEqual(dictionary["comment_whitelist"] as? NSNumber, settings.commentsFromKnownUsersAllowlisted)
93+
XCTAssertEqual(dictionary["comment_max_links"] as? NSNumber, settings.commentsMaximumLinks)
94+
XCTAssertEqual(dictionary["moderation_keys"] as? String, settings.commentsModerationKeys)
95+
XCTAssertEqual(dictionary["page_comments"] as? NSNumber, settings.commentsPagingEnabled)
96+
XCTAssertEqual(dictionary["comments_per_page"] as? NSNumber, settings.commentsPageSize)
97+
XCTAssertEqual(dictionary["comment_moderation"] as? NSNumber, settings.commentsRequireManualModeration)
98+
XCTAssertEqual(dictionary["require_name_email"] as? NSNumber, settings.commentsRequireNameAndEmail)
99+
XCTAssertEqual(dictionary["comment_registration"] as? NSNumber, settings.commentsRequireRegistration)
100+
XCTAssertEqual(dictionary["comment_order"] as? String, settings.commentsSortOrder)
101+
XCTAssertEqual(dictionary["thread_comments"] as? NSNumber, settings.commentsThreadingEnabled)
102+
XCTAssertEqual(dictionary["thread_comments_depth"] as? NSNumber, settings.commentsThreadingDepth)
103+
XCTAssertEqual(dictionary["jetpack_relatedposts_allowed"] as? NSNumber, settings.relatedPostsAllowed)
104+
XCTAssertEqual(dictionary["jetpack_relatedposts_enabled"] as? NSNumber, settings.relatedPostsEnabled)
105+
XCTAssertEqual(dictionary["jetpack_relatedposts_show_headline"] as? NSNumber, settings.relatedPostsShowHeadline)
106+
XCTAssertEqual(dictionary["jetpack_relatedposts_show_thumbnails"] as? NSNumber, settings.relatedPostsShowThumbnails)
107+
XCTAssertEqual(dictionary["amp_is_supported"] as? NSNumber, settings.ampSupported)
108+
XCTAssertEqual(dictionary["amp_is_enabled"] as? NSNumber, settings.ampEnabled)
109+
XCTAssertEqual(dictionary["sharing_button_style"] as? String, settings.sharingButtonStyle)
110+
XCTAssertEqual(dictionary["sharing_label"] as? String, settings.sharingLabel)
111+
XCTAssertEqual(dictionary["twitter_via"] as? String, settings.sharingTwitterName)
112+
XCTAssertEqual(dictionary["jetpack_comment_likes_enabled"] as? NSNumber, settings.sharingCommentLikesEnabled)
113+
XCTAssertEqual(dictionary["disabled_likes"] as? NSNumber, settings.sharingDisabledLikes)
114+
XCTAssertEqual(dictionary["disabled_reblogs"] as? NSNumber, settings.sharingDisabledReblogs)
82115
}
83116

84117
func loadJSONSettings() throws -> [String: Any] {

0 commit comments

Comments
 (0)