Skip to content

Fme 2442 using metadata #656

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 12 commits into
base: FME-2442R_baseline
Choose a base branch
from
6 changes: 6 additions & 0 deletions Split.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,8 @@
59FB7C35220329B900ECC96A /* SplitFactoryBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59FB7C34220329B900ECC96A /* SplitFactoryBuilderTests.swift */; };
59FB7C3C2203795F00ECC96A /* LocalhostSplitsParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59FB7C3B2203795F00ECC96A /* LocalhostSplitsParser.swift */; };
59FB7C3E22037B9400ECC96A /* SpaceDelimitedLocalhostSplitsParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59FB7C3D22037B9400ECC96A /* SpaceDelimitedLocalhostSplitsParser.swift */; };
5B91B8362DD84276000510F0 /* SplitMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B91B8352DD84272000510F0 /* SplitMetadata.swift */; };
5B91B8372DD84276000510F0 /* SplitMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B91B8352DD84272000510F0 /* SplitMetadata.swift */; };
9500D9922C56F9BA00383593 /* HostDomainFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9500D9912C56F9BA00383593 /* HostDomainFilterTests.swift */; };
9500D9A92C59297400383593 /* HostDomainFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9500D9A82C59297400383593 /* HostDomainFilter.swift */; };
9500D9AA2C59382000383593 /* HostDomainFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9500D9A82C59297400383593 /* HostDomainFilter.swift */; };
Expand Down Expand Up @@ -1494,6 +1496,7 @@
59FB7C34220329B900ECC96A /* SplitFactoryBuilderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitFactoryBuilderTests.swift; sourceTree = "<group>"; };
59FB7C3B2203795F00ECC96A /* LocalhostSplitsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalhostSplitsParser.swift; sourceTree = "<group>"; };
59FB7C3D22037B9400ECC96A /* SpaceDelimitedLocalhostSplitsParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceDelimitedLocalhostSplitsParser.swift; sourceTree = "<group>"; };
5B91B8352DD84272000510F0 /* SplitMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitMetadata.swift; sourceTree = "<group>"; };
9500D9912C56F9BA00383593 /* HostDomainFilterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostDomainFilterTests.swift; sourceTree = "<group>"; };
9500D9A82C59297400383593 /* HostDomainFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostDomainFilter.swift; sourceTree = "<group>"; };
9500D9AC2C5A918300383593 /* split_cache_v5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = split_cache_v5.xcdatamodel; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2296,6 +2299,7 @@
isa = PBXGroup;
children = (
3B6DEEC420EA6AE20067435E /* SplitEvent.swift */,
5B91B8352DD84272000510F0 /* SplitMetadata.swift */,
3B6DEEC520EA6AE20067435E /* SplitEventsManager.swift */,
9530FD7927F24306005027AA /* EventsManagerCoordinator.swift */,
3B6DEEC620EA6AE20067435E /* SplitEventTask.swift */,
Expand Down Expand Up @@ -3954,6 +3958,7 @@
957E674C25E48753006F5B19 /* Bundle+Finder.swift in Sources */,
95F3F09525AE1F3800084AF8 /* ServiceConstants.swift in Sources */,
95CED0362B459A10005E3C34 /* LocalhostSynchronizer.swift in Sources */,
5B91B8372DD84276000510F0 /* SplitMetadata.swift in Sources */,
9505682426836B20001D7B10 /* ImpressionsCountRecorder.swift in Sources */,
3B6DEF3020EA6AE50067435E /* Evaluator.swift in Sources */,
598EDE78224BB3E9005D4762 /* InternalSplitClient.swift in Sources */,
Expand Down Expand Up @@ -4875,6 +4880,7 @@
95B02D9828D0BDC30030EC8B /* RestClient+UniqueKeys.swift in Sources */,
95B02D9928D0BDC30030EC8B /* RestClient+ImpressionsCount.swift in Sources */,
95B02D9A28D0BDC30030EC8B /* RestClient+SplitChanges.swift in Sources */,
5B91B8362DD84276000510F0 /* SplitMetadata.swift in Sources */,
95B02D9B28D0BDC30030EC8B /* DataResult.swift in Sources */,
958AD2132CA457C100E3DD43 /* RetryableSegmentsSyncWorker.swift in Sources */,
9566744729F03662001B4FA5 /* DbCipher.swift in Sources */,
Expand Down
54 changes: 25 additions & 29 deletions Split/Api/DefaultSplitClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,49 +55,45 @@ public final class DefaultSplitClient: NSObject, SplitClient, TelemetrySplitClie
}
}

