Skip to content

Commit

Permalink
Release 28.7.0
Browse files Browse the repository at this point in the history
  • Loading branch information
robot-divkit committed Oct 23, 2023
1 parent 796c8db commit 7ee2177
Show file tree
Hide file tree
Showing 21 changed files with 498 additions and 93 deletions.
9 changes: 9 additions & 0 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@
"DivKit/Timers/DivTimerStorage.swift":"divkit/public-ios/DivKit/Timers/DivTimerStorage.swift",
"DivKit/Timers/TimeIntervalMeasuring.swift":"divkit/public-ios/DivKit/Timers/TimeIntervalMeasuring.swift",
"DivKit/Variables/DivTriggersStorage.swift":"divkit/public-ios/DivKit/Variables/DivTriggersStorage.swift",
"DivKit/Variables/DivVariableName.swift":"divkit/public-ios/DivKit/Variables/DivVariableName.swift",
"DivKit/Variables/DivVariableStorage.swift":"divkit/public-ios/DivKit/Variables/DivVariableStorage.swift",
"DivKit/Variables/DivVariableTracker.swift":"divkit/public-ios/DivKit/Variables/DivVariableTracker.swift",
"DivKit/Variables/DivVariableUpdater.swift":"divkit/public-ios/DivKit/Variables/DivVariableUpdater.swift",
"DivKit/Variables/DivVariableValue.swift":"divkit/public-ios/DivKit/Variables/DivVariableValue.swift",
Expand Down Expand Up @@ -383,6 +385,7 @@
"DivKit/generated_sources/DivVariable.swift":"divkit/public-ios/DivKit/generated_sources/DivVariable.swift",
"DivKit/generated_sources/DivVariableTemplate.swift":"divkit/public-ios/DivKit/generated_sources/DivVariableTemplate.swift",
"DivKit/generated_sources/DivVideo.swift":"divkit/public-ios/DivKit/generated_sources/DivVideo.swift",
"DivKit/generated_sources/DivVideoScale.swift":"divkit/public-ios/DivKit/generated_sources/DivVideoScale.swift",
"DivKit/generated_sources/DivVideoSource.swift":"divkit/public-ios/DivKit/generated_sources/DivVideoSource.swift",
"DivKit/generated_sources/DivVideoSourceTemplate.swift":"divkit/public-ios/DivKit/generated_sources/DivVideoSourceTemplate.swift",
"DivKit/generated_sources/DivVideoTemplate.swift":"divkit/public-ios/DivKit/generated_sources/DivVideoTemplate.swift",
Expand Down Expand Up @@ -568,6 +571,7 @@
"LayoutKit/LayoutKit/Blocks/Video/PlayerView.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/Video/PlayerView.swift",
"LayoutKit/LayoutKit/Blocks/Video/VideoBlock.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/Video/VideoBlock.swift",
"LayoutKit/LayoutKit/Blocks/Video/VideoData.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/Video/VideoData.swift",
"LayoutKit/LayoutKit/Blocks/Video/VideoScale.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/Video/VideoScale.swift",
"LayoutKit/LayoutKit/Blocks/VideoBlockLegacy.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/VideoBlockLegacy.swift",
"LayoutKit/LayoutKit/Blocks/ViewType.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/ViewType.swift",
"LayoutKit/LayoutKit/Blocks/Visibility.swift":"divkit/public-ios/LayoutKit/LayoutKit/Blocks/Visibility.swift",
Expand Down Expand Up @@ -813,6 +817,7 @@
"Specs/DivKit/28.4.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.4.0/DivKit.podspec",
"Specs/DivKit/28.5.1/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.5.1/DivKit.podspec",
"Specs/DivKit/28.6.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.6.0/DivKit.podspec",
"Specs/DivKit/28.7.0/DivKit.podspec":"divkit/public-ios/Specs/DivKit/28.7.0/DivKit.podspec",
"Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/24.3.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.0.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/25.1.0/DivKitExtensions.podspec",
Expand All @@ -838,27 +843,31 @@
"Specs/DivKitExtensions/28.4.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.4.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.5.1/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.6.0/DivKitExtensions.podspec",
"Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec":"divkit/public-ios/Specs/DivKitExtensions/28.7.0/DivKitExtensions.podspec",
"Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.0.1/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.1.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.2.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.3.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.3.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.4.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.4.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.5.1/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.6.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec":"divkit/public-ios/Specs/DivKit_LayoutKit/28.7.0/DivKit_LayoutKit.podspec",
"Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.0.1/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.1.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.2.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.3.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.3.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.4.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.4.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.5.1/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.6.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec":"divkit/public-ios/Specs/DivKit_LayoutKitInterface/28.7.0/DivKit_LayoutKitInterface.podspec",
"Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.0.1/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.1.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.2.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.3.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.3.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.4.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.4.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.5.1/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.6.0/DivKit_Serialization.podspec",
"Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec":"divkit/public-ios/Specs/DivKit_Serialization/28.7.0/DivKit_Serialization.podspec",
"Specs/LayoutKit/24.3.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/24.3.0/LayoutKit.podspec",
"Specs/LayoutKit/25.0.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.0.0/LayoutKit.podspec",
"Specs/LayoutKit/25.1.0/LayoutKit.podspec":"divkit/public-ios/Specs/LayoutKit/25.1.0/LayoutKit.podspec",
Expand Down
2 changes: 1 addition & 1 deletion DivKit/DivKitInfo.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
public enum DivKitInfo {
public static let version = "28.6.0"
public static let version = "28.7.0"
}
16 changes: 15 additions & 1 deletion DivKit/Extensions/DivVideoExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ extension DivVideo: DivBlockModeling {
bufferingActions: bufferingActions,
endActions: endActions,
fatalActions: fatalActions,
path: context.parentPath
path: context.parentPath,
scale: resolveScale(resolver).scale
)

