Skip to content

Commit

Permalink
Merge pull request #121 from surfstudio/SPT-1998-logger
Browse files Browse the repository at this point in the history
SPT-1998 LoggerContext
  • Loading branch information
mrandrewsmith authored Apr 16, 2024
2 parents 7c3be2d + 5311162 commit 49bb19a
Show file tree
Hide file tree
Showing 58 changed files with 471 additions and 224 deletions.
28 changes: 28 additions & 0 deletions NodeKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
390E697B2A13660C007F2304 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E69782A13660C007F2304 /* MultipartFormData.swift */; };
390E697C2A13660C007F2304 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E69792A13660C007F2304 /* AFError.swift */; };
390E697D2A13660C007F2304 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E697A2A13660C007F2304 /* HTTPHeaders.swift */; };
502F9D972BAA36CF00151A8D /* LoggingContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D962BAA36CF00151A8D /* LoggingContext.swift */; };
502F9D9A2BAA389500151A8D /* LoggingContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D992BAA389500151A8D /* LoggingContextTests.swift */; };
502F9D9D2BAA39F400151A8D /* Log+Equatalbe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */; };
90B608D4283E1110006F4309 /* NodeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90B608CB283E1110006F4309 /* NodeKit.framework */; };
90B608DA283E1110006F4309 /* NodeKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 90B608CE283E1110006F4309 /* NodeKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
90B6090E283E1268006F4309 /* UrlCacheReaderNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B608E4283E1268006F4309 /* UrlCacheReaderNode.swift */; };
Expand Down Expand Up @@ -159,6 +162,9 @@
390E69782A13660C007F2304 /* MultipartFormData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormData.swift; sourceTree = "<group>"; };
390E69792A13660C007F2304 /* AFError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AFError.swift; sourceTree = "<group>"; };
390E697A2A13660C007F2304 /* HTTPHeaders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPHeaders.swift; sourceTree = "<group>"; };
502F9D962BAA36CF00151A8D /* LoggingContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingContext.swift; sourceTree = "<group>"; };
502F9D992BAA389500151A8D /* LoggingContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingContextTests.swift; sourceTree = "<group>"; };
502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Log+Equatalbe.swift"; sourceTree = "<group>"; };
90B608CB283E1110006F4309 /* NodeKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NodeKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
90B608CE283E1110006F4309 /* NodeKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NodeKit.h; sourceTree = "<group>"; };
90B608D3283E1110006F4309 /* NodeKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NodeKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -343,6 +349,23 @@
path = EndToEndTests;
sourceTree = "<group>";
};
502F9D982BAA385E00151A8D /* Utils */ = {
isa = PBXGroup;
children = (
502F9D9B2BAA39E700151A8D /* Equatable */,
502F9D992BAA389500151A8D /* LoggingContextTests.swift */,
);
path = Utils;
sourceTree = "<group>";
};
502F9D9B2BAA39E700151A8D /* Equatable */ = {
isa = PBXGroup;
children = (
502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */,
);
path = Equatable;
sourceTree = "<group>";
};
90B608C1283E1110006F4309 = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -380,6 +403,7 @@
90B608D7283E1110006F4309 /* NodeKitTests */ = {
isa = PBXGroup;
children = (
502F9D982BAA385E00151A8D /* Utils */,
39EF561B2A0E28C3004B77C0 /* EndToEndTests */,
90B609E2283E16DC006F4309 /* Infrastructure */,
90B60A1A283E19C5006F4309 /* Resources */,
Expand Down Expand Up @@ -756,6 +780,7 @@
90B60980283E1287006F4309 /* Logable.swift */,
90B60981283E1287006F4309 /* LoggerExtensions.swift */,
90B60982283E1287006F4309 /* Log.swift */,
502F9D962BAA36CF00151A8D /* LoggingContext.swift */,
);
path = Logging;
sourceTree = "<group>";
Expand Down Expand Up @@ -1136,6 +1161,7 @@
90B6098D283E1287006F4309 /* Method.swift in Sources */,
90B6092B283E1268006F4309 /* Debouncer.swift in Sources */,
90B609C2283E1287006F4309 /* MockerProxyConfigNode.swift in Sources */,
502F9D972BAA36CF00151A8D /* LoggingContext.swift in Sources */,
90B60988283E1287006F4309 /* URLQueryArrayKeyEncodingStartegy.swift in Sources */,
390E69752A136591007F2304 /* RequestEncodingModel.swift in Sources */,
90B609AF283E1287006F4309 /* RequestCreatorNode.swift in Sources */,
Expand Down Expand Up @@ -1175,10 +1201,12 @@
90B609F8283E16DC006F4309 /* EncodingTests.swift in Sources */,
90B609F1283E16DC006F4309 /* ChainConfiguratorNodeTests.swift in Sources */,
90B609F6283E16DC006F4309 /* URLQueryInjectorNodeTests.swift in Sources */,
502F9D9A2BAA389500151A8D /* LoggingContextTests.swift in Sources */,
90B609FD283E16DC006F4309 /* UrlETagReaderNodeTests.swift in Sources */,
90B609F7283E16DC006F4309 /* TokenRefresherNodeTests.swift in Sources */,
90B609F4283E16DC006F4309 /* URLQueryArrayKeyEncodingBracketsStartegyTests.swift in Sources */,
90B609EF283E16DC006F4309 /* DTOMapperNodeTests.swift in Sources */,
502F9D9D2BAA39F400151A8D /* Log+Equatalbe.swift in Sources */,
90B60A09283E16DC006F4309 /* AbortingTests.swift in Sources */,
90B609FB283E16DC006F4309 /* TestUtls.swift in Sources */,
90B60A08283E16DC006F4309 /* Credentials.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"originHash" : "1d2e6911b0388532b33f83466feee8deadacbc6241719180eb45fd871a5091ac",
"pins" : [
{
"identity" : "coreevents",
Expand All @@ -10,5 +11,5 @@
}
}
],
"version" : 2
"version" : 3
}
8 changes: 4 additions & 4 deletions NodeKit/CacheNode/ETag/UrlETagReaderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import Foundation

/// Этот узел читает eTag-токен из хранилища и добавляет его к запросу.
open class UrlETagReaderNode: TransportLayerNode {
open class UrlETagReaderNode: Node {

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

/// Ключ, по которому необходимо получить eTag-токен из хедеров.
/// По-молчанию имеет значение `eTagRequestHeaderKey`
Expand All @@ -23,15 +23,15 @@ open class UrlETagReaderNode: TransportLayerNode {
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - eTagHeaderKey: Ключ, по которому необходимо добавить eTag-токен к запросу.
public init(next: TransportLayerNode,
public init(next: some TransportLayerNode,
etagHeaderKey: String = ETagConstants.eTagRequestHeaderKey) {
self.next = next
self.etagHeaderKey = etagHeaderKey
}

/// Пытается прочесть eTag-токен из хранилища и добавить его к запросу.
/// В случае, если прочесть токен не удалось, то управление просто передается дальше.
open override func process(_ data: TransportUrlRequest) -> Observer<Json> {
open func process(_ data: TransportUrlRequest) -> Observer<Json> {
guard let tag = UserDefaults.etagStorage?.value(forKey: data.url.absoluteString) as? String else {
return next.process(data)
}
Expand Down
8 changes: 4 additions & 4 deletions NodeKit/CacheNode/ETag/UrlETagSaverNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ extension UserDefaults {

/// Этот узел сохраняет пришедшие eTag-токены.
/// В качестве ключа используется абсолютный URL до endpoint-a.
open class UrlETagSaverNode: ResponsePostprocessorLayerNode {
open class UrlETagSaverNode: Node {

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

/// Ключ, по которому необходимо получить eTag-токен из хедеров.
/// По-молчанию имеет значение `ETagConstants.eTagResponseHeaderKey`
Expand All @@ -34,14 +34,14 @@ open class UrlETagSaverNode: ResponsePostprocessorLayerNode {
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - eTagHeaderKey: Ключ, по которому необходимо получить eTag-токен из хедеров.
public init(next: ResponsePostprocessorLayerNode?, eTagHeaderKey: String = ETagConstants.eTagResponseHeaderKey) {
public init(next: (any ResponsePostprocessorLayerNode)?, eTagHeaderKey: String = ETagConstants.eTagResponseHeaderKey) {
self.next = next
self.eTagHeaderKey = eTagHeaderKey
}

/// Пытается получить eTag-токен по ключу `UrlETagSaverNode.eTagHeaderKey`.
/// В любом случае передает управление дальше.
open override func process(_ data: UrlProcessedResponse) -> Observer<Void> {
open func process(_ data: UrlProcessedResponse) -> Observer<Void> {
guard let tag = data.response.allHeaderFields[self.eTagHeaderKey] as? String,
let url = data.request.url,
let urlAsKey = url.withOrderedQuery()
Expand Down
14 changes: 7 additions & 7 deletions NodeKit/CacheNode/FirstCachePolicyNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public enum BaseFirstCachePolicyNodeError: Error {
/// Этот узел реализует политику кэширования
/// "Сначала читаем из кэша, а затем запрашиваем у сервера"
/// - Important: В ообщем случае слушатель может быть оповещен дважды. Первый раз, когда ответ прочитан из кэша, а второй раз, когда он был получен с сервера.
open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
open class FirstCachePolicyNode: Node {

// MARK: - Nested

Expand All @@ -33,19 +33,19 @@ open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
// MARK: - Properties

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

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

// MARK: - Init and Deinit

/// Инициаллизирует узел.
///
/// - Parameters:
/// - cacheReaderNode: Следующий узел для обработки.
/// - next: Узел для чтения из кэша.
public init(cacheReaderNode: CacheReaderNode, next: NextProcessorNode) {
/// - cacheReaderNode: Узел для чтения из кэша.
/// - next: Следующий узел для обработки.
public init(cacheReaderNode: any CacheReaderNode, next: any NextProcessorNode) {
self.cacheReaderNode = cacheReaderNode
self.next = next
}
Expand All @@ -56,7 +56,7 @@ open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
/// а затем, передает управление следующему узлу.
/// В случае, если получить `URLRequest` не удалось,
/// то управление просто передается следующему узлу
open override func process(_ data: RawUrlRequest) -> Context<Json> {
open func process(_ data: RawUrlRequest) -> Observer<Json> {
let result = Context<Json>()

if let request = data.toUrlRequest() {
Expand Down
10 changes: 5 additions & 5 deletions NodeKit/CacheNode/IfServerFailsFromCacheNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,27 @@ import Foundation

/// Узел реализует политику кэширования "Если интернета нет, то запросить данные из кэша"
/// Этот узел работает с URL кэшом.
open class IfConnectionFailedFromCacheNode: Node<URLRequest, Json> {
open class IfConnectionFailedFromCacheNode: Node {

/// Следующий узел для обработки.
public var next: Node<URLRequest, Json>
public var next: any Node<URLRequest, Json>
/// Узел, считывающий данные из URL кэша.
public var cacheReaderNode: Node<UrlNetworkRequest, Json>
public var cacheReaderNode: any Node<UrlNetworkRequest, Json>

/// Инициаллизирует узел.
///
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - cacheReaderNode: Узел, считывающий данные из URL кэша.
public init(next: Node<URLRequest, Json>, cacheReaderNode: Node<UrlNetworkRequest, Json>) {
public init(next: any Node<URLRequest, Json>, cacheReaderNode: any Node<UrlNetworkRequest, Json>) {
self.next = next
self.cacheReaderNode = cacheReaderNode
}

/// Проверяет, произошла ли ошибка связи в ответ на запрос.
/// Если ошибка произошла, то возвращает успешный ответ из кэша.
/// В противном случае передает управление следующему узлу.
open override func process(_ data: URLRequest) -> Observer<Json> {
open func process(_ data: URLRequest) -> Observer<Json> {

return self.next.process(data).mapError { error -> Observer<Json> in
var logMessage = self.logViewObjectName
Expand Down
5 changes: 2 additions & 3 deletions NodeKit/CacheNode/UrlCacheReaderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ public enum BaseUrlCacheReaderError: Error {

/// Этот узел отвечает за чтение данных из URL кэша.
/// Сам по себе узел является листом и не может быть встроен в сквозную цепочку.
open class UrlCacheReaderNode: Node<UrlNetworkRequest, Json> {

open class UrlCacheReaderNode: Node {

public var needsToThrowError: Bool

Expand All @@ -31,7 +30,7 @@ open class UrlCacheReaderNode: Node<UrlNetworkRequest, Json> {
}

/// Посылает запрос в кэш и пытается сериализовать данные в JSON.
open override func process(_ data: UrlNetworkRequest) -> Context<Json> {
open func process(_ data: UrlNetworkRequest) -> Observer<Json> {

guard let cachedResponse = self.extractCachedUrlResponse(data.urlRequest) else {
return self.needsToThrowError ? .emit(error: BaseUrlCacheReaderError.cantLoadDataFromCache) : Context<Json>()
Expand Down
4 changes: 2 additions & 2 deletions NodeKit/CacheNode/UrlCacheWriterNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import Foundation
/// - Important: это "глупая" реализация,
/// в которой не учитываются server-side политики и прочее.
/// Подразумечается, что этот узел не входит в цепочку, а является листом одного из узлов.
open class UrlCacheWriterNode: Node<UrlProcessedResponse, Void> {
open class UrlCacheWriterNode: Node {

/// Формирует `CachedURLResponse` с политикой `.allowed`, сохраняет его в кэш,
/// а затем возвращает сообщение об успешной операции.
open override func process(_ data: UrlProcessedResponse) -> Context<Void> {
open func process(_ data: UrlProcessedResponse) -> Observer<Void> {
let cahced = CachedURLResponse(response: data.response, data: data.data, storagePolicy: .allowed)
URLCache.shared.storeCachedResponse(cahced, for: data.request)
return Context<Void>().emit(data: ())
Expand Down
12 changes: 6 additions & 6 deletions NodeKit/CacheNode/UrlNotModifiedTriggerNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import Foundation

/// Этот узел проверяет код ответа от сервера и в случае, если код равен 304 (NotModified)
/// Узел посылает запрос в URL кэш.
open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {
open class UrlNotModifiedTriggerNode: Node {

// MARK: - Properties

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

/// Узел для чтения данных из кэша.
public var cacheReader: Node<UrlNetworkRequest, Json>
public var cacheReader: any Node<UrlNetworkRequest, Json>

// MARK: - Init and deinit

Expand All @@ -27,8 +27,8 @@ open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {
/// - Parameters:
/// - next: Следующий узел для обратки.
/// - cacheReader: Узел для чтения данных из кэша.
public init(next: ResponseProcessingLayerNode,
cacheReader: Node<UrlNetworkRequest, Json>) {
public init(next: some ResponseProcessingLayerNode,
cacheReader: some Node<UrlNetworkRequest, Json>) {
self.next = next
self.cacheReader = cacheReader
}
Expand All @@ -37,7 +37,7 @@ open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {

/// Проверяет http status-code. Если код соовуетствует NotModified, то возвращает запрос из кэша.
/// В протвином случае передает управление дальше.
open override func process(_ data: UrlDataResponse) -> Observer<Json> {
open func process(_ data: UrlDataResponse) -> Observer<Json> {

var logMessage = self.logViewObjectName

Expand Down
Loading

0 comments on commit 49bb19a

Please sign in to comment.