Skip to content

Commit fe22e7e

Browse files
authored
Make Project.category Optional (#2649)
* make Project.Category optional and safely unwrap it * update tests
1 parent 4dbda4e commit fe22e7e

17 files changed

+102
-54
lines changed

KsApi/models/Project.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import ReactiveSwift
55
public struct Project {
66
public var availableCardTypes: [String]?
77
public var blurb: String
8-
public var category: Category
8+
public var category: Category?
99
public var country: Country
1010
public var creator: User
1111
public var extendedProjectProperties: ExtendedProjectProperties?

KsApi/models/ProjectTests.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ final class ProjectTests: XCTestCase {
116116
])
117117

118118
XCTAssertEqual("US", project.country.countryCode)
119-
XCTAssertEqual("Ceramics", project.category.analyticsName)
120-
XCTAssertEqual(1, project.category.id)
121-
XCTAssertEqual("Ceramics", project.category.name)
122-
XCTAssertEqual(5, project.category.parentId)
123-
XCTAssertEqual("Art", project.category.parentName)
119+
XCTAssertEqual("Ceramics", project.category?.analyticsName)
120+
XCTAssertEqual(1, project.category?.id)
121+
XCTAssertEqual("Ceramics", project.category?.name)
122+
XCTAssertEqual(5, project.category?.parentId)
123+
XCTAssertEqual("Art", project.category?.parentName)
124124
}
125125

126126
func testJSONParsing_WithCompleteData_SpanishCategory() {
@@ -185,11 +185,11 @@ final class ProjectTests: XCTestCase {
185185
])
186186

187187
XCTAssertEqual("US", project.country.countryCode)
188-
XCTAssertEqual("Ceramics", project.category.analyticsName)
189-
XCTAssertEqual(1, project.category.id)
190-
XCTAssertEqual("Cerámica", project.category.name)
191-
XCTAssertEqual(5, project.category.parentId)
192-
XCTAssertEqual("Art", project.category.parentName)
188+
XCTAssertEqual("Ceramics", project.category?.analyticsName)
189+
XCTAssertEqual(1, project.category?.id)
190+
XCTAssertEqual("Cerámica", project.category?.name)
191+
XCTAssertEqual(5, project.category?.parentId)
192+
XCTAssertEqual("Art", project.category?.parentName)
193193
}
194194