// MARK: Events
// MARK: Events Listeners
extension DefaultSplitClient {

private func onWithMetadata(event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute actionWithMetadata: @escaping SplitActionWithMetadata) {
guard let factory = clientManager?.splitFactory else { return }
let task = SplitEventActionTask(action: actionWithMetadata, event: event.type, runInBackground: runInBackground, factory: factory, queue: queue)
on(event: event.type, executeTask: task)
}

public func on(event: SplitEvent, executeWithMetadata action: SplitActionWithMetadata?) {
guard let action = action else { return }
onWithMetadata(event: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: true, queue: nil, execute: action)
}

private func on(event: SplitEvent, executeTask task: SplitEventActionTask) {
if event != .sdkReadyFromCache, eventsManager.eventAlreadyTriggered(event: event) {
Logger.w("A handler was added for \(event.toString()) on the SDK, which has already fired and won’t be emitted again. The callback won’t be executed.")
return
}
eventsManager.register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task)
}

public func on(event: SplitEvent, execute action: @escaping SplitAction) {
on(event: event, runInBackground: false, queue: nil, execute: action)
}

public func on(event: SplitEvent, runInBackground: Bool,
execute action: @escaping SplitAction) {
public func on(event: SplitEvent, runInBackground: Bool, execute action: @escaping SplitAction) {
on(event: event, runInBackground: runInBackground, queue: nil, execute: action)
}

public func on(event: SplitEvent,
queue: DispatchQueue, execute action: @escaping SplitAction) {
public func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) {
on(event: event, runInBackground: true, queue: queue, execute: action)
}

private func on(event: SplitEvent,
runInBackground: Bool,
queue: DispatchQueue?,
execute action: @escaping SplitAction) {

guard let factory = clientManager?.splitFactory else {
return
}

let task = SplitEventActionTask(action: action, event: event,
runInBackground: runInBackground,
factory: factory,
queue: queue)
task.event = event
private func on(event: SplitEvent, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) {
guard let factory = clientManager?.splitFactory else { return }
let task = SplitEventActionTask(action: action, event: event, runInBackground: runInBackground, factory: factory, queue: queue)
on(event: event, executeTask: task)
}

private func on(event: SplitEvent, executeTask task: SplitEventTask) {
if event != .sdkReadyFromCache,
eventsManager.eventAlreadyTriggered(event: event) {
Logger.w("A handler was added for \(event.toString()) on the SDK, " +
"which has already fired and won’t be emitted again. The callback won’t be executed.")
return
}
eventsManager.register(event: event, task: task)
}
}

// MARK: Treatment / Evaluation
Expand Down
29 changes: 14 additions & 15 deletions Split/Api/FailHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import Foundation

/// To avoid crashing host app this dummy components will be returned
/// on Failed init
///

class FailedClient: SplitClient {

// MARK: Treatments
func getTreatment(_ split: String) -> String {
return SplitConstants.control
}
Expand Down Expand Up @@ -54,17 +54,16 @@ class FailedClient: SplitClient {
return [:]
}

func on(event: SplitEvent, execute action: @escaping SplitAction) {
}
// MARK: Events Listeners
func on(event: SplitEvent, execute action: @escaping SplitAction) {}

func on(event: SplitEvent, runInBackground: Bool,
execute action: @escaping SplitAction) {
}
func on(event: SplitEvent, runInBackground: Bool, execute action: @escaping SplitAction) {}

func on(event: SplitEvent,
queue: DispatchQueue, execute action: @escaping SplitAction) {
}
func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) {}

func on(event: SplitEvent, executeWithMetadata: SplitActionWithMetadata) {}

// MARK: Tracking
func track(trafficType: String, eventType: String) -> Bool {
return false
}
Expand Down Expand Up @@ -105,6 +104,7 @@ class FailedClient: SplitClient {
return false
}

// MARK: By FlagSets
func getTreatmentsByFlagSet(_ flagSet: String, attributes: [String: Any]?) -> [String: String] {
return [:]
}
Expand Down Expand Up @@ -137,19 +137,18 @@ class FailedClient: SplitClient {
return [:]
}

func setUserConsent(enabled: Bool) {
}
func setUserConsent(enabled: Bool) {}

func flush() {
}
// MARK: Lifeycle
func flush() {}

func destroy() {
}
func destroy() {}

func destroy(completion: (() -> Void)?) {
completion?()
}

// MARK: Tracking
func track(trafficType: String, eventType: String, properties: [String: Any]?) -> Bool {
return false
}
Expand Down
54 changes: 36 additions & 18 deletions Split/Api/LocalhostSplitClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public final class LocalhostSplitClient: NSObject, SplitClient {
super.init()
}

// MARK: Treatments
public func getTreatment(_ split: String, attributes: [String: Any]?) -> String {
return getTreatmentWithConfig(split).treatment
}
Expand Down Expand Up @@ -121,32 +122,52 @@ public final class LocalhostSplitClient: NSObject, SplitClient {
return results
}

public func on(event: SplitEvent, runInBackground: Bool,
execute action: @escaping SplitAction) {
// MARK: Events Listeners
public func on(event: SplitEvent, execute action: @escaping SplitAction) {
on(event: event, runInBackground: false, queue: nil, execute: action)
}

public func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) {
on(eventWithMetadata: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: false, queue: nil, execute: executeWithMetadata)
}

public func on(event: SplitEvent, runInBackground: Bool, execute action: @escaping SplitAction) {
on(event: event, runInBackground: runInBackground, queue: nil, execute: action)
}

public func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) {
on(event: event, runInBackground: true, queue: queue, execute: action)
}

