diff --git a/RevenueCatUI/Helpers/PaywallData+Default.swift b/RevenueCatUI/Helpers/PaywallData+Default.swift index 5f61f02e48..97397b1fc9 100644 --- a/RevenueCatUI/Helpers/PaywallData+Default.swift +++ b/RevenueCatUI/Helpers/PaywallData+Default.swift @@ -40,13 +40,15 @@ extension PaywallData { displayRestorePurchases: true ), localization: Self.localization, - assetBaseURL: Self.defaultTemplateBaseURL + assetBaseURL: Self.defaultTemplateBaseURL, + revision: Self.revisionID ) } static let defaultTemplate: PaywallTemplate = .template2 static let appIconPlaceholder = "revenuecatui_default_paywall_app_icon" + static let revisionID: Int = -1 } diff --git a/Sources/Misc/Codable/DefaultDecodable.swift b/Sources/Misc/Codable/DefaultDecodable.swift index cdbfa4d8ad..67c61cac42 100644 --- a/Sources/Misc/Codable/DefaultDecodable.swift +++ b/Sources/Misc/Codable/DefaultDecodable.swift @@ -199,6 +199,10 @@ enum DefaultDecodable { static var defaultValue: String { "" } } + enum Zero: DefaultValueProvider { + static var defaultValue: Int { 0 } + } + enum EmptyArray: DefaultValueProvider { static var defaultValue: T { [] } } @@ -226,6 +230,7 @@ enum DefaultDecodable { * @DefaultDecodable.EmptyArray var values: [String] * @DefaultDecodable.EmptyDictionary var dictionary: [String: Int] * @DefaultDecodable.Now var date: Date + * @DefaultDecodable.Zero var number: Int * } * ``` */ @@ -237,5 +242,6 @@ extension DefaultDecodable { typealias EmptyArray = DefaultValue> typealias EmptyDictionary = DefaultValue> typealias Now = DefaultValue + typealias Zero = DefaultValue } diff --git a/Sources/Paywalls/PaywallData.swift b/Sources/Paywalls/PaywallData.swift index 25bbc85d2d..564f1afc61 100644 --- a/Sources/Paywalls/PaywallData.swift +++ b/Sources/Paywalls/PaywallData.swift @@ -11,7 +11,7 @@ // // Created by Nacho Soto on 7/10/23. -// swiftlint:disable file_length +// swiftlint:disable file_length identifier_name import Foundation @@ -31,6 +31,15 @@ public struct PaywallData { /// The base remote URL where assets for this paywall are stored. public var assetBaseURL: URL + /// The revision identifier for this paywall. + var revision: Int { + get { return self._revision } + set { self._revision = newValue } + } + + @DefaultDecodable.Zero + internal private(set) var _revision: Int = 0 + @EnsureNonEmptyCollectionDecodable internal private(set) var localization: [String: LocalizedConfiguration] @@ -60,8 +69,6 @@ public protocol PaywallLocalizedConfiguration { } -// swiftlint:disable identifier_name - extension PaywallData { /// Defines the necessary localized information for a paywall. @@ -347,12 +354,14 @@ extension PaywallData { templateName: String, config: Configuration, localization: [String: LocalizedConfiguration], - assetBaseURL: URL + assetBaseURL: URL, + revision: Int = 0 ) { self.templateName = templateName self.config = config self.localization = localization self.assetBaseURL = assetBaseURL + self.revision = revision } /// Creates a test ``PaywallData`` with one localization @@ -360,7 +369,8 @@ extension PaywallData { templateName: String, config: Configuration, localization: LocalizedConfiguration, - assetBaseURL: URL + assetBaseURL: URL, + revision: Int = 0 ) { let locale = Locale.current.identifier @@ -368,7 +378,8 @@ extension PaywallData { templateName: templateName, config: config, localization: [locale: localization], - assetBaseURL: assetBaseURL + assetBaseURL: assetBaseURL, + revision: revision ) } @@ -428,6 +439,7 @@ extension PaywallData: Codable { case config case localization = "localizedStrings" case assetBaseURL = "assetBaseUrl" + case _revision = "revision" } } diff --git a/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json b/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json index bd49fb6db3..2520486736 100644 --- a/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json +++ b/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json @@ -56,6 +56,7 @@ "title" : "Ignite your child's curiosity" } }, + "revision" : 1, "template_name" : "1" } }, diff --git a/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json b/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json index 87b36f4f54..1107850ff8 100644 --- a/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json +++ b/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json @@ -70,6 +70,7 @@ "title" : "Ignite your child's curiosity" } }, + "revision" : 3, "template_name" : "2" } }, diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json index 1b8fa24b7f..357647319c 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json b/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json index 65da9802cf..ff7ffe695b 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json @@ -84,7 +84,8 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 5 } }, { diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json index 775471c955..7504d3a227 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json @@ -69,5 +69,6 @@ } } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 7 } diff --git a/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift b/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift index 0f10c2b2c0..329160c152 100644 --- a/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift +++ b/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift @@ -112,6 +112,7 @@ class OfferingsDecodingTests: BaseHTTPResponseTest { let paywall = try XCTUnwrap(offering.paywall) expect(paywall.templateName) == "1" try expect(paywall.assetBaseURL) == XCTUnwrap(URL(string: "https://rc-paywalls.s3.amazonaws.com")) + expect(paywall.revision) == 5 expect(paywall.config.packages) == ["$rc_monthly", "$rc_annual", "custom_package"] expect(paywall.config.defaultPackage).to(beNil()) diff --git a/Tests/UnitTests/Paywalls/PaywallDataTests.swift b/Tests/UnitTests/Paywalls/PaywallDataTests.swift index 69c3fcf05a..f57b8e0355 100644 --- a/Tests/UnitTests/Paywalls/PaywallDataTests.swift +++ b/Tests/UnitTests/Paywalls/PaywallDataTests.swift @@ -22,6 +22,7 @@ class PaywallDataTests: BaseHTTPResponseTest { expect(paywall.templateName) == "1" expect(paywall.assetBaseURL) == URL(string: "https://rc-paywalls.s3.amazonaws.com")! + expect(paywall.revision) == 7 expect(paywall.config.packages) == ["$rc_monthly", "$rc_annual", "custom_package"] expect(paywall.config.defaultPackage) == "$rc_annual" expect(paywall.config.images) == .init(