Skip to content

Commit 462f5b8

Browse files
chore: adds evalDetails and evalTargetId if available to the provider evaluation response metadata (#5)
1 parent 9e010a9 commit 462f5b8

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,6 @@ fastlane/screenshots/**/*.png
6363
fastlane/test_output
6464

6565
.DS_Store
66-
.swiftpm/
66+
.swiftpm/
67+
68+
.vscode/

Sources/DevCycleProvider.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,10 @@ public final class DevCycleProvider: FeatureProvider {
175175
}
176176

177177
let variable = devcycleClient!.variable(key: key, defaultValue: defaultValue)
178+
178179
return ProviderEvaluation(
179180
value: variable.value,
181+
flagMetadata: DevCycleProvider.getFlagMetadata(variable: variable),
180182
reason: DevCycleProvider.getEvalReason(variable: variable)
181183
)
182184
}
@@ -205,6 +207,7 @@ public final class DevCycleProvider: FeatureProvider {
205207
let variable = devcycleClient!.variable(key: key, defaultValue: defaultValue)
206208
return ProviderEvaluation(
207209
value: variable.value,
210+
flagMetadata: DevCycleProvider.getFlagMetadata(variable: variable),
208211
reason: DevCycleProvider.getEvalReason(variable: variable)
209212
)
210213
}
@@ -236,6 +239,7 @@ public final class DevCycleProvider: FeatureProvider {
236239

237240
return ProviderEvaluation(
238241
value: Int64(variable.value),
242+
flagMetadata: DevCycleProvider.getFlagMetadata(variable: variable),
239243
reason: DevCycleProvider.getEvalReason(variable: variable)
240244
)
241245
}
@@ -264,6 +268,7 @@ public final class DevCycleProvider: FeatureProvider {
264268
let variable = devcycleClient!.variable(key: key, defaultValue: defaultValue)
265269
return ProviderEvaluation(
266270
value: variable.value,
271+
flagMetadata: DevCycleProvider.getFlagMetadata(variable: variable),
267272
reason: DevCycleProvider.getEvalReason(variable: variable)
268273
)
269274
}
@@ -295,6 +300,7 @@ public final class DevCycleProvider: FeatureProvider {
295300
return ProviderEvaluation(
296301
value: variable.isDefaulted
297302
? defaultValue : DevCycleProvider.convertDictionaryToValue(variable.value),
303+
flagMetadata: DevCycleProvider.getFlagMetadata(variable: variable),
298304
reason: DevCycleProvider.getEvalReason(variable: variable)
299305
)
300306
}
@@ -546,4 +552,17 @@ public final class DevCycleProvider: FeatureProvider {
546552
}
547553
return variable.isDefaulted ? Reason.defaultReason.rawValue : Reason.targetingMatch.rawValue
548554
}
555+
556+
internal static func getFlagMetadata<T>(variable: DVCVariable<T>) -> [String: FlagMetadataValue] {
557+
var flagMetadata: [String: FlagMetadataValue] = [:]
558+
if let evalReason = variable.eval {
559+
if let evalDetails = evalReason.details {
560+
flagMetadata["evalDetails"] = FlagMetadataValue.of(evalDetails)
561+
}
562+
if let evalTargetId = evalReason.targetId {
563+
flagMetadata["evalTargetId"] = FlagMetadataValue.of(evalTargetId)
564+
}
565+
}
566+
return flagMetadata
567+
}
549568
}

Tests/DevCycleProviderTests.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,24 +100,28 @@ final class DevCycleProviderTests: XCTestCase {
100100
key: "test-bool", defaultValue: true, context: nil as EvaluationContext?)
101101
XCTAssertEqual(boolResult.value, true)
102102
XCTAssertEqual(boolResult.reason, Reason.defaultReason.rawValue)
103+
XCTAssertEqual(boolResult.flagMetadata, [:])
103104

104105
// String evaluation
105106
let stringResult = try provider.getStringEvaluation(
106107
key: "test-string", defaultValue: "default-value", context: nil as EvaluationContext?)
107108
XCTAssertEqual(stringResult.value, "default-value")
108109
XCTAssertEqual(stringResult.reason, Reason.defaultReason.rawValue)
110+
XCTAssertEqual(stringResult.flagMetadata, [:])
109111

110112
// Number evaluation
111113
let numberResult = try provider.getDoubleEvaluation(
112114
key: "test-number", defaultValue: 42.0, context: nil as EvaluationContext?)
113115
XCTAssertEqual(numberResult.value, 42.0)
114116
XCTAssertEqual(numberResult.reason, Reason.defaultReason.rawValue)
117+
XCTAssertEqual(numberResult.flagMetadata, [:])
115118

