Skip to content

Adds EnumDeserializerWithDefault and SealedDeserializerWithDefault#2345

Merged
JayShortway merged 2 commits into
mainfrom
pw2-default-sealed-enum-cases-1
Apr 10, 2025
Merged

Adds EnumDeserializerWithDefault and SealedDeserializerWithDefault#2345
JayShortway merged 2 commits into
mainfrom
pw2-default-sealed-enum-cases-1

Conversation

@JayShortway

@JayShortway JayShortway commented Apr 9, 2025

Copy link
Copy Markdown
Member

This is part 1/3:

  1. 👉 Adds EnumDeserializerWithDefault and SealedDeserializerWithDefault #2345
  2. [Paywalls v2] Adds a default case to most enums and sealed types #2346
  3. [Paywalls v2] Adds a default case to Background and ButtonComponent #2347

Description

Adds 2 abstract serializers that will be used in the follow-up PRs to deserialize enums and sealed types with a default case.

@codecov

codecov Bot commented Apr 9, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 0% with 28 lines in your changes missing coverage. Please review.

Project coverage is 79.93%. Comparing base (91bdacd) to head (629ce04).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...utils/serializers/SealedDeserializerWithDefault.kt 0.00% 15 Missing ⚠️
...s/utils/serializers/EnumDeserializerWithDefault.kt 0.00% 13 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2345      +/-   ##
==========================================
- Coverage   80.15%   79.93%   -0.23%     
==========================================
  Files         282      284       +2     
  Lines       10023    10051      +28     
  Branches     1418     1422       +4     
==========================================
  Hits         8034     8034              
- Misses       1377     1405      +28     
  Partials      612      612              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ajpallares ajpallares left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes sense, but I'll leave approval to someone who knows Kotlin better

internal abstract class SealedDeserializerWithDefault<T : Any>(
private val serialName: String,
private val serializerByType: Map<String, () -> KSerializer<out T>>,
private val defaultValue: () -> T,

@ajpallares ajpallares Apr 9, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an optimization to only lazily compute the defaultValue when needed, right?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess that a sealed class default might have properties that also need to be initialized... I think this way we allow that?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, it's very likely premature, but also practically free. I figured this abstract class doesn't know what the default value of its implementation will be, and this avoids any computation as well as object instantiation to when it is needed. Otherwise all default values will be instantiated right away.

@tonidero tonidero left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! I haven't checked the usage yet, but these make sense to me!

defaultValue = defaultValue,
)

private val enumName = defaultValue.javaClass.simpleName

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess if/when we fix minification in our SDKs, we should remember to keep the names of these enums... But we should be ok for now 👍

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a very good point!

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, it's only used in the SerialDescriptor, so I think that should be fine. Still good to double check when we minify.

