Skip to content

Commit

Permalink
feat: Adopt latest OF SDK (#184)
Browse files Browse the repository at this point in the history
* feat!: Adopt newer OF SDK

Signed-off-by: Fabrizio Demaria <[email protected]>

* deps: Pin OF SDK version

Signed-off-by: Fabrizio Demaria <[email protected]>

* fix: Small demo app fix

Signed-off-by: Fabrizio Demaria <[email protected]>

* deps: Remove OF dependency from demo app

Signed-off-by: Fabrizio Demaria <[email protected]>

---------

Signed-off-by: Fabrizio Demaria <[email protected]>
  • Loading branch information
fabriziodemaria authored Feb 7, 2025
1 parent 3588ae8 commit 652d5f0
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 52 deletions.
10 changes: 5 additions & 5 deletions ConfidenceDemoApp/ConfidenceDemoApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
733219BF2BE3C11100747AC2 /* ConfidenceOpenFeature in Frameworks */ = {isa = PBXBuildFile; productRef = 733219BE2BE3C11100747AC2 /* ConfidenceOpenFeature */; };
734EBDDC2D565CAC006D3435 /* Confidence in Frameworks */ = {isa = PBXBuildFile; productRef = 734EBDDB2D565CAC006D3435 /* Confidence */; };
735EADF52CF9B64E007BC42C /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 735EADF42CF9B64E007BC42C /* LoginView.swift */; };
C770C99A2A739FBC00C2AC8C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C770C9962A739FBC00C2AC8C /* Preview Assets.xcassets */; };
C770C99B2A739FBC00C2AC8C /* ConfidenceDemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C770C9972A739FBC00C2AC8C /* ConfidenceDemoApp.swift */; };
Expand Down Expand Up @@ -56,7 +56,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
733219BF2BE3C11100747AC2 /* ConfidenceOpenFeature in Frameworks */,
734EBDDC2D565CAC006D3435 /* Confidence in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -169,7 +169,7 @@
);
name = ConfidenceDemoApp;
packageProductDependencies = (
733219BE2BE3C11100747AC2 /* ConfidenceOpenFeature */,
734EBDDB2D565CAC006D3435 /* Confidence */,
);
productName = ConfidenceDemoApp;
productReference = C770C9682A739FA000C2AC8C /* ConfidenceDemoApp.app */;
Expand Down Expand Up @@ -646,9 +646,9 @@
/* End XCConfigurationList section */

/* Begin XCSwiftPackageProductDependency section */
733219BE2BE3C11100747AC2 /* ConfidenceOpenFeature */ = {
734EBDDB2D565CAC006D3435 /* Confidence */ = {
isa = XCSwiftPackageProductDependency;
productName = ConfidenceOpenFeature;
productName = Confidence;
};
/* End XCSwiftPackageProductDependency section */
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct ConfidenceDemoApp: App {
withAppInfo: true,
withOsInfo: true,
withLocale: true
).decorated(context: [:]);
).decorated(context: context);

confidence = Confidence
.Builder(clientSecret: secret, loggerLevel: .TRACE)
Expand Down
4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"repositoryURL": "[email protected]:open-feature/swift-sdk.git",
"state": {
"branch": null,
"revision": "02b033c954766e86d5706bfc8ee5248244c11e77",
"version": "0.1.0"
"revision": "e2be5852827d7d6b837b9a4e577bb52bea6322d7",
"version": "0.3.0"
}
}
]
Expand Down
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ let package = Package(
targets: ["Confidence"])
],
dependencies: [
.package(url: "[email protected]:open-feature/swift-sdk.git", from: "0.1.0"),
.package(url: "[email protected]:open-feature/swift-sdk.git", .exact("0.3.0")),
],
targets: [
.target(
Expand Down
43 changes: 15 additions & 28 deletions Sources/ConfidenceProvider/ConfidenceFeatureProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class ConfidenceFeatureProvider: FeatureProvider {
public var hooks: [any Hook] = []
private let lock = UnfairLock()
private let initializationStrategy: InitializationStrategy
private let eventHandler = EventHandler(ProviderEvent.notReady)
private let eventHandler = EventHandler()
private let confidence: Confidence
private let confidenceFeatureProviderQueue = DispatchQueue(label: "com.provider.queue")
private var cancellables = Set<AnyCancellable>()
Expand All @@ -26,41 +26,29 @@ public class ConfidenceFeatureProvider: FeatureProvider {
The `initializationStrategy` defines when the Provider is ready to read flags, before or after a refresh of the flag evaluation fata.
*/
public convenience init(confidence: Confidence, initializationStrategy: InitializationStrategy = .fetchAndActivate) {
self.init(confidence: confidence, session: nil)
self.init(confidence: confidence, initializationStrategy: initializationStrategy, session: nil)
}

internal init(
confidence: Confidence,
initializationStrategy: InitializationStrategy = .fetchAndActivate,
initializationStrategy: InitializationStrategy,
session: URLSession?
) {
self.metadata = Metadata(name: ConfidenceFeatureProvider.providerId)
self.initializationStrategy = initializationStrategy
self.confidence = confidence
}

public func initialize(initialContext: OpenFeature.EvaluationContext?) {
public func initialize(initialContext: OpenFeature.EvaluationContext?) async throws {
let context = ConfidenceTypeMapper.from(ctx: initialContext ?? MutableContext(attributes: [:]))
confidence.putContextLocal(context: context)
do {
if initializationStrategy == .activateAndFetchAsync {
try confidence.activate()
eventHandler.send(.ready)
Task {
await confidence.asyncFetch()
}
} else {
Task {
do {
try await confidence.fetchAndActivate()
eventHandler.send(.ready)
} catch {
eventHandler.send(.error)
}
}
if initializationStrategy == .activateAndFetchAsync {
try confidence.activate()
Task {
await confidence.asyncFetch()
}
} catch {
eventHandler.send(.error)
} else {
try await confidence.fetchAndActivate()
}
}

Expand All @@ -75,14 +63,13 @@ public class ConfidenceFeatureProvider: FeatureProvider {
public func onContextSet(
oldContext: OpenFeature.EvaluationContext?,
newContext: OpenFeature.EvaluationContext
) {
) async {
let removedKeys: [String] = oldContext.map {
Array($0.asMap().filter { key, _ in !newContext.asMap().keys.contains(key) }.keys)
} ?? []

Task {
confidence.putContext(context: ConfidenceTypeMapper.from(ctx: newContext), removedKeys: removedKeys)
}
await confidence.putContextAndWait(
context: ConfidenceTypeMapper.from(ctx: newContext),
removedKeys: removedKeys)
}

public func getBooleanEvaluation(key: String, defaultValue: Bool, context: EvaluationContext?) throws
Expand Down Expand Up @@ -115,7 +102,7 @@ public class ConfidenceFeatureProvider: FeatureProvider {
try confidence.getEvaluation(key: key, defaultValue: defaultValue).toProviderEvaluation()
}

public func observe() -> AnyPublisher<OpenFeature.ProviderEvent, Never> {
public func observe() -> AnyPublisher<OpenFeature.ProviderEvent?, Never> {
return eventHandler.observe()
}

Expand Down
28 changes: 16 additions & 12 deletions Tests/ConfidenceProviderTests/ConfidenceProviderTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,17 @@ class ConfidenceProviderTest: XCTestCase {
.withFlagResolverClient(flagResolver: client)
.build()

let provider = ConfidenceFeatureProvider(confidence: confidence, initializationStrategy: .activateAndFetchAsync)
OpenFeatureAPI.shared.setProvider(provider: provider)

let cancellable = OpenFeatureAPI.shared.observe().sink { event in
if event == .ready {
readyExpectation.fulfill()
} else {
print(event)
print(event.debugDescription)
}
}

let provider = ConfidenceFeatureProvider(confidence: confidence, initializationStrategy: .activateAndFetchAsync)
OpenFeatureAPI.shared.setProvider(provider: provider)

await fulfillment(of: [readyExpectation], timeout: 5.0)
cancellable.cancel()
}
Expand Down Expand Up @@ -60,16 +61,19 @@ class ConfidenceProviderTest: XCTestCase {
.withStorage(storage: FakeStorage())
.build()

let provider = ConfidenceFeatureProvider(confidence: confidence, initializationStrategy: .activateAndFetchAsync)
OpenFeatureAPI.shared.setProvider(provider: provider)

let cancellable = OpenFeatureAPI.shared.observe().sink { event in
if event == .error {
errorExpectation.fulfill()
} else {
print(event)
if let event = event {
if case .error = event {
errorExpectation.fulfill()
} else {
// no-op
}
}
}

let provider = ConfidenceFeatureProvider(confidence: confidence, initializationStrategy: .activateAndFetchAsync)
OpenFeatureAPI.shared.setProvider(provider: provider)

await fulfillment(of: [errorExpectation], timeout: 5.0)
cancellable.cancel()
}
Expand Down Expand Up @@ -103,7 +107,7 @@ class ConfidenceProviderTest: XCTestCase {
if event == .ready {
readyExpectation.fulfill()
} else {
print(event)
print(event.debugDescription)
}
}
await fulfillment(of: [readyExpectation], timeout: 1.0)
Expand Down
6 changes: 3 additions & 3 deletions api/ConfidenceProvider_public_api.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
},
{
"name": "initialize(initialContext:)",
"declaration": "public func initialize(initialContext: OpenFeature.EvaluationContext?)"
"declaration": "public func initialize(initialContext: OpenFeature.EvaluationContext?) async throws"
},
{
"name": "onContextSet(oldContext:newContext:)",
"declaration": "public func onContextSet(\n oldContext: OpenFeature.EvaluationContext?,\n newContext: OpenFeature.EvaluationContext\n)"
"declaration": "public func onContextSet(\n oldContext: OpenFeature.EvaluationContext?,\n newContext: OpenFeature.EvaluationContext\n) async"
},
{
"name": "getBooleanEvaluation(key:defaultValue:context:)",
Expand All @@ -36,7 +36,7 @@
},
{
"name": "observe()",
"declaration": "public func observe() -> AnyPublisher<OpenFeature.ProviderEvent, Never>"
"declaration": "public func observe() -> AnyPublisher<OpenFeature.ProviderEvent?, Never>"
}
]
}
Expand Down

0 comments on commit 652d5f0

Please sign in to comment.