Skip to content
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

SPT-1998 Скрытие AsyncStream и исправление опечаток (6) #138

Merged
merged 2 commits into from
May 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions Example/Example.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 60;
objectVersion = 54;
objects = {

/* Begin PBXBuildFile section */
Expand Down Expand Up @@ -350,7 +350,6 @@
packageReferences = (
50C445A02BC81FB300C515E6 /* XCRemoteSwiftPackageReference "SwiftMessages" */,
50C445A62BC8202600C515E6 /* XCRemoteSwiftPackageReference "ReactiveDataDisplayManager" */,
5097DF472BCD62AA00D422EE /* XCLocalSwiftPackageReference "../NodeKit" */,
50B5697E2BD183F00054DC09 /* XCRemoteSwiftPackageReference "iOS-Utils" */,
50B569812BD184150054DC09 /* XCRemoteSwiftPackageReference "Nuke" */,
50B5698A2BD18F040054DC09 /* XCRemoteSwiftPackageReference "SnapKit" */,
Expand Down Expand Up @@ -603,13 +602,6 @@
};
/* End XCConfigurationList section */

/* Begin XCLocalSwiftPackageReference section */
5097DF472BCD62AA00D422EE /* XCLocalSwiftPackageReference "../NodeKit" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = ../NodeKit;
};
/* End XCLocalSwiftPackageReference section */

/* Begin XCRemoteSwiftPackageReference section */
50B5697E2BD183F00054DC09 /* XCRemoteSwiftPackageReference "iOS-Utils" */ = {
isa = XCRemoteSwiftPackageReference;
Expand Down
2 changes: 1 addition & 1 deletion Example/Modules/MockServer/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ let package = Package(
)
],
dependencies: [
.package(path: "../../../NodeKit"),
.package(path: "../../.."),
.package(path: "../Models")
],
targets: [
Expand Down
2 changes: 1 addition & 1 deletion Example/Modules/Models/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ let package = Package(
)
],
dependencies: [
.package(path: "../../../NodeKit")
.package(path: "../../..")
],
targets: [
.target(
Expand Down
6 changes: 4 additions & 2 deletions Example/Modules/Services/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ let package = Package(
],
dependencies: [
.package(path: "../Models"),
.package(path: "../../../NodeKit")
.package(path: "../MockServer"),
.package(path: "../../..")
],
targets: [
.target(
name: "Services",
dependencies: [
"Models",
"NodeKit"
"NodeKit",
"MockServer"
],
path: "Services"
)
Expand Down
4 changes: 0 additions & 4 deletions NodeKit/NodeKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@
50B569782BCFEF610054DC09 /* AsyncStreamNodeResultPublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B569772BCFEF610054DC09 /* AsyncStreamNodeResultPublisher.swift */; };
50B5697A2BCFF1A10054DC09 /* CombineCompatibleNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B569792BCFF1A10054DC09 /* CombineCompatibleNode.swift */; };
50B6838F2BBF3615001F7EA3 /* AccessSafeNodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B6838E2BBF3615001F7EA3 /* AccessSafeNodeTests.swift */; };
50BEF7BE2BE8A713003DCB04 /* MergedAsyncStreamNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BEF7BD2BE8A713003DCB04 /* MergedAsyncStreamNode.swift */; };
50C57AB72BE3871D004C344E /* ServiceChainProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C57AB62BE3871D004C344E /* ServiceChainProvider.swift */; };
50C57AB92BE388C6004C344E /* ChainBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C57AB82BE388C6004C344E /* ChainBuilder.swift */; };
50C8EB302BBD90DE00C5CB93 /* CombineNodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C8EB2F2BBD90DE00C5CB93 /* CombineNodeTests.swift */; };
Expand Down Expand Up @@ -365,7 +364,6 @@
50B569772BCFEF610054DC09 /* AsyncStreamNodeResultPublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncStreamNodeResultPublisher.swift; sourceTree = "<group>"; };
50B569792BCFF1A10054DC09 /* CombineCompatibleNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombineCompatibleNode.swift; sourceTree = "<group>"; };
50B6838E2BBF3615001F7EA3 /* AccessSafeNodeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessSafeNodeTests.swift; sourceTree = "<group>"; };
50BEF7BD2BE8A713003DCB04 /* MergedAsyncStreamNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MergedAsyncStreamNode.swift; sourceTree = "<group>"; };
50C57AB62BE3871D004C344E /* ServiceChainProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceChainProvider.swift; sourceTree = "<group>"; };
50C57AB82BE388C6004C344E /* ChainBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChainBuilder.swift; sourceTree = "<group>"; };
50C8EB272BBD7A2200C5CB93 /* AsyncStreamCombineNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncStreamCombineNode.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -517,7 +515,6 @@
501349142BE3E6D2002CC3DA /* AnyAsyncNode.swift */,
5005EB222BB8A6D900B670CD /* AsyncStreamNode.swift */,
501349162BE3E770002CC3DA /* AnyAsyncStreamNode.swift */,
50BEF7BD2BE8A713003DCB04 /* MergedAsyncStreamNode.swift */,
);
path = Async;
sourceTree = "<group>";
Expand Down Expand Up @@ -1521,7 +1518,6 @@
5005EB212BB8A6D000B670CD /* AsyncNode.swift in Sources */,
90B609A5283E1287006F4309 /* ResponseProcessorNode.swift in Sources */,
90B60995283E1287006F4309 /* DTOEncoderNode.swift in Sources */,
50BEF7BE2BE8A713003DCB04 /* MergedAsyncStreamNode.swift in Sources */,
90B60914283E1268006F4309 /* ETagConstants.swift in Sources */,
50528E292BAE162600E86CB6 /* LoggerStreamNode.swift in Sources */,
90B609A2283E1287006F4309 /* ResponseDataParserNode.swift in Sources */,
Expand Down
21 changes: 12 additions & 9 deletions NodeKit/NodeKit/CacheNode/FirstCachePolicyNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,29 @@ import Foundation
/// - SeeAlso: `FirstCachePolicyNode`
///
/// - cantGetURLRequest: Возникает в случае, если запрос отправленный в сеть не содержит `URLRequest`
public enum BaseFirstCachePolicyNodeError: Error {
enum BaseFirstCachePolicyNodeError: Error {
case cantGetURLRequest
}

/// Этот узел реализует политику кэширования
/// "Сначала читаем из кэша, а затем запрашиваем у сервера"
/// - Important: В общем случае слушатель может быть оповещен дважды. Первый раз, когда ответ прочитан из кэша, а второй раз, когда он был получен с сервера.
open class FirstCachePolicyNode: AsyncStreamNode {
class FirstCachePolicyNode: AsyncStreamNode {
// MARK: - Nested

/// Тип для читающего из URL кэша узла
public typealias CacheReaderNode = AsyncNode<URLNetworkRequest, Json>
typealias CacheReaderNode = AsyncNode<URLNetworkRequest, Json>

/// Тип для следующего узла
public typealias NextProcessorNode = AsyncNode<RawURLRequest, Json>
typealias NextProcessorNode = AsyncNode<RawURLRequest, Json>

// MARK: - Properties

/// Следующий узел для обработки.
public var next: any NextProcessorNode
var next: any NextProcessorNode

/// Узел для чтения из кэша.
public var cacheReaderNode: any CacheReaderNode
var cacheReaderNode: any CacheReaderNode

// MARK: - Init and Deinit

Expand All @@ -44,7 +44,7 @@ open class FirstCachePolicyNode: AsyncStreamNode {
/// - Parameters:
/// - cacheReaderNode: Узел для чтения из кэша.
/// - next: Следующий узел для обработки.
public init(cacheReaderNode: any CacheReaderNode, next: any NextProcessorNode) {
init(cacheReaderNode: any CacheReaderNode, next: any NextProcessorNode) {
self.cacheReaderNode = cacheReaderNode
self.next = next
}
Expand All @@ -55,12 +55,12 @@ open class FirstCachePolicyNode: AsyncStreamNode {
/// а затем, передает управление следующему узлу.
/// В случае, если получить `URLRequest` не удалось,
/// то управление просто передается следующему узлу
public func process(
func process(
_ data: RawURLRequest,
logContext: LoggingContextProtocol
) -> AsyncStream<NodeResult<Json>> {
return AsyncStream { continuation in
Task {
let task = Task {
if let request = data.toURLRequest() {
let cacheResult = await cacheReaderNode.process(request, logContext: logContext)
continuation.yield(cacheResult)
Expand All @@ -70,6 +70,9 @@ open class FirstCachePolicyNode: AsyncStreamNode {
continuation.yield(nextResult)
continuation.finish()
}
continuation.onTermination = { _ in
task.cancel()
}
}
}
}
4 changes: 2 additions & 2 deletions NodeKit/NodeKit/Core/Node/Async/AnyAsyncStreamNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

public struct AnyAsyncStreamNode<Input, Output>: AsyncStreamNode {
struct AnyAsyncStreamNode<Input, Output>: AsyncStreamNode {

// MARK: - Private Properties

Expand All @@ -22,7 +22,7 @@ public struct AnyAsyncStreamNode<Input, Output>: AsyncStreamNode {

// MARK: - AsyncNode

public func process(_ data: Input, logContext: LoggingContextProtocol) -> AsyncStream<NodeResult<Output>> {
func process(_ data: Input, logContext: LoggingContextProtocol) -> AsyncStream<NodeResult<Output>> {
return node.process(data, logContext: logContext)
}
}
18 changes: 3 additions & 15 deletions NodeKit/NodeKit/Core/Node/Async/AsyncNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import Foundation

/// Протокол ноды, описывающий подход преобразования входных данных в результат с помощью SwiftConcurrency.
/// Поддерживает обработку результатов с помощью Combine, наследуя протокол ``CombineCompatibleNode``.
/// Содержит параметры для логов, наследуя протокол ``LoggableNode``.
/// Содержит параметры для логов, наследуя протокол ``Node``.
/// Применим для узлов, которые возвращают один результат.
public protocol AsyncNode<Input, Output>: LoggableNode, CombineCompatibleNode<Self.Input, Self.Output> {
public protocol AsyncNode<Input, Output>: Node, CombineCompatibleNode<Self.Input, Self.Output> {
associatedtype Input
associatedtype Output

Expand All @@ -29,12 +29,6 @@ public protocol AsyncNode<Input, Output>: LoggableNode, CombineCompatibleNode<Se
///
/// - Returns: Cтруктура-обертку текущей ноды ``AnyAsyncNode``.
func eraseToAnyNode() -> AnyAsyncNode<Input, Output>

/// Метод, позволяющий объединить две ноды с одинаковыми Input и Output в AsyncStreamNode.
///
/// - Parameter node: Нода, необходимая для объединения.
/// - Returns: Нода AsyncStreamNode, включающая текущую и переданную ноду.
func merged(with node: any AsyncNode<Input, Output>) -> any AsyncStreamNode<Input, Output>
}

public extension AsyncNode {
Expand Down Expand Up @@ -74,13 +68,7 @@ public extension AsyncNode {
return AnyAsyncNode(node: self)
}

/// Стандартная реализация объединения двух узлов в AsyncStreamNode.
///
/// - Parameter node: Нода, необходимая для объединения.
/// - Returns: Нода AsyncStreamNode, включающая текущую и переданную ноду.
func merged(with node: any AsyncNode<Input, Output>) -> any AsyncStreamNode<Input, Output> {
return MergedAsyncStreamNode(firstNode: self, secondNode: node)
}

}

/// Содержит синтаксический сахар для работы с узлами, у которых входящий тип = `Void`
Expand Down
8 changes: 4 additions & 4 deletions NodeKit/NodeKit/Core/Node/Async/AsyncStreamNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import Foundation

/// Протокол ноды, описывающий подход преобразования входных данных в результат с помощью SwiftConcurrency.
/// Поддерживает обработку результатов с помощью Combine, наследуя протокол ``CombineCompatibleNode``.
/// Содержит параметры для логов, наследуя протокол ``LoggableNode``.
/// Содержит параметры для логов, наследуя протокол ``Node``.
/// Применим для узлов, которые могут вернуть несколько результатов
public protocol AsyncStreamNode<Input, Output>: LoggableNode, CombineCompatibleNode<Self.Input, Self.Output> {
protocol AsyncStreamNode<Input, Output>: Node, CombineCompatibleNode<Self.Input, Self.Output> {
associatedtype Input
associatedtype Output

Expand All @@ -31,7 +31,7 @@ public protocol AsyncStreamNode<Input, Output>: LoggableNode, CombineCompatibleN
func eraseToAnyNode() -> AnyAsyncStreamNode<Input, Output>
}

public extension AsyncStreamNode {
extension AsyncStreamNode {

/// Метод process с созданием нового лог контекста.
@discardableResult
Expand Down Expand Up @@ -70,7 +70,7 @@ public extension AsyncStreamNode {
}

/// Содержит синтаксический сахар для работы с узлами, у которых входящий тип = `Void`
public extension AsyncStreamNode where Input == Void {
extension AsyncStreamNode where Input == Void {

/// Вызывает `process(_:)`
@discardableResult
Expand Down
53 changes: 0 additions & 53 deletions NodeKit/NodeKit/Core/Node/Async/MergedAsyncStreamNode.swift

This file was deleted.

8 changes: 4 additions & 4 deletions NodeKit/NodeKit/Core/Node/Node.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// LoggableNode.swift
// Node.swift
// CoreNetKitWithExample
//
// Created by Александр Кравченков on 27/11/2018.
Expand All @@ -10,16 +10,16 @@ import Foundation

/// Протокол, описывающий любой узел или цепочку узлов.
/// Необходим для объединения всех типов узлов и добавления общих методов.
public protocol LoggableNode { }
public protocol Node { }

/// Содержит вычисляемые константы
public extension LoggableNode {
public extension Node {
/// Возвращает имя типа строкой
var objectName: String {
return "\(type(of: self))"
}

/// Имея обхекта в формате:
/// Имея объекта в формате:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// Имея объекта в формате:
/// Имя объекта в формате:

/// <<<===\(self.objectName)===>>>" + `String.lineTabDeilimeter`
var logViewObjectName: String {
return "<<<===\(self.objectName)===>>>" + .lineTabDeilimeter
Expand Down
15 changes: 9 additions & 6 deletions NodeKit/NodeKit/Utils/Logging/LoggerStreamNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,29 @@

/// Этот узел выполняет выведение лога в консоль.
/// Сразу же передает управление следующему узлу и подписывается на выполнение операций.
open class LoggerStreamNode<Input, Output>: AsyncStreamNode {
class LoggerStreamNode<Input, Output>: AsyncStreamNode {

/// Следующий узел для обработки.
open var next: any AsyncStreamNode<Input, Output>
var next: any AsyncStreamNode<Input, Output>
/// Содержит список ключей, по которым будет отфлитрован лог.
open var filters: [String]
var filters: [String]

/// Инициаллизирует объект.
///
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - filters: Содержит список ключей, по которым будет отфлитрован лог.
public init(next: any AsyncStreamNode<Input, Output>, filters: [String] = []) {
init(next: any AsyncStreamNode<Input, Output>, filters: [String] = []) {
self.next = next
self.filters = filters
}

/// Сразу же передает управление следующему узлу и подписывается на выполнение операций.
///
/// - Parameter data: Данные для обработки. Этот узел их не импользует.
public func process(_ data: Input, logContext: LoggingContextProtocol) -> AsyncStream<NodeResult<Output>> {
func process(_ data: Input, logContext: LoggingContextProtocol) -> AsyncStream<NodeResult<Output>> {
return AsyncStream { continuation in
Task {
let task = Task {
for await result in next.process(data, logContext: logContext) {
continuation.yield(result)
}
Expand All @@ -40,6 +40,9 @@ open class LoggerStreamNode<Input, Output>: AsyncStreamNode {
.forEach { print($0.description) }
continuation.finish()
}
continuation.onTermination = { _ in
task.cancel()
}
}
}
}
Loading
Loading