let videoPath = context.parentPath + (id ?? DivVideo.type)
Expand Down Expand Up @@ -99,6 +100,19 @@ extension DivVideoSource {
}
}

extension DivVideoScale {
fileprivate var scale: VideoScale {
switch self {
case .fill:
return .fill
case .noScale:
return .noScale
case .fit:
return .fit
}
}
}

private func _makeImage(base64: String) -> Image? {
decode(base64: base64).flatMap(Image.init(data:))
}
Expand Down
11 changes: 8 additions & 3 deletions DivKit/Variables/DivTriggersStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public final class DivTriggersStorage {
cardId: cardId,
changedVariablesNames: Set(variables.keys),
newVariables: variables,
oldVariables: [:]
oldVariables: nil
)
}

Expand All @@ -76,7 +76,7 @@ public final class DivTriggersStorage {
cardId: DivCardID,
changedVariablesNames: Set<DivVariableName>,
newVariables: DivVariables,
oldVariables: DivVariables
oldVariables: DivVariables?
) {
triggers.forEach { trigger in
if trigger.shouldPerformActions(
Expand Down Expand Up @@ -128,7 +128,7 @@ extension DivTrigger {
cardId: DivCardID,
changedVariablesNames: Set<DivVariableName>,
newVariables: DivVariables,
oldVariables: DivVariables,
oldVariables: DivVariables?,
persistentValuesStorage: DivPersistentValuesStorage,
reporter: DivReporter
) -> Bool {
Expand All @@ -145,6 +145,11 @@ extension DivTrigger {
return false
}

// oldVariables is nil for initial trigger resolving
guard let oldVariables = oldVariables else {
return true
}

switch resolveMode(resolverWithNewVariables) {
case .onVariable:
return true
Expand Down
8 changes: 8 additions & 0 deletions DivKit/Variables/DivVariableName.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import Foundation

import BasePublic

public enum DivVariableNameTag {}
public typealias DivVariableName = Tagged<DivVariableNameTag, String>

public typealias DivVariables = [DivVariableName: DivVariableValue]
171 changes: 171 additions & 0 deletions DivKit/Variables/DivVariableStorage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
import Foundation

import BasePublic

/// Stores variables.
/// Use ``DivVariableStorage`` to provide external variables into `DivKit`.
/// You can combine storages to have variables with different scopes.
public final class DivVariableStorage {
public struct ChangeEvent {
public let changedVariables: Set<DivVariableName>
public let oldValues: DivVariables
}

private let outerStorage: DivVariableStorage?

private var values = DivVariables()
private let lock = RWLock()

var allValues: DivVariables {
(outerStorage?.allValues ?? [:]) + values
}

private let changeEventsPipe = SignalPipe<ChangeEvent>()
let changeEvents: Signal<ChangeEvent>

/// Initializes a new instance of ``DivVariableStorage``.
///
/// - Parameters:
/// - outerStorage: Storage that provides outer scope variables. Outer scope variables are accessible via
/// current storage (see `getValue` and `update` methods). Outer scope variables can be shadowed.
public init(outerStorage: DivVariableStorage? = nil) {
self.outerStorage = outerStorage

if let outerStorage = outerStorage {
weak var weakSelf: DivVariableStorage?
let outerStorageEvents: Signal<ChangeEvent> = outerStorage.changeEvents.compactMap {
guard let self = weakSelf else {
return nil
}
return ChangeEvent(
changedVariables: $0.changedVariables,
oldValues: $0.oldValues + self.values
)
}
changeEvents = Signal.merge(outerStorageEvents, changeEventsPipe.signal)
weakSelf = self
} else {
changeEvents = changeEventsPipe.signal
}
}

/// Gets variable value.
/// If variable with the given name not exists gets value from the outer storage.
public func getValue<T>(_ name: DivVariableName) -> T? {
let variable = lock.read {
values[name]
}
if let variable = variable {
return variable.typedValue()
}
return outerStorage?.getValue(name)
}

/// Puts variable into the storage.
/// Updates variable value if a variable with the given name already exists.
/// Does not affect outer storage.
public func put(name: DivVariableName, value: DivVariableValue) {
lock.write {
let oldValues = allValues
values[name] = value
notify(ChangeEvent(changedVariables: [name], oldValues: oldValues))
}
}

/// Puts multiple variables into the storage.
/// Updates values of existing variables.
/// Does not affect outer storage.
public func put(
_ variables: DivVariables,
notifyObservers: Bool = true
) {
lock.write {
let oldValues = allValues
values = values + variables
if notifyObservers {
notify(ChangeEvent(changedVariables: Set(variables.map { $0.key }), oldValues: oldValues))
}
}
}

/// Replaces all variables with new ones in single transaction.
/// Does not affect outer storage.
public func replaceAll(
_ variables: DivVariables,
notifyObservers: Bool = true
) {
lock.write {
let oldValues = allValues
values = variables
if notifyObservers {
let changedVariables = makeChangedVariables(old: oldValues, new: variables)
if changedVariables.isEmpty {
return
}
notify(ChangeEvent(changedVariables: changedVariables, oldValues: oldValues))
}
}
}

/// Updates variable value.
/// If variable with the given name not exists updates value in the outer storage.
public func update(name: DivVariableName, value: DivVariableValue) {
update(name: name, valueFactory: { _ in value })
}

/// Clears the storage.
/// Does not affect outer storage.
public func clear() {
lock.write {
values = DivVariables()
}
}

func update(
name: DivVariableName,
valueFactory: (DivVariableValue) -> DivVariableValue?
) {
let hasLocalValue = lock.write {
guard let oldValue = values[name] else {
return false
}

if let value = valueFactory(oldValue), value != oldValue {
let oldValues = allValues
values[name] = value
notify(ChangeEvent(changedVariables: [name], oldValues: oldValues))
}

return true
}

if hasLocalValue {
return
}

if let outerStorage = outerStorage {
outerStorage.update(name: name, valueFactory: valueFactory)
} else {
DivKitLogger.error("Variable is not declared: \(name)")
}
}

private func notify(_ event: ChangeEvent) {
onMainThread { [weak self] in
self?.changeEventsPipe.send(event)
}
}
}

func makeChangedVariables(
old: DivVariables,
new: DivVariables
) -> Set<DivVariableName> {
var result = Set<DivVariableName>()
for (name, value) in old {
if new[name] != value {
result.insert(name)
}
}
return result.union(Set(new.keys).subtracting(Set(old.keys)))
}
2 changes: 1 addition & 1 deletion DivKit/Variables/DivVariableValue.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

import CommonCorePublic
import BasePublic

@frozen
public enum DivVariableValue: Hashable {
Expand Down
Loading

0 comments on commit 7ee2177

Please sign in to comment.