116119
// Integer evaluation
117120
let integerResult = try provider.getIntegerEvaluation(
118121
key: "test-integer", defaultValue: 42, context: nil as EvaluationContext?)
119122
XCTAssertEqual(integerResult.value, 42)
120123
XCTAssertEqual(integerResult.reason, Reason.defaultReason.rawValue)
124+
XCTAssertEqual(integerResult.flagMetadata, [:])
121125
}
122126

123127
// MARK: - Object Evaluation Tests
@@ -139,6 +143,7 @@ final class DevCycleProviderTests: XCTestCase {
139143
key: "test-object", defaultValue: defaultValue, context: nil as EvaluationContext?)
140144

141145
XCTAssertEqual(result.reason, Reason.defaultReason.rawValue)
146+
XCTAssertEqual(result.flagMetadata, [:])
142147

143148
if case .structure(let attributes) = result.value {
144149
XCTAssertEqual(attributes["name"], .string("John"))
@@ -173,7 +178,8 @@ final class DevCycleProviderTests: XCTestCase {
173178
)
174179

175180
XCTAssertEqual(result.reason, Reason.defaultReason.rawValue)
176-
181+
XCTAssertEqual(result.flagMetadata, [:])
182+
177183
if case .structure(let attributes) = result.value {
178184
XCTAssertEqual(attributes["string"], .string("text"))
179185
XCTAssertEqual(attributes["boolean"], .boolean(true))
@@ -1001,34 +1007,39 @@ final class DevCycleProviderTests: XCTestCase {
10011007
key: "json-flag-list", defaultValue: listDefault, context: nil)
10021008
XCTAssertEqual(listResult.value, .structure([:]))
10031009
XCTAssertEqual(listResult.reason, "TARGETING_MATCH")
1010+
XCTAssertEqual(listResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10041011

10051012
// .double
10061013
let doubleDefault = Value.double(610)
10071014
let doubleResult = try provider.getObjectEvaluation(
10081015
key: "json-flag-double", defaultValue: doubleDefault, context: nil)
10091016
XCTAssertEqual(doubleResult.value, .structure([:]))
10101017
XCTAssertEqual(doubleResult.reason, "TARGETING_MATCH")
1018+
XCTAssertEqual(doubleResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10111019

10121020
// .boolean
10131021
let boolDefault = Value.boolean(false)
10141022
let boolResult = try provider.getObjectEvaluation(
10151023
key: "json-flag-bool", defaultValue: boolDefault, context: nil)
10161024
XCTAssertEqual(boolResult.value, .structure([:]))
10171025
XCTAssertEqual(boolResult.reason, "TARGETING_MATCH")
1026+
XCTAssertEqual(boolResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10181027

10191028
// .string
10201029
let stringDefault = Value.string("string")
10211030
let stringResult = try provider.getObjectEvaluation(
10221031
key: "json-flag-string", defaultValue: stringDefault, context: nil)
10231032
XCTAssertEqual(stringResult.value, .structure([:]))
10241033
XCTAssertEqual(stringResult.reason, "TARGETING_MATCH")
1034+
XCTAssertEqual(stringResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10251035

10261036
// .null
10271037
let nullDefault = Value.null
10281038
let nullResult = try provider.getObjectEvaluation(
10291039
key: "json-flag-null", defaultValue: nullDefault, context: nil)
10301040
XCTAssertEqual(nullResult.value, .structure([:]))
10311041
XCTAssertEqual(nullResult.reason, "TARGETING_MATCH")
1042+
XCTAssertEqual(stringResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10321043

10331044
// .date
10341045
let date = Date()
@@ -1037,6 +1048,7 @@ final class DevCycleProviderTests: XCTestCase {
10371048
key: "json-flag-date", defaultValue: dateDefault, context: nil)
10381049
XCTAssertEqual(dateResult.value, .structure([:]))
10391050
XCTAssertEqual(dateResult.reason, "TARGETING_MATCH")
1051+
XCTAssertEqual(stringResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10401052
}
10411053

10421054
func testGetObjectEvaluationWithStructureValueIsAccepted() throws {
@@ -1047,5 +1059,6 @@ final class DevCycleProviderTests: XCTestCase {
10471059
key: "json-flag-structure", defaultValue: structureDefault, context: nil)
10481060
XCTAssertEqual(structureResult.value, structureDefault)
10491061
XCTAssertEqual(structureResult.reason, "TARGETING_MATCH")
1062+
XCTAssertEqual(structureResult.flagMetadata, ["evalDetails": FlagMetadataValue.of("OpenFeature Testing")])
10501063
}
10511064
}

0 commit comments

Comments
 (0)