From fc1f839d7b32a5c67f4fcd64845c368061c09ce8 Mon Sep 17 00:00:00 2001 From: Muzahidul Islam <129880873+muzahidul-opti@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:53:29 +0600 Subject: [PATCH 1/2] Update swift.yml --- .github/workflows/swift.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml index 1fc4011b..49d57b81 100644 --- a/.github/workflows/swift.yml +++ b/.github/workflows/swift.yml @@ -96,7 +96,7 @@ jobs: BRANCH: ${{ github.ref_name }} GITHUB_TOKEN: ${{ secrets.CI_USER_TOKEN }} COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} - COCOAPODS_VERSION: '1.12.1' + COCOAPODS_VERSION: '1.15.2' run: | gem install cocoapods -v $COCOAPODS_VERSION Scripts/run_release.sh From a19716d49c563d10faf0cb2e8d5388950c60ec55 Mon Sep 17 00:00:00 2001 From: muzahidul-opti Date: Wed, 28 May 2025 17:53:48 +0600 Subject: [PATCH 2/2] Add experiment id and variation id to decision payload to support netspring --- Sources/Implementation/DecisionInfo.swift | 10 ++++++- Sources/Utils/Constants.swift | 2 ++ .../DecisionListenerTests_Datafile.swift | 27 ++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Sources/Implementation/DecisionInfo.swift b/Sources/Implementation/DecisionInfo.swift index 72c38c30..b2c60b4e 100644 --- a/Sources/Implementation/DecisionInfo.swift +++ b/Sources/Implementation/DecisionInfo.swift @@ -140,9 +140,17 @@ struct DecisionInfo { decisionInfo[Constants.DecisionInfoKeys.variationKey] = variation?.key ?? NSNull() // keep key in the map even with nil value decisionInfo[Constants.DecisionInfoKeys.ruleKey] = ruleKey ?? NSNull() // decisionInfo[Constants.DecisionInfoKeys.reasons] = reasons - decisionInfo[Constants.DecisionInfoKeys.decisionEventDispatched] = decisionEventDispatched } + decisionInfo[Constants.DecisionInfoKeys.decisionEventDispatched] = decisionEventDispatched + + if let expId = experiment?.id { + decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] = expId + } + + if let varId = variation?.id { + decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] = varId + } return decisionInfo } diff --git a/Sources/Utils/Constants.swift b/Sources/Utils/Constants.swift index f60f6fdc..100a2e6e 100644 --- a/Sources/Utils/Constants.swift +++ b/Sources/Utils/Constants.swift @@ -88,7 +88,9 @@ struct Constants { } struct ExperimentDecisionInfoKeys { + static let experimentId = "experimentId" static let experiment = "experimentKey" + static let variationId = "variationId" static let variation = "variationKey" } diff --git a/Tests/OptimizelyTests-Common/DecisionListenerTests_Datafile.swift b/Tests/OptimizelyTests-Common/DecisionListenerTests_Datafile.swift index 708f8217..85f25b65 100644 --- a/Tests/OptimizelyTests-Common/DecisionListenerTests_Datafile.swift +++ b/Tests/OptimizelyTests-Common/DecisionListenerTests_Datafile.swift @@ -37,12 +37,16 @@ class DecisionListenerTests_Datafile: XCTestCase { var notificationVariation: String? var notificationExperiment: String? var notificationType: String? + var expId: String? + var varId: String? let exp = expectation(description: "x") _ = notificationCenter.addDecisionNotificationListener(decisionListener: { (type, _, _, decisionInfo) in notificationExperiment = decisionInfo[Constants.ExperimentDecisionInfoKeys.experiment] as? String notificationVariation = decisionInfo[Constants.ExperimentDecisionInfoKeys.variation] as? String + expId = decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] as? String + varId = decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] as? String notificationType = type exp.fulfill() }) @@ -56,6 +60,8 @@ class DecisionListenerTests_Datafile: XCTestCase { XCTAssertEqual(variation, "all_traffic_variation") XCTAssertEqual(notificationExperiment, "ab_running_exp_audience_combo_empty_conditions") XCTAssertEqual(notificationVariation, "all_traffic_variation") + XCTAssertEqual(expId, "10390977723") + XCTAssertEqual(varId, "10416523170") XCTAssertEqual(notificationType, Constants.DecisionType.abTest.rawValue) } @@ -63,12 +69,18 @@ class DecisionListenerTests_Datafile: XCTestCase { var notificationVariation: String? var notificationExperiment: String? var notificationType: String? + var expId: String? + var varId: String? let exp = expectation(description: "x") _ = notificationCenter.addDecisionNotificationListener(decisionListener: { (type, _, _, decisionInfo) in notificationExperiment = decisionInfo[Constants.ExperimentDecisionInfoKeys.experiment] as? String notificationVariation = decisionInfo[Constants.ExperimentDecisionInfoKeys.variation] as? String + expId = decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] as? String + varId = decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] as? String + expId = decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] as? String + varId = decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] as? String notificationType = type exp.fulfill() }) @@ -81,6 +93,8 @@ class DecisionListenerTests_Datafile: XCTestCase { XCTAssertEqual(notificationExperiment, "ab_running_exp_audience_combo_exact_foo_or_true__and__42_or_4_2") XCTAssertEqual(notificationVariation, nil) + XCTAssertEqual(expId, "10390977714") + XCTAssertEqual(varId, nil) XCTAssertEqual(notificationType, Constants.DecisionType.abTest.rawValue) notificationCenter.clearAllNotificationListeners() } @@ -93,12 +107,16 @@ class DecisionListenerTests_Datafile: XCTestCase { var notificationVariation: String? var notificationExperiment: String? var notificationType: String? + var expId: String? + var varId: String? let exp = expectation(description: "x") _ = notificationCenter.addDecisionNotificationListener(decisionListener: { (type, _, _, decisionInfo) in notificationExperiment = decisionInfo[Constants.ExperimentDecisionInfoKeys.experiment] as? String notificationVariation = decisionInfo[Constants.ExperimentDecisionInfoKeys.variation] as? String + expId = decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] as? String + varId = decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] as? String notificationType = type exp.fulfill() }) @@ -111,6 +129,8 @@ class DecisionListenerTests_Datafile: XCTestCase { XCTAssertEqual(notificationExperiment, "ab_running_exp_audience_combo_empty_conditions") XCTAssertEqual(notificationVariation, "all_traffic_variation") XCTAssertEqual(notificationType, Constants.DecisionType.abTest.rawValue) + XCTAssertEqual(expId, "10390977723") + XCTAssertEqual(varId, "10416523170") notificationCenter.clearAllNotificationListeners() } @@ -118,12 +138,15 @@ class DecisionListenerTests_Datafile: XCTestCase { var notificationVariation: String? var notificationExperiment: String? var notificationType: String? - + var expId: String? + var varId: String? let exp = expectation(description: "x") _ = notificationCenter.addDecisionNotificationListener(decisionListener: { (type, _, _, decisionInfo) in notificationExperiment = decisionInfo[Constants.ExperimentDecisionInfoKeys.experiment] as? String notificationVariation = decisionInfo[Constants.ExperimentDecisionInfoKeys.variation] as? String + expId = decisionInfo[Constants.ExperimentDecisionInfoKeys.experimentId] as? String + varId = decisionInfo[Constants.ExperimentDecisionInfoKeys.variationId] as? String notificationType = type exp.fulfill() }) @@ -133,6 +156,8 @@ class DecisionListenerTests_Datafile: XCTestCase { XCTAssertEqual(notificationExperiment, "ab_running_exp_audience_combo_exact_foo_or_true__and__42_or_4_2") XCTAssertEqual(notificationVariation, nil) + XCTAssertEqual(expId, "10390977714") + XCTAssertEqual(varId, nil) XCTAssertEqual(notificationType, Constants.DecisionType.abTest.rawValue) notificationCenter.clearAllNotificationListeners() }