internal abstract class SealedDeserializerWithDefault<T : Any>(
private val serialName: String,
private val serializerByType: Map<String, () -> KSerializer<out T>>,
private val defaultValue: () -> T,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess that a sealed class default might have properties that also need to be initialized... I think this way we allow that?

@JayShortway JayShortway added this pull request to the merge queue Apr 10, 2025
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Apr 10, 2025
@emerge-tools

emerge-tools Bot commented Apr 10, 2025

Copy link
Copy Markdown

📸 Snapshot Test

2 modified, 414 unchanged

Name Added Removed Modified Renamed Unchanged Errored Approval
TestPurchasesUIAndroidCompatibility Paparazzi
com.revenuecat.testpurchasesuiandroidcompatibility.paparazzi
0 0 2 0 147 0 ✅ Approved
TestPurchasesUIAndroidCompatibility
com.revenuecat.testpurchasesuiandroidcompatibility
0 0 0 0 267 0 N/A

🛸 Powered by Emerge Tools

@JayShortway JayShortway added this pull request to the merge queue Apr 10, 2025
Merged via the queue into main with commit e1daf5c Apr 10, 2025
@JayShortway JayShortway deleted the pw2-default-sealed-enum-cases-1 branch April 10, 2025 11:03
github-merge-queue Bot pushed a commit that referenced this pull request Apr 10, 2025
This is part 2/3:
1. #2345 
2. 👉  #2346 
3. #2347
---------------
## Description
This uses the `EnumDeserializerWithDefault` and
`SealedDeserializerWithDefault` to add default cases to all enums and
sealed types, except `Background` and `ButtonComponent`. Those 2 will be
done in the next PR, as they have some cascading effects.
github-merge-queue Bot pushed a commit that referenced this pull request Apr 11, 2025
…t` (#2347)

This is part 3/3:
1. #2345 
2. #2346 
3. 👉  #2347
---------------
## Description
Adds a new `Unknown` default case to: 
- `Background`
- `ButtonComponent.Action`
- `ButtonComponent.Destination`
- `ButtonComponent.UrlMethod`

And handles this new case in code:
- An unknown background type will cause the paywall to fail to render,
as we can't infer colors and content colors in this case.
- Any unknown button action/destination/method type will cause the
button to be hidden.
github-merge-queue Bot pushed a commit that referenced this pull request Apr 15, 2025
**This is an automatic release.**

## RevenueCat SDK
### 🐞 Bugfixes
* Add missing response fields to `CustomerInfo`. Including transaction
Prices (#2128) via Cesar de la Vega (@vegaro)

## RevenueCatUI SDK
### Paywallv2
#### 🐞 Bugfixes
* [Paywalls v2] Fixes timeline layout when width is Fit (#2354) via
JayShortway (@JayShortway)
* [Paywalls V2] Improves fuzzy matching locale when the region doesn't
match (#2355) via JayShortway (@JayShortway)
* [Paywalls V2] Norwegian Bokmål and Norwegian Nynorsk fall back to
Norwegian. (#2329) via JayShortway (@JayShortway)
### Customer Center
#### 🐞 Bugfixes
* Clean up on restoring functionality in customer center (#2316) via
Cesar de la Vega (@vegaro)

### 🔄 Other Changes
* [Paywalls v2] Adds the unsupported Background type to the error
message (#2350) via JayShortway (@JayShortway)
* [Paywalls v2] Uses a fixed date for template previews to avoid daily
changes. (#2351) via JayShortway (@JayShortway)
* [Paywalls v2] Adds a default case to `Background` and
`ButtonComponent` (#2347) via JayShortway (@JayShortway)
* [Paywalls v2] Improves `PaywallComponentsTemplatePreviewRecorder`
stability (#2352) via JayShortway (@JayShortway)
* [Paywalls v2] Adds a default case to most enums and sealed types
(#2346) via JayShortway (@JayShortway)
* Adds `EnumDeserializerWithDefault` and `SealedDeserializerWithDefault`
(#2345) via JayShortway (@JayShortway)
* [Paywalls V2] Renders template previews in a fixed resolution using
Paparazzi (#2214) via JayShortway (@JayShortway)
* Bump fastlane from 2.227.0 to 2.227.1 (#2344) via dependabot[bot]
(@dependabot[bot])
* Migrate root gradle file to KTS (#2343) via Jaewoong Eum (@skydoves)
* Migrate tester modules to KTS format (#2340) via Jaewoong Eum
(@skydoves)
* Introduce purchases-bom package (#2339) via Jaewoong Eum (@skydoves)
* [AUTOMATIC][Paywalls V2] Updates paywall-preview-resources submodule
(#2338) via RevenueCat Git Bot (@RCGitBot)
* [Diagnostics] Removes Android 7 requirement (#2335) via JayShortway
(@JayShortway)
* [Paywalls v2] Fixes `update-paywall-preview-resources-submodule` CI
job (#2337) via JayShortway (@JayShortway)
* Make purchases module to transitive dependency for the ui module
(#2334) via Jaewoong Eum (@skydoves)
* Migrate settings.gradle to KTS and add the dependency resolutions
(#2328) via Jaewoong Eum (@skydoves)

Co-authored-by: revenuecat-ops <ops@revenuecat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants