diff --git a/Examples/MagicWeather/Project.swift b/Examples/MagicWeather/Project.swift index 6505a1fb2a..b75f283c34 100644 --- a/Examples/MagicWeather/Project.swift +++ b/Examples/MagicWeather/Project.swift @@ -4,6 +4,7 @@ import ProjectDescriptionHelpers let project = Project( name: "MagicWeatherApp", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( @@ -34,4 +35,4 @@ let project = Project( settings: .appTarget ) ] -) \ No newline at end of file +) diff --git a/Examples/MagicWeatherSwiftUI/Project.swift b/Examples/MagicWeatherSwiftUI/Project.swift index 7685e28c4e..c04dcfa0a9 100644 --- a/Examples/MagicWeatherSwiftUI/Project.swift +++ b/Examples/MagicWeatherSwiftUI/Project.swift @@ -4,6 +4,7 @@ import ProjectDescriptionHelpers let project = Project( name: "MagicWeatherSwiftUI", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( @@ -34,4 +35,4 @@ let project = Project( settings: .appTarget ) ], -) \ No newline at end of file +) diff --git a/Examples/PurchaseTester/Project.swift b/Examples/PurchaseTester/Project.swift index b9b139ddb8..cfdeef2a1d 100644 --- a/Examples/PurchaseTester/Project.swift +++ b/Examples/PurchaseTester/Project.swift @@ -30,6 +30,7 @@ let allDestinations = destinations + [.appleWatch] let project = Project( name: "PurchaseTester", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( @@ -115,4 +116,4 @@ let project = Project( ) ) ] -) \ No newline at end of file +) diff --git a/Examples/rc-maestro/Project.swift b/Examples/rc-maestro/Project.swift index badfdb4587..3c71abf286 100644 --- a/Examples/rc-maestro/Project.swift +++ b/Examples/rc-maestro/Project.swift @@ -5,6 +5,7 @@ import Foundation let project = Project( name: "Maestro", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( @@ -53,4 +54,4 @@ let project = Project( ) ) ] -) \ No newline at end of file +) diff --git a/Examples/testCustomEntitlementsComputation/Project.swift b/Examples/testCustomEntitlementsComputation/Project.swift index 62c4bce83d..28753c54a9 100644 --- a/Examples/testCustomEntitlementsComputation/Project.swift +++ b/Examples/testCustomEntitlementsComputation/Project.swift @@ -11,6 +11,7 @@ let allDestinations: Destinations = [ let project = Project( name: "testCustomEntitlementsComputation", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( diff --git a/Projects/APITesters/Project.swift b/Projects/APITesters/Project.swift index 02852a19f4..90e1fbd7fd 100644 --- a/Projects/APITesters/Project.swift +++ b/Projects/APITesters/Project.swift @@ -25,6 +25,7 @@ let allDeploymentTargets: DeploymentTargets = .multiplatform( let project = Project( name: "APITesters", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .framework, targets: [ .target( diff --git a/Projects/PaywallValidationTester/Project.swift b/Projects/PaywallValidationTester/Project.swift index 197ee10d4d..676a360948 100644 --- a/Projects/PaywallValidationTester/Project.swift +++ b/Projects/PaywallValidationTester/Project.swift @@ -21,6 +21,7 @@ let allDeploymentTargets: DeploymentTargets = .multiplatform( let project = Project( name: "PaywallValidationTester", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( diff --git a/Projects/PaywallsTester/Project.swift b/Projects/PaywallsTester/Project.swift index 74cfe52191..79e2eb479e 100644 --- a/Projects/PaywallsTester/Project.swift +++ b/Projects/PaywallsTester/Project.swift @@ -23,6 +23,7 @@ let allDeploymentTargets: DeploymentTargets = .multiplatform( let project = Project( name: "PaywallsTester", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .appProject, targets: [ .target( diff --git a/Projects/RevenueCatUI/Project.swift b/Projects/RevenueCatUI/Project.swift index 4b61702006..30777c5c08 100644 --- a/Projects/RevenueCatUI/Project.swift +++ b/Projects/RevenueCatUI/Project.swift @@ -12,6 +12,7 @@ let allDeploymentTargets: DeploymentTargets = .multiplatform( let project = Project( name: "RevenueCatUI", organizationName: .revenueCatOrgName, + packages: .projectPackages, settings: .framework, targets: [ .target( diff --git a/Tests/BackendIntegrationTests/Constants.swift b/Tests/BackendIntegrationTests/Constants.swift index 796cb0a52a..0ff1f95260 100644 --- a/Tests/BackendIntegrationTests/Constants.swift +++ b/Tests/BackendIntegrationTests/Constants.swift @@ -10,12 +10,12 @@ import Foundation enum Constants { - static let apiKey = "REVENUECAT_API_KEY" - static let loadShedderApiKey = "REVENUECAT_LOAD_SHEDDER_API_KEY" + static let apiKey = "rGogYWEdzrENUEzEoYXZNUkzoPEbEvfb" + static let loadShedderApiKey = "appl_aRfhwrmSlzrSrQagvIipFKcFLKv" static let customEntitlementComputationApiKey = "REVENUECAT_CUSTOM_ENTITLEMENT_COMPUTATION_API_KEY" // Server URL for the tests. If set to empty string, we'll use the default URL. - static let proxyURL = "REVENUECAT_PROXY_URL" + static let proxyURL = "" static let userDefaultsSuiteName = "BackendIntegrationTests" static let storeKitConfigFileName = "RevenueCat_IntegrationPurchaseTesterConfiguration" diff --git a/Tuist/Package.resolved b/Tuist/Package.resolved index 592c03c60c..ddadb2dd0f 100644 --- a/Tuist/Package.resolved +++ b/Tuist/Package.resolved @@ -43,7 +43,7 @@ "location" : "https://github.com/RevenueCat/purchases-ios", "state" : { "branch" : "main", - "revision" : "b715caf85ab9298db7ab16976ac3ed196a837993" + "revision" : "292b90b8455643b61b589ff4c407c88ca1f9bb76" } }, { diff --git a/Tuist/ProjectDescriptionHelpers/Environment.swift b/Tuist/ProjectDescriptionHelpers/Environment.swift index ded1b56906..c6d1fb41d2 100644 --- a/Tuist/ProjectDescriptionHelpers/Environment.swift +++ b/Tuist/ProjectDescriptionHelpers/Environment.swift @@ -1,18 +1,43 @@ import ProjectDescription +public enum DependencyMode { + /// The dependency is a local Swift Package Manager package. + case localSwiftPackage + + /// The dependency is a local Xcode project. Tuist's default behavior. + case localXcodeProject + + /// The dependency is a remote Swift Package Manager package. + case remoteSwiftPackage + + /// The dependency is a remote Xcode project. + case remoteXcodeProject +} + extension Environment { - /// Returns whether the current environment is local. - /// This is determined by the `rcLocal` environment variable, defaulting to `true` if not set. - /// + /// Returns the dependency mode for RevenueCat/RevenueCatUI. + /// /// Example usage: /// ```bash - /// # Generate project with local environment (default) + /// # Generate project with local Swift Package dependency (default) /// tuist generate - /// - /// # Generate project with non-local environment - /// TUIST_RC_LOCAL=false tuist generate + /// + /// # Generate project with Xcode project dependency (instead of Swift Package) + /// TUIST_RC_XCODE_PROJECT=true tuist generate + /// + /// # Generate project with remote dependency (instead of local dependency) + /// TUIST_RC_REMOTE=true tuist generate /// ``` - public static var local: Bool { - Environment.rcLocal.getBoolean(default: true) + public static var dependencyMode: DependencyMode { + // Note: Environment variable names are prefixed with TUIST_ automatically, therefore: + // rcRemote reads TUIST_RC_REMOTE + // rcXcodeProject reads TUIST_RC_XCODE_PROJECT + let remote = Environment.rcRemote.getBoolean(default: false) + let xcodeProject = Environment.rcXcodeProject.getBoolean(default: false) + if remote { + return xcodeProject ? .remoteXcodeProject : .remoteSwiftPackage + } else { + return xcodeProject ? .localXcodeProject : .localSwiftPackage + } } } diff --git a/Tuist/ProjectDescriptionHelpers/ProjectDescriptionPackages.swift b/Tuist/ProjectDescriptionHelpers/ProjectDescriptionPackages.swift new file mode 100644 index 0000000000..bd98e7e997 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/ProjectDescriptionPackages.swift @@ -0,0 +1,14 @@ +import ProjectDescription + +extension Array { + + public static var projectPackages: [ProjectDescription.Package] { + if Environment.dependencyMode == .localSwiftPackage { + return [.package(path: "../..")] + } else if Environment.dependencyMode == .remoteSwiftPackage { + return [.package(url: "https://github.com/RevenueCat/purchases-ios", .branch("main"))] + } else { + return [] + } + } +} \ No newline at end of file diff --git a/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift b/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift index 04b38cb186..0f09ed3ae2 100644 --- a/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift +++ b/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift @@ -1,29 +1,78 @@ import ProjectDescription extension TargetDependency { - /// Returns a RevenueCat dependency that can be either local or external - /// - Parameter local: If true, returns a local project dependency. If false, returns an external dependency - /// from spm + /// Returns the RevenueCat dependency based on the dependency mode /// - Returns: A TargetDependency for RevenueCat public static var revenueCat: TargetDependency { - if Environment.local { - .project( - target: "RevenueCat", - path: .relativeToRoot("Projects/RevenueCat") - ) - } else { - .revenueCatLocal + switch Environment.dependencyMode { + case .localSwiftPackage: + return .revenueCatSwiftPackageDependency + case .remoteSwiftPackage: + return .revenueCatSwiftPackageDependency + case .remoteXcodeProject: + return .revenueCatRemoteXcodeProjectDependency + case .localXcodeProject: + return .revenueCatXcodeProjectDependency } } - /// Returns a local RevenueCat dependency from SPM - /// - Returns: A TargetDependency for RevenueCat from external source - public static var revenueCatLocal: TargetDependency { - .external( - name: "RevenueCat" - ) + /// Returns the RevenueCatUI dependency based on the dependency mode + /// - Returns: A TargetDependency for RevenueCatUI + public static var revenueCatUI: TargetDependency { + switch Environment.dependencyMode { + case .localSwiftPackage: + return .revenueCatUISwiftPackageDependency + case .remoteSwiftPackage: + return .revenueCatUISwiftPackageDependency + case .remoteXcodeProject: + return .revenueCatUIRemoteXcodeProjectDependency + case .localXcodeProject: + return .revenueCatUIXcodeProjectDependency + } + } + + // RevenueCat + + /// Returns the remote RevenueCat dependency as Tuist's XcodeProj-based dependency + static var revenueCatRemoteXcodeProjectDependency: TargetDependency { + .external(name: "RevenueCat") + } + + /// Returns the remote RevenueCat Swift Package Manager dependency + static var revenueCatSwiftPackageDependency: TargetDependency { + .package(product: "RevenueCat", type: .runtime) + } + + /// Returns the Xcode project RevenueCat dependency + /// - Returns: A TargetDependency for RevenueCat from Xcode project + static var revenueCatXcodeProjectDependency: TargetDependency { + .project( + target: "RevenueCat", + path: .relativeToRoot("Projects/RevenueCat")) + } + + // RevenueCatUI + + /// Returns the remote RevenueCat dependency as Tuist's XcodeProj-based dependency + static var revenueCatUIRemoteXcodeProjectDependency: TargetDependency { + .external(name: "RevenueCatUI") } + /// Returns the remote RevenueCat Swift Package Manager dependency + static var revenueCatUISwiftPackageDependency: TargetDependency { + .package(product: "RevenueCatUI", type: .runtime) + } + + /// Returns the Xcode project RevenueCatUI dependency + /// - Returns: A TargetDependency for RevenueCat from Xcode project + static var revenueCatUIXcodeProjectDependency: TargetDependency { + .project( + target: "RevenueCat", + path: .relativeToRoot("Projects/RevenueCatUI")) + } + + // Custom Entitlement Computation + /// Returns a RevenueCat dependency with custom entitlement computation enabled /// - Returns: A TargetDependency for RevenueCat_CustomEntitlementComputation public static var revenueCatCustomEntitlementComputation: TargetDependency { @@ -33,29 +82,6 @@ extension TargetDependency { ) } - /// Returns a RevenueCatUI dependency that can be either local or external - /// - Parameter local: If true, returns a local project dependency. If false, returns an external dependency - /// from spm - /// - Returns: A TargetDependency for RevenueCatUI - public static var revenueCatUI: TargetDependency { - if Environment.local { - .project( - target: "RevenueCatUI", - path: .relativeToRoot("Projects/RevenueCatUI") - ) - } else { - .revenueCatUILocal - } - } - - /// Returns a local RevenueCatUI dependency from SPM - /// - Returns: A TargetDependency for RevenueCatUI from external source - public static var revenueCatUILocal: TargetDependency { - .external( - name: "RevenueCatUI" - ) - } - /// Returns a ReceiptParser dependency /// - Returns: A TargetDependency for ReceiptParser public static var receiptparser: TargetDependency { diff --git a/Workspace.swift b/Workspace.swift index 3e66f3be1d..7255541b3d 100644 --- a/Workspace.swift +++ b/Workspace.swift @@ -13,7 +13,7 @@ var projects: [Path] = [ "./Projects/PaywallValidationTester" ] -if Environment.local { +if Environment.dependencyMode == .localXcodeProject { projects.append("./Projects/RevenueCat") projects.append("./Projects/RevenueCatUI") } else {