public func on(event: SplitEvent, execute action: @escaping SplitAction) {
on(event: event, runInBackground: false, queue: nil, execute: action)
private func on(event: SplitEvent, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) {
on(eventWithMetadata: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: runInBackground, queue: queue, execute: action)
}

private func on(event: SplitEvent, runInBackground: Bool,
queue: DispatchQueue?, execute action: @escaping SplitAction) {
private func on(eventWithMetadata event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) {

guard let factory = clientManger?.splitFactory else { return }
if let eventsManager = self.eventsManager {
let task = SplitEventActionTask(action: action, event: event.type,
runInBackground: runInBackground,
factory: factory,
queue: queue)
eventsManager.register(event: event, task: task)
}
}

private func on(eventWithMetadata event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitActionWithMetadata) {

guard let factory = clientManger?.splitFactory else { return }
if let eventsManager = self.eventsManager {
let task = SplitEventActionTask(action: action, event: event,
let task = SplitEventActionTask(action: action, event: event.type,
runInBackground: runInBackground,
factory: factory,
queue: queue)
eventsManager.register(event: event, task: task)
}
}

// MARK: Tracking
public func track(trafficType: String, eventType: String) -> Bool {
return true
}
Expand Down Expand Up @@ -179,11 +200,10 @@ public final class LocalhostSplitClient: NSObject, SplitClient {
return true
}

public func setUserConsent(enabled: Bool) {
}
public func setUserConsent(enabled: Bool) {}

public func flush() {
}
// MARK: Lifecycle
public func flush() {}

public func destroy() {
splitsStorage.destroy()
Expand All @@ -195,7 +215,7 @@ public final class LocalhostSplitClient: NSObject, SplitClient {
}
}

// MARK: Persistent attributes feature
// MARK: Persistence
extension LocalhostSplitClient {

public func setAttribute(name: String, value: Any) -> Bool {
Expand Down Expand Up @@ -223,7 +243,7 @@ extension LocalhostSplitClient {
}
}

// MARK: TreatmentBySets Feature
// MARK: By FlagSet
extension LocalhostSplitClient {
public func getTreatmentsByFlagSet(_ flagSet: String, attributes: [String: Any]?) -> [String: String] {
return [String: String]()
Expand All @@ -249,13 +269,11 @@ extension LocalhostSplitClient {
return [String: String]()
}

public func getTreatmentsWithConfigByFlagSet(_ flagSet: String,
attributes: [String: Any]?, evaluationOptions: EvaluationOptions?) -> [String: SplitResult] {
public func getTreatmentsWithConfigByFlagSet(_ flagSet: String, attributes: [String: Any]?, evaluationOptions: EvaluationOptions?) -> [String: SplitResult] {
return [String: SplitResult]()
}

public func getTreatmentsWithConfigByFlagSets(_ flagSets: [String],
attributes: [String: Any]?, evaluationOptions: EvaluationOptions?) -> [String: SplitResult] {
public func getTreatmentsWithConfigByFlagSets(_ flagSets: [String], attributes: [String: Any]?, evaluationOptions: EvaluationOptions?) -> [String: SplitResult] {
return [String: SplitResult]()
}
}
Loading