195195
func testJSONParsing_WithMemberData() {

KsApi/models/graphql/adapters/Project+FetchProjectQueryDataTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ final class Project_FetchProjectQueryDataTests: XCTestCase {
114114
)
115115

116116
/// Project Category
117-
XCTAssertEqual(project.category.name, "Photobooks")
118-
XCTAssertEqual(project.category.id, decompose(id: "Q2F0ZWdvcnktMjgw"))
119-
XCTAssertEqual(project.category.analyticsName, "Photobooks")
120-
XCTAssertEqual(project.category.parentId, decompose(id: "Q2F0ZWdvcnktMTU="))
121-
XCTAssertEqual(project.category.parentName, "Photography")
117+
XCTAssertEqual(project.category?.name, "Photobooks")
118+
XCTAssertEqual(project.category?.id, decompose(id: "Q2F0ZWdvcnktMjgw"))
119+
XCTAssertEqual(project.category?.analyticsName, "Photobooks")
120+
XCTAssertEqual(project.category?.parentId, decompose(id: "Q2F0ZWdvcnktMTU="))
121+
XCTAssertEqual(project.category?.parentName, "Photography")
122122

123123
/// Project Country
124124
XCTAssertEqual(project.country.countryCode, "CA")

KsApi/models/graphql/adapters/Project+ProjectFragment.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ extension Project {
2525
currency: projectFragment.currency.value
2626
),
2727
let categoryFragment = projectFragment.category?.fragments.categoryFragment,
28-
let category = Project.Category.category(from: categoryFragment),
2928
let dates = projectDates(from: projectFragment),
3029
let memberData = projectMemberData(from: projectFragment),
3130
let photo = projectPhoto(from: projectFragment),
@@ -34,6 +33,11 @@ extension Project {
3433
let creator = User.user(from: userFragment)
3534
else { return nil }
3635

36+
var category: Category?
37+
if let categoryFragment = projectFragment.category?.fragments.categoryFragment {
38+
category = Project.Category.category(from: categoryFragment)
39+
}
40+
3741
var location: Location?
3842
if let locationFragment = projectFragment.location?.fragments.locationFragment {
3943
location = Location.location(from: locationFragment)

KsApi/models/graphql/adapters/Project+ProjectFragmentTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class Project_ProjectFragmentTests: XCTestCase {
3838
project.blurb,
3939
"In this unforgiving Hell, people are forced to fight to the death in an elite gamble for their souls."
4040
)
41-
XCTAssertEqual(project.category.name, "Comic Books")
41+
XCTAssertEqual(project.category?.name, "Comic Books")
4242
XCTAssertEqual(project.creator.id, decompose(id: "VXNlci0xMDA3NTM5MDAy"))
4343
XCTAssertEqual(project.memberData.permissions.last, .comment)
4444
XCTAssertEqual(project.dates.deadline, 1_630_591_053)

KsApi/models/lenses/ProjectLenses.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ extension Project {
104104
) }
105105
)
106106

107-
public static let category = Lens<Project, Project.Category>(
107+
public static let category = Lens<Project, Project.Category?>(
108108
view: { $0.category },
109109
set: { Project(
110110
availableCardTypes: $1.availableCardTypes, blurb: $1.blurb, category: $0, country: $1.country,
@@ -133,6 +133,47 @@ extension Project {
133133
) }
134134
)
135135

136+
public static let categoryName = Lens<Project, String>(
137+
view: { $0.category?.name ?? "" },
138+
set: { newName, project in
139+
let updatedCategory: Project.Category? = project.category.map { category in
140+
Project.Category(id: category.id, name: newName)
141+
}
142+
143+
return Project(
144+
availableCardTypes: project.availableCardTypes,
145+
blurb: project.blurb,
146+
category: updatedCategory,
147+
country: project.country,
148+
creator: project.creator,
149+
extendedProjectProperties: project.extendedProjectProperties,
150+
memberData: project.memberData, dates: project.dates,
151+
displayPrelaunch: project.displayPrelaunch, flagging: project.flagging, id: project.id,
152+
lastWave: project.lastWave,
153+
location: project.location,
154+
name: project.name,
155+
pledgeManager: project.pledgeManager,
156+
pledgeOverTimeCollectionPlanChargeExplanation: project
157+
.pledgeOverTimeCollectionPlanChargeExplanation,
158+
pledgeOverTimeCollectionPlanChargedAsNPayments: project
159+
.pledgeOverTimeCollectionPlanChargedAsNPayments,
160+
pledgeOverTimeCollectionPlanShortPitch: project.pledgeOverTimeCollectionPlanShortPitch,
161+
pledgeOverTimeMinimumExplanation: project.pledgeOverTimeMinimumExplanation,
162+
personalization: project.personalization, photo: project.photo,
163+
isInPostCampaignPledgingPhase: project.isInPostCampaignPledgingPhase,
164+
postCampaignPledgingEnabled: project.postCampaignPledgingEnabled,
165+
prelaunchActivated: project.prelaunchActivated,
166+
redemptionPageUrl: project.redemptionPageUrl,
167+
rewardData: project.rewardData,
168+
sendMetaCapiEvents: project.sendMetaCapiEvents, slug: project.slug,
169+
staffPick: project.staffPick, state: project.state, stats: project.stats, tags: project.tags,
170+
urls: project.urls,
171+
video: project.video, watchesCount: project.watchesCount,
172+
isPledgeOverTimeAllowed: project.isPledgeOverTimeAllowed
173+
)
174+
}
175+
)
176+
136177
public static let country = Lens<Project, Country>(
137178
view: { $0.country },
138179
set: { Project(

KsApi/models/templates/ProjectTemplates.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ extension Project {
7676
|> Project.lens.photo.small .~ "https://i.kickstarter.com/assets/012/224/660/847bc4da31e6863e9351bee4e55b8005_original.jpg?fit=pad&height=90&origin=ugc&q=92&width=160&sig=rOHQ6Fif6TxwI%2BL8F9RQY0wUgN%2F4yusD%2FTGXhYW8w%2FQ%3D"
7777
|> Project.lens.name .~ "Today"
7878
|> Project.lens.blurb .~ "A 24-hour timepiece beautifully designed to change the way you see your day."
79-
|> \.category.name .~ "Product Design"
79+
|> Project.lens.categoryName .~ "Product Design"
8080
|> Project.lens.stats.backersCount .~ 1_090
8181
|> Project.lens.stats.pledged .~ 212_870
8282
|> Project.lens.stats.goal .~ 24_000
@@ -87,7 +87,7 @@ extension Project {
8787
|> Project.lens.photo.small .~ "https://i.kickstarter.com/assets/012/347/230/2eddca8c4a06ecb69b8787b985201b92_original.jpg?fit=contain&origin=ugc&q=92&width=460&sig=ewWbTA9q%2BTNYpB9KQnwXKCfjCJum57sWhpZkp%2FiwHKY%3D"
8888
|> Project.lens.name .~ "Cosmic Surgery"
8989
|> Project.lens.blurb .~ "Cosmic Surgery is a photo book, set in the not too distant future where the world of cosmetic surgery is about to be transformed."
90-
|> \.category.name .~ "Photo Books"
90+
|> Project.lens.categoryName .~ "Photo Books"
9191
|> Project.lens.stats.backersCount .~ 329
9292
|> Project.lens.stats.pledged .~ 22_318
9393
|> Project.lens.stats.goal .~ 22_000
@@ -114,7 +114,7 @@ extension Project {
114114
|> Project.lens.photo.med .~ "https://i.kickstarter.com/assets/005/055/025/6e0d27710c9ae20d661e2974e99fe239_original.jpg?fit=contain&origin=ugc&q=92&width=460&sig=C05wZhm%2Fm7cw9lbn9H05zOhA8ApoQ%2Bu%2FCAO%2FuGJDMo0%3D"
115115
|> Project.lens.name .~ "Charlie Kaufman's Anomalisa"
116116
|> Project.lens.blurb .~ "From writer Charlie Kaufman (Being John Malkovich, Eternal Sunshine of the Spotless Mind) and Duke Johnson (Moral Orel, Frankenhole) comes Anomalisa."
117-
|> \.category.name .~ "Animation"
117+
|> Project.lens.categoryName .~ "Animation"
118118
|> Project.lens.stats.backersCount .~ 5_770
119119
|> Project.lens.stats.pledged .~ 406_237
120120
|> Project.lens.stats.goal .~ 200_000

Library/Tracking/KSRAnalyticsTests.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,10 @@ final class KSRAnalyticsTests: TestCase {
302302
project.stats.percentFunded,
303303
segmentClientProperties?["project_percent_raised"] as? Int
304304
)
305-
XCTAssertEqual(project.category.analyticsName, segmentClientProperties?["project_subcategory"] as? String)
305+
XCTAssertEqual(
306+
project.category?.analyticsName,
307+
segmentClientProperties?["project_subcategory"] as? String
308+
)
306309
XCTAssertEqual("Art", segmentClientProperties?["project_category"] as? String)
307310
XCTAssertEqual(String(project.creator.id), segmentClientProperties?["project_creator_uid"] as? String)
308311
XCTAssertEqual(24 * 15, segmentClientProperties?["project_hours_remaining"] as? Int)
@@ -451,7 +454,10 @@ final class KSRAnalyticsTests: TestCase {
451454

452455
let segmentClientProperties = segmentClient.properties.last
453456

454-
XCTAssertEqual(project.category.analyticsName, segmentClientProperties?["project_subcategory"] as? String)
457+
XCTAssertEqual(
458+
project.category?.analyticsName,
459+
segmentClientProperties?["project_subcategory"] as? String
460+
)
455461
XCTAssertEqual("Art", segmentClientProperties?["project_category"] as? String)
456462
}
457463

Library/Tracking/ProjectAnalyticsProperties.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ extension Project: HasProjectAnalyticsProperties {
5454

5555
extension Project: ProjectAnalyticsProperties {
5656
public var categoryAnalyticsName: String? {
57-
self.category.analyticsName
57+
self.category?.analyticsName
5858
}
5959

6060
public var categoryParentAnalyticsName: String? {
61-
self.category.parentAnalyticsName
61+
self.category?.parentAnalyticsName
6262
}
6363

6464
public var categoryParentId: String? {
65-
self.category.parentId.flatMap(String.init)
65+
self.category?.parentId.flatMap(String.init)
6666
}
6767

6868
public var countryCode: String {

Library/ViewModels/ActivityFriendBackingViewModel.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public final class ActivityFriendBackingViewModel: ActivityFriendBackingViewMode
5252
self.friendTitle = activity
5353
.map { activity in
5454
let stringCategoryId = (
55-
activity.project?.category.parentId ?? activity.project?.category.id
55+
activity.project?.category?.parentId ?? activity.project?.category?.id
5656
)
5757
.map(String.init)
5858

0 commit comments

Comments
 (0)