From b63f1cde0f2e98275cd362f7c52dded20750b06d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 23 Aug 2023 01:08:29 +0300 Subject: [PATCH 001/202] swift-docc-plugin 1.3.0 --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d2d05c2..016478d 100644 --- a/Package.swift +++ b/Package.swift @@ -12,7 +12,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.0.0"), - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0") + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. From aa936537d3713bd26f85c7fc92abd3c3a0e7f416 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 23 Aug 2023 01:10:55 +0300 Subject: [PATCH 002/202] async-http-client 1.19.0 --- Package.resolved | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Package.resolved b/Package.resolved index bd26029..ad4dea0 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "78db67e5bf4a8543075787f228e8920097319281", - "version" : "1.18.0" + "revision" : "16f7e62c08c6969899ce6cc277041e868364e5cf", + "version" : "1.19.0" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "32e8d724467f8fe623624570367e3d50c5638e46", - "version" : "1.5.2" + "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", + "version" : "1.5.3" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "6213ba7a06febe8fef60563a4a7d26a4085783cf", - "version" : "2.54.0" + "revision" : "cf281631ff10ec6111f2761052aa81896a83a007", + "version" : "2.58.0" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "e866a626e105042a6a72a870c88b4c531ba05f83", - "version" : "2.24.0" + "revision" : "320bd978cceb8e88c125dcbb774943a92f6286e9", + "version" : "2.25.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "41f4098903878418537020075a4d8a6e20a0b182", - "version" : "1.17.0" + "revision" : "e7403c35ca6bb539a7ca353b91cc2d8ec0362d58", + "version" : "1.19.0" } } ], From 4788d8ac8dd16220297ddaf013735fe6f3edc086 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 23 Aug 2023 01:22:59 +0300 Subject: [PATCH 003/202] replaced deprecated .createNew with the new .singleton --- Sources/CouchDBClient/CouchDBClient.swift | 190 +++++++++++----------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index be73f6d..0b00432 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -153,19 +153,19 @@ public class CouchDBClient { public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) - } + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } defer { DispatchQueue.main.async { try? httpClient.syncShutdown() } } - + let url = buildUrl(path: "/_all_dbs") let request = try buildRequest(fromUrl: url, withMethod: .GET) @@ -204,7 +204,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -244,7 +244,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -283,62 +283,62 @@ public class CouchDBClient { } } - /// Delete DB. - /// - /// Example: - /// ```swift - /// try await couchDBClient.deleteDB("myDBName") - /// ``` - /// - /// - Parameters: - /// - dbName: DB name. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. - @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { - try await authIfNeed(eventLoopGroup: eventLoopGroup) - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) - } - - defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } - } - - let url = buildUrl(path: "/\(dbName)") - - let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) - - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } - - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse - } - - let data = Data(bytes) - let decoder = JSONDecoder() - - do { - let decodedResponse = try decoder.decode(UpdateDBResponse.self, from: data) - return decodedResponse - } catch let parsingError { - if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.insertError(error: couchdbError) - } - throw parsingError - } - } + /// Delete DB. + /// + /// Example: + /// ```swift + /// try await couchDBClient.deleteDB("myDBName") + /// ``` + /// + /// - Parameters: + /// - dbName: DB name. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Request response. + @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/\(dbName)") + + let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) + + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { + throw CouchDBClientError.unknownResponse + } + + let data = Data(bytes) + let decoder = JSONDecoder() + + do { + let decodedResponse = try decoder.decode(UpdateDBResponse.self, from: data) + return decodedResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.insertError(error: couchdbError) + } + throw parsingError + } + } /// Get data from DB. /// @@ -404,7 +404,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -453,7 +453,7 @@ public class CouchDBClient { /// - queryItems: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: An object or a struct (of generic type) parsed from JSON. - public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response = try await get(dbName: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { @@ -506,7 +506,7 @@ public class CouchDBClient { /// /// // encode document into JSON string /// let data = try encoder.encode(updatedData) - /// + /// /// let response = try await couchDBClient.update( /// dbName: testsDB, /// uri: doc._id!, @@ -530,7 +530,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -550,7 +550,7 @@ public class CouchDBClient { if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - + guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { throw CouchDBClientError.unknownResponse } @@ -604,7 +604,7 @@ public class CouchDBClient { /// - doc: Document object/struct. Should confirm to ``CouchDBRepresentable`` and Codable protocols. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Update response. - public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { guard let id = doc._id else { throw CouchDBClientError.idMissing } guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } @@ -666,7 +666,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -687,7 +687,7 @@ public class CouchDBClient { if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - + guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { throw CouchDBClientError.unknownResponse } @@ -736,10 +736,10 @@ public class CouchDBClient { /// - dbName: DB name. /// - doc: Document object/struct. Should confirm to ``CouchDBRepresentable`` protocol. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { - let encoder = JSONEncoder() - encoder.dateEncodingStrategy = dateEncodingStrategy - let insertEncodeData = try encoder.encode(doc) + public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + let encoder = JSONEncoder() + encoder.dateEncodingStrategy = dateEncodingStrategy + let insertEncodeData = try encoder.encode(doc) let insertResponse = try await insert( dbName: dbName, @@ -762,7 +762,7 @@ public class CouchDBClient { /// ```swift /// let response = try await couchDBClient.delete(fromDb: "databaseName", uri: doc._id, rev: doc._rev) /// ``` - /// + /// /// - Parameters: /// - dbName: DB name. /// - uri: document uri (usually _id). @@ -774,7 +774,7 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) } defer { @@ -839,9 +839,9 @@ internal extension CouchDBClient { components.host = couchHost components.port = couchPort components.path = path - + components.queryItems = query.isEmpty ? nil : query - + if components.url?.absoluteString == nil { assertionFailure("url should not be nil") } @@ -858,22 +858,22 @@ internal extension CouchDBClient { if let authData = authData, let sessionCookieExpires = sessionCookieExpires, sessionCookieExpires > Date() { return authData } - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .createNew) - } - + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + defer { DispatchQueue.main.async { try? httpClient.syncShutdown() } } - + let url = buildUrl(path: "/_session") - + var request = try HTTPClient.Request(url:url, method: .POST) request.headers.add(name: "Content-Type", value: "application/x-www-form-urlencoded") let dataString = "name=\(userName)&password=\(userPassword)" @@ -893,17 +893,17 @@ internal extension CouchDBClient { cookie = header.value } } - + if let httpCookie = HTTPClient.Cookie(header: cookie, defaultDomain: self.couchHost) { if httpCookie.expires == nil { let formatter = DateFormatter() formatter.dateFormat = "E, dd-MMM-yyy HH:mm:ss z" - + let expiresString = cookie.split(separator: ";") .map({ $0.trimmingCharacters(in: .whitespaces) }) .first(where: { $0.hasPrefix("Expires=") })? .split(separator: "=").last - + if let expiresString = expiresString { let expires = formatter.date(from: String(expiresString)) sessionCookieExpires = expires @@ -921,7 +921,7 @@ internal extension CouchDBClient { authData = try JSONDecoder().decode(CreateSessionResponse.self, from: data) return authData } - + /// Build HTTP request from url string. /// - Parameters: /// - url: URL string. From 37c4bf683063668d072cc8c2221e54a9c02ccaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=C3=B3rio=20Gevartosky=20Torrezan?= Date: Tue, 16 Jan 2024 15:06:25 -0400 Subject: [PATCH 004/202] Adding _find capability. (#13) --- Sources/CouchDBClient/CouchDBClient.swift | 90 +++++++++++++++++++ .../Models/CouchDBFindResponse.swift | 13 +++ 2 files changed, 103 insertions(+) create mode 100644 Sources/CouchDBClient/Models/CouchDBFindResponse.swift diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 0b00432..e78e423 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -478,6 +478,96 @@ public class CouchDBClient { throw parsingError } } + + /// Find data on DB. + /// + /// Examples: + /// + /// Define your document model: + /// ```swift + /// // Example struct + /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// var name: String + /// var _id: String? + /// var _rev: String? + /// } + /// ``` + /// + /// Find documents by selector: + /// ```swift + /// // find documents from DB by selector + /// var response = try await couchDBClient.get(in: "databaseName", selector: ["selector": ["name": "Greg"]]) + /// + /// // parse JSON + /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! + /// let docs = try JSONDecoder().decode([ExpectedDoc].self, from: Data(bytes)) + /// ``` + /// + /// + /// - Parameters: + /// - in dbName: DB name. + /// - selector: Codable representation of json selector query. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Array of documents [T]. + public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + let encoder = JSONEncoder() + let insertEncodeData = try encoder.encode(selector) + + let insertResponse = try await find( + in: dbName, + body: .data(insertEncodeData), + eventLoopGroup: eventLoopGroup + ) + + guard var body = insertResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { + throw CouchDBClientError.unknownResponse + } + + let data = Data(bytes) + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = dateDecodingStrategy + + do { + let doc = try decoder.decode(CouchDBFindResponse.self, from: data) + return doc.docs + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.getError(error: couchdbError) + } + throw parsingError + } + + } + + public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/" + dbName + "/_find", query: []) + var request = try buildRequest(fromUrl: url, withMethod: .POST) + request.body = body + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + return response + } /// Update data in DB. /// diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift new file mode 100644 index 0000000..cd40015 --- /dev/null +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -0,0 +1,13 @@ +// +// CouchDBFindResponse.swift +// +// +// Created by Gregorio Gevartosky Torrezan on 2023-11-15. +// + +import Foundation + +public struct CouchDBFindResponse: Codable { + var docs: [T] + var bookmark: String? +} From 7db38dd0d3280d172a193899b755aab6cbc62f2b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:16:28 +0300 Subject: [PATCH 005/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index e78e423..af6e1ec 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -496,7 +496,7 @@ public class CouchDBClient { /// Find documents by selector: /// ```swift /// // find documents from DB by selector - /// var response = try await couchDBClient.get(in: "databaseName", selector: ["selector": ["name": "Greg"]]) + /// var response = try await couchDBClient.find(in: "databaseName", selector: ["selector": ["name": "Greg"]]) /// /// // parse JSON /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! From 4e37384b7c36e7f49bf3bd403dcb2610b5f4895b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:16:33 +0300 Subject: [PATCH 006/202] tabs --- Sources/CouchDBClient/CouchDBClient.swift | 117 +++++++++++----------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index af6e1ec..1091d87 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -509,65 +509,64 @@ public class CouchDBClient { /// - selector: Codable representation of json selector query. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Array of documents [T]. - public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { - let encoder = JSONEncoder() - let insertEncodeData = try encoder.encode(selector) - - let insertResponse = try await find( - in: dbName, - body: .data(insertEncodeData), - eventLoopGroup: eventLoopGroup - ) - - guard var body = insertResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse - } - - let data = Data(bytes) - let decoder = JSONDecoder() - decoder.dateDecodingStrategy = dateDecodingStrategy - - do { - let doc = try decoder.decode(CouchDBFindResponse.self, from: data) - return doc.docs - } catch let parsingError { - if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.getError(error: couchdbError) - } - throw parsingError - } - - } - - public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { - try await authIfNeed(eventLoopGroup: eventLoopGroup) - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) - } - - defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } - } - - let url = buildUrl(path: "/" + dbName + "/_find", query: []) - var request = try buildRequest(fromUrl: url, withMethod: .POST) - request.body = body - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } - - return response - } + public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + let encoder = JSONEncoder() + let insertEncodeData = try encoder.encode(selector) + + let insertResponse = try await find( + in: dbName, + body: .data(insertEncodeData), + eventLoopGroup: eventLoopGroup + ) + + guard var body = insertResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { + throw CouchDBClientError.unknownResponse + } + + let data = Data(bytes) + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = dateDecodingStrategy + + do { + let doc = try decoder.decode(CouchDBFindResponse.self, from: data) + return doc.docs + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.getError(error: couchdbError) + } + throw parsingError + } + } + + public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/" + dbName + "/_find", query: []) + var request = try buildRequest(fromUrl: url, withMethod: .POST) + request.body = body + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + return response + } /// Update data in DB. /// From a70250cda7ba57ca0f9f5d920fc84415158a220e Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:34:42 +0300 Subject: [PATCH 007/202] renames --- Sources/CouchDBClient/CouchDBClient.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 1091d87..3a9c601 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -479,7 +479,7 @@ public class CouchDBClient { } } - /// Find data on DB. + /// Find data in DB. /// /// Examples: /// @@ -511,15 +511,15 @@ public class CouchDBClient { /// - Returns: Array of documents [T]. public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() - let insertEncodeData = try encoder.encode(selector) + let selectorData = try encoder.encode(selector) - let insertResponse = try await find( + let findResponse = try await find( in: dbName, - body: .data(insertEncodeData), + body: .data(selectorData), eventLoopGroup: eventLoopGroup ) - guard var body = insertResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { + guard var body = findResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { throw CouchDBClientError.unknownResponse } From e2f2b508619a693216228da57b20dab1651634bf Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:35:01 +0300 Subject: [PATCH 008/202] added test for find method with body --- .../CouchDBClientTests.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index bf659d2..39d3159 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -243,6 +243,29 @@ final class CouchDBClientTests: XCTestCase { XCTAssertNotNil(couchDBClient.sessionCookieExpires) } + func test8_find_with_body() async throws { + do { + let testDoc = ExpectedDoc(name: "Greg") + let insertEncodedData = try JSONEncoder().encode(testDoc) + let insertResponse = try await couchDBClient.insert( + dbName: testsDB, + body: .data(insertEncodedData) + ) + + let selector = ["selector": ["name": "Greg"]] + let bodyData = try JSONEncoder().encode(selector) + var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + + let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! + let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)) + + XCTAssertTrue(decodedResponse.docs.count > 0) + XCTAssertEqual(decodedResponse.docs.first!._id, insertResponse.id) + } catch { + XCTFail(error.localizedDescription) + } + } + func test99_deleteDB() async throws { do { try await couchDBClient.deleteDB(testsDB) From f9aa3ab11d152456a8d4ea0a5072d626e6658321 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:36:42 +0300 Subject: [PATCH 009/202] docs added --- Sources/CouchDBClient/CouchDBClient.swift | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 3a9c601..04d0f64 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -537,7 +537,23 @@ public class CouchDBClient { throw parsingError } } - + + /// Find data in DB. + /// + /// Example: + /// ```swift + /// let selector = ["selector": ["name": "Greg"]] + /// let bodyData = try JSONEncoder().encode(selector) + /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + /// + /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! + /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs + /// ``` + /// - Parameters: + /// - dbName: DB name. + /// - body: Request body data. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Request response. public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { try await authIfNeed(eventLoopGroup: eventLoopGroup) From e5602ae61636faee418beb21330ff66ab1606571 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:54:54 +0300 Subject: [PATCH 010/202] findError added --- Sources/CouchDBClient/CouchDBClient.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 04d0f64..cf906eb 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -22,6 +22,8 @@ public enum CouchDBClientError: Error { case insertError(error: CouchDBError) /// Update request wasn't successful. case updateError(error: CouchDBError) + /// Find request wasn't successful. + case findError(error: CouchDBError) /// Uknown response from CouchDB. case unknownResponse /// Wrong username or password. @@ -41,6 +43,8 @@ extension CouchDBClientError: LocalizedError { return "Insert request wasn't successful: \(error.localizedDescription)" case .updateError(let error): return "Update request wasn't successful: \(error.localizedDescription)" + case .findError(let error): + return "Find request wasn't successful: \(error.localizedDescription)" case .unknownResponse: return "Uknown response from CouchDB." case .unauthorized: @@ -532,7 +536,7 @@ public class CouchDBClient { return doc.docs } catch let parsingError { if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.getError(error: couchdbError) + throw CouchDBClientError.findError(error: couchdbError) } throw parsingError } From 0e06ef633732aaf886fd9d685e3baf941393c6da Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:55:41 +0300 Subject: [PATCH 011/202] tests renamed --- .../CouchDBClientTests/CouchDBClientTests.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 39d3159..2bfcdcf 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -27,7 +27,7 @@ final class CouchDBClientTests: XCTestCase { try await super.setUp() } - func test0_CreateDB() async throws { + func test00_CreateDB() async throws { do { let exists = try await couchDBClient.dbExists(testsDB) if exists { @@ -40,7 +40,7 @@ final class CouchDBClientTests: XCTestCase { } } - func test1_DBExists() async throws { + func test01_DBExists() async throws { do { let exists = try await couchDBClient.dbExists(testsDB) XCTAssertTrue(exists) @@ -49,7 +49,7 @@ final class CouchDBClientTests: XCTestCase { } } - func test3_GetAllDbs() async throws { + func test03_GetAllDbs() async throws { do { let dbs = try await couchDBClient.getAllDBs() @@ -61,7 +61,7 @@ final class CouchDBClientTests: XCTestCase { } } - func test4_updateAndDeleteDocMethods() async throws { + func test04_updateAndDeleteDocMethods() async throws { var testDoc = ExpectedDoc(name: "test name") var expectedInsertId: String = "" var expectedInsertRev: String = "" @@ -141,7 +141,7 @@ final class CouchDBClientTests: XCTestCase { } } - func test5_InsertGetUpdateDelete() async throws { + func test05_InsertGetUpdateDelete() async throws { var testDoc = ExpectedDoc(name: "test name") var expectedInsertId: String = "" var expectedInsertRev: String = "" @@ -228,7 +228,7 @@ final class CouchDBClientTests: XCTestCase { } } - func test6_BuildUrl() { + func test06_BuildUrl() { let expectedUrl = "http://127.0.0.1:5984?key=testKey" let url = couchDBClient.buildUrl(path: "", query: [ URLQueryItem(name: "key", value: "testKey") @@ -236,14 +236,14 @@ final class CouchDBClientTests: XCTestCase { XCTAssertEqual(url, expectedUrl) } - func test7_Auth() async throws { + func test07_Auth() async throws { let session: CreateSessionResponse? = try await couchDBClient.authIfNeed() XCTAssertNotNil(session) XCTAssertEqual(true, session?.ok) XCTAssertNotNil(couchDBClient.sessionCookieExpires) } - func test8_find_with_body() async throws { + func test08_find_with_body() async throws { do { let testDoc = ExpectedDoc(name: "Greg") let insertEncodedData = try JSONEncoder().encode(testDoc) From c9416571d095866a73f2be07d361e9ba2742df66 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:56:46 +0300 Subject: [PATCH 012/202] added test for find method with generic type --- .../CouchDBClientTests.swift | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 2bfcdcf..63b4c45 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -261,6 +261,37 @@ final class CouchDBClientTests: XCTestCase { XCTAssertTrue(decodedResponse.docs.count > 0) XCTAssertEqual(decodedResponse.docs.first!._id, insertResponse.id) + + _ = try await couchDBClient.delete( + fromDb: testsDB, + uri: decodedResponse.docs.first!._id!, + rev: decodedResponse.docs.first!._rev! + ) + } catch { + XCTFail(error.localizedDescription) + } + } + + func test09_find_with_generics() async throws { + do { + let testDoc = ExpectedDoc(name: "Sam") + let insertEncodedData = try JSONEncoder().encode(testDoc) + let insertResponse = try await couchDBClient.insert( + dbName: testsDB, + body: .data(insertEncodedData) + ) + + let selector = ["selector": ["name": "Sam"]] + let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) + + XCTAssertTrue(docs.count > 0) + XCTAssertEqual(docs.first!._id, insertResponse.id) + + _ = try await couchDBClient.delete( + fromDb: testsDB, + uri: docs.first!._id!, + rev: docs.first!._rev! + ) } catch { XCTFail(error.localizedDescription) } From e6b6566c9289bb5fd8424be0f7c47fe708ba7c4d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 22:59:25 +0300 Subject: [PATCH 013/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index cf906eb..7a36e7d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -485,29 +485,14 @@ public class CouchDBClient { /// Find data in DB. /// - /// Examples: + /// Example: /// - /// Define your document model: /// ```swift - /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { - /// var name: String - /// var _id: String? - /// var _rev: String? - /// } + /// // find documents in DB by selector + /// let selector = ["selector": ["name": "Sam"]] + /// let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) /// ``` /// - /// Find documents by selector: - /// ```swift - /// // find documents from DB by selector - /// var response = try await couchDBClient.find(in: "databaseName", selector: ["selector": ["name": "Greg"]]) - /// - /// // parse JSON - /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let docs = try JSONDecoder().decode([ExpectedDoc].self, from: Data(bytes)) - /// ``` - /// - /// /// - Parameters: /// - in dbName: DB name. /// - selector: Codable representation of json selector query. From d4f520f31ae7dc6468322ea60a6a92fdce6a1649 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:10:06 +0300 Subject: [PATCH 014/202] README updated --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index dc44aa3..70b826d 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,13 @@ print(dbs) // prints: ["_global_changes", "_replicator", "_users", "yourDBname"] ``` +Find documents in DB by selector: +```swift +let selector = ["selector": ["name": "Sam"]] +let docs: [ExpectedDoc] = try await couchDBClient.find(in: "databaseName", selector: selector) +print(docs) +``` + ### Using with Vapor Here's a simple [tutorial](https://spaceinbox.me/docs/couchdbclient/tutorials/couchdbclient/vaportutorial) for Vapor. From 78e7d1030b007b996b624f47f795986986b7ec8e Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:11:04 +0300 Subject: [PATCH 015/202] updated dependencies --- Package.resolved | 55 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/Package.resolved b/Package.resolved index ad4dea0..390b3d2 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "16f7e62c08c6969899ce6cc277041e868364e5cf", - "version" : "1.19.0" + "revision" : "291438696abdd48d2a83b52465c176efbd94512b", + "version" : "1.20.1" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" } }, { @@ -14,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-atomics.git", "state" : { - "revision" : "6c89474e62719ddcc1e9614989fff2f68208fe10", - "version" : "1.1.0" + "revision" : "cd142fd2f64be2100422d658e7411e39489da985", + "version" : "1.2.0" } }, { @@ -23,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "937e904258d22af6e447a0b72c0bc67583ef64a2", - "version" : "1.0.4" + "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192", + "version" : "1.0.6" } }, { @@ -45,6 +54,15 @@ "version" : "1.0.0" } }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "1827dc94bdab2eb5f2fc804e9b0cb43574282566", + "version" : "1.0.2" + } + }, { "identity" : "swift-log", "kind" : "remoteSourceControl", @@ -59,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "cf281631ff10ec6111f2761052aa81896a83a007", - "version" : "2.58.0" + "revision" : "702cd7c56d5d44eeba73fdf83918339b26dc855c", + "version" : "2.62.0" } }, { @@ -68,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "0e0d0aab665ff1a0659ce75ac003081f2b1c8997", - "version" : "1.19.0" + "revision" : "798c962495593a23fdea0c0c63fd55571d8dff51", + "version" : "1.20.0" } }, { @@ -77,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "a8ccf13fa62775277a5d56844878c828bbb3be1a", - "version" : "1.27.0" + "revision" : "3bd9004b9d685ed6b629760fc84903e48efec806", + "version" : "1.29.0" } }, { @@ -95,8 +113,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "e7403c35ca6bb539a7ca353b91cc2d8ec0362d58", - "version" : "1.19.0" + "revision" : "ebf8b9c365a6ce043bf6e6326a04b15589bd285e", + "version" : "1.20.0" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" } } ], From 51966c35c78ad3cf59b544bbda8e1d17acfe9518 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:14:03 +0300 Subject: [PATCH 016/202] docs updated --- Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md | 1 + Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md | 2 ++ Sources/CouchDBClient/CouchDBClient.swift | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index 2e06c00..0672515 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -17,6 +17,7 @@ Currently CouchDBClient supports: - Get databases list. - Get document by id or documents using view. - Insert/update documents. +- Find documents by selector. - Delete documents. - CouchDB authorization. diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md index 18ca725..65efbf7 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md @@ -27,5 +27,7 @@ A CouchDB client class with methods using Swift Concurrency. - ``insert(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` - ``update(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` - ``update(dbName:uri:body:eventLoopGroup:)`` +- ``find(in:body:eventLoopGroup:)`` +- ``find(in:selector:dateDecodingStrategy:eventLoopGroup:)`` - ``delete(fromDb:doc:eventLoopGroup:)`` - ``delete(fromDb:uri:rev:eventLoopGroup:)`` diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 7a36e7d..f1bb924 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -483,7 +483,7 @@ public class CouchDBClient { } } - /// Find data in DB. + /// Find data in DB by selector. /// /// Example: /// @@ -527,7 +527,7 @@ public class CouchDBClient { } } - /// Find data in DB. + /// Find data in DB by selector. /// /// Example: /// ```swift From 1118bb3f1af1a62bca1b5b3aff7cad08081cadd4 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:24:11 +0300 Subject: [PATCH 017/202] try Swift 5.7.1 --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 016478d..3c96474 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.6 +// swift-tools-version:5.7.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From dfdc610c8a987592deb09277d2811a0db3468135 Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 16 Jan 2024 23:26:48 +0300 Subject: [PATCH 018/202] Update build-ubuntu.yml --- .github/workflows/build-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index 322f04a..bb991a2 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{matrix.swift}} strategy: matrix: - swift: [5.8.1, 5.7.3, 5.6.3] + swift: [5.9, 5.8.1, 5.7.3] runs-on: ubuntu-latest container: image: swift:${{matrix.swift}} From ab8f67a89f5b83ed20fe30a9965a3f2f58f6d2c1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:39:51 +0300 Subject: [PATCH 019/202] Swift 5.7.3 --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 3c96474..a08f718 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7.1 +// swift-tools-version:5.7.3 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From 896eef9ed6ad097efc14ed50c98c90175b1ace39 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Jan 2024 23:42:10 +0300 Subject: [PATCH 020/202] Revert "Swift 5.7.3" This reverts commit ab8f67a89f5b83ed20fe30a9965a3f2f58f6d2c1. --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index a08f718..3c96474 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7.3 +// swift-tools-version:5.7.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From 04f3bdd6c39c1581af943701597a3fce9e8e1c62 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 24 Feb 2024 18:38:32 +0500 Subject: [PATCH 021/202] updated dependencies --- Package.resolved | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/Package.resolved b/Package.resolved index 390b3d2..8e4161f 100644 --- a/Package.resolved +++ b/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "d029d9d39c87bed85b1c50adee7c41795261a192", - "version" : "1.0.6" + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types", "state" : { - "revision" : "1827dc94bdab2eb5f2fc804e9b0cb43574282566", - "version" : "1.0.2" + "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", + "version" : "1.0.3" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", - "version" : "1.5.3" + "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", + "version" : "1.5.4" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "702cd7c56d5d44eeba73fdf83918339b26dc855c", - "version" : "2.62.0" + "revision" : "635b2589494c97e48c62514bc8b37ced762e0a62", + "version" : "2.63.0" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "798c962495593a23fdea0c0c63fd55571d8dff51", - "version" : "1.20.0" + "revision" : "363da63c1966405764f380c627409b2f9d9e710b", + "version" : "1.21.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "3bd9004b9d685ed6b629760fc84903e48efec806", - "version" : "1.29.0" + "revision" : "0904bf0feb5122b7e5c3f15db7df0eabe623dd87", + "version" : "1.30.0" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "320bd978cceb8e88c125dcbb774943a92f6286e9", - "version" : "2.25.0" + "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", + "version" : "2.26.0" } }, { @@ -113,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "ebf8b9c365a6ce043bf6e6326a04b15589bd285e", - "version" : "1.20.0" + "revision" : "6cbe0ed2b394f21ab0d46b9f0c50c6be964968ce", + "version" : "1.20.1" } }, { @@ -125,6 +125,15 @@ "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", "version" : "1.0.2" } + }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", + "version" : "1.2.1" + } } ], "version" : 2 From bdeedda9ca5dd2f140d31181a64bafebfc2ef97b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 24 Feb 2024 18:54:01 +0500 Subject: [PATCH 022/202] Docs updated --- README.md | 12 ++++++------ .../CouchDBClient.docc/CouchDBClient.md | 2 +- .../ErrorsHandling/ErrorsHandlingTutorial.tutorial | 8 ++++---- .../Tutorials/Tutorial Table of Contents.tutorial | 4 ++-- .../Tutorials/macOS/macOSTutorial.tutorial | 8 ++++---- .../Tutorials/vapor/VaporTutorial.tutorial | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 70b826d..4b867f9 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,14 @@ -This is simple lib to work with CouchDB in Swift. +This is a simple lib to work with CouchDB in Swift. - Latest version is based on async/await and requires Swift 5.6 and newer. Works with Vapor 4.50 and newer. - Version 1.0.0 can be used with Vapor 4 without async/await. Swift 5.3 is required -- You can use old version for Vapor 3 from vapor3 branch or using version < 1.0.0. +- You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. -The only depndency for this lib is async-http-client +The only dependency for this lib is async-http-client -## Documentaion +## Documentation You can find docs, examples and even tutorials [here](https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient). @@ -55,7 +55,7 @@ let couchDBClient = CouchDBClient( ) ``` -If you don’t want to have your password in the code you can pass COUCHDB_PASS param in you command line. For example you can run your Server Side Swift project: +If you don’t want to have your password in the code you can pass COUCHDB_PASS param in your command line. For example you can run your Server Side Swift project: ```bash COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run ``` @@ -113,7 +113,7 @@ try await couchDBClient.update( print(doc) // doc will have updated name and _rev values now ``` -Delete data example: +Delete data: ```swift let response = try await couchDBClient.delete(fromDb: "databaseName", doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index 0672515..0a95d58 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -8,7 +8,7 @@ Source code is available on [GitHub](https://github.com/makoni/couchdb-vapor). CouchDBClient allows you to make simple requests to CouchDB. It's using Swift Concurrency (async/await) and supports Linux, iOS 13+ and macOS 10.15+. -It's using [AsyncHTTPClient](https://github.com/swift-server/async-http-client) which makes it easy to use CouchDBClient for server-side development with Vapor 4. +It's using [AsyncHTTPClient](https://github.com/swift-server/async-http-client) which makes it easy to use CouchDBClient for server-side development with Vapor 4. But it's easy to use it with any iOS or macOS app. Check the Essentials section for examples. Currently CouchDBClient supports: - Check if DB exists. diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial index 75c1341..313adfa 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial @@ -14,25 +14,25 @@ @Steps { @Step { - `CouchDBClient` has an Error enum `CouchDBClientError`. Some of enum values has nested error of `CouchDBError` type that represents error messages from CouchDB. + `CouchDBClient` has an Error enum `CouchDBClientError`. Some enum values have nested errors of `CouchDBError` type that represent error messages from CouchDB. @Code(name: "main.swift", file: ErrorsHandlingTutorial-1.swift) } @Step { - You can wrap your code in do-catch block to catch a CouchDB error during insert operation. + You can wrap your code in a do-catch block to catch a CouchDB error during insert operation. @Code(name: "main.swift", file: ErrorsHandlingTutorial-2.swift) } @Step { - Same for update to find out what's wrong. + Same for updates to find out what's wrong. @Code(name: "main.swift", file: ErrorsHandlingTutorial-3.swift) } @Step { - And same for get operation. CouchDB will return an error message if username or password is incorrect for example. + And same for a get operation. CouchDB will return an error message if the username or password is incorrect for example. @Code(name: "main.swift", file: ErrorsHandlingTutorial-4.swift) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index c6118a1..cec5b4a 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -1,6 +1,6 @@ @Tutorials(name: "CouchDBClient") { @Intro(title: "Getting started") { - Check tutorials for using the lib in a macOS app or with Vapor for server-side developement. + Check tutorials for using the lib in a macOS app or with Vapor for server-side development. @Image(source: logo.png, alt: "CouchDBClient logo") } @@ -15,7 +15,7 @@ } @Chapter(name: "Errors handling") { - Examples handling CouchDBClient errors and errors from CouchDB. + Examples of handling CouchDBClient errors and errors from CouchDB. @Image(source: chapter1.png, alt: "CouchDBClient logo") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index 6ebdd8b..6cd9d2d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -7,7 +7,7 @@ @Section(title: "Initializaton") { @ContentAndMedia { - Adding CouchDBClient in your project. + Adding CouchDBClient to your project. @Image(source: chapter1.png, alt: "Application icon") } @@ -38,7 +38,7 @@ } @Step { - Define a model for your CouchDB document. It should confirm to `Codable` and `CouchDBRepresentable` protocols. + Define a model for your CouchDB document. It should conform to `Codable` and `CouchDBRepresentable` protocols. @Code(name: "main.swift", file: macOSTutorial-4.swift) } @@ -50,13 +50,13 @@ } @Step { - Here's an example of updating the document. CouchDBClient will also update `_rev` value of your document with the value from CouchDB after saving. + Here's an example of updating the document. CouchDBClient will also update the `_rev` value of your document with the value from CouchDB after saving. @Code(name: "main.swift", file: macOSTutorial-6.swift) } @Step { - Getting document by it's `_id` from DB with that method will parse JSON into your model if you'll provide it as a generic type. + Getting a document by its `_id` from DB with that method will parse JSON into your model if you provide it as a generic type. @Code(name: "main.swift", file: macOSTutorial-7.swift) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index 31a56ec..14ba158 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -32,13 +32,13 @@ } @Step { - Define you data model for CouchDB document. Nested `Row` and `RowsResponse` models will be used to parse CouchDB responses. + Define your data model for CouchDB documents. Nested `Row` and `RowsResponse` models will be used to parse CouchDB responses. @Code(name: "main.swift", file: VaporTutorial-3.swift) } @Step { - Get you document from DB. That example is using `CouchDB View` to find the document by url field. It's map function needs `key` param which is `appUrl` in our case. + Get your document from DB. That example is using `CouchDB View` to find the document by the url field. Its map function needs a `key` param which is `appUrl` in our case. @Code(name: "main.swift", file: VaporTutorial-4.swift) } From 2dd69f6824b6d49435987651331ebd56b544a8b9 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sat, 24 Feb 2024 19:01:30 +0500 Subject: [PATCH 023/202] Delete .github/workflows/CodeQL.yml --- .github/workflows/CodeQL.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/workflows/CodeQL.yml diff --git a/.github/workflows/CodeQL.yml b/.github/workflows/CodeQL.yml deleted file mode 100644 index 8fef0e6..0000000 --- a/.github/workflows/CodeQL.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: "CodeQL" - -on: - push: - branches: [ "develop" ] - pull_request: - branches: [ "main" ] - -jobs: - run-codeql-linux: - name: Run CodeQL on Linux - runs-on: ubuntu-latest - permissions: - security-events: write - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: swift - - - name: Build - run: swift build - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 From 33cb1749063501c2f156bbf5b8e9c3f91ca4afd8 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 27 Mar 2024 00:56:16 +0300 Subject: [PATCH 024/202] dependencies updated --- Package.resolved | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Package.resolved b/Package.resolved index 8e4161f..a2013f7 100644 --- a/Package.resolved +++ b/Package.resolved @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "635b2589494c97e48c62514bc8b37ced762e0a62", - "version" : "2.63.0" + "revision" : "fc63f0cf4e55a4597407a9fc95b16a2bc44b4982", + "version" : "2.64.0" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "363da63c1966405764f380c627409b2f9d9e710b", - "version" : "1.21.0" + "revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63", + "version" : "1.22.0" } }, { From abce15ff8325e804dd183e5974bae8d333e8577a Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 27 Mar 2024 00:57:27 +0300 Subject: [PATCH 025/202] =?UTF-8?q?fixed=20when=20update=20method=20didn?= =?UTF-8?q?=E2=80=99t=20use=20passed=20dateEncodingStrategy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/CouchDBClient/CouchDBClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index f1bb924..1db97d4 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -704,7 +704,7 @@ public class CouchDBClient { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy - let encodedData = try JSONEncoder().encode(doc) + let encodedData = try encoder.encode(doc) let updateResponse = try await update( dbName: dbName, From 1a522e05a025c080fa7888248ed588bc546f8a24 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 20:34:13 +0300 Subject: [PATCH 026/202] noData error added --- Sources/CouchDBClient/CouchDBClient.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 1db97d4..68254e1 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -28,6 +28,8 @@ public enum CouchDBClientError: Error { case unknownResponse /// Wrong username or password. case unauthorized + /// Missing data in response body. + case noData } extension CouchDBClientError: LocalizedError { @@ -49,6 +51,8 @@ extension CouchDBClientError: LocalizedError { return "Uknown response from CouchDB." case .unauthorized: return "Wrong username or password." + case .noData: + return "Missing data in response body." } } } From a1dcfaf413e11714336eee34b14393e26667e022 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 20:35:20 +0300 Subject: [PATCH 027/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- .../CouchDBClient/CouchDB+Deprecated.swift | 93 +++++++++++++++++++ Sources/CouchDBClient/CouchDBClient.swift | 54 +++++++---- 2 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 Sources/CouchDBClient/CouchDB+Deprecated.swift diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift new file mode 100644 index 0000000..f8742eb --- /dev/null +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -0,0 +1,93 @@ +// +// CouchDB+Deprecated.swift +// +// +// Created by Sergei Armodin on 02.04.2024. +// + +import Foundation +import AsyncHTTPClient +import NIO + +extension CouchDBClient { + /// Insert data in DB. Accepts HTTPClient.Body as body parameter. + /// + /// Examples: + /// + /// Define your document model: + /// ```swift + /// // Example struct + /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// var name: String + /// var _id: String? + /// var _rev: String? + /// } + /// ``` + /// + /// Create a new document and insert: + /// ```swift + /// let testDoc = ExpectedDoc(name: "My name") + /// let data = try JSONEncoder().encode(testData) + /// + /// let response = try await couchDBClient.insert( + /// dbName: "databaseName", + /// body: .data(data) + /// ) + /// + /// print(response) + /// ``` + /// + /// - Parameters: + /// - dbName: DB name. + /// - body: Request body data. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Insert request response. + @available(*, deprecated, message: "Use the insert method that accepts HTTPClientRequest.Body type.") + public func insert(dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/\(dbName)") + + var request = try self.buildRequest(fromUrl: url, withMethod: .POST) + request.body = body + + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { + throw CouchDBClientError.unknownResponse + } + + let data = Data(bytes) + let decoder = JSONDecoder() + + do { + let decodedResponse = try decoder.decode(CouchUpdateResponse.self, from: data) + return decodedResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.insertError(error: couchdbError) + } + throw parsingError + } + } + +} diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 68254e1..d0a7461 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -176,20 +176,21 @@ public class CouchDBClient { let url = buildUrl(path: "/_all_dbs") - let request = try buildRequest(fromUrl: url, withMethod: .GET) + let request = try buildRequestNew(fromUrl: url, withMethod: .GET) let response = try await httpClient - .execute(request: request) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse - } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) - let data = Data(bytes) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } return try JSONDecoder().decode([String].self, from: data) } @@ -725,7 +726,7 @@ public class CouchDBClient { doc._id = updateResponse.id } - /// Insert data in DB. + /// Insert data in DB. Accepts HTTPClientRequest.Body as body parameter. /// /// Examples: /// @@ -744,9 +745,11 @@ public class CouchDBClient { /// let testDoc = ExpectedDoc(name: "My name") /// let data = try JSONEncoder().encode(testData) /// + /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: insertEncodeData)) + /// /// let response = try await couchDBClient.insert( /// dbName: "databaseName", - /// body: .data(data) + /// body: body /// ) /// /// print(response) @@ -757,7 +760,7 @@ public class CouchDBClient { /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Insert request response. - public func insert(dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -775,22 +778,24 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - var request = try self.buildRequest(fromUrl: url, withMethod: .POST) + var request = try self.buildRequestNew(fromUrl: url, withMethod: .POST) request.body = body let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() do { @@ -839,9 +844,11 @@ public class CouchDBClient { encoder.dateEncodingStrategy = dateEncodingStrategy let insertEncodeData = try encoder.encode(doc) + let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: insertEncodeData)) + let insertResponse = try await insert( dbName: dbName, - body: .data(insertEncodeData), + body: body, eventLoopGroup: eventLoopGroup ) @@ -1038,4 +1045,17 @@ internal extension CouchDBClient { body: nil ) } + + func buildRequestNew(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { + var headers = HTTPHeaders() + headers.add(name: "Content-Type", value: "application/json") + if let cookie = sessionCookie { + headers.add(name: "Cookie", value: cookie) + } + + var request = HTTPClientRequest(url: url) + request.method = method + request.headers = headers + return request + } } From 0bb698248e9c4ad87144a8ed5b4f9cbebfc08c05 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 20:37:54 +0300 Subject: [PATCH 028/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- Sources/CouchDBClient/CouchDBClient.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index d0a7461..38b6b8c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -223,10 +223,9 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName) - let request = try buildRequest(fromUrl: url, withMethod: .HEAD) + let request = try buildRequestNew(fromUrl: url, withMethod: .HEAD) let response = try await httpClient - .execute(request: request) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized From ad36014e42feed91e91d536f414281cb758fe772 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 20:39:22 +0300 Subject: [PATCH 029/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- Sources/CouchDBClient/CouchDBClient.swift | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 38b6b8c..ede8569 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -263,21 +263,23 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - let request = try self.buildRequest(fromUrl: url, withMethod: .PUT) + let request = try self.buildRequestNew(fromUrl: url, withMethod: .PUT) let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() do { From 73ffa10b93b0a3b0cb36fa3e2664e8207c38d47c Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 20:40:29 +0300 Subject: [PATCH 030/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- Sources/CouchDBClient/CouchDBClient.swift | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index ede8569..c9bc062 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -322,21 +322,23 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) + let request = try self.buildRequestNew(fromUrl: url, withMethod: .DELETE) let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() do { From c60feade15cd011b682946ee999c133f075b83e7 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 21:09:14 +0300 Subject: [PATCH 031/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- .../CouchDBClient/CouchDB+Deprecated.swift | 81 +------------------ Sources/CouchDBClient/CouchDBClient.swift | 49 ++++++++--- .../CouchDBClientTests.swift | 42 +++++++--- 3 files changed, 67 insertions(+), 105 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index f8742eb..5d1473a 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -10,84 +10,5 @@ import AsyncHTTPClient import NIO extension CouchDBClient { - /// Insert data in DB. Accepts HTTPClient.Body as body parameter. - /// - /// Examples: - /// - /// Define your document model: - /// ```swift - /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { - /// var name: String - /// var _id: String? - /// var _rev: String? - /// } - /// ``` - /// - /// Create a new document and insert: - /// ```swift - /// let testDoc = ExpectedDoc(name: "My name") - /// let data = try JSONEncoder().encode(testData) - /// - /// let response = try await couchDBClient.insert( - /// dbName: "databaseName", - /// body: .data(data) - /// ) - /// - /// print(response) - /// ``` - /// - /// - Parameters: - /// - dbName: DB name. - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Insert request response. - @available(*, deprecated, message: "Use the insert method that accepts HTTPClientRequest.Body type.") - public func insert(dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { - try await authIfNeed(eventLoopGroup: eventLoopGroup) - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) - } - - defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } - } - - let url = buildUrl(path: "/\(dbName)") - - var request = try self.buildRequest(fromUrl: url, withMethod: .POST) - request.body = body - - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } - - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse - } - - let data = Data(bytes) - let decoder = JSONDecoder() - - do { - let decodedResponse = try decoder.decode(CouchUpdateResponse.self, from: data) - return decodedResponse - } catch let parsingError { - if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.insertError(error: couchdbError) - } - throw parsingError - } - } - + } diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index c9bc062..68c9d08 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -369,11 +369,22 @@ public class CouchDBClient { /// Get document by ID: /// ```swift /// // get data from DB by document ID - /// var response = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") + /// var response = try await couchDBClient.get( + /// dbName: "databaseName", + /// uri: "documentId" + /// ) /// /// // parse JSON - /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let doc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) + /// let expectedBytes = response.headers + /// .first(name: "content-length") + /// .flatMap(Int.init) ?? 1024 * 1024 * 10 + /// var bytes = try await response.body.collect(upTo: expectedBytes) + /// let data = bytes.readData(length: bytes.readableBytes) + /// + /// let doc = try JSONDecoder().decode( + /// ExpectedDoc.self, + /// from: data! + /// ) /// ``` /// /// You can also provide CouchDB view document as uri and key in query. @@ -397,8 +408,18 @@ public class CouchDBClient { /// uri: "_design/all/_view/by_url", /// query: ["key": "\"\(url)\""] /// ) - /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let decodedResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + /// + /// let expectedBytes = response.headers + /// .first(name: "content-length") + /// .flatMap(Int.init) ?? 1024 * 1024 * 10 + /// var bytes = try await response.body.collect(upTo: expectedBytes) + /// let data = bytes.readData(length: bytes.readableBytes) + /// + /// let decodedResponse = try JSONDecoder().decode( + /// RowsResponse.self, + /// from: data! + /// ) + /// /// print(decodedResponse.rows) /// print(decodedResponse.rows.first?.value) /// ``` @@ -409,7 +430,7 @@ public class CouchDBClient { /// - query: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -426,10 +447,9 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) - let request = try buildRequest(fromUrl: url, withMethod: .GET) + let request = try buildRequestNew(fromUrl: url, withMethod: .GET) let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized @@ -466,17 +486,20 @@ public class CouchDBClient { /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: An object or a struct (of generic type) parsed from JSON. public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { - let response = try await get(dbName: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) + let response: HTTPClientResponse = try await get(dbName: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() decoder.dateDecodingStrategy = dateDecodingStrategy diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 63b4c45..6e72bd8 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -115,14 +115,20 @@ final class CouchDBClientTests: XCTestCase { XCTAssertEqual(testDoc._id, expectedInsertId) // get updated doc - var getResponse2 = try await couchDBClient.get( + let getResponse2 = try await couchDBClient.get( dbName: testsDB, uri: expectedInsertId ) XCTAssertNotNil(getResponse2.body) - let bytes2 = getResponse2.body!.readBytes(length: getResponse2.body!.readableBytes)! - testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes2)) + let expectedBytes2 = getResponse2.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes2 = try await getResponse2.body.collect(upTo: expectedBytes2) + let data2 = bytes2.readData(length: bytes2.readableBytes) + + testDoc = try JSONDecoder().decode( + ExpectedDoc.self, + from: data2! + ) XCTAssertEqual(expectedName, testDoc.name) @@ -151,7 +157,7 @@ final class CouchDBClientTests: XCTestCase { let insertEncodeData = try JSONEncoder().encode(testDoc) let response = try await couchDBClient.insert( dbName: testsDB, - body: .data(insertEncodeData) + body: .bytes(ByteBuffer(data: insertEncodeData)) ) XCTAssertEqual(response.ok, true) @@ -167,11 +173,17 @@ final class CouchDBClientTests: XCTestCase { // Test Get var expectedName = testDoc.name do { - var response = try await couchDBClient.get(dbName: testsDB, uri: expectedInsertId) + let response = try await couchDBClient.get(dbName: testsDB, uri: expectedInsertId) XCTAssertNotNil(response.body) - let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + let data = bytes.readData(length: bytes.readableBytes) + + testDoc = try JSONDecoder().decode( + ExpectedDoc.self, + from: data! + ) XCTAssertEqual(expectedName, testDoc.name) XCTAssertEqual(testDoc._rev, expectedInsertRev) @@ -197,14 +209,20 @@ final class CouchDBClientTests: XCTestCase { XCTAssertNotEqual(updateResponse.rev, expectedInsertRev) XCTAssertEqual(updateResponse.id, expectedInsertId) - var getResponse = try await couchDBClient.get( + let getResponse = try await couchDBClient.get( dbName: testsDB, uri: expectedInsertId ) XCTAssertNotNil(getResponse.body) - let bytes = getResponse.body!.readBytes(length: getResponse.body!.readableBytes)! - testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) + let expectedBytes = getResponse.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await getResponse.body.collect(upTo: expectedBytes) + let data = bytes.readData(length: bytes.readableBytes) + + testDoc = try JSONDecoder().decode( + ExpectedDoc.self, + from: data! + ) XCTAssertEqual(expectedName, testDoc.name) } catch let error { @@ -249,7 +267,7 @@ final class CouchDBClientTests: XCTestCase { let insertEncodedData = try JSONEncoder().encode(testDoc) let insertResponse = try await couchDBClient.insert( dbName: testsDB, - body: .data(insertEncodedData) + body: .bytes(ByteBuffer(data: insertEncodedData)) ) let selector = ["selector": ["name": "Greg"]] @@ -278,7 +296,7 @@ final class CouchDBClientTests: XCTestCase { let insertEncodedData = try JSONEncoder().encode(testDoc) let insertResponse = try await couchDBClient.insert( dbName: testsDB, - body: .data(insertEncodedData) + body: .bytes(ByteBuffer(data: insertEncodedData)) ) let selector = ["selector": ["name": "Sam"]] From dd00301d52db835f3f1aea5d7a1778b11c46bac2 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 21:14:30 +0300 Subject: [PATCH 032/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- Sources/CouchDBClient/CouchDBClient.swift | 25 ++++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 68c9d08..56d188f 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -631,11 +631,12 @@ public class CouchDBClient { /// /// // encode document into JSON string /// let data = try encoder.encode(updatedData) + /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: data)) /// /// let response = try await couchDBClient.update( /// dbName: testsDB, /// uri: doc._id!, - /// body: .data(data) + /// body: body /// ) /// /// print(response) @@ -645,10 +646,10 @@ public class CouchDBClient { /// - Parameters: /// - dbName: DB name. /// - uri: URI (view or document id). - /// - body: Request body data. New will be created if nil value provided. + /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Update response. - public func update(dbName: String, uri: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + public func update(dbName: String, uri: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -665,22 +666,24 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/" + uri) - var request = try buildRequest(fromUrl: url, withMethod: .PUT) + var request = try buildRequestNew(fromUrl: url, withMethod: .PUT) request.body = body let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() do { @@ -737,10 +740,12 @@ public class CouchDBClient { encoder.dateEncodingStrategy = dateEncodingStrategy let encodedData = try encoder.encode(doc) + let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: encodedData)) + let updateResponse = try await update( dbName: dbName, uri: id, - body: .data(encodedData), + body: body, eventLoopGroup: eventLoopGroup ) From febe7b3071c0022f0143c942cec69dd0c9c70283 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 21:15:02 +0300 Subject: [PATCH 033/202] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 6e72bd8..c6f08dd 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -198,10 +198,12 @@ final class CouchDBClientTests: XCTestCase { do { let updateEncodedData = try JSONEncoder().encode(testDoc) + let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: updateEncodedData)) + let updateResponse = try await couchDBClient.update( dbName: testsDB, uri: expectedInsertId, - body: .data(updateEncodedData) + body: body ) XCTAssertFalse(updateResponse.rev.isEmpty) From 5260938b8e0e67dfbd7a72cf327a11dba7bd5ef0 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 21:30:44 +0300 Subject: [PATCH 034/202] migrating to new HTTPClientRequest from HTTPClient.Request wip --- Sources/CouchDBClient/CouchDBClient.swift | 50 +++++++------------ .../CouchDBClientTests.swift | 26 ++++++++-- 2 files changed, 41 insertions(+), 35 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 56d188f..add3761 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -532,18 +532,22 @@ public class CouchDBClient { public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: selectorData)) let findResponse = try await find( in: dbName, - body: .data(selectorData), + body: requestBody, eventLoopGroup: eventLoopGroup ) - guard var body = findResponse.body, let bytes = body.readBytes(length: body.readableBytes) else { - throw CouchDBClientError.unknownResponse + let body = findResponse.body + let expectedBytes = findResponse.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - let data = Data(bytes) let decoder = JSONDecoder() decoder.dateDecodingStrategy = dateDecodingStrategy @@ -574,7 +578,7 @@ public class CouchDBClient { /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + public func find(in dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -591,11 +595,10 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/_find", query: []) - var request = try buildRequest(fromUrl: url, withMethod: .POST) + var request = try buildRequestNew(fromUrl: url, withMethod: .POST) request.body = body let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized @@ -922,21 +925,23 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/" + uri, query: [ URLQueryItem(name: "rev", value: rev) ]) - let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) + let request = try self.buildRequestNew(fromUrl: url, withMethod: .DELETE) let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { return CouchUpdateResponse(ok: false, id: "", rev: "") } - let data = Data(bytes) return try JSONDecoder().decode(CouchUpdateResponse.self, from: data) } @@ -1058,25 +1063,6 @@ internal extension CouchDBClient { return authData } - /// Build HTTP request from url string. - /// - Parameters: - /// - url: URL string. - /// - method: HTTP method. - /// - Returns: HTTP Request. - func buildRequest(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { - var headers = HTTPHeaders() - headers.add(name: "Content-Type", value: "application/json") - if let cookie = sessionCookie { - headers.add(name: "Cookie", value: cookie) - } - return try HTTPClient.Request( - url: url, - method: method, - headers: headers, - body: nil - ) - } - func buildRequestNew(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { var headers = HTTPHeaders() headers.add(name: "Content-Type", value: "application/json") diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index c6f08dd..8fc3136 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -272,16 +272,32 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) + try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) + let selector = ["selector": ["name": "Greg"]] let bodyData = try JSONEncoder().encode(selector) - var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: bodyData)) + + let findResponse = try await couchDBClient.find( + in: testsDB, + body: requestBody + ) + + let body = findResponse.body + let expectedBytes = findResponse.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) - let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! - let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: data) XCTAssertTrue(decodedResponse.docs.count > 0) XCTAssertEqual(decodedResponse.docs.first!._id, insertResponse.id) + try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) + _ = try await couchDBClient.delete( fromDb: testsDB, uri: decodedResponse.docs.first!._id!, @@ -301,12 +317,16 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) + try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) + let selector = ["selector": ["name": "Sam"]] let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) XCTAssertTrue(docs.count > 0) XCTAssertEqual(docs.first!._id, insertResponse.id) + try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) + _ = try await couchDBClient.delete( fromDb: testsDB, uri: docs.first!._id!, From c1cd49a6160f0a047151a6bce4fe33a3ebe34c32 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Tue, 2 Apr 2024 21:31:21 +0300 Subject: [PATCH 035/202] rename --- Sources/CouchDBClient/CouchDBClient.swift | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index add3761..7d4327a 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -176,7 +176,7 @@ public class CouchDBClient { let url = buildUrl(path: "/_all_dbs") - let request = try buildRequestNew(fromUrl: url, withMethod: .GET) + let request = try buildRequest(fromUrl: url, withMethod: .GET) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -223,7 +223,7 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName) - let request = try buildRequestNew(fromUrl: url, withMethod: .HEAD) + let request = try buildRequest(fromUrl: url, withMethod: .HEAD) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -263,7 +263,7 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - let request = try self.buildRequestNew(fromUrl: url, withMethod: .PUT) + let request = try self.buildRequest(fromUrl: url, withMethod: .PUT) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -322,7 +322,7 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - let request = try self.buildRequestNew(fromUrl: url, withMethod: .DELETE) + let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -447,7 +447,7 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) - let request = try buildRequestNew(fromUrl: url, withMethod: .GET) + let request = try buildRequest(fromUrl: url, withMethod: .GET) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -595,7 +595,7 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/_find", query: []) - var request = try buildRequestNew(fromUrl: url, withMethod: .POST) + var request = try buildRequest(fromUrl: url, withMethod: .POST) request.body = body let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -669,7 +669,7 @@ public class CouchDBClient { } let url = buildUrl(path: "/" + dbName + "/" + uri) - var request = try buildRequestNew(fromUrl: url, withMethod: .PUT) + var request = try buildRequest(fromUrl: url, withMethod: .PUT) request.body = body let response = try await httpClient @@ -812,7 +812,7 @@ public class CouchDBClient { let url = buildUrl(path: "/\(dbName)") - var request = try self.buildRequestNew(fromUrl: url, withMethod: .POST) + var request = try self.buildRequest(fromUrl: url, withMethod: .POST) request.body = body let response = try await httpClient @@ -925,7 +925,7 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/" + uri, query: [ URLQueryItem(name: "rev", value: rev) ]) - let request = try self.buildRequestNew(fromUrl: url, withMethod: .DELETE) + let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) let response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) @@ -1063,7 +1063,7 @@ internal extension CouchDBClient { return authData } - func buildRequestNew(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { + func buildRequest(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { var headers = HTTPHeaders() headers.add(name: "Content-Type", value: "application/json") if let cookie = sessionCookie { From d9e4ec872ff4497c9566f43887df5a5eaa4a6b2f Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:42:16 +0300 Subject: [PATCH 036/202] tests updated --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 8fc3136..8cfa1f9 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -272,7 +272,6 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) let selector = ["selector": ["name": "Greg"]] let bodyData = try JSONEncoder().encode(selector) @@ -294,14 +293,12 @@ final class CouchDBClientTests: XCTestCase { let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: data) XCTAssertTrue(decodedResponse.docs.count > 0) - XCTAssertEqual(decodedResponse.docs.first!._id, insertResponse.id) - - try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) + XCTAssertTrue(decodedResponse.docs.contains(where: { $0._id == insertResponse.id })) _ = try await couchDBClient.delete( fromDb: testsDB, - uri: decodedResponse.docs.first!._id!, - rev: decodedResponse.docs.first!._rev! + uri: insertResponse.id, + rev: insertResponse.rev ) } catch { XCTFail(error.localizedDescription) @@ -317,16 +314,12 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) - let selector = ["selector": ["name": "Sam"]] let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) XCTAssertTrue(docs.count > 0) XCTAssertEqual(docs.first!._id, insertResponse.id) - try await Task.sleep(nanoseconds: NSEC_PER_SEC * 2) - _ = try await couchDBClient.delete( fromDb: testsDB, uri: docs.first!._id!, From 20497ebd68a42a2ad95c867f792dd602a3153638 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:42:37 +0300 Subject: [PATCH 037/202] auth fixed --- Sources/CouchDBClient/CouchDBClient.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 7d4327a..6351525 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1056,9 +1056,14 @@ internal extension CouchDBClient { sessionCookie = cookie - guard var body = response.body, let bytes = body.readBytes(length: body.readableBytes) else { return nil } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } - let data = Data(bytes) authData = try JSONDecoder().decode(CreateSessionResponse.self, from: data) return authData } From d8eab77fc320c7f8d194dc47272459e94421e4a1 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:42:55 +0300 Subject: [PATCH 038/202] collect body bytes before returning response --- Sources/CouchDBClient/CouchDBClient.swift | 26 +++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 6351525..fa4fe87 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -448,13 +448,20 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) let request = try buildRequest(fromUrl: url, withMethod: .GET) - let response = try await httpClient + var response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + + response.body = .bytes( + try await body.collect(upTo: expectedBytes) + ) + return response } @@ -597,13 +604,20 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/_find", query: []) var request = try buildRequest(fromUrl: url, withMethod: .POST) request.body = body - let response = try await httpClient + var response = try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + + response.body = .bytes( + try await body.collect(upTo: expectedBytes) + ) + return response } @@ -1015,14 +1029,14 @@ internal extension CouchDBClient { let url = buildUrl(path: "/_session") - var request = try HTTPClient.Request(url:url, method: .POST) + var request = HTTPClientRequest(url: url) + request.method = .POST request.headers.add(name: "Content-Type", value: "application/x-www-form-urlencoded") let dataString = "name=\(userName)&password=\(userPassword)" - request.body = HTTPClient.Body.string(dataString) + request.body = .bytes(ByteBuffer(string: dataString)) let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() + .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { throw CouchDBClientError.unauthorized From 85208260a5e74b5ef3c5706b0bfc0758882bf9e3 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:54:39 +0300 Subject: [PATCH 039/202] param renamed to make keep backward compatibility with old methods --- .../CouchDBClient/CouchDB+Deprecated.swift | 153 +++++++++++++++++- Sources/CouchDBClient/CouchDBClient.swift | 10 +- .../CouchDBClientTests.swift | 8 +- 3 files changed, 161 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index 5d1473a..ca227bb 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -8,7 +8,158 @@ import Foundation import AsyncHTTPClient import NIO +import NIOHTTP1 extension CouchDBClient { - + /// Get data from DB. + /// + /// Examples: + /// + /// Define your document model: + /// ```swift + /// // Example struct + /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// var name: String + /// var _id: String? + /// var _rev: String? + /// } + /// ``` + /// + /// Get document by ID: + /// ```swift + /// // get data from DB by document ID + /// var response = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") + /// + /// // parse JSON + /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! + /// let doc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) + /// ``` + /// + /// You can also provide CouchDB view document as uri and key in query. + /// Define Row and RowsResponse models: + /// ```swift + /// struct Row: Codable { + /// let value: ExpectedDoc + /// } + /// + /// struct RowsResponse: Codable { + /// let total_rows: Int + /// let offset: Int + /// let rows: [Row] + /// } + /// ``` + /// + /// Get data and parse RowsResponse: + /// ```swift + /// let response = try await couchDBClient.get( + /// dbName: "databaseName", + /// uri: "_design/all/_view/by_url", + /// query: ["key": "\"\(url)\""] + /// ) + /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! + /// let decodedResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + /// print(decodedResponse.rows) + /// print(decodedResponse.rows.first?.value) + /// ``` + /// + /// - Parameters: + /// - dbName: DB name. + /// - uri: URI (view or document id). + /// - query: Request query items. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Request response. + @available(*, deprecated, message: "Use the new get(fromDB:uri:queryItems) method.") + public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) + let request = try buildRequestOld(fromUrl: url, withMethod: .GET) + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + return response + } + + /// Find data in DB by selector. + /// + /// Example: + /// ```swift + /// let selector = ["selector": ["name": "Greg"]] + /// let bodyData = try JSONEncoder().encode(selector) + /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + /// + /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! + /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs + /// ``` + /// - Parameters: + /// - dbName: DB name. + /// - body: Request body data. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Request response. + public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } + + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + + let url = buildUrl(path: "/" + dbName + "/_find", query: []) + var request = try buildRequestOld(fromUrl: url, withMethod: .POST) + request.body = body + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + return response + } + + /// Build HTTP request from url string. + /// - Parameters: + /// - url: URL string. + /// - method: HTTP method. + /// - Returns: HTTP Request. + func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { + var headers = HTTPHeaders() + headers.add(name: "Content-Type", value: "application/json") + if let cookie = sessionCookie { + headers.add(name: "Cookie", value: cookie) + } + return try HTTPClient.Request( + url: url, + method: method, + headers: headers, + body: nil + ) + } } diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index fa4fe87..7c97181 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -85,7 +85,7 @@ public class CouchDBClient { /// Base URL. private var couchBaseURL: String = "" /// Session cookie for requests that needs authorization. - private var sessionCookie: String? + internal var sessionCookie: String? /// Session cookie as Cookie struct internal var sessionCookieExpires: Date? /// CouchDB user name. @@ -430,7 +430,7 @@ public class CouchDBClient { /// - query: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { + public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -493,7 +493,7 @@ public class CouchDBClient { /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: An object or a struct (of generic type) parsed from JSON. public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { - let response: HTTPClientResponse = try await get(dbName: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) + let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { throw CouchDBClientError.unauthorized @@ -542,7 +542,7 @@ public class CouchDBClient { let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: selectorData)) let findResponse = try await find( - in: dbName, + inDB: dbName, body: requestBody, eventLoopGroup: eventLoopGroup ) @@ -585,7 +585,7 @@ public class CouchDBClient { /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - public func find(in dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { + public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 8cfa1f9..563fc97 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -116,7 +116,7 @@ final class CouchDBClientTests: XCTestCase { // get updated doc let getResponse2 = try await couchDBClient.get( - dbName: testsDB, + fromDB: testsDB, uri: expectedInsertId ) XCTAssertNotNil(getResponse2.body) @@ -173,7 +173,7 @@ final class CouchDBClientTests: XCTestCase { // Test Get var expectedName = testDoc.name do { - let response = try await couchDBClient.get(dbName: testsDB, uri: expectedInsertId) + let response = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) XCTAssertNotNil(response.body) let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 @@ -212,7 +212,7 @@ final class CouchDBClientTests: XCTestCase { XCTAssertEqual(updateResponse.id, expectedInsertId) let getResponse = try await couchDBClient.get( - dbName: testsDB, + fromDB: testsDB, uri: expectedInsertId ) XCTAssertNotNil(getResponse.body) @@ -278,7 +278,7 @@ final class CouchDBClientTests: XCTestCase { let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: bodyData)) let findResponse = try await couchDBClient.find( - in: testsDB, + inDB: testsDB, body: requestBody ) From 7af5c33c5d11f7015c7c075ca2281515fa222ea1 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:55:17 +0300 Subject: [PATCH 040/202] marking old find as deprecated --- .../CouchDBClient/CouchDB+Deprecated.swift | 109 +++++++++--------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index ca227bb..63ca4d5 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -99,67 +99,68 @@ extension CouchDBClient { } /// Find data in DB by selector. - /// - /// Example: - /// ```swift - /// let selector = ["selector": ["name": "Greg"]] - /// let bodyData = try JSONEncoder().encode(selector) - /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) - /// - /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! - /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs - /// ``` - /// - Parameters: - /// - dbName: DB name. - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. - public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { - try await authIfNeed(eventLoopGroup: eventLoopGroup) + /// + /// Example: + /// ```swift + /// let selector = ["selector": ["name": "Greg"]] + /// let bodyData = try JSONEncoder().encode(selector) + /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + /// + /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! + /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs + /// ``` + /// - Parameters: + /// - dbName: DB name. + /// - body: Request body data. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: Request response. + @available(*, deprecated, message: "Use the new get(fromDB:uri:queryItems) method.") + public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { + try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) - } + let httpClient: HTTPClient + if let eventLoopGroup = eventLoopGroup { + httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + } - defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } + defer { + DispatchQueue.main.async { + try? httpClient.syncShutdown() } + } - let url = buildUrl(path: "/" + dbName + "/_find", query: []) - var request = try buildRequestOld(fromUrl: url, withMethod: .POST) - request.body = body - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } + let url = buildUrl(path: "/" + dbName + "/_find", query: []) + var request = try buildRequestOld(fromUrl: url, withMethod: .POST) + request.body = body + let response = try await httpClient + .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) + .get() - return response + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized } + return response + } + /// Build HTTP request from url string. - /// - Parameters: - /// - url: URL string. - /// - method: HTTP method. - /// - Returns: HTTP Request. - func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { - var headers = HTTPHeaders() - headers.add(name: "Content-Type", value: "application/json") - if let cookie = sessionCookie { - headers.add(name: "Cookie", value: cookie) - } - return try HTTPClient.Request( - url: url, - method: method, - headers: headers, - body: nil - ) + /// - Parameters: + /// - url: URL string. + /// - method: HTTP method. + /// - Returns: HTTP Request. + func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { + var headers = HTTPHeaders() + headers.add(name: "Content-Type", value: "application/json") + if let cookie = sessionCookie { + headers.add(name: "Cookie", value: cookie) } + return try HTTPClient.Request( + url: url, + method: method, + headers: headers, + body: nil + ) + } } From ca0caa2cee38ea026f2983b9f367b39f1148f63f Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:55:32 +0300 Subject: [PATCH 041/202] private --- Sources/CouchDBClient/CouchDB+Deprecated.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index 63ca4d5..07b3680 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -150,7 +150,7 @@ extension CouchDBClient { /// - url: URL string. /// - method: HTTP method. /// - Returns: HTTP Request. - func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { + private func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { var headers = HTTPHeaders() headers.add(name: "Content-Type", value: "application/json") if let cookie = sessionCookie { From 78f56666e7bf2dc0f651bbaba9fd832f124b541c Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 19:58:21 +0300 Subject: [PATCH 042/202] deprecated message --- Sources/CouchDBClient/CouchDB+Deprecated.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index 07b3680..dc3b247 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -68,7 +68,7 @@ extension CouchDBClient { /// - query: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - @available(*, deprecated, message: "Use the new get(fromDB:uri:queryItems) method.") + @available(*, deprecated, message: "Use the new `get(fromDB:uri:queryItems:eventLoopGroup)` method.") public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -114,7 +114,7 @@ extension CouchDBClient { /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Request response. - @available(*, deprecated, message: "Use the new get(fromDB:uri:queryItems) method.") + @available(*, deprecated, message: "Use the new 'find(inDB:body:eventLoopGroup)' method.") public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { try await authIfNeed(eventLoopGroup: eventLoopGroup) From a54dfcfd99b4e336e342b5eb987735410452a644 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 20:05:57 +0300 Subject: [PATCH 043/202] renames --- Sources/CouchDBClient/CouchDBClient.swift | 16 +++++++++++++--- .../CouchDBClientTests/CouchDBClientTests.swift | 4 ++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 7c97181..5d02dca 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -465,6 +465,11 @@ public class CouchDBClient { return response } + @available(*, deprecated, renamed: "get", message: "Renamed to: get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup)") + public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + return try await get(fromDB: dbName, uri: uri, queryItems: queryItems, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) + } + /// Get a document from DB. It will parse JSON using provided generic type. Check an example in Discussion. /// @@ -492,7 +497,7 @@ public class CouchDBClient { /// - queryItems: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: An object or a struct (of generic type) parsed from JSON. - public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + public func get (fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { @@ -520,7 +525,12 @@ public class CouchDBClient { throw parsingError } } - + + @available(*, deprecated, renamed: "find", message: "Renamed to: find(inDB:selector:dateDecodingStrategy:eventLoopGroup)") + public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + return try await find(inDB: dbName, selector: selector, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) + } + /// Find data in DB by selector. /// /// Example: @@ -536,7 +546,7 @@ public class CouchDBClient { /// - selector: Codable representation of json selector query. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Array of documents [T]. - public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: selectorData)) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 563fc97..6da3631 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -85,7 +85,7 @@ final class CouchDBClientTests: XCTestCase { // get inserted doc do { - testDoc = try await couchDBClient.get(dbName: testsDB, uri: expectedInsertId) + testDoc = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) } catch CouchDBClientError.getError(let error) { XCTFail(error.reason) return @@ -315,7 +315,7 @@ final class CouchDBClientTests: XCTestCase { ) let selector = ["selector": ["name": "Sam"]] - let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) + let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) XCTAssertTrue(docs.count > 0) XCTAssertEqual(docs.first!._id, insertResponse.id) From d6c9c9c9a8cb8c06d9a97184948918f542c6c78b Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 20:08:25 +0300 Subject: [PATCH 044/202] moved deprecations --- Sources/CouchDBClient/CouchDB+Deprecated.swift | 10 ++++++++++ Sources/CouchDBClient/CouchDBClient.swift | 11 ----------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index dc3b247..e095653 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -163,4 +163,14 @@ extension CouchDBClient { body: nil ) } + + @available(*, deprecated, renamed: "get", message: "Renamed to: get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup)") + public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + return try await get(fromDB: dbName, uri: uri, queryItems: queryItems, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) + } + + @available(*, deprecated, renamed: "find", message: "Renamed to: find(inDB:selector:dateDecodingStrategy:eventLoopGroup)") + public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + return try await find(inDB: dbName, selector: selector, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) + } } diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5d02dca..d9fac50 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -465,12 +465,6 @@ public class CouchDBClient { return response } - @available(*, deprecated, renamed: "get", message: "Renamed to: get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup)") - public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { - return try await get(fromDB: dbName, uri: uri, queryItems: queryItems, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) - } - - /// Get a document from DB. It will parse JSON using provided generic type. Check an example in Discussion. /// /// Example: @@ -526,11 +520,6 @@ public class CouchDBClient { } } - @available(*, deprecated, renamed: "find", message: "Renamed to: find(inDB:selector:dateDecodingStrategy:eventLoopGroup)") - public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { - return try await find(inDB: dbName, selector: selector, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) - } - /// Find data in DB by selector. /// /// Example: From eecb20f1d2e453bb393cdabf46e6874c511496d8 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Fri, 5 Apr 2024 20:10:22 +0300 Subject: [PATCH 045/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index d9fac50..5aa119f 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -404,7 +404,7 @@ public class CouchDBClient { /// Get data and parse RowsResponse: /// ```swift /// let response = try await couchDBClient.get( - /// dbName: "databaseName", + /// fromDB: "databaseName", /// uri: "_design/all/_view/by_url", /// query: ["key": "\"\(url)\""] /// ) @@ -482,7 +482,7 @@ public class CouchDBClient { /// Get document by ID: /// ```swift /// // get data from DB by document ID - /// let doc: ExpectedDoc = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") + /// let doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") /// ``` /// /// - Parameters: @@ -527,7 +527,7 @@ public class CouchDBClient { /// ```swift /// // find documents in DB by selector /// let selector = ["selector": ["name": "Sam"]] - /// let docs: [ExpectedDoc] = try await couchDBClient.find(in: testsDB, selector: selector) + /// let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) /// ``` /// /// - Parameters: @@ -574,7 +574,7 @@ public class CouchDBClient { /// ```swift /// let selector = ["selector": ["name": "Greg"]] /// let bodyData = try JSONEncoder().encode(selector) - /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) + /// var findResponse = try await couchDBClient.find(inDB: testsDB, body: .data(bodyData)) /// /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs From 469247f9b1c1c5ca6fff12c92aead5433a73a2b6 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sat, 6 Apr 2024 22:05:49 +0300 Subject: [PATCH 046/202] docs --- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 637e8a7..55b8c2e 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -7,7 +7,7 @@ import Foundation -/// Every CouchDB document should have **\_id** and **\_rev** properties. Both should be optional **String?** type. Unfortunatelly DocC ignores properties starting with `_` symbol so check the example in Overview section. +/// Every CouchDB document should have **\_id** and **\_rev** properties. Both should be optional **String?** type. Unfortunately DocC ignores properties starting with `_` symbol so check the example in the Overview section. /// /// Example: /// ```swift From 31187b51d1dd5697ad7885362aceb2ebf52b8363 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 21:50:39 +0300 Subject: [PATCH 047/202] added Codable to CouchDBRepresentable protocol --- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 55b8c2e..74409ee 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -12,13 +12,13 @@ import Foundation /// Example: /// ```swift /// // Example struct -/// struct ExpectedDoc: CouchDBRepresentable, Codable { +/// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? /// } /// ``` -public protocol CouchDBRepresentable { +public protocol CouchDBRepresentable: Codable { /// Document ID. var _id: String? { get set } /// Revision MVCC token. From f33724089accb263acf2c9e32cc8858a527fd852 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 21:58:34 +0300 Subject: [PATCH 048/202] added RowsResponse model --- .../CouchDBClient/Models/RowsResponse.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Sources/CouchDBClient/Models/RowsResponse.swift diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift new file mode 100644 index 0000000..ef9a6a3 --- /dev/null +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -0,0 +1,18 @@ +// +// RowsResponse.swift +// +// +// Created by Sergei Armodin on 07.04.2024. +// + +import Foundation + +public struct RowsResponse: Codable { + public struct Row: Codable { + public let value: T + } + + public let total_rows: Int + public let offset: Int + public let rows: [Row] +} From 6cd2d096e02d5dea45e61c0130e8efdc672eb4ce Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 22:12:26 +0300 Subject: [PATCH 049/202] docs --- Sources/CouchDBClient/CouchDB+Deprecated.swift | 16 ++-------------- Sources/CouchDBClient/CouchDBClient.swift | 14 +------------- Sources/CouchDBClient/Models/RowsResponse.swift | 7 ++++++- 3 files changed, 9 insertions(+), 28 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index e095653..3ef03e5 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -36,20 +36,8 @@ extension CouchDBClient { /// ``` /// /// You can also provide CouchDB view document as uri and key in query. - /// Define Row and RowsResponse models: - /// ```swift - /// struct Row: Codable { - /// let value: ExpectedDoc - /// } - /// - /// struct RowsResponse: Codable { - /// let total_rows: Int - /// let offset: Int - /// let rows: [Row] - /// } - /// ``` /// - /// Get data and parse RowsResponse: + /// Get data and parse `RowsResponse`: /// ```swift /// let response = try await couchDBClient.get( /// dbName: "databaseName", @@ -57,7 +45,7 @@ extension CouchDBClient { /// query: ["key": "\"\(url)\""] /// ) /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let decodedResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + /// let decodedResponse = try JSONDecoder().decode(RowsResponse.self, from: data) /// print(decodedResponse.rows) /// print(decodedResponse.rows.first?.value) /// ``` diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5aa119f..c26f764 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -388,18 +388,6 @@ public class CouchDBClient { /// ``` /// /// You can also provide CouchDB view document as uri and key in query. - /// Define Row and RowsResponse models: - /// ```swift - /// struct Row: Codable { - /// let value: ExpectedDoc - /// } - /// - /// struct RowsResponse: Codable { - /// let total_rows: Int - /// let offset: Int - /// let rows: [Row] - /// } - /// ``` /// /// Get data and parse RowsResponse: /// ```swift @@ -416,7 +404,7 @@ public class CouchDBClient { /// let data = bytes.readData(length: bytes.readableBytes) /// /// let decodedResponse = try JSONDecoder().decode( - /// RowsResponse.self, + /// RowsResponse.self, /// from: data! /// ) /// diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index ef9a6a3..328609b 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -7,12 +7,17 @@ import Foundation +/// Rows response model. public struct RowsResponse: Codable { public struct Row: Codable { + /// A CouchDB document. public let value: T } - + + /// Total documents in a response. public let total_rows: Int + /// Results offset. public let offset: Int + /// CouchDB documents. public let rows: [Row] } From 8d47cd21da39ed822c490260b31570265bbabebe Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 22:12:37 +0300 Subject: [PATCH 050/202] Vapor tutorial updated --- .../Tutorials/vapor/VaporTutorial-0.swift | 14 +------------- .../Tutorials/vapor/VaporTutorial-3.swift | 12 ------------ .../Tutorials/vapor/VaporTutorial-4.swift | 12 ------------ .../Tutorials/vapor/VaporTutorial-5.swift | 14 +------------- .../Tutorials/vapor/VaporTutorial-6.swift | 14 +------------- .../Tutorials/vapor/VaporTutorial.tutorial | 2 +- 6 files changed, 4 insertions(+), 64 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift index 6b3aaaa..9c467de 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift @@ -8,18 +8,6 @@ struct MyApp: Content, CouchDBRepresentable { let url: String let _id: String var _rev: String - - /// Row model for CouchDB - struct Row: Content { - let value: AppOnSiteModel - } - - /// Rows response - struct RowsResponse: Content { - let total_rows: Int - let offset: Int - let rows: [Row] - } } func routes(_ app: Application) throws { @@ -38,7 +26,7 @@ func routes(_ app: Application) throws { guard let bytes = response.body else { throw Abort(.notFound) } let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) guard let myApp = decodeResponse.rows.first?.value else { throw Abort(.notFound) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift index c8983d0..bd1b9a1 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift @@ -8,18 +8,6 @@ struct MyApp: Content, CouchDBRepresentable { let url: String let _id: String var _rev: String - - /// Row model for CouchDB - struct Row: Content { - let value: MyApp - } - - /// Rows response - struct RowsResponse: Content { - let total_rows: Int - let offset: Int - let rows: [Row] - } } func routes(_ app: Application) throws { diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift index 62853e2..fe6b2cf 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift @@ -8,18 +8,6 @@ struct MyApp: Content, CouchDBRepresentable { let url: String let _id: String var _rev: String - - /// Row model for CouchDB - struct Row: Content { - let value: MyApp - } - - /// Rows response - struct RowsResponse: Content { - let total_rows: Int - let offset: Int - let rows: [Row] - } } func routes(_ app: Application) throws { diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift index 182c1f9..43ffbb9 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift @@ -8,18 +8,6 @@ struct MyApp: Content, CouchDBRepresentable { let url: String let _id: String var _rev: String - - /// Row model for CouchDB - struct Row: Content { - let value: MyApp - } - - /// Rows response - struct RowsResponse: Content { - let total_rows: Int - let offset: Int - let rows: [Row] - } } func routes(_ app: Application) throws { @@ -37,7 +25,7 @@ func routes(_ app: Application) throws { guard let bytes = response.body else { throw Abort(.notFound) } let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) guard let myApp = decodeResponse.rows.first?.value else { throw Abort(.notFound) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift index 61917c2..8c3741d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift @@ -8,18 +8,6 @@ struct MyApp: Content, CouchDBRepresentable { let url: String let _id: String var _rev: String - - /// Row model for CouchDB - struct Row: Content { - let value: MyApp - } - - /// Rows response - struct RowsResponse: Content { - let total_rows: Int - let offset: Int - let rows: [Row] - } } func routes(_ app: Application) throws { @@ -37,7 +25,7 @@ func routes(_ app: Application) throws { guard let bytes = response.body else { throw Abort(.notFound) } let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) guard let myApp = decodeResponse.rows.first?.value else { throw Abort(.notFound) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index 14ba158..386d729 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -32,7 +32,7 @@ } @Step { - Define your data model for CouchDB documents. Nested `Row` and `RowsResponse` models will be used to parse CouchDB responses. + Define your data model for CouchDB documents. `RowsResponse` model from the `CouchDBClient` library will be used to parse CouchDB responses. @Code(name: "main.swift", file: VaporTutorial-3.swift) } From dba25fe618f91fce4d9e84cb341da90c389a6e94 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 22:17:55 +0300 Subject: [PATCH 051/202] docs --- .../CouchDBClient.docc/Extensions/Client.md | 14 ++++++++++---- Sources/CouchDBClient/CouchDBClient.swift | 8 ++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md index 65efbf7..35cd017 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md @@ -21,13 +21,19 @@ A CouchDB client class with methods using Swift Concurrency. - ``createDB(_:eventLoopGroup:)`` - ``deleteDB(_:eventLoopGroup:)`` - ``dbExists(_:eventLoopGroup:)`` -- ``get(dbName:uri:queryItems:eventLoopGroup:)`` -- ``get(dbName:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` +- ``get(fromDB:uri:queryItems:eventLoopGroup:)`` +- ``get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` - ``insert(dbName:body:eventLoopGroup:)`` - ``insert(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` - ``update(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` - ``update(dbName:uri:body:eventLoopGroup:)`` -- ``find(in:body:eventLoopGroup:)`` -- ``find(in:selector:dateDecodingStrategy:eventLoopGroup:)`` +- ``find(inDB:body:eventLoopGroup:)`` +- ``find(inDB:selector:dateDecodingStrategy:eventLoopGroup:)`` - ``delete(fromDb:doc:eventLoopGroup:)`` - ``delete(fromDb:uri:rev:eventLoopGroup:)`` + +### Deprecated methods +- ``get(dbName:uri:queryItems:eventLoopGroup:)`` +- ``get(dbName:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` +- ``find(in:body:eventLoopGroup:)`` +- ``find(in:selector:dateDecodingStrategy:eventLoopGroup:)`` diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index c26f764..4102795 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -114,7 +114,7 @@ public class CouchDBClient { /// userPassword: "myPassword" /// ) /// ``` - /// If you don't want to have your password in the code you can pass `COUCHDB_PASS` param in you command line. + /// If you don't want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. /// For example you can run your Server Side Swift project: /// ```bash /// COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run @@ -130,9 +130,9 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - couchProtocol: Protocol for requests (check ``CouchDBProtocol`` enum for avaiable values). - /// - couchHost: Host of CouchDB instance. - /// - couchPort: Port CouchDB works on. + /// - couchProtocol: Protocol for requests (check the ``CouchDBProtocol`` enum for available values). + /// - couchHost: Host of the CouchDB instance. + /// - couchPort: Port that CouchDB works on. /// - userName: Username. /// - userPassword: User password. public init(couchProtocol: CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String = "", userPassword: String = "") { From ebab497b73716a902ac89e5774aaea474fc83ad7 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 22:50:35 +0300 Subject: [PATCH 052/202] docs and refactoring --- Sources/CouchDBClient/CouchDBClient.swift | 160 +++++++++++----------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 4102795..2e9d625 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -12,23 +12,23 @@ import AsyncHTTPClient /// CouchDB client errors. public enum CouchDBClientError: Error { - /// **id** property is empty or missing in provided document. + /// **id** property is empty or missing in the provided document. case idMissing - /// **\_rev** property is empty or missing in provided document. + /// **\_rev** property is empty or missing in the provided document. case revMissing - /// Get request wasn't successful. + /// The Get request wasn't successful. case getError(error: CouchDBError) - /// Insert request wasn't successful. + /// The Insert request wasn't successful. case insertError(error: CouchDBError) - /// Update request wasn't successful. + /// The Update request wasn't successful. case updateError(error: CouchDBError) - /// Find request wasn't successful. + /// The Find request wasn't successful. case findError(error: CouchDBError) - /// Uknown response from CouchDB. + /// Unknown response from CouchDB. case unknownResponse /// Wrong username or password. case unauthorized - /// Missing data in response body. + /// Missing data in the response body. case noData } @@ -36,23 +36,23 @@ extension CouchDBClientError: LocalizedError { public var errorDescription: String? { switch self { case .idMissing: - return "id property is empty or missing in provided document." + return "id property is empty or missing in the provided document." case .revMissing: - return "_rev property is empty or missing in provided document." + return "_rev property is empty or missing in the provided document." case .getError(let error): - return "Get request wasn't successful: \(error.localizedDescription)" + return "The Get request wasn't successful: \(error.localizedDescription)" case .insertError(let error): - return "Insert request wasn't successful: \(error.localizedDescription)" + return "The Insert request wasn't successful: \(error.localizedDescription)" case .updateError(let error): - return "Update request wasn't successful: \(error.localizedDescription)" + return "The Update request wasn't successful: \(error.localizedDescription)" case .findError(let error): - return "Find request wasn't successful: \(error.localizedDescription)" + return "The Find request wasn't successful: \(error.localizedDescription)" case .unknownResponse: - return "Uknown response from CouchDB." + return "Unknown response from CouchDB." case .unauthorized: return "Wrong username or password." case .noData: - return "Missing data in response body." + return "Missing data in the response body." } } } @@ -61,18 +61,18 @@ extension CouchDBClientError: LocalizedError { public class CouchDBClient { /// Protocol (URL scheme) that should be used to perform requests to CouchDB. public enum CouchDBProtocol: String { - /// Use HTTP protocol. + /// HTTP protocol. case http - /// Use HTTPS protocol. + /// HTTPS protocol. case https } // MARK: - Public properties - /// Flag if did authorize in CouchDB. + /// Flag if authorized in CouchDB. public var isAuthorized: Bool { authData?.ok ?? false } - /// You can set timeout for requests in seconds. Default value is 30. + /// You can set a timeout for requests in seconds. Default value is 30. public var requestsTimeout: Int64 = 30 // MARK: - Private properties @@ -84,9 +84,9 @@ public class CouchDBClient { private var couchPort: Int = 5984 /// Base URL. private var couchBaseURL: String = "" - /// Session cookie for requests that needs authorization. + /// Session cookie for requests that need authorization. internal var sessionCookie: String? - /// Session cookie as Cookie struct + /// Session cookie as Cookie struct. internal var sessionCookieExpires: Date? /// CouchDB user name. private var userName: String = "" @@ -149,7 +149,7 @@ public class CouchDBClient { // MARK: - Public methods - /// Get DBs list. + /// Get a database list. /// /// Example: /// ```swift @@ -157,7 +157,7 @@ public class CouchDBClient { /// ``` /// /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Array of strings containing DBs names. + /// - Returns: Array of strings containing database names. public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -194,7 +194,7 @@ public class CouchDBClient { return try JSONDecoder().decode([String].self, from: data) } - /// Check if DB exists + /// Check if database exists. /// /// Example: /// @@ -203,7 +203,7 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: True or false. public func dbExists(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Bool { @@ -234,7 +234,7 @@ public class CouchDBClient { return response.status == .ok } - /// Create DB. + /// Create a database. /// /// Example: /// ```swift @@ -242,9 +242,9 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. + /// - Returns: Creation response. @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -293,7 +293,7 @@ public class CouchDBClient { } } - /// Delete DB. + /// Delete a database. /// /// Example: /// ```swift @@ -301,9 +301,9 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. + /// - Returns: Deletion response. @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -352,14 +352,14 @@ public class CouchDBClient { } } - /// Get data from DB. + /// Get data from a database. /// /// Examples: /// - /// Define your document model: + /// Define your document data model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -387,9 +387,9 @@ public class CouchDBClient { /// ) /// ``` /// - /// You can also provide CouchDB view document as uri and key in query. + /// You can also provide a CouchDB view document as uri and key in the query. /// - /// Get data and parse RowsResponse: + /// Get data and parse `RowsResponse`: /// ```swift /// let response = try await couchDBClient.get( /// fromDB: "databaseName", @@ -413,11 +413,11 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - uri: URI (view or document id). /// - query: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. + /// - Returns: Response. public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -453,14 +453,14 @@ public class CouchDBClient { return response } - /// Get a document from DB. It will parse JSON using provided generic type. Check an example in Discussion. + /// Get a document from a database. It will parse JSON using the provided generic type. Check an example in Discussion. /// /// Example: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -469,17 +469,17 @@ public class CouchDBClient { /// /// Get document by ID: /// ```swift - /// // get data from DB by document ID + /// // get data from the database by document ID /// let doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - uri: URI (view or document id). /// - queryItems: Request query items. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: An object or a struct (of generic type) parsed from JSON. - public func get (fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + public func get (fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { @@ -508,22 +508,22 @@ public class CouchDBClient { } } - /// Find data in DB by selector. + /// Find data in a database by selector. /// /// Example: /// /// ```swift - /// // find documents in DB by selector + /// // find documents in the database by selector /// let selector = ["selector": ["name": "Sam"]] /// let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) /// ``` /// /// - Parameters: - /// - in dbName: DB name. - /// - selector: Codable representation of json selector query. + /// - in dbName: Database name. + /// - selector: Codable representation of the JSON selector query. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Array of documents [T]. - public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + /// - Returns: Array of `[T]` documents. + public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: selectorData)) @@ -556,7 +556,7 @@ public class CouchDBClient { } } - /// Find data in DB by selector. + /// Find data in a database by selector. /// /// Example: /// ```swift @@ -568,10 +568,10 @@ public class CouchDBClient { /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs /// ``` /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. + /// - Returns: Response. public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -608,14 +608,14 @@ public class CouchDBClient { return response } - /// Update data in DB. + /// Update data in a database. /// /// Examples: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -623,17 +623,17 @@ public class CouchDBClient { /// ``` /// Get document by ID and update it: /// ```swift - /// // get data from DB by document ID + /// // get data from the database by document ID /// var response = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") /// /// // parse JSON /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! /// var doc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) /// - /// // Update value + /// // update some value /// doc.name = "Updated name" /// - /// // encode document into JSON string + /// // encode document into a JSON string /// let data = try encoder.encode(updatedData) /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: data)) /// @@ -648,7 +648,7 @@ public class CouchDBClient { /// /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - uri: URI (view or document id). /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. @@ -701,22 +701,22 @@ public class CouchDBClient { } } - /// Update document in DB. That method will mutate `doc` to update it's `_rev` with the value from CouchDB response. + /// Update document in a database. That method will mutate `doc` to update its `_rev` with the value from CouchDB response. /// /// Examples: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? /// } /// ``` - /// Get document by ID and update it: + /// Get a document by ID and update it: /// ```swift - /// // get data from DB by document ID + /// // get data from the database by document ID /// var doc: ExpectedDoc = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") /// print(doc) /// @@ -732,11 +732,11 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. That method will mutate `doc` to update it's `_id` and `_rev` properties from insert request. - /// - doc: Document object/struct. Should confirm to ``CouchDBRepresentable`` and Codable protocols. + /// - dbName: Database name. That method will mutate `doc` to update its `_id` and `_rev` properties from insert request. + /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Update response. - public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { guard let id = doc._id else { throw CouchDBClientError.idMissing } guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } @@ -761,14 +761,14 @@ public class CouchDBClient { doc._id = updateResponse.id } - /// Insert data in DB. Accepts HTTPClientRequest.Body as body parameter. + /// Insert data in a database. Accepts `HTTPClientRequest.Body` as body parameter. /// /// Examples: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -791,10 +791,10 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - body: Request body data. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Insert request response. + /// - Returns: Insertion response. public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -844,14 +844,14 @@ public class CouchDBClient { } } - /// Insert document in DB. That method will mutate `doc` to update it's `_id` and `_rev` with the values from CouchDB response. + /// Insert document in a database. That method will mutate `doc` to update its `_id` and `_rev` with the values from CouchDB response. /// /// Examples: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -871,10 +871,10 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. - /// - doc: Document object/struct. Should confirm to ``CouchDBRepresentable`` protocol. + /// - dbName: Database name. + /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy let insertEncodeData = try encoder.encode(doc) @@ -895,7 +895,7 @@ public class CouchDBClient { doc._id = insertResponse.id } - /// Delete document from DB by URI. + /// Delete a document from a database by URI. /// /// Examples: /// @@ -904,7 +904,7 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. + /// - dbName: Database name. /// - uri: document uri (usually _id). /// - rev: document revision. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. @@ -946,7 +946,7 @@ public class CouchDBClient { return try JSONDecoder().decode(CouchUpdateResponse.self, from: data) } - /// Delete document from DB. + /// Delete a document from a database. /// /// Examples: /// @@ -955,8 +955,8 @@ public class CouchDBClient { /// ``` /// /// - Parameters: - /// - dbName: DB name. - /// - doc: Document object/struct. Should confirm to ``CouchDBRepresentable`` protocol. + /// - dbName: Database name. + /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. /// - Returns: Delete request response. public func delete(fromDb dbName: String, doc: CouchDBRepresentable, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { From cc290e1fa3002753352b6adcebf07bd4b3996319 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 22:57:23 +0300 Subject: [PATCH 053/202] docs and refactoring --- README.md | 12 ++++++------ .../Tutorials/macOS/macOSTutorial-4.swift | 2 +- .../Tutorials/macOS/macOSTutorial-5.swift | 2 +- .../Tutorials/macOS/macOSTutorial-6.swift | 2 +- .../Tutorials/macOS/macOSTutorial-7.swift | 2 +- .../Tutorials/macOS/macOSTutorial-8.swift | 2 +- .../Tutorials/macOS/macOSTutorial.tutorial | 2 +- .../CouchDBClient/Models/CouchDBFindResponse.swift | 2 +- Tests/CouchDBClientTests/CouchDBClientTests.swift | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 4b867f9..c02d456 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This is a simple lib to work with CouchDB in Swift. -- Latest version is based on async/await and requires Swift 5.6 and newer. Works with Vapor 4.50 and newer. +- Latest version is based on async/await and requires Swift 5.7.1 or newer. Works with Vapor 4.50 and newer. - Version 1.0.0 can be used with Vapor 4 without async/await. Swift 5.3 is required - You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. @@ -55,7 +55,7 @@ let couchDBClient = CouchDBClient( ) ``` -If you don’t want to have your password in the code you can pass COUCHDB_PASS param in your command line. For example you can run your Server Side Swift project: +If you don’t want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. For example you can run your Server Side Swift project: ```bash COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run ``` @@ -76,7 +76,7 @@ Define your document model: ```swift // Example struct -struct ExpectedDoc: CouchDBRepresentable, Codable { +struct ExpectedDoc: CouchDBRepresentable { var name: String var _id: String? var _rev: String? @@ -98,7 +98,7 @@ print(testDoc) // testDoc has _id and _rev values now ### Update data ```swift -// get data from DB by document ID +// get data from a database by document ID var doc: ExpectedDoc = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") print(doc) @@ -121,7 +121,7 @@ let response = try await couchDBClient.delete(fromDb: "databaseName", doc: doc) let response = try await couchDBClient.delete(fromDb: "databaseName", uri: doc._id,rev: doc._rev) ``` -Get all DBs example: +Get all databases example: ```swift let dbs = try await couchDBClient.getAllDBs() @@ -129,7 +129,7 @@ print(dbs) // prints: ["_global_changes", "_replicator", "_users", "yourDBname"] ``` -Find documents in DB by selector: +Find documents in a database by selector: ```swift let selector = ["selector": ["name": "Sam"]] let docs: [ExpectedDoc] = try await couchDBClient.find(in: "databaseName", selector: selector) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift index 409aa4b..dfe5228 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift @@ -11,7 +11,7 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" -struct MyDoc: CouchDBRepresentable, Codable { +struct MyDoc: CouchDBRepresentable { var _id: String? var _rev: String? var title: String diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift index 53b56fd..54a647c 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift @@ -11,7 +11,7 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" -struct MyDoc: CouchDBRepresentable, Codable { +struct MyDoc: CouchDBRepresentable { var _id: String? var _rev: String? var title: String diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift index e8e4c81..1307d3b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift @@ -11,7 +11,7 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" -struct MyDoc: CouchDBRepresentable, Codable { +struct MyDoc: CouchDBRepresentable { var _id: String? var _rev: String? var title: String diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift index a0ab1b3..533ca10 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift @@ -11,7 +11,7 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" -struct MyDoc: CouchDBRepresentable, Codable { +struct MyDoc: CouchDBRepresentable { var _id: String? var _rev: String? var title: String diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift index a0d6a01..aa1672e 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift @@ -11,7 +11,7 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" -struct MyDoc: CouchDBRepresentable, Codable { +struct MyDoc: CouchDBRepresentable { var _id: String? var _rev: String? var title: String diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index 6cd9d2d..6f60572 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -38,7 +38,7 @@ } @Step { - Define a model for your CouchDB document. It should conform to `Codable` and `CouchDBRepresentable` protocols. + Define a model for your CouchDB document. It should conform to the `CouchDBRepresentable` protocol. @Code(name: "main.swift", file: macOSTutorial-4.swift) } diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index cd40015..dc5b045 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -7,7 +7,7 @@ import Foundation -public struct CouchDBFindResponse: Codable { +public struct CouchDBFindResponse: Codable { var docs: [T] var bookmark: String? } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 6da3631..7e04c4a 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -6,7 +6,7 @@ import AsyncHTTPClient final class CouchDBClientTests: XCTestCase { - struct ExpectedDoc: CouchDBRepresentable, Codable { + struct ExpectedDoc: CouchDBRepresentable { var name: String var _id: String? var _rev: String? From d8343b1a200b185dec6a5db5138ef2418bfc398f Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 23:02:20 +0300 Subject: [PATCH 054/202] Tutorials updated --- .../ErrorsHandlingTutorial.tutorial | 6 +-- .../Tutorials/macOS/macOSTutorial.tutorial | 50 +++++++++---------- .../Tutorials/vapor/VaporTutorial.tutorial | 46 ++++++++--------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial index 313adfa..6af9e6f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial @@ -1,13 +1,13 @@ @Tutorial(time: 3) { @Intro(title: "Handling CouchDB errors") { - Use CouchDBClient in macOS app + Use CouchDBClient in a macOS app @Image(source: chapter1.png, alt: "Application icon") } - @Section(title: "Use CouchDBClient in macOS app") { + @Section(title: "macOS app example") { @ContentAndMedia { - Use CouchDBClient in macOS app + Use CouchDBClient in a macOS app @Image(source: chapter1.png, alt: "Application icon") } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index 6f60572..f894b6d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -1,29 +1,29 @@ @Tutorial(time: 10) { - @Intro(title: "Using in macOS app") { + @Intro(title: "Using in macOS app") { Learn how to use CouchDBClient in your macOS app - + @Image(source: chapter1.png, alt: "Application icon") - } - - @Section(title: "Initializaton") { - @ContentAndMedia { + } + + @Section(title: "Initialization") { + @ContentAndMedia { Adding CouchDBClient to your project. - - @Image(source: chapter1.png, alt: "Application icon") - } - - @Steps { - @Step { + + @Image(source: chapter1.png, alt: "Application icon") + } + + @Steps { + @Step { Add `CouchDBClient` as a Swift Package dependency. - - @Image(source: macOSTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") - } - - @Step { - Here's an example app. - - @Code(name: "main.swift", file: macOSTutorial-1.swift) - } + + @Image(source: macOSTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") + } + + @Step { + Here's an example app. + + @Code(name: "main.swift", file: macOSTutorial-1.swift) + } @Step { Import `CouchDBClient`. @@ -56,13 +56,13 @@ } @Step { - Getting a document by its `_id` from DB with that method will parse JSON into your model if you provide it as a generic type. + Getting a document by its `_id` from a database with that method will parse JSON into your model if you provide it as a generic type. @Code(name: "main.swift", file: macOSTutorial-7.swift) } @Step { - Deleting a document from DB is also easy. + Deleting a document from a database is also easy. @Code(name: "main.swift", file: macOSTutorial-8.swift) } @@ -72,6 +72,6 @@ @Image(source: macOSTutorial-2.png, alt: "Add CouchDBClient as a Swift Package dependency.") } - } - } + } + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index 386d729..b4e2fed 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -1,29 +1,29 @@ @Tutorial(time: 15) { - @Intro(title: "Using with Vapor in server-side app") { + @Intro(title: "Using with Vapor in server-side app") { Use CouchDBClient for developing server-side apps built with Vapor. - + @Image(source: chapter1.png, alt: "Application icon") - } - - @Section(title: "Use CouchDBClient in macOS app") { - @ContentAndMedia { + } + + @Section(title: "Use CouchDBClient in macOS app") { + @ContentAndMedia { Vapor is built on top of Apple's [SwiftNIO](https://github.com/apple/swift-nio). `CouchDBClient` is compatible with SwiftNIO and can be used for server-side development. - - @Image(source: chapter1.png, alt: "Application icon") - } - - @Steps { - @Step { + + @Image(source: chapter1.png, alt: "Application icon") + } + + @Steps { + @Step { Add `CouchDBClient` as a Swift Package dependency. - - @Image(source: VaporTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") - } - - @Step { + + @Image(source: VaporTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") + } + + @Step { Open `routes.swift` in your Vapor project. - - @Code(name: "main.swift", file: VaporTutorial-1.swift) - } + + @Code(name: "main.swift", file: VaporTutorial-1.swift) + } @Step { Import `CouchDBClient` and create a client instance. @@ -38,7 +38,7 @@ } @Step { - Get your document from DB. That example is using `CouchDB View` to find the document by the url field. Its map function needs a `key` param which is `appUrl` in our case. + Get your document from a database. That example is using `CouchDB View` to find the document by the url field. Its map function needs a `key` param which is `appUrl` in our case. @Code(name: "main.swift", file: VaporTutorial-4.swift) } @@ -54,6 +54,6 @@ @Code(name: "main.swift", file: VaporTutorial-6.swift) } - } - } + } + } } From 952f8e2636daec7dbf6d72899c5b30c6fe728159 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 23:03:41 +0300 Subject: [PATCH 055/202] docs --- Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index 0a95d58..64f10e9 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -15,7 +15,7 @@ Currently CouchDBClient supports: - Create DB. - Delete DB. - Get databases list. -- Get document by id or documents using view. +- Get a document by id or documents using a view. - Insert/update documents. - Find documents by selector. - Delete documents. From 093c7c336f3e89f4b0b199123241ffe8d5601abc Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 23:21:57 +0300 Subject: [PATCH 056/202] platforms list updated --- Package.swift | 2 +- Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 3c96474..915f47e 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,7 @@ import PackageDescription let package = Package( name: "couchdb-vapor", - platforms: [.macOS(.v10_15), .iOS(.v13)], + platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library(name: "CouchDBClient", targets: ["CouchDBClient"]), diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index 64f10e9..b5bc23f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -6,7 +6,7 @@ A simple CouchDB client written in Swift. Source code is available on [GitHub](https://github.com/makoni/couchdb-vapor). -CouchDBClient allows you to make simple requests to CouchDB. It's using Swift Concurrency (async/await) and supports Linux, iOS 13+ and macOS 10.15+. +CouchDBClient allows you to make simple requests to CouchDB. It's using Swift Concurrency (async/await) and supports Linux, iOS 13+, iPadOS 13+, tvOS 13+, watchOS 6+, visionOS 1.0+ and macOS 10.15+. It's using [AsyncHTTPClient](https://github.com/swift-server/async-http-client) which makes it easy to use CouchDBClient for server-side development with Vapor 4. But it's easy to use it with any iOS or macOS app. Check the Essentials section for examples. From 79bd6570cbb8050a78237db44bc5a47cc33b2bb0 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 23:38:21 +0300 Subject: [PATCH 057/202] minimum swift version 5.8 --- Package.swift | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 915f47e..27c9a46 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.7.1 +// swift-tools-version:5.8 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription diff --git a/README.md b/README.md index c02d456..b09e7c1 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This is a simple lib to work with CouchDB in Swift. -- Latest version is based on async/await and requires Swift 5.7.1 or newer. Works with Vapor 4.50 and newer. +- Latest version is based on async/await and requires Swift 5.8 or newer. Works with Vapor 4.50 and newer. - Version 1.0.0 can be used with Vapor 4 without async/await. Swift 5.3 is required - You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. From e1737a79a77a87f31887bb615845a9e8058dda88 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Sun, 7 Apr 2024 23:41:04 +0300 Subject: [PATCH 058/202] workflow updated --- .github/workflows/build-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index bb991a2..e76defe 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{matrix.swift}} strategy: matrix: - swift: [5.9, 5.8.1, 5.7.3] + swift: [5.10, 5.9, 5.8] runs-on: ubuntu-latest container: image: swift:${{matrix.swift}} From 2a6c9641899cf4ff7509691af5f1a9db68293ca4 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 7 Apr 2024 23:43:38 +0300 Subject: [PATCH 059/202] Update build-ubuntu.yml --- .github/workflows/build-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index e76defe..5eeb04c 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{matrix.swift}} strategy: matrix: - swift: [5.10, 5.9, 5.8] + swift: ["5.10", "5.9", "5.8"] runs-on: ubuntu-latest container: image: swift:${{matrix.swift}} From 04bcd15d2fc4cb608fabc3b2d41cbe1a19ddc319 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 7 Apr 2024 23:49:58 +0300 Subject: [PATCH 060/202] Update build-macos.yml --- .github/workflows/build-macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 6528098..1b848ce 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -12,7 +12,7 @@ on: jobs: macOS: name: Build on macOS - runs-on: macOS-latest + runs-on: macOS-14 steps: - name: Print Swift version run: swift --version From a70d23ea1f9567b8f846931c217e885c5bfe3d03 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Mon, 8 Apr 2024 00:08:23 +0300 Subject: [PATCH 061/202] import NIOFoundationCompat to fix building on Ubuntu --- Sources/CouchDBClient/CouchDBClient.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 2e9d625..a9146e2 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -8,6 +8,7 @@ import Foundation import NIO import NIOHTTP1 +import NIOFoundationCompat import AsyncHTTPClient /// CouchDB client errors. From 7acc1b63ca0f3f6f007214ae67c4e0612103ef53 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Mon, 8 Apr 2024 17:40:00 +0300 Subject: [PATCH 062/202] using async-http-client from 1.21.0. Not calling http --- Package.resolved | 4 ++-- Package.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Package.resolved b/Package.resolved index a2013f7..422111b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "291438696abdd48d2a83b52465c176efbd94512b", - "version" : "1.20.1" + "revision" : "fb308ee72f3d4c082a507033f94afa7395963ef3", + "version" : "1.21.0" } }, { diff --git a/Package.swift b/Package.swift index 27c9a46..e57410c 100644 --- a/Package.swift +++ b/Package.swift @@ -11,7 +11,7 @@ let package = Package( .library(name: "CouchDBClient", targets: ["CouchDBClient"]), ], dependencies: [ - .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.0.0"), + .package(url: "https://github.com/swift-server/async-http-client", from: "1.21.0"), .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0") ], targets: [ From c9ec8c1338ec233dd99e16796ea1d1a5bcfb4e9a Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Mon, 8 Apr 2024 17:40:49 +0300 Subject: [PATCH 063/202] Using HTTPClient.shared if eventLoopGroup not provided. No more calls httpClient.syncShutdown() if using shared singleton --- .../CouchDBClient/CouchDB+Deprecated.swift | 16 ++-- Sources/CouchDBClient/CouchDBClient.swift | 80 ++++++++++++------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift index 3ef03e5..fb253f3 100644 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ b/Sources/CouchDBClient/CouchDB+Deprecated.swift @@ -64,12 +64,14 @@ extension CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -110,12 +112,14 @@ extension CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index a9146e2..34039fd 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -166,12 +166,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -214,12 +216,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -253,12 +257,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -312,12 +318,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -426,12 +434,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -580,12 +590,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -661,12 +673,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -803,12 +817,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -915,12 +931,14 @@ public class CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } @@ -1006,12 +1024,14 @@ internal extension CouchDBClient { if let eventLoopGroup = eventLoopGroup { httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) } else { - httpClient = HTTPClient(eventLoopGroupProvider: .singleton) + httpClient = HTTPClient.shared } defer { - DispatchQueue.main.async { - try? httpClient.syncShutdown() + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } } } From 860450046adea23d2e0beb5f2bb9b47d0fb26009 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Thu, 11 Apr 2024 22:15:31 +0300 Subject: [PATCH 064/202] docs updated --- README.md | 2 +- .../CouchDBClient.docc/Resources/errors.svg | 11 ++++ .../Resources/errors@3x.png | Bin 0 -> 39623 bytes .../CouchDBClient.docc/Resources/logo.svg | 49 ++++++++++++++++++ .../CouchDBClient.docc/Resources/logo@3x.png | Bin 85068 -> 0 bytes .../CouchDBClient.docc/Resources/macbook.svg | 11 ++++ .../ErrorsHandlingTutorial-1.swift | 2 +- .../ErrorsHandlingTutorial-2.swift | 2 +- .../ErrorsHandlingTutorial-3.swift | 2 +- .../ErrorsHandlingTutorial-4.swift | 2 +- .../ErrorsHandlingTutorial.tutorial | 6 +-- .../Tutorial Table of Contents.tutorial | 4 +- .../Tutorials/macOS/macOSTutorial-7.swift | 2 +- .../Tutorials/macOS/macOSTutorial-8.swift | 2 +- 14 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/errors.svg create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/logo.svg delete mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/logo@3x.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/macbook.svg diff --git a/README.md b/README.md index 5e7f5e6..d6e4621 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ print(testDoc) // testDoc has _id and _rev values now ```swift // get data from a database by document ID -var doc: ExpectedDoc = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") +var doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") print(doc) // Update value diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors.svg b/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors.svg new file mode 100644 index 0000000..6ce173e --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors.svg @@ -0,0 +1,11 @@ + + + exclamationmark.triangle + + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d005aaff93ff5dfb3940b17127ebc1143f0560 GIT binary patch literal 39623 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%0ADM~XteOJ`8_#VAW+iBo+ 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

P*rqq$= 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�j=-DVpupe{EUVE#OLx>gwIq;f(h{?;vd5%KZ7= z)aS9r_ynyHg_+uSSuxI9-~~D{|_&_>c&5oab5~gnVmiOd#1-sYfwx z322nr7_1&2w#Gh?=LF)t&SQwF6rUUV?<_vSX4GBSH2QKM9Og8|-~#`r8K{^i{Ng{d zO^mGuWv1on44m$JNb?`st9hbJoPM68XJ>vZjPiYk47;ozud6kFjX|x9{^39WuGVLF z;WFmhtel=e_c}66GrcVx%-gl_M%n}oQ#U_+ta0#n@FMv}J$29<>OMrSEIu7<4k}?5 zInZnDix{6R`vQ0x?mh2pdC^mceB~UON-1{}eENS@U<|`RoO?>=w=StYWn*O}Ig+^k z{9K;OrK*mKf=9n+K>Ova&@5%aI#R#v&3E_CsR~v`f4&k|{3o>Sdcnvam+YBx|L*C3 zt6x9la?5h>DS1eC`mn!RmBT(~>GhWV4ImO^sKB2(V5M_Dc)eE6u@JeGm?$l{mD5lX zUtY%jYE)>$H=kIRg*x(mv_5;v+pQa&gEH;#HFM{b=7br_N-UO_=h=!$&=z}G1&-x9 z-^J%UHES1&92{d@XsZt8fWOzq~E(g^d%+*uGJmJxg&kF!g4c6~>q%#XImMU4Jh@ z7L_eurto$>6SL0wmaC`?L`w8ZGunS}ytDXPv9_A8?X^Me%*&fMRDfS-pOBL5Yu}63 zlnWkYS%}9yLCd}j9{rEJ55TC2&6V*h^I^kDl&;}~>MTa%s%7oKTUiHa>Al~22F@@H zvP>jwbHa!{=0PPpvGW$)gzNyAW&3+iCeT>fK@~r0kBj-?76rW40hIq;r^Mz_<3gi{fN*x)TB0nPghmkKY z%LaW1p(2ukMk`vGrxdK`-qvk$+?65HyXE_61S0s%uw;@I@}ycz>J+GUkg;w~0YcYc%0ig7B>Sj-sVHgLBp^L_v}SF5Nc z4L^Ok8J?|X1rrOiR`1l&3Vavat@C6-H(SNpIb*PiGvs-?GskqoU!*|s3!69=3hrg( zgKIdCs*86@fhBS!e`bCyVf`VES7e!ksM8V*}3WSw4%_`ok7^7 zfY`vF|D0cozW3GtO2tOnt5z8Zd5*4{tHIa6J8KE|G*6eNUOA#p4Xt)WpSDb?OueJC z$*36(-SeatRkN~FyC!wl#w}45q>57WgH#v16bJcTMcC_&t&fVORt=j{z0k3Uiqk)e zLajk_iiqM-Yn<>}%9D~cQYI;8ll|)4yJ8hnd0a2DqT+hE*TqT`lwyBmm5b@rX|y

vXCJBCdlWeQQ$dz9y&Cw|BL@ddj3KyD|}kj zLgNsG)3}~zFqVZ=FN{pHc%aHdM&MR*j20i*jz>RA~W(Lh|M0^ zIKQ*1`I*C)VWK3VSF>IbL|01GF;;_p6x8_x!y&Qh$1QvB+=d0Q`a0h%4T-@$S==RB zGu3I*485HG+fM_vZ)Eiq1r0s5x{$tNW=|PwMt@?!=-6((8j>pevPS!!(M{X(f(piE za%rx*jKeT4qqA+ib04bh*;AluPselS zw*gt(zfA1bqp0y_n53LP;y$Rb$(RGYQRi=dNA~4h3uL!$By)3^u>w{dY?1owR%Bp^ z0e-f+pX0tTwv)WZzG-u`+qa@_r08?1$<%+%%&PKPiR=rn^B`OH7?b4e@IY zwo$~rmqk`YH02y98 + + logo + + + + + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/logo@3x.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/logo@3x.png deleted file mode 100644 index 1599a94ba5bc2bf1c87e10a3e72973995833ac3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85068 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

T=%&>ANk5e)MtM+H3gu1 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 diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/macbook.svg b/Sources/CouchDBClient/CouchDBClient.docc/Resources/macbook.svg new file mode 100644 index 0000000..b181c65 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Resources/macbook.svg @@ -0,0 +1,11 @@ + + + macbook + + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift index fc58854..ed19d18 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift @@ -8,7 +8,7 @@ Task { try await couchDBClient.update(dbName: dbName, doc: &doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift index 83b3d65..5d0c975 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift @@ -16,7 +16,7 @@ Task { try await couchDBClient.update(dbName: dbName, doc: &doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift index 01c35d4..0e883b3 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift @@ -24,7 +24,7 @@ Task { } print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift index 833cc24..840aaf2 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift @@ -25,7 +25,7 @@ Task { print(doc) do { - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) } catch CouchDBClientError.getError(let error) { print(error.reason) return diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial index 6af9e6f..c465180 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial @@ -2,14 +2,14 @@ @Intro(title: "Handling CouchDB errors") { Use CouchDBClient in a macOS app - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: errors.svg, alt: "Application icon") } - @Section(title: "macOS app example") { + @Section(title: "Catching errors") { @ContentAndMedia { Use CouchDBClient in a macOS app - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: errors.svg, alt: "Error icon") } @Steps { diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index cec5b4a..f8c37e7 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -2,7 +2,7 @@ @Intro(title: "Getting started") { Check tutorials for using the lib in a macOS app or with Vapor for server-side development. - @Image(source: logo.png, alt: "CouchDBClient logo") + @Image(source: logo.svg, alt: "CouchDBClient logo") } @Chapter(name: "Getting started") { @@ -17,7 +17,7 @@ @Chapter(name: "Errors handling") { Examples of handling CouchDBClient errors and errors from CouchDB. - @Image(source: chapter1.png, alt: "CouchDBClient logo") + @Image(source: errors.svg, alt: "CouchDBClient logo") @TutorialReference(tutorial: "doc:ErrorsHandlingTutorial") } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift index 533ca10..6a3ec12 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift @@ -26,7 +26,7 @@ Task { try await couchDBClient.update(dbName: dbName, doc: &doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) print(docFromDB) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift index aa1672e..0c86289 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift @@ -26,7 +26,7 @@ Task { try await couchDBClient.update(dbName: dbName, doc: &doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(dbName: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) From 49637d216b8a9a52ad9a76cf9f72b9e8dc149d50 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Thu, 11 Apr 2024 22:29:58 +0300 Subject: [PATCH 065/202] docs updated --- .../Resources/chapter1@3x.png | Bin 51934 -> 0 bytes .../Resources/curlybraces.square.fill.svg | 10 ++++++++ .../Resources/errors@3x.png | Bin 39623 -> 0 bytes .../CouchDBClient.docc/Resources/vapor.svg | 22 ++++++++++++++++++ .../Tutorial Table of Contents.tutorial | 2 +- .../Tutorials/macOS/macOSTutorial.tutorial | 4 ++-- .../Tutorials/vapor/VaporTutorial-0.swift | 2 +- .../Tutorials/vapor/VaporTutorial-4.swift | 2 +- .../Tutorials/vapor/VaporTutorial-5.swift | 2 +- .../Tutorials/vapor/VaporTutorial-6.swift | 2 +- .../Tutorials/vapor/VaporTutorial.tutorial | 6 ++--- Sources/CouchDBClient/CouchDBClient.swift | 6 ++--- 12 files changed, 45 insertions(+), 13 deletions(-) delete mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/chapter1@3x.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/curlybraces.square.fill.svg delete mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/vapor.svg diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/chapter1@3x.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/chapter1@3x.png deleted file mode 100644 index a38c93c8d5d0477156012577b995ffc7dc88b70e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51934 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 au0(`#|H0|ZysgXNpUGi!qx^&C@BBaVg^A(- diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/curlybraces.square.fill.svg b/Sources/CouchDBClient/CouchDBClient.docc/Resources/curlybraces.square.fill.svg new file mode 100644 index 0000000..cfb8f36 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Resources/curlybraces.square.fill.svg @@ -0,0 +1,10 @@ + + + curlybraces.square.fill + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/errors@3x.png deleted file mode 100644 index f6d005aaff93ff5dfb3940b17127ebc1143f0560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39623 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%0ADM~XteOJ`8_#VAW+iBo+ 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

P*rqq$= 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�j=-DVpupe{EUVE#OLx>gwIq;f(h{?;vd5%KZ7= z)aS9r_ynyHg_+uSSuxI9-~~D{|_&_>c&5oab5~gnVmiOd#1-sYfwx z322nr7_1&2w#Gh?=LF)t&SQwF6rUUV?<_vSX4GBSH2QKM9Og8|-~#`r8K{^i{Ng{d zO^mGuWv1on44m$JNb?`st9hbJoPM68XJ>vZjPiYk47;ozud6kFjX|x9{^39WuGVLF z;WFmhtel=e_c}66GrcVx%-gl_M%n}oQ#U_+ta0#n@FMv}J$29<>OMrSEIu7<4k}?5 zInZnDix{6R`vQ0x?mh2pdC^mceB~UON-1{}eENS@U<|`RoO?>=w=StYWn*O}Ig+^k z{9K;OrK*mKf=9n+K>Ova&@5%aI#R#v&3E_CsR~v`f4&k|{3o>Sdcnvam+YBx|L*C3 zt6x9la?5h>DS1eC`mn!RmBT(~>GhWV4ImO^sKB2(V5M_Dc)eE6u@JeGm?$l{mD5lX zUtY%jYE)>$H=kIRg*x(mv_5;v+pQa&gEH;#HFM{b=7br_N-UO_=h=!$&=z}G1&-x9 z-^J%UHES1&92{d@XsZt8fWOzq~E(g^d%+*uGJmJxg&kF!g4c6~>q%#XImMU4Jh@ z7L_eurto$>6SL0wmaC`?L`w8ZGunS}ytDXPv9_A8?X^Me%*&fMRDfS-pOBL5Yu}63 zlnWkYS%}9yLCd}j9{rEJ55TC2&6V*h^I^kDl&;}~>MTa%s%7oKTUiHa>Al~22F@@H zvP>jwbHa!{=0PPpvGW$)gzNyAW&3+iCeT>fK@~r0kBj-?76rW40hIq;r^Mz_<3gi{fN*x)TB0nPghmkKY z%LaW1p(2ukMk`vGrxdK`-qvk$+?65HyXE_61S0s%uw;@I@}ycz>J+GUkg;w~0YcYc%0ig7B>Sj-sVHgLBp^L_v}SF5Nc z4L^Ok8J?|X1rrOiR`1l&3Vavat@C6-H(SNpIb*PiGvs-?GskqoU!*|s3!69=3hrg( zgKIdCs*86@fhBS!e`bCyVf`VES7e!ksM8V*}3WSw4%_`ok7^7 zfY`vF|D0cozW3GtO2tOnt5z8Zd5*4{tHIa6J8KE|G*6eNUOA#p4Xt)WpSDb?OueJC z$*36(-SeatRkN~FyC!wl#w}45q>57WgH#v16bJcTMcC_&t&fVORt=j{z0k3Uiqk)e zLajk_iiqM-Yn<>}%9D~cQYI;8ll|)4yJ8hnd0a2DqT+hE*TqT`lwyBmm5b@rX|y

vXCJBCdlWeQQ$dz9y&Cw|BL@ddj3KyD|}kj zLgNsG)3}~zFqVZ=FN{pHc%aHdM&MR*j20i*jz>RA~W(Lh|M0^ zIKQ*1`I*C)VWK3VSF>IbL|01GF;;_p6x8_x!y&Qh$1QvB+=d0Q`a0h%4T-@$S==RB zGu3I*485HG+fM_vZ)Eiq1r0s5x{$tNW=|PwMt@?!=-6((8j>pevPS!!(M{X(f(piE za%rx*jKeT4qqA+ib04bh*;AluPselS zw*gt(zfA1bqp0y_n53LP;y$Rb$(RGYQRi=dNA~4h3uL!$By)3^u>w{dY?1owR%Bp^ z0e-f+pX0tTwv)WZzG-u`+qa@_r08?1$<%+%%&PKPiR=rn^B`OH7?b4e@IY zwo$~rmqk`YH02y98 + + Vapor + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index f8c37e7..bc0dbae 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -8,7 +8,7 @@ @Chapter(name: "Getting started") { Learn how to use CouchDBClient. - @Image(source: chapter1.png, alt: "CouchDBClient logo") + @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient logo") @TutorialReference(tutorial: "doc:macOSTutorial") @TutorialReference(tutorial: "doc:VaporTutorial") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index f894b6d..9e306b4 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -2,14 +2,14 @@ @Intro(title: "Using in macOS app") { Learn how to use CouchDBClient in your macOS app - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: curlybraces.square.fill.svg, alt: "Application icon") } @Section(title: "Initialization") { @ContentAndMedia { Adding CouchDBClient to your project. - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: macbook.svg, alt: "Application icon") } @Steps { diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift index 9c467de..d49994b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift @@ -15,7 +15,7 @@ func routes(_ app: Application) throws { app.get(":appUrl") { req async throws -> View in let response = try await couchDBClient.get( - dbName: "myDB", + fromDB: "myDB", uri: "_design/all/_view/by_url", queryItems: [ URLQueryItem(name: "key", value: "\"\(url)\"") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift index fe6b2cf..385976b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift @@ -14,7 +14,7 @@ func routes(_ app: Application) throws { app.get(":appUrl") { req async throws -> View in let url = req.parameters.get("appUrl")! let response = try await couchDBClient.get( - dbName: "myDB", + fromDB: "myDB", uri: "_design/all/_view/by_url", queryItems: [ URLQueryItem(name: "key", value: "\"\(url)\"") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift index 43ffbb9..97f6212 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift @@ -14,7 +14,7 @@ func routes(_ app: Application) throws { app.get(":appUrl") { req async throws -> View in let url = req.parameters.get("appUrl")! let response = try await couchDBClient.get( - dbName: "myDB", + fromDB: "myDB", uri: "_design/all/_view/by_url", queryItems: [ URLQueryItem(name: "key", value: "\"\(url)\"") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift index 8c3741d..67081a6 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift @@ -14,7 +14,7 @@ func routes(_ app: Application) throws { app.get(":appUrl") { req async throws -> View in let url = req.parameters.get("appUrl")! let response = try await couchDBClient.get( - dbName: "myDB", + fromDB: "myDB", uri: "_design/all/_view/by_url", queryItems: [ URLQueryItem(name: "key", value: "\"\(url)\"") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index b4e2fed..6c4bfc8 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -2,14 +2,14 @@ @Intro(title: "Using with Vapor in server-side app") { Use CouchDBClient for developing server-side apps built with Vapor. - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: curlybraces.square.fill.svg, alt: "Application icon") } - @Section(title: "Use CouchDBClient in macOS app") { + @Section(title: "Use CouchDBClient with Vapor") { @ContentAndMedia { Vapor is built on top of Apple's [SwiftNIO](https://github.com/apple/swift-nio). `CouchDBClient` is compatible with SwiftNIO and can be used for server-side development. - @Image(source: chapter1.png, alt: "Application icon") + @Image(source: vapor.svg, alt: "Application icon") } @Steps { diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 34039fd..0e2b92a 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -379,7 +379,7 @@ public class CouchDBClient { /// ```swift /// // get data from DB by document ID /// var response = try await couchDBClient.get( - /// dbName: "databaseName", + /// fromDB: "databaseName", /// uri: "documentId" /// ) /// @@ -637,7 +637,7 @@ public class CouchDBClient { /// Get document by ID and update it: /// ```swift /// // get data from the database by document ID - /// var response = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") + /// var response = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") /// /// // parse JSON /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! @@ -732,7 +732,7 @@ public class CouchDBClient { /// Get a document by ID and update it: /// ```swift /// // get data from the database by document ID - /// var doc: ExpectedDoc = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") + /// var doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") /// print(doc) /// /// // Update value From a57f6ad6649ab138b3008dd797738444cd9d87e8 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Apr 2024 00:05:38 +0300 Subject: [PATCH 066/202] Vapor tutorial updated --- .../Resources/VaporTutorial-1.png | Bin 307004 -> 0 bytes .../vapor/VaporTutorial-package-1.swift | 28 ++++++++++++++++ .../vapor/VaporTutorial-package-2.swift | 30 ++++++++++++++++++ .../Tutorials/vapor/VaporTutorial.tutorial | 20 ++++++++---- 4 files changed, 71 insertions(+), 7 deletions(-) delete mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/VaporTutorial-1.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/VaporTutorial-1.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/VaporTutorial-1.png deleted file mode 100644 index 29762b49306a5633a3d6fa62e47674ddb66ff855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307004 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 ~h-)A3h8ESx8jA`K7fR?4#hIaOFb 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 SCuD;Mf0X3T$>vI5_WD2eIkgP{ diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift new file mode 100644 index 0000000..c19202d --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift @@ -0,0 +1,28 @@ +// swift-tools-version:5.10 +import PackageDescription + +let package = Package( + name: "spaceinbox.me", + platforms: [ + .macOS(.v13) + ], + dependencies: [ + // 💧 A server-side Swift web framework. + .package(url: "https://github.com/vapor/vapor", from: "4.0.0"), + .package(url: "https://github.com/vapor/leaf", from: "4.0.0"), + ], + targets: [ + .target( + name: "App", + dependencies: [ + .product(name: "Leaf", package: "leaf"), + .product(name: "Vapor", package: "vapor"), + ] + ), + .executableTarget(name: "Run", dependencies: [.target(name: "App")]), + .testTarget(name: "AppTests", dependencies: [ + .target(name: "App"), + .product(name: "XCTVapor", package: "vapor"), + ]) + ] +) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift new file mode 100644 index 0000000..12ff663 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift @@ -0,0 +1,30 @@ +// swift-tools-version:5.10 +import PackageDescription + +let package = Package( + name: "spaceinbox.me", + platforms: [ + .macOS(.v13) + ], + dependencies: [ + // 💧 A server-side Swift web framework. + .package(url: "https://github.com/vapor/vapor", from: "4.0.0"), + .package(url: "https://github.com/vapor/leaf", from: "4.0.0"), + .package(url: "https://github.com/makoni/couchdb-vapor", from: "1.5.0") + ], + targets: [ + .target( + name: "App", + dependencies: [ + .product(name: "Leaf", package: "leaf"), + .product(name: "Vapor", package: "vapor"), + .product(name: "CouchDBClient", package: "couchdb-vapor") + ] + ), + .executableTarget(name: "Run", dependencies: [.target(name: "App")]), + .testTarget(name: "AppTests", dependencies: [ + .target(name: "App"), + .product(name: "XCTVapor", package: "vapor"), + ]) + ] +) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index 6c4bfc8..015bac1 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -13,46 +13,52 @@ } @Steps { + @Step { + Open the `Package.swift` file. + + @Code(name: "Package.swift", file: VaporTutorial-package-1.swift) + } + @Step { Add `CouchDBClient` as a Swift Package dependency. - @Image(source: VaporTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") + @Code(name: "Package.swift", file: VaporTutorial-package-2.swift) } @Step { Open `routes.swift` in your Vapor project. - @Code(name: "main.swift", file: VaporTutorial-1.swift) + @Code(name: "routes.swift", file: VaporTutorial-1.swift) } @Step { Import `CouchDBClient` and create a client instance. - @Code(name: "main.swift", file: VaporTutorial-2.swift) + @Code(name: "routes.swift", file: VaporTutorial-2.swift) } @Step { Define your data model for CouchDB documents. `RowsResponse` model from the `CouchDBClient` library will be used to parse CouchDB responses. - @Code(name: "main.swift", file: VaporTutorial-3.swift) + @Code(name: "routes.swift", file: VaporTutorial-3.swift) } @Step { Get your document from a database. That example is using `CouchDB View` to find the document by the url field. Its map function needs a `key` param which is `appUrl` in our case. - @Code(name: "main.swift", file: VaporTutorial-4.swift) + @Code(name: "routes.swift", file: VaporTutorial-4.swift) } @Step { Parse the response into our data model. - @Code(name: "main.swift", file: VaporTutorial-5.swift) + @Code(name: "routes.swift", file: VaporTutorial-5.swift) } @Step { Finally pass the data to Leaf for template rendering. - @Code(name: "main.swift", file: VaporTutorial-6.swift) + @Code(name: "routes.swift", file: VaporTutorial-6.swift) } } } From 819060333ddd8dea969a210ab403042fe6d5c322 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Apr 2024 01:27:44 +0300 Subject: [PATCH 067/202] A SwiftUI tutorial --- .../CouchDBClient.docc/Resources/swift.svg | 10 +++ .../Resources/swiftui-example-1.png | Bin 0 -> 562898 bytes .../Resources/swiftui-example-2.png | Bin 0 -> 937766 bytes .../Tutorials/SwiftUI/SwiftUITutorial-1.swift | 14 ++++ .../Tutorials/SwiftUI/SwiftUITutorial-2.swift | 15 ++++ .../Tutorials/SwiftUI/SwiftUITutorial-3.swift | 25 +++++++ .../Tutorials/SwiftUI/SwiftUITutorial-4.swift | 31 ++++++++ .../Tutorials/SwiftUI/SwiftUITutorial-5.swift | 58 +++++++++++++++ .../Tutorials/SwiftUI/SwiftUITutorial-6.swift | 69 ++++++++++++++++++ .../SwiftUI/SwiftUITutorial.tutorial | 65 +++++++++++++++++ .../Tutorial Table of Contents.tutorial | 1 + .../Tutorials/macOS/macOSTutorial.tutorial | 6 +- 12 files changed, 291 insertions(+), 3 deletions(-) create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/swift.svg create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-1.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-2.png create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/swift.svg b/Sources/CouchDBClient/CouchDBClient.docc/Resources/swift.svg new file mode 100644 index 0000000..d20f0db --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Resources/swift.svg @@ -0,0 +1,10 @@ + + + swift + + + + + + + \ No newline at end of file diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-1.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbcb684cffcbbc8466783e97cacf902a0e954e6 GIT binary patch literal 562898 zcmeFYXIK+m7d8quP*kuYQUam^N)b?yIw~q4O+^KiqJ$zsKzdC^MFph<1VN=lrHP94 zqLheKL7E^PB7|NH5D2L=XM)f3zVCIuf9EE*k3TNnZ5waB^{T$=G zLoTbNbge)3T9D_|J(;j18T<3+9#tPb<^u%>`>*e>_WNb~ex+>@?mr&D)>ib{z0q^O z5_@ifoEkxvH6f;^X+l1!R~4VC9k8EswvFd%=obED_;-C5rkZC{#LZxt9-x&X7M#I7r{(2SUM>7Jx0)|_o_-=werssH5EfmsXLF<9T8gH+*k$#PyEeS7FCt}V4P9iUnXY7zN^sdSQR4zq}Q~GqST7^N|1n4Rem4Clp^t0 zr$U6rS#^z*qq{Ge#($GgAD`S{7-$}zLfvA&$9wT%NSV|)GvJFXaKuzX#`Z?f0azg#efT&^=B z_a<&3{BBD7xiTHAiw7aOrn~JMSJvZXKFv0pJplj8m(Ztt2X_~lL{5Unsh}3cK#JS^o@{Nr@vQ$Te@0&RbeBPcmWg2bT%40xOTI%UZ zy4~l$zQYA>RiLlu$xW!Pu9hZ!j@ipY`&``sFZj2<;swN;c#^e#JP#Kb6I0X?`hDZf zHeHvXulz4~UCSh7es9sfuf)$ICAqWq{=s9L&l5JUe%@!izVK_v#jO{rx8&`;a?j-E z(caCpdz{xh#5T%Qi`?B|y{V_#rY!hNwLrVz@clOa2QflN&gd-*p=;OW>m>_q8jac@ zdCOqyvxn&iM8bt)B@1IV8psuF$v#ygd7@Ew?3mY14ZP2R(%3KqrKSChhxYHbynnR+ zZNk*;`1>jy7msgG33qyJ-f_l9>dRII{SO^Ox7P>ltPHo+FK-u~;@Nb}(U?!QdQN#$ z{kH@84)Wr=(B64FKW_a{Ka=MaK*+VXu|&~!$c!FOjvlBH7mI8lTZbIc<+FQg@mp(g zQ^hvoQ=pc$=&|8Q^}U<=3zB)8$(uzUx;(T$BXUb?L}=uANWz!Rl<>1}w|6|9+C->3 zXusF? z8K*KF4!yY?d->&0#SHQVi}+MI?BNe_3XKwD1}b>%(2C@Ws6peZvwseQnYS-~l(mgN zd10@kZbtHDeGQY(`hjU5Kf1l2`y`ele=#-7`cs7kBY8=09Dn51k&+|w&v);6(xmcS z{D{mI_YW0sE@vlPvAd&kg778sx}MHC>?zLc3+BET9X~8xnS6ikz1ln5OW5r5*9tG9 z-d3Dgl zsD;NQb>d7*&a15BsLo@rM54}-f9`EB=`ij5QXGE$+I6=a`JBr+I@iUobNXNPxAt%D z?<_uAjCb*$zNwj@>6RjvGOo$;b)O2^f9vD}jR%1J_wX+}EY4T-h-c4!Xzo$y$myy4 z#4^Nx5`LYSQ+he~5~WJ_lg9^C4qyVNK`xxC*z3|d`d<18k%PceH1D08u0rTzoi{(6 zF0a1#CiYg$o5s79BXTvm(&Ex~Y4T|&&NoB_MY+@u*RLa=s8^_Oo9_2HtP^Hy>XEjZ zwC}}+Bm?7;7d|gS)QVN2)D={6)GIyCE2CdzB;_c(o|sivR})kxING}68XmY+=QS2t zI(v4HR%SeRd^>)i`Fyj)QJbSBSKnOC`K9Cfz8Jr9W%kajtJ+!7$0j8$o06JK-sMDK zGBFwRhqSs{f0^Dat^VY_`&K+lcI4g6CH48Mb1!KdX~i@_aUZd7Vo$~Pi`z!4p;EMi z#-|F?h#Fr`PMmc2uFyK~ZQS_ct#S+6R;y3bGv!Fir>KnRZDLyfZk@drt$wW`lTodu z*0&W$6eFy!+f;q|^7*OFtab3vkD<#$?+4vgiuPTK%!u^Xn&TJ7f0wYd(mKOSZr1PWukBBX`&R)(Xttu~1fZa8HKl*M=NP7RAC~7^CRDRcewc>T4)};A_ za~oXQn1B0f$H2xX0Q?vRf$xlL`%JP3YkGEdk|6z-Tj;(mrms{Jg zCf{F`y2|A0*iBfMxQIKZIM`SOS_XCoQCE(3gV~KA%WS7Dtn3^w7N^f}HVr>MDvDL_ z#;6Ql`7+(U0xmPMSUTz@Q_aposI~- z8g@JE!v2`YBHK7oFQaTs3{6tP^tP9(1*@SnNAEf`T#8G3-cW>B08BNi7U(yPZZ&`1 z-0`F;PDBP(YU*AYe21Owis`_JXX%*{v~~qdbXiUGC3xFTMyIZx1nKL@XUOMzBDT#d z&WGXr8Jvq@uKG2HN{vhshm_R)qi3~ob(2lsKR_03)@Zx(0G-jG$tb#Lse9(&+?TrY zU*1}iv=3Sv{dGwx{`kAOV^vH}0pBLU_i!E~t*W_rwpR}ho5$OuhOj@d>`}wvIHe&0 z!ev5&jwv(v= zTzEG8)5a9pa$hmXn|saQ?fPerdH9e|JCS$5>vjLO-aPes{lEJgHIZ{Xr_J>Y4Uw%m z+RM?=-TStOPm0L}LFB;Zy9QR?JUn|3ao@a#mk%x=_wRMNV(DXPVyubwz$o5w@UVAO z48Yvw-iJp!Koi-;IQra@48XX#dus;h99V0iiR^O^D;w^jB5%@N!mC*3i&UI;Nte zqN0GbQ1A|P_qi3I;O;H`_a^_|=d7bQ+RNpxkBf)9B=^3z>^*#abPgQgKIlKMzu(g_ zz~#SBa`*nHTSy0$xM!4<6^|+X=ibPr+T5d>7hM7z-K@^KV309Go}sI(s(Mm;?SlW~ z)PEoOKbKnm_fnM;s%rmx>HnPie_wjl+tEwU1A{!&NB6%I_Rq!td-9(PwUxMi|DUn= zJJ4%Kk&)KjqOJ6wS<~I(U@>$FnMg60vu0P2Euv=J*SZwspX}c)vcK`BMQiN9&Vd(}_4=yKGR^r!C=y3ZG(g>^4vY?Bl+ihG-JW!=FY{D$sl`1B-JCv;n} z%S`Mno2I_1Ng8Giu;zL+Ce<&`{^)su{=u;Gj#i#vI?-%$-U{*G|G$6#cLe_L2>gE- zfg7m%M>}_avIUc)d=m__L;t*zpeva3T{07wOOJF6>@(AKxX^8NxY&+aLtH8C6Z{iP zv!n5eel99)F7WH}P0MM4o;KF|WA3Q26yP}cJM2aa4L-QGHwGpy))!c_-_#{{j^Q9Lgh^VuwbuP1Q)}%7BG;w^?Lt!F$zw2%gb9YCaNlQIxH@F88 z406+S`YbJ)7}Ay@CA3aUGH>f~|EZlu{MP*IKK;s)nU{Fc$T}wbAT{e#R+rv#p%SLM zIYNHsc4z{7NpAh{a_*b{8r&1P7gnXUok5=4;BJ)bTaG#?-z(uwOMKI*t;^ZcQ1tBcNy zGOlmw=n}bR&NH|LE>M38OmOb!$U?n0c_oYp*V*~i4lZVimV3b6VBX=UfKyVzpi&)* zE2SRn6BH)2?Y>d?y|7fHlSPkxL=XH9QvJ0kvO(Fg{~gJ%@fl(F0}HE!h7x5np(DB3 zOFxOgDZa!7;$qBfkVwyS*KA~7$_Mgp!;awK(ab+ta~?GRqUzp6o zi=O$h`yjnU|K5q(P-U`6Xi9dOewW^+b7Q^_H1%iFJuyf8kH1)uJIWa$FFs@jp&f^{2DW21Ww1RU;qrV8 zaSClI!yvWT@(SjADvg6wB7+o_((7clM6`@>p3J5n@ z?1?;w%%1b&WWA|-VOAZ%vUSu9yUB7lC=8P17S(5Uws2jG>gjuW;e4uat>*S_&Gp9y z-pRD-iDs+(FuUq{`7t|QzwcOIqIO7oV;m&1E1y?saVuB9s&yQ2w#rF5b3rcfe5u0k zgMMSxo0}lFZd01S?XFKza~_a>@GGvm>|K_caE{2&fAcAkO~H}2nA+=0B)?`;oaV>C z$rB^}jqn6moQ3p2$@MhK9#^tYRCFfjJN#!g=bxLx?%k%)+D(y8TKxZWQ%wa}%V?G) zWGVUeZNwR#4b}qbgI+!K7buUaq*d7JJZNA$qhAo|wzRKICd;`?c~4I~v@KeCul;s| zi5k#WkJ{Atdm^ZC*lRYIlgRlFO@K>8MB(k~2;PHc+Hz6KlP}aK9=3&W7f-N(z0F0n z;gVsmMgRXpN}ac&&oz_#B`Gi0>rztyO)yU_y%m*0v=mHLw-HXz0{x&lb|0gV>O9%j zjDx!TpFcjuKX{8jfbQ5&<_+W7d!RVA0`GhBBsIO6<_HD^OgW3nrHd_fe@Bat=PPnV z2frbvZ4gDaRVG2rkOQcWdx+&72c5*|7RE&)-IpY0mxxKeamZ9Dt~Qie{FwZ!UZ`7k zrx+v=K4{M_%wym9hA+sB4UHk^nmNjU_E6U}&Y!H`D|``A-}_+Q*`!c}~Y z7Z@2_7XqonN$?PT2W?|KoZ|W0PPxO$Qa|uxGcu(n$hq>huSI|>S2#+vV~8@AMG0B% z_sCS!T;eLnIZK*()rw;QvufMHrB@dt1+y4?AaNK z2kJ;0mgfdl34_7fOLMZN5RF{2X-?D0Uek$-awHR$7zA*Na}OKw+Hq9h_3F)4(1<5+RQcV_z@uKxl2DkZIC&DAK0Ha z`{K!)vL|Rn#U>@}D;>ZI8#3+|_#&$gOV-_~)znAWc5U<^_sf>VJ(a4+0WS99(|Ru{ zxsS^F#oqu~p6iwPf7D(atX;fz1DxHw(l-BuCqng$&W`rq3(iETZ9Boy#ENWCQ35w3 zZ`PL+vb%8g>kpZQpLFa2wB<)+!OrtY0)Sot94)>KB2b~YrBDY#D&;0WNS-xC- z_$6^u=X~%j9p5p;j@k9BldJs_vqV(gX}|8gHq*u&v4`ANE$|(|Jc+;0L=-C5_5N;q z8v{fmH!Jf>OK?7AvyQB_LW~EWCBDPf(oCFzJfNre)Ruh3w*&mVc5|5H8Cvc~D)hw4 zdGqg+RDQiPCq{kjS)h`pBzhX&g{d|AF*Ct!-?#CWQKZDRzFJ0Q0HxJloSb6$qeQ;(z#6>TVo=-eTafC7+1;AXw%Rw`Ha%vM|D~d8cZN3&c`v_^%ryKtruRZpLMv7byKh5e5w_qVF($>r5 z-_uLc|DG*@o#d@WKPAqY(e!VOzS_4cz{npiz>bLrHtO{e5M$Z`{je-kvqr4S9KNLX zgz_KZC3K}Dt5ItyCaeHZ-Of(pyv)CgDYGpA`cRlBuJ(gUV+}#gv{?T!DM3fB(N<@v zqDT7gBIcj~=-=5>TV~gYUrCskraTK{%5FIGdmn#Z_VGqH+1rDbV8iH7L#qQ1g24i^CYE}ltP?5xl=45IE^AG>ZS=|@+2Fs-?vr`o0kppTd!=Rjxlc_V%)zH~*IUwut0StN{Hm6>N?w5~Sx)^3W z7AtdApQ(OwKRaCGq>i#qcSPSUdIYr#)7D#qHy)E;%t}3l?uvr~qaMSMZwGUrx6q~8 ztr$cWI7(z5q{*<75SX|ZoWp|%@e4!{R~ue(z3^Sy47(V#^MPjAtm3S+?;mN|*Qgt}IUz51bhR~f+O*^;t>yzK^ z@X~W>G>{sY&tk`-bV)$AN(shvyfK%3NdgTBaw12LFKf{Z2lw+$V2<4sm-E?6HG?6% z?;6-_sXnQueM74`}8S1x8j)f)ZTycDAxPl}GF zavG`{xx?`{FyRI#BRkZq5<(U&5b1G3VjTNDPl-BuKF|xLgT7GzoPZb87EHtK8;F&-X{D~Fh0LSKssUo8*K2Kd(JRibvnvEQhK;s~VqK80o>+2b zK$)2^nk%|$%v_q#bWlG`FqK4(UEx<702N%W3`r zu2eCe=DT#Bh|-!eOX0|AmB^J_n5DoJjis56Q&F7QEZffPJ0|fBj4Xg{wTsMj;b7Kn z_jEx5qyl20AUEcT0GtR`Y+p3{toE%z7tI^dpR4HJyT}OYFT)`^4)h6MTwE1%<$9V9 z2D)T3SK+xIPP?@;X6xynkyUHfHk4U7Img~6fd!{np`?9G$SVyN5_LPzUC6cl+@m!u zA>hqzr;XrQ4O1<>z(}i)&YY1_ss8ye&SQPu+2^-3^FKaWnu7m!5Qv6m-(P6m&ueSy zqsuR^zAnk(p!&}2v%^t(AoJp6W^vn%bigNj&io;6!Sf`p`8uPr@=7JoD?9tBK-&4zkD)Gu3WugIgB_P=356W^5s%eIG#M8nD`DSa7hnsS5d&Pr+lsid|KJJu5K5$BF_UGo34( z3~8<{?GTaT`Q6bcdFrD3Lf!cduE5RMFB*L@n`Wy72gam*z1y8Q@ivpwZRd3S%)fMz1T&$&)t)Nik_oTf_rRYk?W+y{ ze1E95XSL`1Nz*RwX=c3|B~nQZ40+rPSIo7ZS|#i*G+ERnDXQLa2-9|pw?Qzr4C03p7?W29Ba6!zsNVs zYmbf8eON%+TYtiweF;%?D@30Bl862v>-qzA66(#S`u}yj8hU|$)Wq8^ryz>q57~xw zV8Jq60?)S5>?-1*1c{(6<536~Ek-Jy8`iCyJHk2bQ&L z9rV?o@JQ-sMeqo``1-^|*?m9N{jul$8_p=<&q)r(A~^*g{i*FG5x8ZsOv0jGw7yPy z`)OwOBzg80wRFB>Mb+KMHXf&J1Xp}&WpTp5St5tPX@;CYN-bRmPK2A`ad-)25ZR=Z zRgN@FfZO0nm=giUJ5u>?Jhkajy2z)-+{)Rq(nn(3LGT1(eGuwsO#}}-MYe0!h#TfR z+1)dnLY8ScMKH;OHMjX4MF|T|BdTr3em}}CYtZkvZO`kC{;gRTb&;Tde)3^ z3Q?(nAkexs!oQroe4C^*-gkR5eidVi3(Y81wUqOw`E0AWz3SOr5~%Z zr!R8Swg;r4C3&Vgz6sa%jJ~~75U(=jYQ>pJH&_m~Xnbs=bmXd;x}5JlmOC^Q&C%i}2+Lgyx8o;}D~DSV(Z%-=t6JkBE7HWKLdo zd{nNiM+9+7KrS?7v8Q^`pWf#BXl3-3GG=YHhytmc76h(5k##x(y}*R3?bKdKiP4Q; zLz|O?meiZTKL4ZwyFt}V#Qqcdug%?F!=b`jw=%heZTCI30tBxm^=?*qe1L?2H2q0@ zOKMpoHB9;Aq=Y%`LvVMz8b*uNTQ&A3jtP!^5Ef}y;}qS0uARPM*xjsJqQw^=SO_#- zbefjpkNl1L=GUP9+2yON^;80HID2QCr}8uZTQ!phG9?)My7FywnjYaRlKkY&e(BF- zkxmM(n76^IKLET&(^Yl3bllI_HZ_K<-hzSp2e8Zk<+7H3y^l;QVRg$1co>`ohXtSy znAaiY{X`nfE-3{2h;xJl57RIEMC(91!yjJt=QytELeGRc zioGc~w1`3x6*#hY^uds%S&#@0{+YT57G4u{()lCMQK)-`3M?(@*DYLdZ!LgW5Hlp#5iEf~fH{>A*x}RUE%?Q(!PLXN&triVuIb{3 zi=!cF%8Nwjm*1qb+q#%PH}l?$a6fy~+QDu2ZRoYc%%R9_GsxKe*;G(p|mF07~ z1%ofl{c?>VNluqEaCiyv;P~aXeQQ81?A%F!74``+ z)L|!L*7}nl-bbQ7C01+xPj=}kun^7-GO4RAg%I@p`cXtP|1005_paIe9l?9S)OpT& zHxq;)UqupQbLI}GCh|wR=e^*`vPG22p+DpAW{Z}kNi5xAPJX2AvOyYdsoirD7>@V} z%ef}>5`&dAWYzfdEG=cV6~)xnJ6=|7&;Q(b190q_Pp2uH0nEIwL&i;q$782H7zftt z>Q840ez9h^p5qiruYcKfY2wYtKS{sZHWEXZwGs=vz+QGINaGrBcpeTUD9n2xX3o1C z;<94gsmoVo5Evn$Cbg>*YpPkO0}CTT^S`nOVf&a#XBYh^@vU|#L`~2a`nLV9sdfa3 z@GqfHecMV%4r~qL*d+NJ10>vJ(-m}{aME&@4D#E$l!ei1fid8T@7;Suh`1;tT8)F#~vz*2`GpdzJq zGH}Kv%jENv4A{0TmO-cro3?B8hGK!DvzWU&O{ZrEjjtD_zkFqZ{# z0K>nTDnWmjBsKLL@owunLE1(}vk%m?2GKe*lc$QRh+}JLEzk@>ZEzh>2i6hm;1p03 z_J!uzq*Xj)6?>Np)9u`|C`uovZ;Z3T{O`1G0ckYPR^s67qHTK#3oxe+bEHRI9PlKO zk6K$mrbvWIU$N=WagIy_-g?;8N1XSxV2lW_utLPsa~pJZ(R~|FtoAQl^t<2Jrh@6} z=rK7hKHsI+@Cz@0dr-E?oJfA`kxhV>I&m*>jCiR{tqmGq`BE~G`l)@sgfQI1foNf6 zco~779%%D^xDd62Z%$2Zou&XXvD|(a0KL2t^U*GAkz_S%0*OE-d|&5ud0hT5Uu%0u zOUI%U*UPw}(Ub?ctZ}4{e2$3OqG~omt!kHuyhoVP$l~mwzoDadY3&AEAa6#nfS;b$ z+ijkl-H2BBBMH73uJc0Ybhuy7s_eoc<~vvhvFVOLvIYD8r-*)Vs%}$qCT`rszQ?(; zvjAuu*b840d=tiJuN&i=kaMFSX!_{|-vApj9|Se5J7$u6E+2C%baR9NTG{=8@V@ym ztZcK<1)Z@ohwx&v9nEhiuPOK{j>QuE7%`ixCrzw<@hUFB1%Tb8V*rp(M&leM^oibY zlme&HslXGcvlie`Uum`?O3^t0Ben^pR>|?#gaqw;x*;W2B1cOWy0hlKlf0WQO%g`` z3UQP)O6sITR}mz`m2v;2Q8W3`Y9heRHvU&UaFZyo&B^1p%*t~tOksf}*lZGt2%eE= zwYQh>4ckw4Rqood^3cJ(q*wDXY%;Szw6cke&Al-8=8iwl@nok97| zzbAMeHTs-p+91$&iP?b5$|iZ*sBvzpjDlG$gw>yH4|kYS04vTiDV$Ph09pS@Prw3D zzrn5#7D;Q~`)`P12T{gIz!DOiq*VcX;N9>t5-jJ|!J>9=TI8X>;;?O*wJUbiO*%iq zRxEFO(lq5|Iz6rxB}zD8O4i(uWYM-=W7u6YBEjw%^oZ5xoTSx-+i>-{pZXVVC-AQD zg2M9sm<;VsG9Be0W&xju1g+9+oVA~!(<**=bW(z@*Q2`dRAIiALFH-wKjNy>E^k{0 z&i#HMsvHxhsU9j&rzX75v43pfFn*(;OZ<0Kx}CYC<231WZJF7Co019p^h0q&? znS5SFY*AK&X&emt=vQ(cRd{j`Gdo?;MyybM!fu&SuRk+!iwexK1j#3Js7eJ1lfX=G zsS!Kty{}F-_M`ds@z`W(->~oEtU*7k6A^Gi%n_0)5cE5^#!~;GvFx~UKR;quNS^hadnk>m zRj{84eQ%m(S&)eCM2g*Tl*TN_EP36~N6t!gn<3ebvLod&NAEE$wgRmerWWVtYuZ=I zFc%bmMAS~FNr3~qz7855SKJ^-Cx7D=XqNw^+%}rF^`-x<)?)9>of+Wq;%nwNV_*WyV9B)&TW&8(K<;JH;&i^o#EQN2O!CG_yVEmflw zlVmIQbkj?8^C(4B$@8=Spqb1Qpx1jj%+wW*3JyuA0Nb=|>B%*hiRiZyspJZ{6QO3b z3;@!!RQ&~sa;3+up6{>6jeEL{H8A3c(zioCm$Du<2>&^=$R}Y}wvw(*e#?WJwY<5U zfwg{J^1;>m;jUR*kUoe1c!{Vo@&=fH=DTkn%cD~ewSpFk+&YsI$4O*%JP8SyN6?6m z7-#7KLHq2N2pnthBaW5UGx>JeZW)0a`Ljyw8u-Ax-E8hk53{_Co`zs#?o!i4;@jVO z)Jdykcr9VZO|~X+>b8%8PB-%ASssx8urv-h?03&n9f$Jgh%Ix(ZCP<)28Botsr&wH z7E%hdc{Pj}7{v-x3;#kRv02HpGAvcfp`I|BuQf21I6umLP`;Bjs*li8cZr-hyWjxI zNG<`1HE^DDpkgR2I?or#ZZTxHbzvy2ZM}q`@Gqg=C@7K^H>H2r0X%k9IPm+I&_AeZ z^%)ekNRAM{xFm_vZ4CMu>pyg|Yot)T5L4>7h2MW&lu|MyI_Xux$-Im8b%sf$m~kn` zTc^qE%=tK0+VKsK&i0)&>>PXH{S`fd!|_D^(C7*6Dt z4hem&8UrVa^R&Ugub5KyRegVmI zzK%f>M(#KykqY&$;sfzFj~0oifampx?k-b~H3lkU{ znq%tMd;Wos2})pl440K0#Vi1{?iBmbMDGPGKYL)oe@M(1ehQT;Z2p1Ks=j5fsJ(Yn zp!wcyj>1vn*>{ejD#+&(2tmS!vD>CTrlsgtW){^PB`#&Y$Fi5Q!&>x*^S`#$Ux}VR z%^a~nOnRpxb3|lCnolzt@`M`gx0cU1n`ULhWmGe6?nI3?>9h*6xZb=CacBPA%-3Jh zhWCIbeBYj!2L0o~{`#@OahCIcN>^5K;3ak?i{e41*!`P1K+*_Apqi*Sf6$kk2uI>8 zs>$N<9+Iqw+^Q_g!_7B&1;3rP1sl@kdV!?^y?Eb!mT-u4i}~xEGhMQ^6Cnw8JWwY< zMvR^Wu0h4o!)#~mfVW@LYmbm@`7(?Hhd!zw(paOXC9q@vKz5jQdvn*hjMSIGkVRj- zUq_o$M%z2@A4ffmJMfnVGQs!5A4r)fji$HaoOa}RbGh+|#uJ>6+-wHeRO;;-`T*B&x)3|$MEx+C1xh9z4yIx!UV;C8;T0- z3uFhLzuYg6XFk^x6?9Z1>2wwjUTm@m!x{*70w;1;I_*ApNi{I!j5w>N7{2K&iq~Ko z4nBBDrGbIcCz5?arp~6$t{meOVQOHfl?VWB2(xvq)ydp=0SOh*ls@U+=()B(kaH5J z4Vpk=fU`)XhmiGl^{MGdB~-{rUmj9w7lHMBHAz7*FM@jCa{sSM%YIoz#g6OFu>45~ zC+&+QE4b;HRX4tcC~fFdjmXo&bRtF6XjBXT1wKV;MJ4s_ntKZ1QD8xIt35}Gnhp`F z8f@UX4+x`Bze(H~&aaR3m<}G~Os2>%Ujhce{1OA#{(WD1=<)z=ARTwN9CO$Qd*Da2 z@P*;PFE23C&wI|@5BIEYMpt6x^cvHZJl|H|S<_VC><3V?;DS#6#;_y|IzZn}@q>_FZ|ZWPYIzNb!(Ya*zs zO$8!j2|h3xcx^*AqpxTztAa7O0KX`(v`=~LOj?LLmSxSQwrOqw8}ypi6FsXh11qDAbV-t`Bb!`c z%UKv+I%rwSKAX9D;lPksRr>f_QDGi$KPa7S{~B{p_&&P{H7=e>Dv2d&2gSG^JHI76 zqJo-d$|=#Hg-(Fim?B{XCL(cU@4@uQ7LBAV!Q-t26G07&rKWsSMp{M9@_^b>l0_n& z@CXW>FvBw2AWj$(HS{1geMpuZaGvKfjdtj&@#~FiF@F-(ZW3=|tTyQmu}h0I(iFHQ zKwRuy1-s$4{yOXgI&WA&g(zuHuQssFCJD+D`=}rD)>ybWcu^%^cY_Sj$UiuNLcsc8W@$xxTIWt!Wue(%)YB(}vtu?5-5tXF z9Z_l^v-(4;GCsMmo1%4n#$PuYuMq%0@igRX0pm+C5RK?)&ilnt=GfNc&-8BwQqA%P z{Wh}c@*6Jm>q^)y$qMMsj=y~0&2IF)B$uQT@@&P3L!LLM$NILd_+;CO%#_-2nhHX! zIg!t+#Dol<<83|PO4#FK(3v4IxP}kLlc(eCw}NGzq8VL_F>G73;xMxCZQfDVxZp98v zYmtQp>Cd=ndv2mES`+lztC2(Zj&$@d2Fho`JcQx44Bc+dC1xyN+sTRSGXKN|dZ#Ac zuR}0lK_bIWVkPcOg%VavWuJ^=zdpy@(?d% zla?*T2<6*IM8IbwVh%lK@un-UjzlaeGGhg@Q5Dgz0JNX>%!zY*5yU@r4L(gpEdm%$ zq&kOsT@a?)A=JuR?j+QXoBwRnLWs4sIw~%=%MF8&Kq!3bHwDCknnM)urVWzc{jc2D zmxsRY{k4J9YFX+a;sT6DQ z80f0Vw4ni!3vzA2N|~;wJAr5`@g+R7LATrE2G}_G3szQ}I=SjGAtA~NQ{)$EM7u>2 zx;(E_#EfMUPAIHsDGqpK#~YGn#>7IDs|+U24TlN0G}}vknaZ4#V2mazUBQjL4)tS| z(|4%MWNk$uwHx%$;ZCqzxx36zCP7oZAMp^LKRuFgGYQPB_a{0YN5{Ss9ao&p-Oh}p zW(}8kLS5n+D2XTR)6BY!mFy>}Ldj`%2mHmxkq{j1LH6%Wbv$c%NI=#e&*b z!>WKen3Gf}eYPSp<>2#1)H2HhNx&in5{XsBn|zW#YpRIte%GNyfq;g5U>B=(5rvN5 zUI3O)`Fn`@L6-gf7@B|Wb8YNbuK~75qRQ{k$zvRI>Z{-5`4nrd9!w$p!^HOTZ84bw z$-oIj_j2RPH-=S7EYX*&g~;F1TN4fWCX8O>nMlY2tl@X;W zOpPDPBB-G6>)T#lrpg?(x~m8mon;aG_p zN-|=RQ}4jyB*+PN`eCUT<0}6T=iLx+eIN#Yi8&l_kE^0Ys@WuQlrl;oXyWR*``tg;vl~4h`DFTfQo&&0%YN^9%P$CWl3Q zJJ(=j|7oFrA_9H-t4v$GO`_qr9rXLG2#y(Rv5I`Oy4js((U+zz+^xnLpxfMCHmAKK zDYrkyjVrEbsrfcK2hMycm5Rxz%D~ZonGrH@4P_>PCjJ$mqF=H7CxwnrBLzxzLIV@T z2;AgL+;DHlENR96I+9A5tVI0J8gtsKhmlvi#jSBpv1P|1;bdOh5;1_lO${MKG8B@A z{0s!tUMN0Fq5j3j zIlm|1-{eG68A|@OrxF(ceB_f|W7JxM@9*Q9+7EPZ@6?qam)A;Gdn%L`_G00AR&Gh` z%Bd<6FoEqr@J}g8+?WOBiy-7)oXp7L>=z9{JIb~}+#}WX|zrR~QixEUEvJZ(4t^Hs3Vi6>Yf&t!;RRag4K|{HJCaU$Fff zxHDfyPwZWJ2EUN|Rr|T-#71lDQx&^~6;>v&pO<}=E%oi_miO9aYoM+qVW3G!E&>ms zN!ewG>6jZcVI)xBh8bvp8^4^e{S^`0h5vB~n(0#m zS!oRw>=~J%s{op4#c5_BrGz&?QBkt4`07U%ajmedRhLB914}+2MLBMxC=9nE`~&_w zJQ(04l(d$KO@dd%qIG1U7vv{MV3*wzbgcE@qva3X=8p{!LV*~mY%TL?TXzJ8`&%sn zyRAa7R}jhJDybFH(TJH?4fWh4mu{Dzs&W?j1=(W$=s~sL&*7AwJ;=|K{>n0|nVn(@ z2A9{N=%=wGh8%*c!*T{+9g6*2BmW^^eCl%f)& zB&nF9kZnk%qJ&DqsDwPW5MwYil_Xh)Y)MQ-mTcLV8Ai!YL-uXPzRY0En8ED-ujhH6 z_kGXr{h#-|hf_$-@%i4L`@Zh$y6$_Nl1<9tlb8^8wiLgf3sRROXxcC;kSR#c4>6Av z!2|Yu`o?$J6e5RqVFl;t--G7Ew-Mh=waF|OnaR_qQ=^5zMz~%;lRVAbMif zLSPqgf`rT8FtYwRAo(eJr!#2w-0gg3(R?C%e7va8$xk5y2^b1`axq*>h|l3!>~%rA z_d0jnNP;dWTfCpzK{na)a>Qdr4E6XtiUsuCYkI+a|n_xJjGgAG34#aLt6gAGf&=1D;{{m%)Y)%L zR6OAA+KZ~f?61&itUB}vm7N8?h%b`xYnJj_FQ2zo&S9xwl_PM0hf*dl0qG@HRK<#y zcy-#Sz{&4)-x9i!T!|l`s+jp~5^ea#un{|H#X5Ta0oz3HGCz)N^2*1IUup1_)W)j;b9WBUT=$QmwXg$PypDsoc~Bb*b0F5cW@E+*$WMYGN+W2!eYk~RB5zI>%(WpT z=1+4ZJWcXZjo$ABU*vSFccQ4N?{2sU&4Sc^05x)4_c6cRwds1VIp@I&s3|B0dD<~p zvUp5U&QXK;KCs9fr@VR&uscn`4#giHYC-E{b53j+6e1f2L#3zsk>xFvjSVC#Y?Tz-;% z1_Ml!ZFs!yrlAIvEjKig^5S*3)sqdF5~mGXsRuBs0}4Ef?0kJMz>91+eWh&cx>=mY zvOm$@H}F5eotf+d1;V~tOx}DSmp`@kyqhj)c2r$p^PFUOd4;~me`Nl>3!r`h>Up z77w7gUv8MN;3fX8OL?gHOOTmRzQlawc?%0jlNKsccou~D3CR+}j<7h_)4L2lLTj2GY z@eGk?6~e6Fb|SR_ZSBwX2v;WCmM_Kr2s48oiFjt}&4*tZw!fKfNAE)iTQSr4-aD4B zkc%)818i^K=)h*ILQ~*W<#MNyti+?hK6Y1nw1ps0GD36ad~MS-w*gbzyvJqwO$yU- z(133F>X0nUo{9EJFsaT1wKXRt;o_08TY=>6$w7@+FXaF|pG%cmqxzl3vf?6bK`zR(eOKm23)tp&CJ`u^4jv7SlN*)L{f;pZ;U=`EW6|1k9MYWi#&Cn|$Tvk( zy$vpKXcw{vz4Ogm=XuaoqN8^;Lqg;I+6TaF@Rz z1JJ&JM8P;Sswq&~0vK@CgE_Hc0@Lel+w2>^t6zRDec$Mq(j3D_R;BcVj1wi`JHt3J z;uSI;-k$6Gbx4ufP2jt$vEQ8tD(sFo(&9=Y#$86p)hPe+pFsFskG7au5g@BPqhlbTuxd-=m&)Up;oy+SaHa zB;KRg%ALx>m_G%enVN4K89RCv0*rvsO!zKP4Hjt;kQ1A9xPP&xANmY|Pi1P0*L?*5 zjLQbP8L!pGD{WNs4P9fsrjMGKm%KqA>O}<2{D^+%f`|bFWa~rKjq#W$JfM|quA z=U)4BR+{)Efi7zF{VceT=Gura*zCBJ{>uS7r=irl)tdn4Brg#N<_O_(5b^8n|_ z#-;@Q%b1jR02~jw^ryXVW9$fc!=rxr*OB_ZMNE2mIzrQss1#n-K+LrU%#kx$$dwa7 zGQliix*3oHT`SU$2kRxC=wj3oeCi#H%jkzjvJZt+_Zqcsj{Qv%{LUzjbxGqd$3&~6 ze?y9>lO~xI^O_!2T2{0RP`a`*%SJ5lju|^Y3$8@V*-s^ye?>mkb{SsOBL8WoQ)Sws zR4lh32g8$uqYUZlhjii1NtcP2L?z(xs|egVo!j}GBbcVpoDqA5qAvhmE(64qIq(B_ z88Cy+5Ja<(O`9R`StI-xB>51*Qewqe46%es;}k%aS4MR8ORp|lUCzuvwvsJDe&h_2 zHmcPCJBF5@0bthPtkfz z#`u>LAzYus?1{_Ct;Nwm>~eDgRc-CnZVvZSf4oJ2XKgRkFb z>{2x)8D`F4bek6z*i{uDL6CE@?pX13AT2iiaTlx$p!WLAskq!6N_$WZ$d7>$DM(9W zck`#1)qeWC%)lwr9;>Xp4a?czy8_gH3noY|yrD_uw94|pC0|U%Y(I0bbh3iU#8qTv zR_7Xzy0TG|Zx{rc^*>d~V1D~QDP}E$qV*uQ8vGgw1Pl_B{5JHniG_b`35Y6O{Fgo{ zn=-I5y_OoxfB$ewIg?r<0iperGB=>lrAt8g1CA2<+)iTAVA;)lX;lX9RBOO1MZ`gT2v)4Sr=!W!d)42WntKL+*!hdN6{9ij3Rmt<%+SNXf) zR1m;m0iMM`PIiPQGwyf6Da-Xk6-_qQI6+{|P^4jp6sEK|;m2=(N`;VyLHz0WgqpR1{U_}Y0cXpGcFtD=azr8=PkB3YJz7S4g1&)QSrC|BJ zSR%7P!Yl!lEU!lKHhCQcF*tQ|NpLgM11{M5yp3bBY-#Smj+y1}4kjx3jMtmW%Wpgj zzvS9O+NuXKV5uUFA8 zX{>d+3K|>_OvlJPrUbjvyZVzRBA&|>rzL5T(-EiYDf{EIcC^L-*14V*$Z7?ceE>XP z404j08i0L;uAB_fq&ElL4@_hIPO4=zkXH0bD^0Zvy@mYrZil8IgCu%dFg?6CF3x+b zaQM={&h5#5VLoK?>Ulf8)d9!cFc30;`PI6H{LQm0)Nt#||KZ(i>$+IUdZGD+ZZ8kP zvxb}B&!#( zJ?3yg>bsbRh{=UoIgRR;d7r0>dIi+W*0Rk7^MH9A!-{mly>1KWFVL^$KS2BuaX~@k zAMf{-MXEnmNSU4apU$Q3#?}!8L7xK2V|JmD41`zkB#BR)M-o!9qWQC4Rbo?@%4z&q zSZLxJx)L{=dU)t4)f6sh!9Oy=uA$q5)?UYBElYDHSs_bZPz}8!qjoJ zx?cQM*N{YZep1qzlP;s<>O93KNv>wX6+0i*xwL0=Zmpdzx{h2A*!HWxN2c(`bk%7@ za^K0#Ra5g>r{Mm*5&|`Lg6SLgCLMCt&d*V^gA#hnby++I!5D~}3>Lg8TyJawp%z*h zq;jah#r?sXf1SaY_SUCHRPDzNvj6qw{e3S@6zd#%Cn2G__CkT|4hT&OH7mjUR2Vd= zh}NU?b7qaZSJoK;=HZ-6l4~J(8eh`yDbp+^c=Ctg zQRXS_=1WFtGR7%B*&*>7Nt(QzFd<+&y9PnHWu(L|(k^x%}|r$uAGj%QLOaiR$yd zki~9;#RkFLbuacRf%UVt0K^$vl+L21%DZ~-A&2Wcij!7vR7K8J8Gwj7lHn43I|Gm6ma2O+4g9r$C?zuvi8}M_RSf+uXRQV;5C|G8UiQE)Vc}dlX zsCXoFp^c|V&u|58ajmV3Y*&M-HYo z2A1CgR`aEZ@+soDy2A@r9Rb0yLIyJkSHSRJt4*=L60gKcXcAu~Xj{%kyZ{8tT;l`F z%fh{m*Yx!qlXaQ{opLcf)#oM|5!_>XT~NZG3IidGNoT zLbu^Z@xZL-57qx$5d0lF7sj556hLd-m{t&8A!^RAkfSdc{@J2bW0DmXba7<&k!fNK zEDVR53Ozeya*zrd?B8p!1UlS?z1m|mS(8!a%(q6e6#%h|9)NBwI>qd+%|)&&G%Y9@ zJj(X!`1Zw}7n-qSNj+BR?e-Dv%M_u3(AkKG^5x<<@yiFw8h8Noqpg?X6y`1Jxi7y2FU`2V`&i8x*)+H}nBKZ}91U&s5Y90)jf)P`( zXovAI#=qZ&&Ck{5Qn$Qm`QO$irthu{?6)@;Fa<0WD}qFmBhd)QmL#rApuV(WO|~ur zs77roT<}`=QfGkRbusE^q#n0CNbnljyjC2$n4!0-?1iH000Rd-MyqRlDPGbfhzjZQ z>Ot?AR&;Cc*6jO)aRChGZ=u>}#@Y;PMK-NnI-@DQ8Qfa*b~|zFX{KKDgwosDOJEt& zt+Il(OE+K19Asj(J5e5ihthHM+z@|xK)Y^!nWsz@R+dn)<;AC#tR%VQ2#Dcp&t>rI z4H#Y`hL?a>Jf0X~YBZwqqO#;CPnl`~fABiUl=$E+3@4aMRpG!LToEbmPG2$X z*m$j0Lx}HwDkO^CJ6;*9MZ_PGINXiByL_Tv^S1?_myJLDurulT{;-dm-cBCzv$$(M zx;2Ao#jGaQ*4}iGW~S?{t90+8S_?B zUHHoy&2K;p+Cb|esAV@n-%sB6dDc1;N;IO^zFmvNm0WZoSGt@fTD>K4OkUdpwP2T} zG~DU*}#5(S`(~svmz%$9d{KWaqgwVHA*iIv})&pVph4wl* zEC7yby;7iZAlXCaV@WD?oIML+J6wATqhkqr9z+o(aI!U+$tW`0jt0or1i-XKB=(}ivM6eO zl!{!_RbE10mw-j!%r7EwA!h;Jo`P#SOT>Tfz?zl%3c_{Z9+ad^0O@ns<`(JC9@G95FTzM0JQ-lzHnimh@cYH^ln!_PfF^tpToC3!5=u zw5E)t%)r>EsQ6;Ad}^z8G=i1;bn->on;?1%nyr!xN-piPMzlKb0Ez|003d_r+E6!= z1n!I3pelxP=sPhH!Ah-wgBPF$;}Av}X|>1d+r@u9*eBH+ci<__?B3r2@n3=Dp;tn% zXG_(brCv0j2jUe7R%P)t>J1$Jygpa?VU_t5FG~emYx)y$gsL3t0}AJuj95+VN?41_ zT&Tvcp@I8QbAk%_ZZaGo*e(y`fluN#t*{*or#$+g!R>sfm(#LM?|BgeEvIzNq4D4-O{chMcE?HU z1Bp$wtw(Q1FJ>^#o8i@auL6E+qtz^Vx!*jinNTktOt2IMM$!QBx!b-|D(Uw>i=ow@ z5wX?z^ZyhP_f15IytFlLighjBm%s3nKgQ70)E|+Zh~5KxbLB8~58Nxf&6VhK1YEd= zK7~fqbk6XU;Rzne2IQ=cu+@4-cV?sqTdt5j{`|NxqfC&E(R4zybF9&h=}Q-ypF6y! zQ?7|h#)!0gZ|fYmToH@b69Ly1-*5I!j!OB^`f(?;TLn84YA#Q1UNLm60Vf609U)D| zquC@};Nt8%RdnEGUi3bsli8qO+VD3*;6^up9>VDsurb$JK`ffyzh8yR8&@IfG5vq~ z#m63t6xd@|*JY4hGN=w+66;rm`G|x)^*bVic4N2G(kUb28TyixAJKFoZ4Vl;VG?vT zIregd#^1NNy7GC?;_#Bi^y$1A1)Jxv|&74a_)gz%e z)I|sCbqf=RRwC-ctKt^p(l%2Y`DulaFeEuFY}JEZBgkmC5cEuM;Vswe?xCkv0REpS zw%oAh`Sf;;4&4Eb+di+KFhQbQz>XqGdKb4p!`%d)e1UQqW`13`y{)Nj>aBdlu7gd^ zD2j8mjfBTsR-w4~;PMdRR%*sf)&lY2`l)v8`~WU<_l;r{x1xNT*&_lX+j0* z{4)v$Uerx_W76yx2`4Kj!w*Q* zGg_xVeETdOs4P<8`PY$EhzgtQ(SE*}ZBfS9`K{KfLS5tj17#q#+Ks1>86$rE_PJPU zZ4ht4G5haxmU&&*n`>ci+7d^>>PINdT(bXTOIUTso)!hnUf-%gDxgmc5ZeHOn8})Fq1s^#M!%uZ?OvhTn zI-T_V%udak?ph8m^DI5%edU{IvbTkaF4$A#u`MQ6>;NM)-sp|lbW9+}x3wT#W=cty z$@#Gmb|^rBzG{&OhIc$k4FgyMdOFgtE6Eg=(POlHUW-jTeQby&9tfDzkPA)xAsG}+ zhPNAe{PjPtl;+kaIg#iSIuGtOa$j|iB=)J^c3bk}byg;gwk^yL_1HxsU0@onG7Qfx zHEdvmB~YJ7zHWV@LM>{Nr&tp6*}}50|C^&fNN!TQFajeX?0a+%BmKnxBxAG@BE;3c z3SK=JwdjTqddme8lfgz}LhfFBQ~A2d{>W?0u_{9Vw^MLg7q3Cqn*jsvt2IoFQL^T1 zAZQp&gE&Oy*E091ToACOsgOVYP6e%J$|K*xuT&6v5c%Q=#ut0us?rz!NceNRv)f)7 zYRC)GM7O;Q?rSR%L9366Yw}u#NyX1jipfjwyeR(}4SuV45yH;4)-N@RH{nIf5R34L z?8)b04LL~qFDpbFU&2fe%$>)uTc|;-HV3{F1^-Ut_P@%M!be&AnM6;U@=F7he!PwHx;R+44T&DAYCJnn1I<)_eb>2Y!-u ztWVHbrj%BJx{il4qgT1A6HP*C0RsldLA&f`F1hGbSM)vXxAA;L#?wg0xSW=Ux8LF z+&ce{&UeX7ipFT0tad>~UYvfx)yBILZyjZ)C%d3j72i*6wAOcooBx{!zbOja{~q3*J@8jh|Jt#MUrY%Bt=EBTrj)?E#;Yws znLvX)UYr6@oFEgH&2J#k(vJdXwA*jQ`voEBPN}VlPG7xAYT(%P;KmpV4E9DnW5@K@ zHjZ_(6+at;1OO2f@OpCo0NYh7ak_%8x=7#KViu8?Zz=Wy}YY z!t@;W(5Jr?f?=~fx+u-Afl8UVGT*e!}F{tTm46ETnBnM)}s*8YgS^3!ZE0C5Ux_PzEtXht8DFzptv0NM9O)E$$ab>52VSmnXZcVQx!w&O_Wy zEgtBWG|JCw?tyWG?64K$&s$ly_)17%Gi)M1&bjlS@g^y(Aq>2xrsyQcS%Vwaz&ho@bIHSn1F0uf|ER_TJl1HlBc&&$K zaZ|cU#hbNdoI>_I+j~f8_o*hwl;GM^tjgsr64SKe(OY&&n*!h}y9S$!qWC?kOe-z2 z%cdX3`s`C+V2;!60$4A)4Vf`l0pL$|>`n>bHp}TZ7e{S$7B$@~Zw1_F2Y%KXWVvo7 zGx+b{8+KOM?g+M+@6{Kr=J(>~=Xt2;^$54%$(=aW$HY23+C((7Usm-!w33eqA?5%@ zH}(D-mA`^d({SulnEX8^>KS$?^pVwn6c4M5&w%l|z`l|j77zc%Y4>3w>rhs+A{sdd z2M2sd=`-1c?v(*1aRfz|2f!FEYbsTF05^OTq=Mu6oF`)Fo_m-E%~oOfr$0 zWD3+al@qqWiBu6Bz^|SZupCAZYomlT@X@?sjAcjPEnD;}S1<=fmtPzC6eq zvRfTitKSxh(EQ;sN?iNQ^txOTR3ILRb=>FjR}kh$2+hWtfS7{dK+3Q5*s%Wq{~rv5 z*GMPAs!1oQz0Lp|mPK6|DhAJGh# z4O?H3iYy_m3g!^1?Vy+exvALk7M^!JZuYs^d<4<=u$Z4(>oFzaS5Wz9hbYaPUxJNe z8lT!im#@HCwc4%A#xox2$Q;n}_=@Oh`Nt_Y$d?C~yONqC|KS1zz~HIUD7Fe(Jw`vV z>f@RXmBoY!+OPn{Qz!@%yuAF>^l%;80pNgTt$`K~3vQ^)iYUnST7Ttr7qK*pT>7%# zJOl_zZFym6c1kLbL0u<(x!v;|CFixIG<@vQN9V!vnrpSTMuO+3-GwR-!-z7BI$Az8 zFp%k$HT#_e{QXS;`6zq2JgA{pr8sbvXMG3Eo9ZQ(6;>Aqva%%q_?z(mX7o%@swxN{ z{x|04pI9Ps>$2`16yxw;=uI0WQf>b2JBv+y+Mhj-2*3@pC{ zNxlJa4@UyHV=V|pcy>~Icaol-Bpm#$%i3Ug%tX_JEN8`uWXFC29?>yMUe>}S5A5`P z^PtOl)cS{X#0NCJ>6T4~%Z*+9_I>u&z^lwiNpB^KT#LyL5lYly*O?DSxKADCMB<6TI>h7@k9j{(Nzw7MbOAMj%L)L2LpaA_cK5SNwuTEiu%E9% z)(bHUVj{E?HKCI0G?0L{PlAz*VI}7R`o`^C7rl_6tl@c8FL)byGf-{V!g9DQqmfEM z6lp!GcR15_jVrmxNJS3yV=JG)vOR!z1Kurc5H?0Wh)*AovRUC zlv|6aRGuEqWEQ@%I$%Im9W;@LL`K8nn!8~*R0B#nHc?NmFhWrU+@M^PK)~m|U!2eBo<;Fx@{lAdPd|4SLKW3$+r%?B#ZM}XD*HM-n0mir za+WmkAp3lwcp&<^NvIe9ld`qBS!^dPc(k`S0t0hmx`BcNnaz{+_dSnrKFrInyVQ=g zl1aG9`CbQsvUxsq<-GMB!6Zl_?{9VHei?h9$v}F?|3z0o5A;Mqn1Ea@k#NsF{8u@A zx_jARlRy*)DXIse;159?iUlsj22(1K6h@Oa^y%ZZHXqFW>W^#hT|eSA^}8_{1Dv)1 zyZ!XE-Hj7e{rP5dNNaiATG%=8i5yVc7bFMFtQS}5 zkFWM%=fFnDhJ`-aig@?*JiYZ)JTLRBe$^Bq{w5Oo^QXx{WwW%RbswRvdoI!y-%W|e z;&@jNKZ*r?H(AwofM=2Qi53uCI&ibH53}iYg@^ns%Rwp<;J_X*^;XSV@wjjI@i-mV z9&-TzzxIIwmJyKe`J)jT%1EYtZWD^Nn5&GOw$D{23etMxK49ke*Jxr_U-{D@a2wgmj}=%Vcsv5T>Gu-1gY)soeVX`x7y0H@(G=MEDx3A86FwS1O9c|n8(4tM9` zc{5pe1RSl=GIj;^106!^A)n!+w6m@dFtwj*#@z}F40L#?h}ubzK^gly1n$RtWA0@C zkB$naBkbaBM4beo9&KozQ?CS1mlEc|3k5ui2zxFxZ`OXj|3KQxhuM+&!c5lx1qF3q zHUyNUiF0RPOIA+rUa!J%s^+yaPv(NTKft)@S)W9yzjD^JwhSW%(Y3biuEv`FawO^8 z&goPDmoWkg|7cyBX3^dTE*+%BtX+r&#`meaq~HMoIPf&#b5F9?wAC?s%(*?dJ@EB- z7g@jN=P~2FlS6PE>WiACQ>;lAdptDW<&RNK9wW&dPPa8@wZAq>RgQWVSK)qQ>y5Pd z^4M(K+WkWbM%%yPZc>h~Oqk`Y9q?oS&YC$lC!4#g_&ykZPQm&98?;TwumQ?%n zGnzIXph@-LG1o(SFq_lSc?RmdSs|)m0&G9JrsPmwJ-csqrN1SOy$sHmM+wXe<%0xg zYiI3j^q&Z7a)YQfK}-f4;-F)6etdPEkt;|?Lv49|CTY-7PEH~4#}BZ>D074$I;oKb z3!Ylctw1ij-0|X!*=9z(fSETwZKRUV8jMXs?1LAFq;i`K_;ch|xEdacf0(PhPh$imin8sg!f|ZbD-_Z zE&Q<1tiLu|;UK4f!wB-w|8Q8@%om}>c}xVB9|VRP#a!L;n7D}#Jm=2Mavq((}0w)BMIw~y)ww}GI`+O zk=hau=Z*aN#7E@D$_t_xWc_IRYCh%CzWxS z)>9|8xx1bV^L;tA*&+%7=0%WD1dEV#xbz z(cZ7>ls0(Mr1j~urIMAGB*%P+Xl^q)&xFHt5HRh3>rU0ktr>hj{JC6H1(k&V81@Vg zOdHIQ0m~3ol&D-;TrD_22v|HD?~sxfmMKPu#)A&8 zp58(p+b(?}`CZ(qk|l8Na|3E0BfGrc-YY!x{H-}L+%G?3uO*synP(TUg2(TmW`}Wo z>>LlkV}gBM)zBW1aqtVvIxb`uVe~Vp4PJ_#1ZMT8^8`{Acp6`f#Qpg+mV%q_!mv?y zB!CT_h0xRXK3Evr_m_16@!ZaV`RMdOsc*9@=$-2 zSymc~t1s|j4qyd?WKqoWGFjk4)f37%UTgq0mEL=^(+Z*w+jnvI4w$pW3!8SAEt_m! ze0*VZRIT#avsib9a2rB!*!G#cY!^e3eLF-H6+UNg<a-h5XQa54uf0pygcR)is-~)gx`$F}>MUW5Ej=U1 zxeGN~=!fzxtH@SdRIa#l?)cWELydPWLiR{k`BC1CfFF9gmL!yo?A9&!%P-Fzp|hOw zPgPtG&<|RDs!PR{IG6ZLU;BPteXq!^tQ&HhZui|Zm;UII|F*{2R$*9pzVzAk&t_Rl zWz+CIZw}Pdy^E{&zVU0?@~BLsbN0=%bNP}x1C5?V4;(DeYnJ+IpH;3)f1N(^T}*Cn zM}XYVi~K}I!RwbVi4Tju^gtev-#({^e}ql=x!KR&xm`Nw_5Oh=?(K9@%xF1G&5LqK zYo-2(wdozJFly{1k(<}7x^p?MF>zTZ$95l#>UPO9;qh--|6`_kt)Co_tcKpb-<*5D zmhZ^>5d8M4eR*&dr7PVfyJ{Y=zde!DeR`#tzp6{EBp7hageVaga~HN-n;O(ThW#4! z%u4mY){M^)1Nx?WMyJc%A{HkhXYwTtX{oT$eSP1)-`P1b=z`hDE{S#*&lna)h1SNa zJd^i0w-~KE;)UnQpHh1CaLb3R3`)d9`~%uMw}g7>L*?|XNe3@2O~u{tkCN58wwCC` zDppmvhe@hZGEJ(^e7Jo}RHRL7xna3zv1*LRb9eDa8^=p25tRl*PX+DK?|C%xa+_42 zOWz=_SoNl>YK-XI?R(wMqAs>$;BH}a2(NTfOwO;zg3W2WRU5hQ`b*{G>96A#j*-OX z9(a3=R!^+tbZC)AZWr$Q&{VavVA*6<#!d7fL;8xh&|Ii)*o5<>*hf*w6O)0giTiI9 zjhjzgIta|}{-CyM=IX9ze=acX!Ae0kp;P&TwF4yO-p7m>OyxmJ1 zV&!-VU)h2PKiF zO&v-*>DM*A4J^#XLz>oODWpSjEeYDMOJ`P{_M@l0tmAUR9p@L1`6{81cc7+Wpk(CW zSXfN>Fue)Q!;L6K)CL;xDS_MaAF)|@bR`Ca>g4eR{*sRmkL3uxPcqJ*xbh~F1<`%2 z;Mqa-jD0MbjrieOuv(|)gTZm4us;&HS=X29Bz0Grgd(gy_KGouV-m_{t zvA_Y3JeVjt*KqE7U);unKl;Zexhsyl+uti~-4Y%XAyFCO7)RTmIDn}=B=}H zs%w(>&lG((+?BNT=1Rpc52YC*+JOC-Cw$`Fu9InaX|((2i{~Tvs5fl?WBMHNYyoho z`km+Q^_#a7)a;>C$MmVz*^dtA0&By<+j6Vl)1glZZWKGIGgcfl?$BCG|D}TAMI~t^ zC6STN+BZRPXe=GQ)U19=L*%&QOrDMB_ZOj_-+zcMaj3P{-&oPQOUIuv^v)}Iowz40 z(P8H7dIi2fYZ@(eg}waXNAVobyf|ZPu)1H@^Fz@5mn35YV81Gfuo(ABC2(?<%@+ez z$~Xj{*>S;Ysi^6Y6gxe-#VS+#S>$DxRCuP_z_(9udso_FN0sQ?xk!J4zTiXO3Z)S5 z4-s%nGP9NLeS{6oQJhdB7C)0dqGsO5u!Zop{4bNTCiwq70nxpzcCtTNBh6F2-rw(PVo7>OGhv8x#M zA8u&)G8w*_{QLI;UcmPh@K#SoErLOq@Y>QMt%sRHff{MSzY)g?JEz<_>T7QF9lSkt zusz=>_}h=I_e@A)P8Pe(`pxDVRvz%!w$%mp^v#VsxIAXRgJ1obUX7IJ?jsTq?igR! z@zpbNS?p#B?T;^;zX&U&XrXF3GbvuTu&sy1Kz1)&9CwXD=|u-*%VoF6VDb>hh&~aV z`K;SZ-;5>v#14H!sh7J4l#BAus@7FDhGBx2ZIWLm_5d!*fyMG+&#y-M!0SZs8<>3< zY#ia|X5;92?dOBNVU~WBzR|hHvZuqbK@2vfP}gv;jp>2;@}W$?S%lw*wgg=M|OA8iVpC#4)uQ{ctVd%q9fJXgb-Nm=4^sA$u6qz0-cd5iGnb=jk~1sgVW$k1_X$FiWYIg2iA3s- zM0Cr(@|b>@N!xQwpdpf985Of_hYWON**1CZ<B28Hh4o6?$m z55j_Pw##7mN=xe)-n9_E*}-kHQ`ERwdGL`L$sg-sKRh{9JqjbKCbqYI_kG{K{_!0_ zc=3<+@pG@gJ;q-CZ0u!oXd?+#KgpMUa&2G5W1H9%y70LxH`*h*e-)Db-6c_l4(!V2 zoxz>Q`lseM&DE&mn-RE-=BUL-rX^F{`Je3=LAWe@^mxUgoe?T?zza{>b(VxZ&dyDE zaZuS{Ru*z8<@vQW?ve4?N;a)b#QS{ae_2RJ@X0fTu?bq z5AC0)Wx0Du*cAj)c=rZn^}063M!9_Uf~7g25Ut_t?;*rf9jza!G}hF06oq!NM8)5d_f> zmBXIb?eMh-Rh{X5QcI=h7P||ny+y0nKfFA%utw2Wqn~B{dXHU;=rWMSGe>y-AM;1w7_j7yGR!pEwEo4l9gXZa57rx4_bUgCDKSW zwym1i3TMKr`tochDECn$ntBu2a z?N^*T-qI7bUikI63Ge?y;p3{QTCH~J{+MgT9@lOLJl`H0jitY7vnt{{O$u3V=n`MI z9lU>NQuTh^<*0*I8o#vbr)OrIaUPA)a=8b=oo4W`$7Z6<&Oe|3Dl1Mq7oi-qP!uMs z#ycbTFtV1`D4XDy{n*p|3(Mz2@O@*1fLVx|4@|iz^tlkbq;nnes5wSGA2Z;v<=YBI zz->a%8f5Mv(@YG?2klFr6hnny<8nH6Kg;1he*9>556fL$p=?`!kG2@d(z_)@c%~+` zdw!5QHI#8RuJX)|C*sl%ly`Ag zoPpZ)l>1=EA48?Ct+Uz|Z00^q=l1z&WiNL3&-q)%bhKY(D)+-(o3_DBUc~`0e%W-!gxZ zJbW@ri&69Y=)$-9UDXBk_}ER1I}NS--LpmHN4N@DpZksIkkdb&lngfSt3yAh{5&Az zg)>ll^Yo?fImtAZ(v@vh2II3$jVUdqT$Q+KuLpP30$8z-2Z?BVgu%)5Zz>>b#r4CJ zMGU*^<@O0h>Vlgs%u9(f*2uG^p*EqeB9#4=9TK3O?iVY+C>_$8Kh>_Y8R;8g75?pU zB?j-egZ?Z=+{U0XTyf_kEqT-}%?DlFD1wBt#FRo3_wa}XWPEDVrp{qF;(ew4%Di5M z5BXvRBLBUba%N+9e%y6ye>)$hEETCZcjY<{@zshWziK)ucS9s7*!pASg-84 zaN6yKV$X&q&t9>~(dglVeI4-MkzbQ zPnJeljrI;r23vcyjh?*o?Jk*h(!i&C*8C}@JR!xdCR1po?`qdTbmFR{*7aLQYhKWw zOrEpTvkQTI-xq~)yCn7Cm)0-8k+Lv1JFv#IVhZ!B=J)}_!cts`P|fdq$7L}az;j^0 zW@JxS%tO?idYFBLRMHdCQDbD05411v zLb6)>hg2P~Z%=I#J=Jo+wDF?xXa3OxN?VEhHwErp8MF5t>C|}BzaQ27$JZ5A`r$f> zZ6|hbYdvcyvA9Ev_|!K*Ql_QgrA$;{`sL{3-Jfi>9d_NK$Lg{A%v-p$smEjXM%-rH zoHIEUM%*WcYin!sbxDK2YHRE0EzH>YZ5h8t^zFB^+CMXt(Ngf)!sqdvR#W4a&JackfE3XEtrRk`!jJS5?KaF>>eG*Vit` zqfyT~j@$Zm#YhNA#&{f?Pj`g^SF0%?t#pv z(}s_mKB?xcb^dU>_Sli(mZ^`KqAHC!5FTfF8@fh5Xb{m!o;ERCtVhq5GX%^EduYDbC^kHU(eZ z?K7g1^*M_|iVs zEC@_t6@{+af!Oh2({`f5wBhuICz%glAwV(9AK_*G*kw<|NT#O zg&nvJAH&eceKQJ%p#rJSr|J)PP)`c|Veq(Op>yT$T>yi7v-O13@I1?2Z%7wz1Ph~T z-#^Bk&k%c>jKNTEXpg_VW%JT|zWHUcMA4R=2lr-jN_1O&Q5u8C^u#k&&nEyc3AmE? z{%Ywh97WgDQDm-Yb&_>leAJhqf1v+8+eK*ZdaBOtGNFgPArdC77Z{7rH;cXE*e+~4 zFn7q1-5jgP4C%;jr)NgA(s-jzH9xD>_E}gP_DF&+APl|?Ti$>?d#-D*XT*NH`9}T8{Xhy}$R7OI1RZzw)AUlDwmS}K-_vsA z&7Ksn+m!Vs=ye@01wn{3)p7zD)f5<=!eJny0>wriiFmK zsRjZ86a1NFdNZ7R)r%$N1>fW8`Qz}9^;n2?Guew}BiA7z;iPdSxF%-bw_=Tw%UN%y zu8O+ub=&HFVz&#;03GT*{mN#NJ$@`A0ISk>b!*8k!-JHqiCZ9gKa6rcaRJg7l6a9K-mB?K(xr2&=GWJrrc@AQ_;0$&RTb52Hz=%( z(%Sz)NUZGH5$o-ep6?>8W#cY{$~H`7G(Veuq*Zw(#>ahEA+)MBKifMdx6IZ$JWqR+ z)uOsITIPjSo$7?CZWVs5{#*V`Vf;P*;9}o}Kh8&#@vjbk-5%yX!!4aKsetvOs(oc) z5|2C{qC9?>!Y*_OGc=22Kd5?^i}nSH|7>hO%6e5q-inZ~2=xwq`mnR=`-i}UcRzl- z+oJEZZ3favRoLljx~FKYZs&1go{cYT!MjQ4Y@f)Zc~b&O+cY!XFkHnfJ-RdL-Fc(q zzF&FT3+(G>)0c0ba0qdE+xppvK$n9-_w_RbFRDp`MjfpO$CxKm)wgvTyP5qzn$E&2 zs`mZ*XBc4Up`=p;Q9!zDkd%-T>5v>mI;0t-yOflcP`W#$yQRBBI*0O|=lfgle{jxP zGv~gpy+3>3F}SZnC%^Y%ilw%VmBREL5nP{-dL1#E*3SlMsJ~FB1`|-1ZdEy5#7qB9 zYsV(QRD3*7|1)T!*fjtbM-kCG=KeVkQC#?M z^G#in&|?1KtpP23p~-B1N@#BUjDSL@FPo7=vdx(rrV7Mi`lj+&Yv|1n#o{vfT`g2u zSSN1~#Cy<8Rt%>Jer^j*oED}ZahyDEoP1!XBDJx7KNv;Y9zjbXH&`ukkFaCGQb-pV z864Ei^0n9$g`aR;uTF9{NRMPHgv?lQ$2Pq@Q}wE1|FU!cx%qFMLeZX)O0>;%ZGm0b z>@r?z;ao(v;YzaiPtl)$B$rmD_N+A{r>%b?I6=F6B+rrAjB#FHBi*mOE?Z|ykkVI` zdF_TxZf}$hjCefyJ9@FR4r*qMX5bR&6hbC2p7;1|`Y;HurP$9=NvagP))!;Ni9F-R ztnrQ|r~^r)v|?N0-~IU$tX`pWltS8|Z{MN?`V?t1DMON7w)Ki+7##~pkq9NQ9kxn$ zO=)Hqqa@^E+$ zW(k=8x7=+3>hnvF2Z<#{JP+)7k9eL8uDQl+Z-a~Sm8hH`_d@Wg$!?#_LC0D;^Wu>J2Y&0gSh>&u5HRroJ+XVlnesuCdXs zq4`3lFp+~zc37Su%O(JGu0|O7JzP3+7%aOakNPM|yc`}LcD*}p^ZTwWh8kn?^xO7Zo$t15uhceMfYEOWU z&ON$|PJb{hpGmQx1QO#!s1x^G-{#Jay`$UZR;QAX4AtPu8Mkg?TmPzJ@)k;9k@Qg^~3gp?Pp!b0UHj| zE)2MJ)UrZOeF^vO;1H-Tp(CMV;M||})AImm%I4t?r_pdi(H7K?&u@az4yoU~#iXA4 z&(g`Z+I(D_*ETmJbRb8P3{?@i!e>xDX}c3{o~xv!aQWj0jw08lAz?O5Y|@}0i+3sT z+eH6%TcWl)j;!5je0S+%w~t{>I<;2e?t$-pSBa-p;lhj0xN#(#>d#WopXt9aJ7IQn z0B>rqWvMIpcOPHO5YJ1mB*U*mu3{##tGQS=Sw-nEL;j6l3YyaMhzTFm@->)eV_ zO`&&y=ODMEO~t0aXe|AZq|~g)Hg!}uZSh6{z(e$oD5?adR%Ct@ZC_M*T1m6M!9G3M{{)DI`poqR?E?)bzWK!XI)o(Vz@q- zk$k0Ez44)=FZ3#nWxI^d?;aa>VpyIa(vP%e50{J`tMj0LEj%+Z6uJrP+g7-}Ugjn_ zN!%?eYjs+Qc)^_8ya>CaWg(M9UXb9DY1(&JqAX=FzZQ?rZThd0&SVkSeTr0}PcMOZ zEi^9l?sE1yey@=QwNk=tr<7r?ZM*|P3&(m5Zz5fNU?@Wsj4F9=Lq9J&eL%*r!FTi)ZAh7WD zW?gKcDhgPQ2Tg4I-dE6xnZ0dDMQph(3#*>nvu=fI@Tfg$*BIjQ6WWnp8d~r#mKGj(fiiX9!BtLMn_E#NpHkZJOmAM;2}0 zFlE+%&q9{rzqx;LvM8UQon4rGuT5ubm#r2(nl={{{>$kr2*PRyZJ~tl7e3jkXa&@R zQi@YUnmkCFA6Z&aHA1dt4=ph?ea|P(;)*$SQy$pNMi=bc4qK5|)EF;#M;+mjpXmEm z3+5;mQ!sZiiU`umBJOzC_-&>g49}VZE!8r8J@YS0t~VtVieHh1Bf;3e^>UVkx4^sH zF_9G98rA$CEZvG1n%{CeB-UCf@A~xTnJzmA9n5A2i0=0>u{|Vm9bJ;CedP;jlIAm( zfohKzhXjl7OY-{%i)NG+$p+w`=2?$XGw218z0zT|U7oA?_($=8?BiI%J!qGC|9W8e z0aWb!a4D#eA$vr~t-B%(NU3+wFd|?*UlU}cC-w?5$tg~|PibBIS%`uvO9Wz|_@s>4CldHsE3S`n&iX;YaZI`z_J))_hVYp+&8kcRTH|Iou zyQQ_AmD%R4&-vLjqGjP4(!1;gKOqY~D1fj11;_p=^2=kE<+TM1ieSLX#C*b}|3-NzN7ufYin$Ww z3s#2=4aq?Vk+9qdxHLKg-YkP*l*PFB!1{HKB=ZEKx4xzVbn%}^J|6EA^*-U0$ktdr z$0!i|L+IgRa;ae_gBtb5`7K-``5}0ePO(rktIAVeN(7r$+x2gUem+7p_;Ugg%J z{+*GvQ_lU~tq)4*F*MPjTBigpcAt;VnxQMW52DlisY@(#APb=|PWt$7azoHa=9Rt> zOoW98l+za93<-#A(UL^L`vK2n*D7I*1__4fO77Y-0#kG$zHy&A_k+&Oh=z$uVgy%@ z6PEL~1gk(wapm$gJX4iCOMBWo{##w~+V~lZqOlQz&T_=QVT-J#Aa^U5*4XA{A`?I_ z4Fq4Kh6ApHvwU#zeWZ>!Vwe7r4$CL%f%1!Fl>0GlVFcBC4y0y?zkG8D6w!+Ma^CCbXM=3 z{bg#+Y_%Da?%VFy#YBLpgY2iKcX9M--1T!BKw2QZH>uq^NA!uwM!rx9`U@fgHyp}) z1+%jTV$}>nBon=FM`)E8R_F0f41J1$k05G)Sv1#4QEA<`V?`-hy>L73QOym9B z#b9KwLDWu$Q(D9owgBAXWBBiX#^2AJqi@7I2*5$CthjMgu*c%~sDl-K z`ooX(`U3n5Fm9?ca1Mf`K-t{$b+iz+$Xx83hy;oDyf?|8xKC%EJ*Q+C+(7Yl={gR{8Up8 zM_%R2YsKe3^}0)L>{3J(CjA;%Gn6j?QOD<1Z8jJ-T2n&8zsSF@{p~m3M=55ykxe z_7JiU|6+&;WZJMNr+kZnUY@U6a6VKtQ(-38oAQhHX~;)Z&c?To*97K=aVlH0%x}Lu z^rY)d6Kh6Rq%Z9b##)8*e3Y!6O zFfJ1ERvp0@!Y{b!uBn4ZP-54-c6;Js{{6eKO(KAi-%D!{gxxis)6IB7Alm-c8QrqfpQB4yHGw%&(arYrbcF%RNq}C(DCL61csTY*N`3$sX?@kSR(imj= zbgk0&+#(~nsdNYEVS3lNStg>$T>?Unr?>DUgF5$dQ;_CS*1Q5>k7l&&w$O%M{|4bg z_i&dTvY3XpKU;;&_~#_x+#^rC5IEg?zrj$8whxF?Rc<7CS~I zKO2hd;KIuC^0f)cS?rh}%*P3~BohW=S4UNxLWR7p7ChaB%pIhJYGrjPua8^r=(OvM z3c-fMY|q7m~s#bpZw0#yKrn z<;CqH%$9~T<#LHaqmoAIcU*m12@<;`hmtxy`a`!oWyepixt^SU%94r@qlBW2i$jsj z&qf{3IK!r?4au?S^&r%IpD5}io)L`_L)PsFd$GizQ;9pDQL3P(ZCJCFOju{|%qAlJ za%a6eVo@MxT$GbjTk7PI(VK6nXV(gfZDRCt3^Kn0r`|_7P`rOkd;G-^7mqw6H!dhg zq(QrTh&%tasJz4kjCy&8Cpha37QQ4R0L8&%ZC4Jy(v0PWh+JT|w-Fvl9r51(=$v|G zg9qa$+`=52YIL>1U?8kz-{NKJL)1g z$=GYm>LDq(!E5I&?p_*A)8ej3&f{+YI9E@u0kVi&U1Q9kH{g@wGhThs>dh`?B&M_o zhCPLco%QO`x64YPP%`RN=$n8PJwDziqr-XNzs2klH4JY^C+DYcx|cq3#sYy9t0GV-J`w(eY;R&h_gJ zfbhaCOx)=Wb*UyXQzLE0oFyoKg0QSMd0owRjg>W_>;VZHgSi1w&gg9Kx^r%*}m-{^+E$bFA&5T}ULx%<33Bj_!2=EU{7i0RPSkYn(wH@nnniM8N5%C3XX?fUwJ}Ph6+%!%eId&r_X~#xY z6(f2igiBBsGdTam;&?l*gb!%o))8@}R7 zYJ>d=cLsmkBIlp@CVaT$Zd3A5~**rsnom`Lo-NU zx5YN1#`59E^|_!&&*-1c_c5o$n7?hduFeaZ3B7+vC4F9=V2;Q%+5x3LE7pK-1yV1* zS0Zovb@qC2+Y)e3$kF*}R^m_o9NkDtm9~R0j42H6r^%3NFw-Y>d3N|X`sdK`Xa0-h zOygzht=dwN6|I%m19gd=1pNwUGo4X7k9q=U5cceUPrDP6fc@Om3x^2HTz<(iH&i>; z?4P;2@G~-%NtI;L0gmDdH6z4+XyOxOM}pc5rf$49XHzPA9DyzY>u9*R)}~8}Mvc}m zKF){RbIw=Sg2J2dmmxT56mx-AC~GY|6Xk|Zzn;7KAJ5l{;X?R_!B6PVsbEG$@^cFJ z&RN)N<>(PMR8??}lzqd;F_QP#JiNzU9VG$H1ScRr$H)F1`ksHon+!ix(gaF_KG97R zw#!%E_vg5Tf77RkIERM6_neQX`8w*`oLs)vlC82RF!#2#bhzx-@WX!`*WC}-qpMP_ z#c5Y(gF8o?rGa&5qtbhY*Z)bqX}bR&!Ru!Y^`GrAjJhybPRo(FS)p!0vnFlMx3p_g zWB?ZIgT&>oW2@+E0p%zWm%l%*(IrDFl5fF;m)e-S!|~v3Y?7|24EY4RwqfQ;o&FDd z801Dje3s(JqTObJRr@TsjA?@S6A+B*WeDQ2$B6~-{PgyEXC#t3a!Zld6q#g2n^C7jTp5(rhSVpbdYvO)YV_wCktqA7DjJ_dp_c3Jecgk+l4=lwhF+F={a;@32>Lgz-G z$BP@@!&Kmm7IWx*k>5xlJBZxI@V$kVAp4R &~0%H4xOtiKD2Qk+NdJs8brUE#V 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%0DNS6|GtmrNk_Mk7aiQ^3 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%0D3+IIw75^o+XVX;m32e7TxM81-A5jE1<0 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Ù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 z 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%0DA+NK&O)8~Ep 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 X6fJ&}{tAn4(9eN=E_+|>@k#g(x;?J= literal 0 HcmV?d00001 diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-2.png b/Sources/CouchDBClient/CouchDBClient.docc/Resources/swiftui-example-2.png new file mode 100644 index 0000000000000000000000000000000000000000..80b250c3227f1b7efc87cfa7b7b0091a39e38df6 GIT binary patch literal 937766 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

*O7X8MLdn*?22_CW`kG8%Z;v1i+ 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 z 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

Oob0tCm}}nte5*(QksP?eV|GTGBFf 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

z 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%0AkVL2#44Qu&$ zj?L?tQbMlQh^Uu%+UK-p&b0BeM;hVEj;7GqdUd5E)xjA5Wyy|-VUaM+x#A-MP-iL1 z5QR8Q7p0O5Vr}{bHZI3oO6zFPz3)M1YA9_b^nLk4@4X~KWz#+MUZhqd#+jtwjIkR( z7rbInB__IbDZV3Z5A;EA?Hsn7SmfX8Dml5V*M*qN)R0~mU=$v>+F_g-G|DKbU94Dq z?mASFsP1OD9)Fzt9~#LXx$$WgU381=j7j{1WB=f_YJ%%(E_U7hF?(}&7+P65vf!ri z2ZNyiz3gdWA4tVjq=PuLJ_Z$;XKd;6?CaefYg$mNRLBx%MRluP+y&SDzMY77{D_uM z@RT{UQabL@u#}lDTGI8%0|2;b^qvN1h9mA2Qp;g}_et4#U={1lW3>vb3i8n|QD9jF z{j%^WQVioMRbbPVvgaOfemM-#01JR8{~W&Rm0AaPf9&_&dC8(myg!dZ;Jjh)Pa7Du z!igGPjenDv)iQRk?2T6Uy4TWeD_Z2tLj7?RSXq=9G9`mtg;M&0uheow2C8O@GFw zn+Y0DtX+Nrml4|&$C?WGZGL_3t1hyKR!fqMFmv{MY=(;WX+69s zG6qXTTRvgww_4tah}SBdH83;rDmxMw>uY+(ThOsvhe#aWyry^}O*m#g0Lo|22m zhcdLNanuW6y<%rppu9D81vvz1i}*D%(RH9|YXQ{xI{IaFja?x%ykW=iWgvx}XK$Q% zwC*LAdmPybJWrmOgt-J=37nxfb&Op9R(fmA?O|Un0XAVg#eoa=?2pX^ z0*bELAYed`(i_+Go;UTa=m`e5xiWzMY*-gqq-b+?!3vhqHv$NRZMvq5(M*?8hsJRB zKwy^Ct4o&UPnj+*1(+y6!>%orQl4<;!I(7gCD2<~ra#tpl|YpsLtmB2L#X(v8zrD@ zpO=hj6brVo%i)LI)4KAh@xasfUk{xd&IBk0VA6(6GU_L&Ehi7|f~nhmiVsZI_GKqu zIRC2`*EHHznHX>f1E&@C(_ORx{)ahZ^nZwZ^LVKD|NpzBaAdE@Fhi8isc4ejjF2Ru zQjzRaDPxJT4l}ZoWi00;W^AcsC&^BtnH+nz$-a(Z>}D8ayWZ3JbUx=g-|Kt*@%!iZ zce>ru`?Wlu&&T6&e~HR|I_Jfa`m%nbc4@)Ka$a^E%%W#&VbXk|K_f!?5?yY!3bF(b zwZ)Z6r7*vtHW#nbT=7`lPLNK#_Rrc5&k2CuPiW)#ns4T49`RVdEK9OOoXzHJ=fMR} zYn%zO9^t`q!>O${n3630ug=|E__9_jPs*tgF=B-8iru+ILoL5;F{A^(cF|5X8e@oh zf)reQeD?RWwm;SE6RAfk^xc0SJ3H%e{bW@p!uT*>K!|#5q(dPDdU5{1GcKi0=_$K; zb+P-Ud^0g6#~q9&z9KR6ecAn^gg)I4^BnZXGb5+m)Dk7Jepb`bIUt6hY8bjSchP%`*e@1Nz6L=G&#N1l- zatp0L4V|rtW4zhmD5~9*WeVkC3duG4Lvtops8?Bao>r!iQEZ$*iNkzVaq)O010Um0 z@pkV2u!r%TUSC)cFr|fyUF`pd!Gwc*c@sH_0!S}M_o@B*uLCn$x>!Mo&VI%7!`|0w zH*HR}H~c4BVtyqouMhOsdD$Bn$1nj0v)1$!xlQx!;VZW0t&!r%}X~C zPg#oUc7%hr?v31eq8t4sIO%Q1@$9Z4EDBv*vu)*grGp;$1!1)~&{)Z6f>a=bo*2A~h!CqIS@7k!vsZ zcaaJClQU0(ZFCSW5_QzL+@vTS{>n3CA*Uvq4QXzY1hZwk_oX5j+6Jr0kyTHvmO$hJ>oIKNqr)`AZFT6h%PXZxRBEQ(ruIBsnGg_*eOG% zRrEQuBAyl@_x$3ugu^oAzRmtzfcX*}*hk%KYJi3EPrKCCe-)y41%DKxKt^k0j7!T$ zn|cbC;L(r)yC}c@?l!oxCCfYMM4Ut2_OybDN9a|>Yu~=#=d2a2XMWj1_{p7H7sZZ? zR;{&bxF-1G=utx1#P~Sk(J7C*`n|1sh{K%ck5zkF?WS|W(;&%gk-PVP({>%M@>I%) z1OT2ot2nVL!%L>i@Tr}O> z6JR(Y^mY5(lLR0q&y!63`6~|51;?~j^R22s%4MxAg`kDgB;wOVE_k2*WBZ6xul$99 z)NTuajn1*l9{Uk6*4IuJtQpK3u(2vOgmuEj&&^h?~5iPFh>|Z$yBchh|JQXX7 zZ!FL~=c95VW7?frMU_{y4{`$;-8;`-nwmlS8!aIoHBw5VP^FJXe$`kq16qz6wQP^n z%a2S;>2pZ05y}bY&*Vo#PkdaAQ4127JYaFZ+qhFBJd0kdI!lWQ@;xf=Zj!b3ibw*H zaAM{7eHTndUG|L#e&`Y*wK??kgY*hIu6@03HF1Szx}|?E2`LTO3vCSHvIkRebzEfy zp62PGhb?W}fcE}X#>F@A#Lorf!pX_%cnHVepIn0h$hQ6T-~V$5|Mao=9S_7rW_UAt z%{Js(&v71qT_R$vYA2oauzcm~RdBbO0eB@s--8_;luMqOH36OkT?D4#9hz3D%UApQ z>vtJ#yTSK2C|l$(j{tRK_Hk>;?ohBhe` zg>1p5nlMlSlyExPEH{n;z?(N<1wbDqvnw$(8l%bPkOMdh8t83$ho|Me?{&IDC-bfQ z^ZiOTzPk(4k5%K&hE3jDsIk^ORQ{(u;JyKZ0>i+dqDcILSL?3 z>}MKn=(XUO##_a9)hvyvINhq=JTrl2U+T%WhI`uc)2X)l+jZCMAt?VNJ52c~3FU3U z`GlqX$fC_wMT=4KK5yfE-v~XEvr2SrEelAhTb~0T3P|GgwF=VrO`NW$~k8=qBuW{Dhpr#%=Rr{D~y|t&S5p!D-OCfq~-k zOnt5~Zp7rW+}(ZAqAyeOD*4v9KkhE}s%;AOpFGa5<$i+fFG8KMNWGt~iYULdjvXtog{5DJ<`Jxl9Y5~Sbdr~N%F{0|JY^ha}YKoM-yGJ05!2WQ|9IDcWyH7C&Afq=zM zRE`2X@tQsiW8|2mJ}wF?2aJ}(Nb9wf+!U2M;L@sV$uikErtMmSL8%X$rmg<&OS36# z{?L@u#R^z=2vY~foJsz9^lk42?i*D|1#&9GDN0Cm zP+Ij1trK=JORuEznh!L@ev->Utlp7yYkl$yVs*k$#u~CMD}dQE#D8k3AU527);OcaMw0c zREVt^F$M!|Hq^~Gfv?@x^3T_cp3?HzDt}aiMCRJLcu>BW+|Bb{))UZPDhA$=O>3F7 ztQ7Lm{k(rAi1Dalh@zJdIjE-AA;y{uhFoyepE3H1kHJ#jArbkukhbvDs`XwM>n$wC z`E!mR(--kT!S+31tzLYcsLb!$+Vqdm>9qc*4i7Y({e}lNI`Q9cc!+asiEA%u3!rao z03r?QM09yoZ$TBWLQU}=X!3Hl-r=|fU`mKHq6fWmXS>fI+suC`H8oayx*y?NG3T@Qy4h`&~#7BIkEVEaalhg#Ca-kvm$=_BX`jQ}!Ar}kmXtHgLnQeuX_ z^RDu~5_)3#_EgiGWuL-x_dj~5)T`N`t}B%KSe4?Rj5>4!z^07~k|#g_U!hCMLs!Rw z1x7-Bjt7khH$>h4*)>QNKj4(2N}{Qml6%%6g5jTdwSSWfF-=ZB!#eM+nFC>T3Dgoq zNc20)(|+gs?>c+VTXY>)1h7t?F=g$-&eS4vtE#MNB1Huc#Ucii+^x^_c<4q2qqJ0@Z&l-1T-3hWR<#PpFFH>v2Rz9IFiQ&&8 zh~#iz9v7AU^TgyN&;hJw>Cqx?pm zApKP4QOw`J$oX>|zym3BeFgXXwLc|hoYD%Z{Oo;;TS6$LayMGKv{^2bggXQ|sO5nz z3QbdsS*nPToc?m-fR;U7kyy!SZV(IDJjd)|P3Z#jG2I<$69<=cX1+xkpk>IrW@>&r zCMergX4iqz;X3^^Eo1RhKu`duTew<`+BZ`_3VOcjv+JvDyQJ=(utqfX=;nfv|8f)tO$3m`viIP%lVxQ;EasgRE>1*JP^b*f#hr$>idrOEi z^24}?P6F)cu`fE0xuYDq=7x`;Qub9r_qoZCg_I-DJ6P_Qixs0c9e2f0dTuD(pih;+ zSExR^!iEUrZi@BSFBZ!UL;|>kA7P(ddZj;KVTD2ri^GX9a?Qg>7<0kETRVfy*q97& zWq@<3{ozc-R=tYi5x~-jKIpC;qVKZg>mQBdU-V;%|wDF@M=x*zhh|^PNvhxm1JNn?Jh&`|G5hP zDrRig1APE^KH7E7kl9+3*g=AE796_ zTlo4-PhJ%6Pv8@uHVhpIZddjq?sKCBdzp(o#u2cSQxTnm z#f_plb*$cp<5@+uUUP;cC?_jFdf&x*O;Orp@Ok|RC9DUgeWmo2Ij1k&`TT@r<)|M~$+&-YwCH0Xwrh8WXa-rz15*WXI z8WZ8hHx*YDs-V2xIjM`Bf>K3yr*DIGBx$unSEd8PEvJWwHTqD(+ z-3J#Qku|-K1r=Xf<9UI1FKI2=eD%Q&V!Ho<<^Be)oPFlJabH8qC3Gz&(Lt zaIU{{>$5QonGAyIMEeo-ZB~=Z`DPX%tCFr3{*fDeH&Ko1l}ZsiBRpEgr)cNHFau&mHg!1$;RomGLoWr5-D^j&(S{3JIzYGLa|dCkL( z921PAy)oamGw8&T9o4{MFQ9AiO?v|52y0}WFBk%XA=h5p=yu!U`xbeS6{TjAZN6XZ zF*QleM!Xm1gc&DHU2YDYnpOz#-2fiSaFkBcb7o({)W0rarZ8UF01Kph%Gq*>N^^}q zOOU?KUB~%zCc@2u5L^~2-v(!XvI~?uk@TfRQ<$QRRe44Zw*~NFwlf;}DFndnqrFwDus<^c_40;egyEqta}4u&^XfEi_{5RASjxpj40xoTo- zL;xPlkXeGn3+(!xy&|_ z?-dujO@@uLwmAP`G&`%ofpyvP1t5#>bqOJV9}a(cE+{`v$9+t~jAnNASP<{Arqxbe zfd%&4qb>^rWxT9AG7n_0p5L}|Pk1`eFawCsyM{+GBY?lwQ_%fbLj6{CJ#7(aKINyr z?QGTW`I&TDe4Ra7bE?(+%?H5SDm|F@xyy~-+Zo*( zhS30Xop5G+xA+<3Az9KY{dowayKYzN$tbM0A7GtHL30gNmX6L&)Nhf{uGD7ZiTd*9h zN(%^Sx4Awo*PxZq7{UipGdNo~Fn+B|kiMF-&$BpQdx`AN6w!B?ENGMnn3;Ny1+{}F z%|MJcq>;S@GEc3|2)5nSSm~Fk-}+`m?PC|KHw;tW6jXimBJq1nu^5pXUx;v2^F}wW(eig)4n?39Y@O-Cl<1t@ zCe#W|-_;33&+fBR2`{1O;IvSpF#;2OCh376ot<2a%J}iqzr$FWburC`m~~?uy^J!q zP(evq99+N|f>iP$fO_-amw%*+=eZAS1rN@gPX|Ke=QNrO{sp#s#2<)>&nPE9aSig{ z8XT?LVmoISvw`{R9iw@`XEVR}P{Hqeji~@pZ7rhNtak3s+I1};_frK-li`vkSCeJg z){APD`pve))>`lhaX-9l+<|fcbnSM+<|w$iCCgWi=fM}C>TKM}`klDB>~r7PWpb$| z@qq-ufzB(OGojpnJPJ5&4`>(<+`oEE=F!UZ2%FB(W(Ym!=4hRuoP00{jJrsA@By%a z`+N9Sw+2ugu#YBqa4kliTde;2k(H~{klp3*>in$Vd|ZKMt}yqlcn7dNPyMw#C*hwB zk|Zq78&~Y^RSkEf;D^v ziR*=J7Su?n0#Lz6)ls@#F!q9|S2LWo>k)%7Mmvl?01$V;zVn&Lmx-4G$J9C-bZ>>H z1zh}$&><vXYdu`@h-|!{iHRas*JyS-nj+uH+HR3EUa!UFN+COHUzw%P?RG5E+ z8&&q8W9cI+EwyNY=ZJE83>?hLK}(`0^6fBRkxjS(I`ZvEJH8z~5TQ5%1|e?{L}&w7CN0k(KVLbA z{9va=4C|yhfaz0(G?}!@%8bKB!|#39zHd+5VKd@ffBA!(6uQVq!gI^2(681?pO-6w zZMIJH1^M!RF4BG|01t9{@Pp8*^hBsTB99w{JHF{rlcJWn| zyv318K=ywpm-kd>(Am{*&}y44i+QpGu~pu+G^=Xzm81R*Yk<$&_U!RUkr5zAiHicki;sl1K=zw?5XT6+owjm+#T=~P8T>KQF~?tvxF0U*^|HGz9cY#m4Ddr_pdJ98 zNcOHD+-utcJncH{$RI;bF18RkMA#VB7~O1NWGf%4YwuwbFKDz$$es`BNemECQX%!- zYTlXvw8#176~tWjtiwuG+B!y=Pg|h1LhIR%?088RJAz&%6RT>U&nxB*bF-h3wKEY^ z$ZG|nmC#qv4YkEP|8VJ#Ub5|eYs4M`sdJ;BUSoRyvX}P8!8p(Ih_77Q>lp(0cxoaS zmPf~0?My49S6)C*3+>U9oqaq@V9k*fE>0DqRVz3>uZ+-kJiChmY9zPnf-=bh?b}(} zebSFF4IF~=p z;(3m0sWCa{s)?p$mBP{6Y+R)=+ zPJXhbEU54n<~y68hYF?w{JcW$U)H)NBJkg?Z=7?{6sp^(=_) zvU6x1*yIg^Pn`rqAI~Fn_A%v1j^b+2ieCmmsdW%d;XZl zupvQOc*XpNF{=tNP4uVBA5@DW4Xkc;+~T~&JN3ft^RM$lQN zoxz`4cOE1>JqHwNuEP&U6SuSe`*71bm}49J<=262Inb`rVNuTbZK7DJgb)^DdtCw^ zVJV6sZnh*hDF2BE$bmhhN{*QAHfJle$JI6?{+*SsLL9PBz&eVtLh68hLm>BF40f*i z*D7)QL_BzT?Zu?%N%3u&?PWXutGxmv@paUdY!U<%wVq_nYBk_G@i?}0Wku)`kw~7rADEwU(NusFF5KT5(SAJA{&79RIhlt)uJ{5n;i?_}`oBuwyFz3$9`soAuQvm>Ndf*@ms*kx3D(Ms zN8rakjb4yG5s^`AGv#*t(H3xV!4e_y_I>nWTw6 zO*UtzY7(bam&;mVPt`ABl z1r79Y$36cMmV|QpG@Yy0UGWRi6scpg1KnXz6L2(ow;-}pWXaoXu5-;bJH@2%`EK8W zNErb0k(Uc)DdEtoippFiz@v3{c8y#KTQ_NnSExC4$!Rn?oi#dB^wdvm%0aCe5?$&K=+^Q7G zZFNXz6`0)Q`2qghF1Kp~?!Vw>Lq9al226&GjxGWxqc?EddIQr~J(b7|{nbAPHUN|p zZgIgiV2jK!F(il^eN+&nOUwC>@Tj}h-N&LQj&}eTuDJavxwU2L(trIP=l!?|fb6nUZ{zA!is##uS-v**^7QI$ zg07`*=bA?BUl76U^r0h8O}|Dvp8Mg1zG$Bs0rY%vOZCnr~x zg@XgMtcL|w-QpR=SDTRui)2Cd9|%E=m_USDwATO^UUCX?_B1mV$ux)9h%>s@f^H;@ zSeC)-=4OTZrz9k?bIH~GMCMJ1BsMx{yzU+^Bc>c&M|oprv-NfnQ*4&Q$ip^Ic7+)7 zpN(~TZZv=pZ)=gbB&d94?aPH&UrF90C9x}R-9%K%&|{2~CtrKl%|X#nsOz=KHUnIb zM09WIAtJp`PGD1TJ#b7{g0C9s+Bj|!lB^u^=WKmyzC4gv7*a=w@rY093asiTXfxkou?j#h z9Dd?noj#3T6KYqOZz)aww1K062m#Ad?Rc|0f^tQ}PS@R0mv8-eOn9FA`hM z`Dc0n)>AKb;JW;E575(YRk4#+EmberlT6r(Yv#e_2%zcNsN}6Y`?wnTv+r7q-U;10 zoG^P}F0(<;J}%#n+;==)e{h7=R}QXz%^pTJKT6H;o`{rNuUP#uVegI*rW>n{hb(>p zsABepDFg5`{frMwrGT?$zj(H19pJ7Zh}U<0Vh7TP*$?BU!&Mv+a9&OrHxcN|>PM_R zd+$uXP`wM#fy~Wc{rrW_i*Wk@O;S$MUtB^In@dRTTB-dVq1;fDpw?QEkA+V2s2F!|lfb^zA-L?m@i$di|N=dZSz2cWu z(a&|SA+lOGPm1me$<3GC+&;uRgrTo~J9NDfO$-8ciC~hx$k^R)D?Gh}9tmN<07ur#ljYx!+EVi%lYB0MY$}8wjJ;SG|@cJX#0F=pF`j zy*$E08Y3&Qi)`HPoemJ7?=~i5bd853gW76NphT9jwELq~W09fV!r517ZNF(R9V@TU z+Xxb^$?#(~Lf}>Ro5a7{MTAZS|n*rU2%P9W$55?eZ^>E`<>G18ytt?@Ud+QJ18G{yBV9?^Vu zE_ui%d2-y0*qIu!rgw`(E8QL?o%$~;A_ea64{ z+jv_A1d7ZbY}bn>ZzNur(YZoBvl*kN_CW|2I|5zLZR`gTRny`3wgTJCJ?SIG#WH}Q zCx$nbR$7NFt3v^Ds0;fk^S+JEt)_nr8}qq2uwLD3_W&*C`6t5bf0bNs1uJp@7YGA1 z%Dl2cRH-Z30vIkmdvL{bopD)GWEiUpm!_=ey*Zua{iA_Z2-s{fogQnd13279{`m_P zueZ6D+4#hr$)}|6q}f=&gwGxT-Sf`Y7|sDECzHfVdes|2`qP^E_bpWbvO|ly3#{XZ z_JszAcJCg(8Iib8`sg`X_5wt;3v1(c_Sih4A6aO*he4Z*Ux8+UDZIkg7!8W64b6vB zVbN>D_#cPhv=lY)3tN;~1W?X*H-K=Nr^H3xIcDMXk8lG!Shkgu&dNE6aR|*Iok(9J z%y@`eK5Yo1^@;)Uuh&1D0N|2+8Z;ug_%wX+(*c3`O6mN#fTg~)l5If-lgv!}WkRAB zJHP}RezuaNh4b6^$ED~(kn8*?tyU9(y@NJ8UkwyT%Ix&bkmjR4PL!}{pH?X8QfGCI z5||BO1pftKY|XpGkx)G)rcv|jgG<8Vt<5UrPZ@`XPPuoBo$1rJF`*)it=&0fvC&9t znzE;>%oQ!7vIjt5v`DGi=of$?KZf~n@*)wSn&Jai`1K%bx9jrmGG$n+jZak|Eu#vM zbah2ami+I0Cpd0slOWaV6OXCGuhl0@W_2a-SM*Jz_uKBjP#0u;n9(H^Tmg0>W@H~z z_TctfqYZ-o6hO{KMQTR)WsKGwXNI_M0`pUeI z-JM&J4jU?~qs>Fys-5p|Xw;)_aigCd<@wLKR~*F6^fl^m@B)f9Zm(Pa)hT`~*W=n_ zZ!dR>d}DW}FoPJVE-(T3$WP$z-IY=pALXK7v$9(Z>@G<7EwDnHwa;6 zh{dJ)ME{&kHl9fC@ygflPo{xtZ>e3KmcPj6U^N}-LC=|{55Q&(Oy(dZO##2}egOi4 z{0XC~m2J*0-DP_Z;O!UhZX|d3za3S1VBoGG%QkCmVc5i%IV_L^$4d8SF5D?X-wF70 z~k|@@D#A@7ivK&YX1aJEqNqLqOvfGww;P@Pr^boXpI1l>{VlQ{ai1(VWd=r*K89H)z z`&4(YtN}7oF2D?3tHJ?vQIVpX2vwmqz<{A|@_VRH^$}md4n%easB*7$OCY@q>?|wUD1hGs6`4Io12@v0HEFJe%UG=enTYuFk5h zCN7S4*>FUOyX$(-bbaM!m}8@zHL+X?0B1&Z3e){dWo`(9yq2PMX za(LlR+ztK1Dx8Sgd!2qLDclMj*a*etkM5KAQC~Q`Ys}#(vrI(L{JIe%OJxOopIEH< zELc^Nxf6WCYw`-%jW_xq6Sy~mW2N7TGf#ny66&$~ukPkMuu-md=23Ny+2IBU0ysuS z(s~+v>UY*@d+R>zVSTA2;Jq4VoB747@)5f-7qab2!p;=cxHFme!H5=7v$!(Vwpfu< zFAU#p0BCeqj1iU;?61#vRl~bxQgTb7{6${hYfVjeu>@JaLw;AEs|-EW<>EPwgfbA0%mt8WVk@vF); zzC{RN7IO1u4@iMXk0)tISW?c(eQ&I!R#5mKW%<1HQ`T(uM*Yn47GHf-Pry>+xy)ZZ z51WK6%ndB1 zgHmV@3$!~$4(~dMT$c7VaaNrYZ>S79e?aSbn(~}OK3dIG*!f+fIsAp%lzjuh5wb2k zQrC1dz2+%FEUVNQ#809YcL`2B;ijP$#R43qSBsW&{G^kBE7*%>-cQceC)M;hbUI#joItWXD|}N$UGy|M1%KkujhCg`&rWb5&@+9|x@7cN9@r`d5#4z|y;3dW&E}!c z9iAE9ixoLxu1APXt}=hVek@|<5MWKzFiw24ZHU~8;GaXv70Px0!D_UerYMSQ zq?8kjN3iWNIWegKTo9)sm&P2_wOV@l4-Wr(nK1_?So)X$O$7p?KCYB~9YOycx&J&X zRNOe(A(w)CrElf>s_$%`ayKV*uhssJ+CDyMb`TQb<{uDh)z#rsPs>${=)y^W`9t~Z z9pzlxzK{uJaP_8|=sZC2t$yUcDS!a19`r~fj4#rxT>0uns&xB#h+xPe1XDkOqRNP> z)I7Z%tuGfJ1C{D3&U0qeBp6}a7kOqK{xD05IG`v#<;h{*VJy-}Th zaeGDAQWV9YnlH1 zLY)Cj!1&$OK2;?FxR8Vl_a&!m)<;pt+G>80Ya5qSbEP+C;A4yY&97WO$ ztpOyX@(ME}Pi@e{d=!ek*#Gdb`orZ{OO|rV>(5+=d3RYC`do}Xdg5muIwMQ&&eP}S z@s1mBK13h$}JQp+a49NJQ&xu}44sP{w| zu8$c3@6Z3PzvKNuW?zK5!xX~>*w+sI|!|&-zan|1R z(|e!xb36TAvVW?J`NV$VM$(IHH$2yy7tX2X)wFSA`LZCoQl{OnaY#V*d@eu*&G190-^lkIbD6b`m*MZqlqM@;9kGB@xbGqD*paYGA@HWXplu+i^Zf+xjg@_ zAOii%H;G1rT*R+xOxr92G9tf@&kw31GT)aEgSIxCsu?*C@Tvixp+-nano=jSTL1(Q zv!hGS5XV|xS};$v-UEPyp40-HwG_kp6cY4f&g)a@ziIQH;4(T-dxSKObPU3^i8jPk zfZgqMTMHD_otvP2;X?%Z@DWRAGB2a+Ub&WvMYU?V9zy+ z19PO7703L-5SoC^E(YKWaSF)B4m7jBlBOcMgDdlgfBV>{!qxQ582}}7qlxkVuz#P` z;$V#O`!9xNly8g4A$~Tke|?pgO6&*F%gkhH|NX2#55oCD?&XNVGGxD3T-R8j)Kepg zY7Gy6m6HN`2@;rTT#xE@vWV{FR(=X;sjBmiG_enLhvMGDqGZB@3Z9q6bfwpLN)8}v z$~J(U$l|-K*a^_4BknWKMJ8EwP4V5G$P zM+qZ83xageqV`rEa^gnO^0LyJH2bx|#3||YI%hJiI4aR|ag|Uf^*locpQlt8S=d-d`6BZxR~(`RYJFddnBd6$5=|DP0P1Og z2Q60?=lbCgRN$3B)C0wfU^_zv{m8UUTbTm^_K#QNi^t`j2!MQlTXMYAbetJ406FIB zJaPO!*ZqP9G3X0y@n$Nv=@qIrAE$~!ptOkh1z>d-omlY)awx2Ip(QZDPXyko66Mn!*OWz8uL+@M|iA~G*fZrOVSW&;CQzTrNS3f^c^T~9c%`{ zGtZxnf4ib^+j)c=J+mHM*~aF-vHrtIB#?ky#k^=J8Do&eNXrc9IT94deeg_%~T14qWu{3)d$6jNw{06 zl)QE3xyyZxE|L?1o>Z$S*m@U>I#-n(+zbRhy#aZg?Kpe~efs<~NAeY{5JKE5LS^4q zF=5HN=#s1?bCTug{(ITKQapmY+PB-w@Hkb~oAkc;(ojI$&j%XR=zAiQj&fRUKE&r+ zO{1_b8D?^6tRJGJW#&SfB{!7fJp_8YqYc!9`*Ne)5%eGvzHPGRiJQ*nK~B+7&=;Kf zr#In;XYjB1{3KyIR-bY+EW$@vQ<>wq46_eUNJKJWs>oG*^|yQ=dTf^!$%QO`i{AdN z0cSyWl=L4`#JxWnWik2et(H^Ei*qx(OG8;!Y6iw9EK3;^2RlM|U-H^WuH_)VhSHn$XgVUgeq^-s!DKqqdnCMvV*45;l7-)1ee>AsBO-sv^Lwk zT}oapmim>4sbqs+&v>OjkCaf#kHS@UPAX8TPgvcii6hY60Y)}J%E&8%w+)eIb*+gt zLho!)7Yf~&8Ix_OsJ_LDhijD5iu1LnXOD8b?)6iK_RaAf)W9C)M$j3jf<{1qv&lRh z48!H^tn^JHCr@?tC+E5HZJ!*;M7Y4VBNe&4h|K%I;GV=)%TU#J)xcE%4(3Z@Kg){Z zSKQ1>U^2#*Gk@_;_}64C`4UhpCi@(JAMtaW{r&Mi8664)hP0l@zWmv{1r|y;3DSm% zV2>a%fjky*dzahGnW?tKwZK((wXE6X=F-r}c8{EkC8iE!ny-x;QC%AgPuq_06vGcz zq=;URg|n!mE-q#ty!aLi3~nXv9@so=mqj&y2~!t+&YxKnqO?NBbrNL(H28|Dw=L*~Y#AhqXKmaIGeyZl?!6S~d-m z+@&-nK}*O5MMY@T-BHR&|L0RY0;v-z^C!o9SrY0sX2ul^1`kReFy4jqW z&CW^-5Bk+VjpaAAaGMhUo39)wFqVdteZI>|7}d?}lxFo43W1lL-5*8g)b+jAcZ7S~ah3O=d;?${ z^M9}iEWp1`!?S+uq=Qng8_vC|yh)5eDW77qnb4S?90%jWC{)+Rhs-{iER=stky}%R zF&Z;a45?P8kcIpu?(3(bwo*FC1Bnnj6Uu`{i{fDESE&Tzz5cW+)2M@Qjn9jIo#5Q} zDj5{#K{+9vUg8!q&{QG>@){A7$fHJ$gw?)GkG!lh5oZCxGx8uSKw=JK|2V?eQiHML zy;G-3zqt0%PGK<^3{v`P06Qp&qW7H=RVq&I-?=}U()O^zdR2lvU?=K4j8@M6;@049 z_sy^2n?{kSBFj;x1iMZ>vXkt0p!hEDyveNYQVg$_fnT)H>IrySAFENbEzCFv;ZIn) zRe#WSiB?{xwq9rZeqnHQ(OCV-WL&4i;=lB^4>29n|BK$nKKq!t4~+iaKL0H*ME7%} z!@=ms-ksW9e7;hiD$6>8Xw}pHa-rv6&|bwX70{E4Ug4m^OH+i$`ZlNyJ<431sK#e= z=!=mO#>!37OI1qWaUe{uj-bN;Jw*BAvf+K;?y9_^A=>r3k?cZ)RnS+iJsz;|7~eh+ zy{Xv{7%EC2b|R!-sBKcmRn(FI^bc&NnLxe=!F9iZW6SC!a^5a7h+UJ}sn8N?fr$%X z6uNZvf>zzdxl%7ROLCV?lfc#M2ec@}WG(;>l;xw+>tWw8`^x)D<)w=h4@9f8Q?83R z#EI@iG^&RB3!%i3hd;WNP>=ez1us43pQ$_D1Ozkwf&&5bF!%l|@=g(cul4hBl9J{b z|Nm&9Kg_cgL@QRT>Es%o^LJ}}sWyxODvhjJ#_z_I0<3u`S2$IgX(#e~N)lnGX45KQ z*mL;k;73n6=b`ft6ht6Dk3Dviyk849yQvB6uuZ5j@&A3koky}Cu}2nN?GyPQJB(cZ zKY%&n`XNghVrKES;r!M-UfW`3IfTS(h28x%>%EXvR!U+C1DW<`Xji%qok&Hv?hep! zu^&gVTfRXf)8_=5G$P$)4~a!SSWPJI9)oD#P7Du8J$03p2@H7<3?n6zh^)d*dbXU3 z7qO>+6NXrZ_E`tmcWnkK-t8Gj@H??OO}ixu^=u|nMGUP%%;~_aLjw%Sb%BvQ7kzTvTs?B^Uc6<1PKS7Qnr48$w%VSL|-S2Ia;q}>gKks zP|npl8wEdrL-u8*ZNOAguC_M6ghdEQaSN?lqgZLTwJg_d!Qu&E(X1Mm#P-r?`% z)}I8&DoV(vQ+t%FE<}VJm#7wk9`PDZ-DpNV57Nv1re?S zbzW!!Xc*mxjx0v*9~9SiMR22G@W1s%+mk}eis@+`t3XX5yfF1In{8baFjtHBUGCZ%(Pm#}hGGEYdsIo#lf2B1_0O@AK`aVfA*8r4HePFE3dO`WtCpFY%ej0}V1I5Y3lgi<<`tEr+LkupV$lKbfZC&@wphIlhKd_b8<{trIJSv@uGu}P?& zwERF@=_MP%`JP<-1LH=Bmd)waWZqhmq+`FRmi0bv=Ll%<_e-vr4TE$2hDBhlRom>? z{~P$2d2*LkCEIt<$dW$Pru2`o;64uj-2tX0u&EASGXC>ln+n0+R0xHuFaAF^6-fx_ zE4aWuV{u6*mO`!L3E6yDo|sC4kbjr-9R<-)33s#Bm>8cOnz`g=evy_skr|ihc61Fd zu*)k8kSUTIeakZMmpLAlqdGsvjyf%b7iec6k8}1~fBN$Avp0Mvg!o{VC%^iw7I)Il zjGOE|nw$I@EU*&co7^!<{d5S|LLfJXo7+^Y`!8q1X}Yb>XVJ6`eiUj#5P(&ydk&L3 z8_Ql{3v~GxC|UCA8|sBv#ig{krzW8X->V*zRh1XUe5gaRq}0GNZ~DaQcH^J zk18FxoKoAL)tEgZSRC_QRQ}(M1c+3)E&cMh0GTQj-Q0DDb z)8aeTj~{y*o78Cju6_y(gJMUgUsgCKDI#jt2Na3z8;|A+3~@1pRU1dFN8uMH+lV1d z_isAaBmsa);=^C_?{<0WjfUwOi@-lLOn6bA;bjA3YFM3!QvRI^H`5Ir{<;3d?eqT+ zaqk_~WV-c%A|jxaP*ggh2|6NWkkCP-$tWN)BSmVWL|i3B5xA@5{_l=XlPy*8RTw$NdY1yew9B_Oti1_pii|wP*PORT8uon6EfLn(Yb7WxQdQ7L{q_8Sa>9yo~D|z{dS=(h$2&M8c>C~&vp%2FTXH} zY}cE5HB?*_4)T`@XbT39{NlSl12ZD)w^)N=#o|N*KoVgl zCYeP8z`d*!UmKu}+tU!@b@Jo&Cc7gz468k=`LOCbg zNXz~Dtni%M*wE00RHZth#&jOv-VL6MNSV7bHwj}`c>PN1&B31AVlfC!&stvcvy&{vU68s?*TA=Jzq3$(w*h{Enb&6EL0fw zl;|`t6l_ac$-(ynOb#n6_xy zSnq&kgKmc`$^E+lYdzD5bp9m^0iPAPW}&7RY(2EpyU)~M-%G)!XQ+Ss;uBV#u8?~i zL3GD#gt9_gCFw{pEf5h_Hvb{dE8K6xRQ95>`9MW&yOe@v-(RvnSQ}|rpO-HjK(W?? z`$WrBc&A}P#7sc?04s^(*z4gmo9^MXTeGao^>eVLRu!tOEuy6DO_~K|{-J|4{*>5g3oAm%4kyBxQb7C}8Ry_~!4$)haA4=36@beT}jw9?ouwwome< z{$qAq>?Tg9y>v*G^iDe;rp#c=d_zT)2KWQVBSMTYsyCH}(7SgHWM}d60jKMO+6`1VhXepvKHc4z909118R_KFcS2pC|b>DGzA<^UvX72Tf)3F3I zi3z~kkaH7KhWCN#HJhJWqtK&!6bmMwf-c^4R8N*pWPjKG@2MM~6Ye34 z)(dkf6yE~70Tb3kWr<`oKxJLc4Y?Z6;_#$aj=}&45~!pyG7wJjP6Zs5hY(@~w92_2 zkabLisRi_s{K9k40C^U*Rb(;$zb!ckyMy?Ua@=Lxd6dt4r3Nr=IM*0@Go=}EB) zvPz75-hvmD9tS2Aw4g^K1GJJ;5k(s`^@8`*JutQ7^NU&tAmFP6Mm*##4xnwOWlBx_ z5dIRO_um9M3P7~-Sc5U;r;bAWu%i%{)qVa$nfTi=SRN%(e6RP7D^s~n)?0ZrG2+sj{r9c)-^;&I>u*Fa!uG_RNrMO zVKwRp@M)})~yzA@=zq85$sT+FJLSsF$m}kN{2lv_C8%OW+b0|JX7E( zhf;`;Ljp6BaO(b4q_#=g3K4G1wn4841ehBgrzC;BNWSQ@7;c?^4D8$v;OpfipQ|7| zJ9fF;T%DPBlue5s10&EP&AI%#%Gf0mvo9R!P886s3aR>v;Q6(Y?egSHy}6ACF=GOc zmBa#S&dC|HM`iHhv9;@zf{!Bt&o?%-O$zw|>tGbH1sEUM=J;CI=TcD!%m>|qs)maX z@GriKsA~PFQ=j!8b~y@Q+JMc!Qezv>zu&MNLBYU`cS*7B@z0|TW_sE$hbJYlK3+$c zhi5XG#x7+{gpo>=RK(UH^UHc~ivmx9{MT^<#sO`9aRmtUSPD6D78>BsL1xAh(1l$p zfkfRF5)P_UKa&KDQ^{qk>ltGAG*Z_P8rYIsm=i=@_XV5s#`l^MijG@I7?cDJ<_>=nTREP%U5F0qX*qTMSDkl9;q za10>Nac-e zI++PchP|FQ6e@aVBrdLGRXHoh|-`lClu!<6{;IxN@Z-cM%DT{Q_+ zXL661zsy>RNvb+dRL#F(xBghAVEpMuV8DI_uRk&*Bl7jP(QWZ6^Y#**uVxvb7Ua`z z_Cw70uc7a}3$UXc9xl2>`DtnhB&n+v^LFHLf1XN_lgNFGiKx~)?$YS63bq3lye5NM zm>PrHxI@3-95%H@CGfF)d+Z%&Yn)l=E-`;2$~4lwW=29^^t2jV5092G&F`;@W@gtj z^hZIPY{4XTWOXvo2?TM>gBSj`8^qILn7Aic+)?i@E zoyiXQbxtT16g1W9QjJQQUP`kjx;6R0_MEb6eF_X?U@nT;6}b@@Z{-KF>yZ_GYAq0} zx}oBw=N9+NLI}!LoTr<39ePpMF3h^J7F!>M*iBTPBRKPG&0maiCbfUG7>5Xwq4Uv~ zh4Cqrp5wq~75fIS>|~~cfd~@eG37TsbZQltXeF8&J{$wk{XdKhgs{+gao4EtJo(F4 z*2Lb-LO(k`%-NzR>dOKm-V_scfMdB%c&{DgB;reY_YTF;vNE?NK)G5APmlRQ%qiacCrw_9(DpM;p6&3M zTsYO{`(KVp2z_?CmsOe9!jLPVE2^OtHv0Rg6v308{e-lox5d4sd07Sqq1k_P#JA(} zhH`>!4p@Ei5wc&Kzmvo>eE(mv#E&+sd$JmHL*|r8N$1I*7~708xK+H5l=dVrVcv>^ z17}`}&b5Ye==4U&Hv(X(8J!p%sdLv;6{)*z4lzD$O-Z|WIWOZSej5;y!0a{9fBwzR zWJq?DB0;Y>s)w!eoc~?=Mt%R4?&%1l8j;Li8D67)Y7#e`jjCfS9@zKBPGQ4q%#+xw zpSH3|vIw0@vlxKz&ste>zyGaI9Hde#y1tvtq)|cLjdXC8IopINa~|^tM#23oy)4PX zxw^_So^Hxxx*`=X3@B{DJ9BIe)?*?`Wg>#^;IU!=Ij7n>$KO+xF%}HIkcfWYJpS(t z@yf9{A+<^X;P_7M%d6P^d%jJ3eBT-nX8MnDbeJZHW)*OHdPOG4{dht91V{~|%J*___v!kew6QK{C#j{~{3a?r7k zF`DgpLSSNqFjlihzUIZg9FP2!*yfdB zdx7+(7XFjNZ3B&oY4?*P8rwcM4)79)l0|9R4f;%w_4b7*y~qND_UsU!dC+vvEpYlq z&orp+s^Gd#S7i7_RdW7lb&)Tc_`uP2KQ-hW2<_=wK* zMw)8s+jG^3qYsTO>-83nz z^}=)Aum>6dh@hv+n3~YLyDdt5qr{^bvtrQR#jD{3bS~p5N6`&k?v+k`;x43n4f9niFlc{5f36mzQA9xQ#fZma-*CbO?8y z>6!=t01KMBKCVVK_>P$ZL`9bQoTt}R8EWoCC?EgPY93}*eY+?}$XI)ggyr?`4}6=Z z*kkk`8jJvHlr_GnE{$N5#x3L3KSt7|$ZesfXsyej0sK;7--`&78*6QU^kBx+@s=2D z+DXcQIwcC`%nprh($CvV9aG-Q0xCzhS%hzXg~pUufLTx;4qQrbEOK+1P*2hkhO*lk z)^fh$=U4UJHsIPwN?@{^XNGxn!{9M>ssIKYmUMnw9RH~`HqLPjB1q|`nl1D*sUb=V zsm(3C&O=`cq@=FeK~D|51|gxGNV&p|m1L`Hny3)2D}_D&DEF8%DU-93bgYf3tcFS# z;_7U*fDt{D_sWNxrY-N!zbE|J&tD+9+E09-Xnh!bs;04t`{!(Zasjf zk6t9FrRkVFo!u$!^d%}3ZVb-`JV0)u9}H~d&ZhVylUI@v7eF7)2TqG1+3g$8%9lnx3bE}JgJ4dh9y?yZr?N4>bS*f|v`rfJPyA{PX znKddCYas>^tS!!Q5-L!RwQj2K*p*0wIUQ-8QEymG2?T-KO+dtX(FQargH1ylDhROZ zt7fBArR>+qnE=^8;>Y`5-zr}3_daxMRAeqzonR{eJ&1q5gcrfgpzW4lBZkF%i_nia zGsL+t_=niKxw%c2EDv(4pHdcEzB&=o%I!dq9M?TyQHdXPiaU;t+-Q9vBZk5AIuqYK z!a1p-MnF4rn`Q64paroVzU|vi2P_)#s>12&S3(Pl%54&LHpze%otU74wb+$=f`2Ls zN^BdbJD@|k3|KD-t&o;`0VfioG8>$@~>hk3Gp3(Y5LCqJ+ePp<5a=TZw9RZh)CfhhTC z%UqDXAYES=WD0wnQ4^--#|1NjQT(S@`fn6{Ip)remG$ZKawFVATZHlAy~)O0V8j-| zxgh`ap7)EYwM?GIgD5OycJ{b0at$y>URYX^<+%|18`ghCe1xw2I-hmvn6v!|1-?mk z@YhJJ-wWj@Mg7qZi?zeJcb+Lj^(Mu`UFFCrIlm(Gc^1@J-=}4 z(^Rv%c9BYvk37@gX$C~7zE!NARusB514K`{*7U;9(ThHeo^e4 zmk48te{{WpB0DtOi{R6(i7k2oQ_0wh_ouPj$+_X9DTF=+&8btXP7QWjMbu$C;pf;5 zAE(ipzKw`iX7;bbVl9gpIRT&v%I@xN!ufhdc@Uk2c={zPG_NNuiw1o=tz)4^(U{_K zZbigJ@9Fv?pK(T|PN1^0++dnAcv&S{?o%cYjx_8OmdV3pO6+V|Uf&XRUp z_P(q?+&>Z_b33d;vd%}L+dv)Si1O`&Kx-TXe__-L=^7z?+WRvm0_;$Ta=lRv?40^cs%~a0BRw%quC(NeU9B(vFu~bZDf>^@xe2I@MS>~uv=?{K%4+fEvmwj zL_OH3?NFIY?hr1p$QnD#q)RG|xJ@utFOg;NV)O##cKG`f;#*!|M zkXp4zK$^(nUKTKfp>8AgLL4QcCZ_pw^gLfu)oSMZslX)8tuR+j+I9Jw*eCQN`+$o~s-czg`Ad zb~rmJ>Z~Q@9Nf&Ef__ZQ(pERKY!v?~MdSMGhh}#HoK@mBtFHIyYrUDG1DvlgMpH0?egK1w0P^SudjTKP zk?R~(tKHTXkep&gm&T;Q0~7p^UFYvMEU5t_S$;W)!9)w1pC)nh!F#wDj+OiPW3f=otm}vv=w5NQ=B&n^B&&s4|~U%S9KTzUy2_-R;x$4(^G9o8ZOP zmz#qxwbhXhzxxJG`nJrI2nC+Nyd_ARmBBwrF*OQs$yHVtO@z}UJg zjED8FpZ2YgLeT(@olR%T7Nh-Zt=YQ)Y%-d4Q(kRcwNs~gb$*1zzLaC4X0U;FpJQF0 zYSA?eUhQ^yhEpp9SnpGo_@Okqs9d&f?fx!n$%P zgUT-3XFfP&X(|?rlS&6lP?SIt1&3;fjouS)0j%x1V*2(sV6dQk!0D052 zrEcyRjaRdxOXu=j3OUoxGb=1-CGn-ZlYu4fnVvV@9v;F#H5BDxIp9|HsPDD02Q<`Mh)IB8e9&!cE_zzs}GxiyT%7W$DtFE>v$6?Naf z(PHJy)kCZ}eb(_&gc#Fx3*@DTFBw%!5VRzW&9UvFxPnd{gQSJ7A^w?P_l}8m2G~C+ z$S_*413sIP4JJm8`Zlt%(Xq;ppz4sRj_E{hb?azuh=<5>$1R-4XSV%)CXDfy=H!6S z^kgamh@ULf@m1U(vr`6J1P4I{pY1-MkkR04fh7=4szvC*Zrl0Wm2ZQpZc@qSTS{dm zuIbYqPJ&8rteX_^4*|WtH-NBTzKgi5#6ONq;UnXDe;=8xFu_wlcaGRchn?flc`n+2 z>l{h?_5e*bx2Q;VV{`L8NNik}JsRPtndo6euj-EDFw@F4#<-JdmgY90UDYvJk3bQP z`qm5Ct~M;ADX1XlNK_Bi0%4!6iGWHOrTlqX#(K_tWU+nm&2@z)Dd;Fi7{AcLlUFJk zyUkX@C*8@ggjPw}<2N`17c4J~oS~NJN0!N`9u*xps1}(~)O{U_vQTIh9ZOaZKZwMl zgyuIL968*;Tg_HgCrACmltsZ_yLfud9R>B}D|9MJbEbP4uu9Vv(pO%>@n^MPsAJWRxD;CWNw{Rvx zH>)i#Y(#BH6FiLPnOF8a+HT)*(QpR(2Dc7M|G;Xga(FcNlps@1GfUa_n%>B{G39DL zIpmWnN#RkPg8b9PV(gpefvc2^p=6f3KAlIx=geL2j@Wy|(ayx}abZwhjza#ZpaG7f z+v1a-USEAGp|{D!^&_#w(GQn;+p8m(wB2Up;~xLi_t#tKhyVhi3#X#?fApW@h4_*`#rZ|<~Is3=VuhfLEjrkJ;#%caMo=oyY+;fy=-YsqcS|05| zVXWdn#iE;u2eu5*<$V_rAPlS*xEtg{=yFqe+Y zlWkOEY#Fxi8PgwIk{DiRR7bV*mbp~iWNmxHn~So$4FOZrtau_^bj-qYpNQ87``B*2 z=kaUq%I{D~eI&Et_$Xuab}?VLuQSJ&K3snZ)0X{=9K)lgdnLjOUW`8J`^WGpDzDg* zu*6c(rYfjPS7ogLF1=D+jxq`$N+t5@-V$1hUXVR5zrA3G;ZzId-7{NDO2uS8*srg@ zl-m8=#pTyq70VSbepfms>pV^2t2yl^NNQC`j0S&7Rnplf6R~5`#iAQS%JaKXQxETS z)UI_9lpQy9zXp#4L7T5H#*C*MM&EkxY#7aBGgfGXiU0m4bMX2wP_~@Ls6c63PC_@3fVG!<>J{vDt9Zug!umi}UNxmTu6_O!1j_t;-WLHZ*hE=H~5|nlzSAmF*n& zjYig>e1Lzt0<<+%1vWm){ijYgzp=}2^Kxx=0V_g3s&9quDrKtam-vL729EaK zVwBM#ZLN!^A+#LqG^vyCA`J-uE(JO+88Q*0R+bko2RUyV6j6D*t_4k(SmAl{JCPXj zr^EviCq*GYVo?~|hLNDSaY|G32L3f(Uy0Ddx=-&H-Pj_Jq^@$W zi_9e(jQ$j+uU-=YO3c3EX!qY)f65mEKfQLh0DzmEm-=ybevcST;0W;NEsj(i|CL{z zgP}00GP{WYH(R|f(I!8z_e2%#O`MV2R?jP(hTD*wL|aVDe<|Qc1yQ@f4d&4`9r78K z8=C6_JDZCX%5N;Er6-R2QdddoOmsW_xaIh}?0jrC0B_BaUrxa0var|QY7)PP33sRo zRA56rUS%~q^2xL=XfJ(*L^&u-Mu?)78T}lLz+2DyZ(!7E+|w+CYtBNL#5*pmh}BUA z#FkOUew2J+iLgo&*JE%&xh05&gML<2P02N%X=Pax*BP1+k%W%xDhj}9?zc9#%tvQx zr4D7j9PZL2U>|gb+NAo`M-;!WgX|i%Bf)*z+3XuJ9ZuLu9w{1EbXy7$2^8tfi~X0-O&<&X{4p_6Y7VGi&%075;;%R+n27P27$4u` zV5kc*QhVR2STWSm^u`!e4q;Zs1oZEJ##xkg0>s-nyxgq_#hvy@q)n(b?G{srZD7dQ zr!5>V25f7iS0QXB z>g&tzQl%j;inT#`vB^ifqfNo_O?N+1GI=S0k53nWE{*xE7jd)cQTdxU`$wKwxDdT; zXq1%2L}do>l&uX+TwkpOwRZ>Lt;K4H;!DVfytT2OWKP7jkG|uSKk^EP6Y4roO*Y=~ zw9VPA=KOPFFBI2wNL!2BAm11dt9FQ&lJC;o<|VE_f(jA)wvPLgPu=QVBmB*zt>OXcvQU)D5KROxDD7$uC3?$br~1xB!{`}XH^_Y{oPfqgkm_Ci31qT=C2n%ijJxc04*nV`zdE#z3Tcs!nKa%@kh#`Dry_ zwR|u|CuaXkU;R=qrB(d>BHCCG=g-OTq=Jz@eRpU?K~Zh%#?tt~`nx&}>=VQV%5am# zmKmmbmnhm|r#p=`#Z>H{D%;=R_Zf^-iudhkZV!+4#%B4IOoVJQz8Dvv^FleUB}JjG zU#(GyPyv&=e*A?k-`VOnAT}8$-sR`sZ?PM86yKDkEhMiA(`gaqru)UaE)aSN@k zY}&s0q(m>DrZeEij_}+Jv!&&B$$@QF((rzgj$z6OqObeSz#VI{8H;GkE~Qz11bkA( z>PV)qnQ)Bd@)vEv2m^_?ig{%FIl(`bJ&q*u{hC&H(((etF|79CAE8cQN19oLwt9$7 zPc|4_shDf`_0x58hq_HE5Lic@RHcFAHs{`(3olyKiGh>zoSR=R_M|Q#Zx&knG#wDl zt5zjcqV5lx<5@C}@yPMiLWnrFbe3@eP8F`tIniTr*}_LG^A#?AB?7Fd0J>IXV)}k; zQ>Xbn*RAzxp0JFW{{5Yy5ohUumBDeTFHb=C+yQ~%6^5D+=-&5K(&q_Y&A^N&1QdZn z#^$Dk`v0T7e|Xs5H|BBpeShYAQM)v;txXp)Hd29P;bR+%*yB+VO*=U{*p*$}fa-}z z$KjPIB7M64zUc>*wWx`=efw9T)QA9!Pb~6XT_0MT^@SWCrJeR)g{BqU6WY<*#y&v; zVkOca3KrW!rREyMFHZrGrkuk%AdTpYe?5QBn^LKg(w%dpouL@xh6ccD*Gf zeWT6o;a!jJ0wZa~Hs3urdG8d*O-8EDQ&K&-nhIPnh*NI->s ziW)Gj_4`+6VZa;ZZa6=YQ`yP)x=Vf(HwTyV z6!x^&)G;BoCT~aIU-P(&#=U(Vl*-~1C9AGx$OGn*Ji!Mjqjgm@uk+q&+Mg|!=iRDT znyiy-|7<@IR%Wo8B5)}{r@_RUElh>r%iXZZ_NrEt6v3xvXRfB%g;y;%{8O{wU{l0) zN(e&S6wgpcOc+Rw9iXbcpvA*z0NOoy-gWwrz4pDekNJhZ)=go}R*<2_G+gcRj{)T0 zSq7sI2J$f~Q53@YpOLF~53PT9=i?1KJ3GqaqOfk<^qLg26LX~mL|IHRh@nn%%9`iQ zSCP}X0jp-ERbKBk_uJHd57HDcn{S92Ri|=9r0+%sbQieT+VEThE@j@9?88YdGL38T zuO#=GR{0vWu~>Pyv+GHLMr&?jOpDZ$xFp8%(0yxeyMb_p<`nG=1cJA#_Os3lC0W-J zEhIKeoXx^0hzct!EI~y9M8zna46;K!54C0BpN{xCq~9KoZ(=={D^AiW7X=08SaPWT z_UG#rJTr5NUp|eF11epy*%Fu|_;5<^%;{Vh|J5~szqUe@IGt|2x2bfqN|8zuwDp}# z2#YXsH|c!3OgX^c=xqR4$Q{7)Yh%Mtfv=!8*js);iRrleMn}B>eRI3{0~=Sy!B%p? z)eCs5_%)AUZKdd4a)|3!RTDJ@T!;I3JLylZqhE?Bb}jrS*6P|OebDc1g+3rcv7fXx z3B3QBHQPBU;o>AD0?^n&T#C?umNPi^(4v+9j8m@{7*N-&F1j( zr3xQ~8sZ9h-J~}H&Ypzew=3V!>P^zp_>dF}zhA{s8qT;;D}c9j?Oo4&&-uW+OeQ!ovV8V5kR^uzRG-(6wGY>vH1bOgAqDIvAqaJ*%Rc>dc zI^rT{?Fj}Tr%xsg1pca;Ts@FKabs_@49AVAI3Wj?*@xZ4u z_{`~R5SOvE=Q1{*B-bs~$UokFUP}gVjMs84kV;RQmEIoval-x8S-?0CQ>oef%;w4e zl1kWUI))mBE_DT?NR9L+U3D$C&TD6|oNgSisWxb}CwQ|*5W*8ap>YF1Zkv(oF{ zCyI{E9&;sBrlfK|s^^ihFoNa@RD@I&f+pZ-X!EppfQ;1uRp>J*J&CpaCy7n*p`wD% z>eF{aojOW!f*zJ;XuiM%M1|$x@5&}beAmIYs?9F9`BtL%vyNt0VFmZyp0;M!Ag5uB zGQ;Jk8&P+Y{JQ&@L3EWOskCBPmfhFSHn@YFZf5oZ|l#a z!2%Zc3K_|E))Y|f#M)9L+%f`}ZD#Uf@&*w6hBaX5O;O~bY1O4G# zqoutX{C}Kl&}qAMrm5tXm6dhKp4*FW=bThHyKW^xatJjK!6>g=IdvKu6)F%bJ5lP8 z1(cB|Z2;vY6SFb{Q)=ObQwK^`NW2M>MytR*3@H@(fa~*FRynS=nKP5{daaN{%XclE z_?RZg3y!FT!HZW~vx+ui;BO#-p1VW_4P>PJz@WDWb|)n3{7@toSZXDGxyQBz&EF|( zdo6oe#%lmjeNJ+SZhmAVB6TCQL(WgmQ=7OHJ?e9Xc$k~{oN&rfI&5TSU!dn6{)LX~ zv>t>|+ez}#cH*+O8So{=4`q*4V0L40#_A?DFfGk=^e!n12CA)J%w7!236%Pr=5tt_ ztZF--vAnAlt=QBrb{nsS(1%$JLntqm5?=4gPk-(aXtI1Y9(Y+J@f(mETc54VZ7VVLY^SM+G zD>ijxKR?UN&ILKPJY(8m`D#kU5qRjO~V~ zr9z}sC(mPFV&md8`-Z?(L0P&m2tLiRpR}-~^5t`2GLG9oXm1@jb4eR;+;*gB-TMJt z?$wwLbvWdix<6^&1l(z;zOT+wg4e7QP85W`nQ@QF=ehWO%*1+?P224)YqX)HUIq-n3_lT{< zQq;%irQRzqA&e>)|2gkHa%3z>s9F|Ctdp1Go__1{|8-i{^Zqq3oIe(|@Y5~&@X)*; zBR*k1VhpUuI<7w1YRtdV*~?TH)?n4ij0HZGGCbk@9_IP6X#Z)1jljmdn>xf3niBvH_f%TtV9RwPgtwjR{N-|!w#D~Nb^)UX;cP2G%{-jB( zp1MUHwtZrjETqdf=U`Cd;){u%69Tu9&R6b_NN9pO@{QAcZw^OnBwk7_L8)$CWuvLG zaFzJ%=FA56N5P7v+Pra~bbma_v45`=QZXOFdn{FD^A3T$V+m~N+yqN1adU0vBbx`ttwbrgibb;>czFX@%_FLpIw9 zsaG4P`JMRL6+WtIrm;H}q(+_`SN^)QaeCO21qnBqrNI z;^sM5fX&v#(Wt+nFi5bBH(UUuIre`(8-Z6U2Oh32^NMO!zpXCYd`O?`>Mga?KBrF@>{SEa)ClOw z>22v~e)cJjy{Aj_hWQ)$y@TVzn-7c%QLW9!G8!=rV}sySpG`QZ01$Ng=nBZg_L$ri z=2)2#cITa6Et)Wuk2%T#oj98-U^dW)Mtd^`&bL$gmcRH}UZ{x-Ub-!<7#Vu2IVRnA zzHNwPApm0!#2=6r++xz?5f0f}3L&Gl?IdheG9sW)DT2@4^=8wyVNcd6$oz|(&o4?# z40r7fq;A^Xj0UMe=nT3$#51gq$l2LbtW@%C42om7@(Xj(<+5$}@uu7jv$DbNi~YF$ zHiZGQ|2zwy4yN`ZtO~TjU@+y z6$0g4uM~#Zu~GqVYD6;Zg5OgUu*Y1mu{2cHbL;K+{+t5QirA{R$_NU?39nS`JRUB% z^^tphPT(J%MOMVauWa@0vV=`SWJ7H`xaSv=;xD%_K0oNQP%51AiQ|J99P1D{|Pi zl#96?iVg5<1qf=I8f+bwh;&4Tr3CyzPV6;zo!lRZ~`D7EAv%wDIruPxv{6^)c; zsEJs8c*toRXuX{1ejA4`)}Og2|1VBk<&28+a)LxTmiWA1EI;?C$z#h5vzu3g_J{)n z%^XCKr}JiW9GmEXa+euxUKVo=1Ha>Cf-3-Q*Qommp%Zxvr2Gg?Y3z3K(>w{KM#%t& z(&Op~Mg%(>^PHmG42>nsHI7NCu7V3hY%&(2nSq4_D)OHUb)_6I?=UNbDF+4@Jn1(` zZ#y6=U<93}S_s8jnnWOr4_+omV2TPqyC=-`6|IPLj?q6y9RljAt@Ty1c@d>4_$`RhkY3khy(?4~{$;wXRop*Yys716y)rvB} z7Q61I&@L6`=n_Q5GDRK%7G6P{G7Vrm8>Pjd{fnXN57< z9N5^Oj>*4fh1?7P=IS}%J(MUiVR$_O+-NnaaE>94xpBzbv({c=GR^GOXYU`1 zM9JiZ&xWyGpHSBx4gSjTm3fLCc&}ew_p?$6^q5qVS6Kdd?}Jkn*h^3I0r@sh0i85`&u& zQosz+!OS@}r&>D6${dmZ9te7LiWb9*-p|1oHfxkz8Fq~>h`0I9Bs3vT>$V-Chf9Jcji z2rjh~-;c&`pMgsg7J3i65({g0DFE^WuylF5GRU3A0q>MF2pbFr*Ip4qSjRHS6I7|$ zbu$_$nkuX;d*gEj3Bwzvc)4&VorW|@)4;x{GWTarvi4tTzFOk@K)4EfXXT5}#XI%# zArcJm;|+wAhDRcsZBH6!n?6pMDu%t3EbA0~WbGVjEjvZ^_g~G55pB`9u2T!3+#;Kd zSph>taa0`OI+g06LF?by@bS2tt0yQAKu7r1rc@SQ7xj+mf>yEx_@P6Y_aPz0+SKFE zBRop-S9V_B#?AE6y&QPR5!y#bVu{ZQzgxlt*(L5%a2uua;-oKjMH&F;X7J+>iPJ+} zL7s4uDOr(Gn;5MSQbs! zt=JXYk_4QByb(lHw-Ej;;a3HbE^R?wgVqMf3lw)gt@tVod!AStBy)4>x34$Zu`3K3 zoYCJ0@w@>HdrNeVV`cxR4y2Z2`Mj&2uea?V;(ycGOcM~<}f|0Qst z&r5cF%NoVz83>TsOaU_6m~5aEYD!x=1e1YZ{-YeecB;&u*>?PT^<2e7g?){w_t9lW zm~o*QLlt%?Qhw~v)OMkr_?M~erA65z=zvM7+G^f{RFRsT*wKT{cfyEikCKbExFY)J z`?q$~P4C;=i@1#Zjoz;LdP5}eN9NQ=iciqqFU(cY^cv$FlU_HGf} zsoV=Zltewi2?@Q>1U8p7);us^XrD&iZ!DQiiwS4pk!d@JSR*}Sx-@^U!^eqxenM1q zHDLnW=Fn)6k@o6xMeg4H*SyT~fa@zx<%&YyEi|AN<5C-7!M&7Xwb?}xNiX;99TolpuKvR&%vy`?TkCg;MLSQhEJ;i^)>bh-q`G(o&tW&1Ku^>u8aJk?pwxG)_XzT- zsn1sXRQHH-16HIc_`;hg?dnOsUW>H`E5En2`xY7RT1MW((<|4vs>*UreQ~=BW4QA! zWADyfu&mCBJti;uBMNe>%%$U@Yc#o~H6V6AF4U zfP47-D^zxV#v&27U(kF_i~6NZOC?efyT(wncdG2_yB(U(rFI>D==G*3C^A3Q2m(3u82(LSXH`r@=Oo*X|GeY?U<4@%d#vTld%^VmX$JDOBmVKS- zT6xZ;4IqeU`0c5~+O-7)RO2|jb++D5&s}u?$8S~U)P7d%iRfEQ)bH+3QjU75SodrhQ5W#PdXJbcN%21{eQ_oz-&J1 z$Qw@y@2|+W%RfRbNIlwjFqrRhHg=x@6UCTvkx_1(>)VfqjeO=ikG|wT`i|X@?OygI zzxGQ+q^f0GND-0^oOjPFzDQ46aT0$|k@uSxfSh4i!biP)mATC~g=yL3%vg{b0`9@- zL9MYzF3q8;cL1bM#{nrSV*Cs{!2xc!jv}<=(6Exv`Mv=7dESBiM=QOIO;=p9uQ!Df zBSh#hsWbJsKCB=!$C+lIOU@@UC(RkcQShLy&n&QfFNE9x4TkO$6RtwQ=G@qzBOsLx z+aBzs0ep#r8uLPCCvs!ikY6H0aR=b;7_cw-&yJQlc0_D*{EHDMA!9wyDm%6Na+8q| zd&Cc}jsmxTZ}Fac-7&bt-1F)r5_bo=@ag& zL+JzCV~EQy3>qH)1gx$DfK^fh4f#Lb1>??yi~-_4m_sL~*RcXhai_MSU@3ql-mRu> zJE!dUE#L2lh;%FZ*`}=B3QCjgO!5gyQ;yqd(mia1D#$4p;hkw0?|pjJczS7vp{*!+^7R#btD?3N$o9CdR@l&QqZn_5nGP88s?dmSI;!6-#t%}sXrk_( z@g%v%=C3PB`qJ!?BcLa&W(l83>PHVa-SNeYuTUh$%a(`RAC>PEon)-DVilq3SGMgG_O7(8I5`$ z!ap{*>rujO$9X04`;}N%t2yIm!{cJ5<}FPy`xfH(7Yb%|wdWjQ1?jc;Uj+bxS6S+C z3q%eTJ2WLV$w55#!~rPY^jF0=?(Zjn6hHlFN!M@4ugmEx5;fcl;a^456M?~4=0I<+ zS-I4*;r57O?c?F)D4$jPQf{Rpy*a6_>>MO)bid@0I-bAwslWIYMONqbWwZnZ z`-UC6&FSeRH*Fwgn~H=y6C|EkVXk0xg2615@>~SGU`|0op_rP%fqgC*yXJoTW59j+Umqz}L@IVu5AdwFq&4U1{}98eQu|YN67TA#MbODHyZtJmQF@8Xz~7~XoWh5# z^OG~c1hm6s59mJuH%(|^P4bf=W1+2J(CD@=2xkm#J|H`^EcsYWBTWbuU)u(i{(`sy z`dN9_F}5RTu&7DDl>tpz$Eji@w>^Z&0e6;Lw;r~u_=gwl1A0$xoXo>2gG7+F>{l&lqO_&8@1Ko75MIm-0JCGPN$9VA(C_wf zFMleg^+}f}EJWu5HcK!@fH$N8;iMNfnHvyqm`hhKLZw~&R&kY|a3uMBkLTwQnl!d7~-PDOqvz(iVSKPQ^T=@)EfyaF$t+5X!T=4^g<@f zS0si7kxAiWb1rAU=39i)l$-U$fOo3v09dWS#~2qEo$uD#dZYmal+828+9 z{vH1ECnIm(ch33DrvU46zf9)+p!cigqx@7TRSwc2hf+vR1Ao?<#fL zYW;c8bs|fD7TDc{c}vW&Xb)2CZk@|>LE@;(IVN*;#;;r;nlkkxL>n|bXtDuCxMdEk zO%Ojor;XoLmgen2XQSVs?|XKJy}B8)6f;yWvt4ZpI@1EWrq|IcNld*hc?ZVf4Dd<~>2?F~>Sx%YT{Ki%nyG2@!e$iN_ zkxTU~{OH9n*JSCiK5>Lc$YG{gT4<17etT5*U$+ljw8$#XX7rhVM_2xPjK)sCuWs%& zp}Fk#fBS0#g4QgLkIf@a1OF`83-l^k>&4hneHgBkWoO)Jj{D3h1*I}z*|)EMymKz& zJjbPD{trqkVGk_g9B)xSbM(BI=>GJk(|hGP>sN^RMM*o|4uhI>nY|ESSE8YzY{g`k zwY;^j1obo5Q_g5@uH5!Xy}8nU9v^JL0^Oyk8^V`zA2Ri^F#(W3E=tZX;f^r<8sudhd`nf-WFsfFap6GmFDlNk^+)`lR};A6?12aK z@|&b0u*{78cgnfYHq2^&zuug?o7>gavuT&SZVePK#wwOByWHt@aN}sCJNt*Q(?{|a z>O6WdJlwoL8-6`^52en<2g+tTI4W_GA;yhO0}+SBY=Lhpz(OEn;_ql0#HikuBTBj@ z{Uo;kO^&9oN=PVg%hOYwcEMhgypxSv(=XqbPKOW<-*XT!^*AlbB2$0j@=ZFW06)DFvC!yV4#oEy`Pl}}?RDLh0 z?I+K^Ny&^o*ykOn*^9i8N~{8qFk;hMv_q=6l4I|Z>gpN&k4yi8X#v>MVO>FLjhiQ48^P);rH&@D?dQSQ~g*a&EyUnpA-|Jq7$Ck9MYQF)O{F*?+xW2p$)2Br)%H zJ~~bVk^-xoPL4T%q`(q@oAt&#rZHIb=ss-;knS8zRW5cKw*=7VeTyQWDU`48B#;z% z@S7EIpU7l@{!I$J@i!@uQqk9VEmXoeY5brgRhex`t13T(`a?Bj_Obn$MswKCAN=7oxd5GLr4AyXw6E|26u$ z54SGkt_@FRW*oAYX@Y#0?`@V+kDr`0X%U7;7`W8oo-@a;L;MiU0@9Srs2h^BC0E40&PcDyN?$#U zAW}@0(FYHUy*9aMr+^X*srksLeIE0MTxh4|GZL3lTo_pXr2IwE9wfvTYutN-bcNXAM_F0t;wu6|hvJqaEOt#IUGf!v8Dv#7ly2(+*>_I_GXOwt zq=S{=6sJ!`tBd4ScIolb-KjS|wZ*mDx~V3|o6*9rGX|4e<-LwCBuuy)yE+38Td7IS zmVpAjTD@t*qf5fC9cWCd)9oA|bZUOM=S2wlB;#Dq1DLLVoKB^48?XWPI3OFJwMYrY zbs2khCH;-njPYHxRcynnA(1EJZBeFUCc~43M6)8qq-eBTK_mxp zxe6?jQm#FkG>-0kl&(QB_C||ESF+dR*8$@MC+`s^U`j^N8*z&0Zwuk0EwW zzn(DBw*v2aX>&H5x-fR92;j! zvf;EFfr7n0KhryOM7#ss5-Dr$lO-CWr7mW$2U|AK-n3qneE2rR*a9(gS&a?-<1 zlBN#AD=C-G$31_xj2Q0PAwWsQcC&Tq$P@N?+4r9fdRtg{ z+h;Ve!V4pAMI(EYfCbOV$%zhNV9*ri%OZWhG?`%3Cvk40b3*wUIakK7D;aHL?8c~o z6^mk1;5g6jRFm20Cgf^2Nv`0TR4ub82~0mJ4oiP%t7B0AAsbK=i#Mez4-SA8^`+>u zpM=2pY@-VND-s!0(+E?1mDyO3-kHC0LCOEA79@botq~h5%;;wsfK;enrtCTvM0^0y zd6=A_#WjWnCbLa^tK41XM{+Yp?6SGZx76;9n|7RStK_k^cZkYamCNj4)%<5F&xx8=PHlVtf z;^~SQ>U`SR(UoFw(p%*7&PF(ERhr?-cW6VlQ&6uoAnU+r`cBHHy6sPpjsHdye$q@5 zR*$_ht@-r7Z+wK@saA+MmWvCZLUup8`@a-@#(xz3w|~C#s7QJE!cKO>t@Fdc7#t>P zE{srCX-w#dahfM+>S0j4Sn8LS+d|~8bVLm50hXHVWv-V@#53lSqaVWZIP2F_Z3%i( z`G>Lu7W78{K(hFlzD;_9`_9x?hnB<1KaNvdZ7A#Y;mpjnfn;5U=ga6x50szB-&q`F z53(rv69#AodLhSOADZ=5S8qpApAkLeND`gL z|C>CL`uR!P$|Lj8Rqmhv&_`-1b|LQ^NhUU8vbK;bEI}ou$w|AEtxnOoBg0YWdw3}-Won}%V|P0ux@F0x7VaX+XuLIeQNF3yRQ&v*ubGUS`Of-IyZm+c z;I<7lJuU)~&5HEyExIATlU{PYrz2nB^ZbE+=ei*@@!I~tY3@9YKwJ&}ziNgOr zO6p`gDquJ`ymhr#9x9<30n#P}hXGw-EAC`BxiZR&cJA zWAMpf36RlhsJ z!+CU^3MZs){<x8s6<{@zERb<1Y_|Et+?`VA>#<%S6si zHYtDQ6bj3*dW#L12XI%Cb;}f$-R*~#HQRK|RC|!|V=8v7DQCEj+jB7QI##g48e>$V zi@3Czdy4DUCP6pY&-NyZ*Uh}0c~8g;rDP(xyu4Lg`c_MmqrVJZ2oXQ!rq?RG+k6O) zx{dZcpYq7>NeX3oSX&-Dq%H3EWS4Q9A`q54~I)o)=`A8*?d(wU80@X%_oTrH$llLev zg!*loS*Z1Sb@lu6E8%YR_@GGHMIo!!^;mfFO zE)xUIk>5rOFE5sn4gCkDIFE|uvBR1La?1sVh=m)z%&$!>K5U^XdF-ipiM&a(aE@Qn zoAJ711T<-uv^Y~=y*Tfv34$$msXXRHK5R`D+3mCZNFnLNwz16}HWvr`TkK|j6(kY$ zAgwkLsSiYV=c`N8Jl2I!>avvO)DWRZW?SmET`tgXWfd;{62JWM_ORQ#KKrc?KTtuV zQE0z=yUnY!AuU5(MeQW8uT2WzA-V~CRJ)n|j5_e^sc+RmynJ(N7&7TA33l<3f!D9f z?LPAMVj1e2Bx!Xv_?5#}w2{u9m60HT0p9hoLl*4`^DWM!;Jf8+UJyBc_+-qcK)U3; zOh@w>{74X?W(d&>s?Fs@kqrcbP;$knF+pKC&p{I|2x6Ss?G`exR=`qhLm{p5!@6O< zIYwpaqKDqT=oQzsSiORCExH)=n#U*^dThC?;D8HP_zOm^{pL_%XaFR@ebmJQ;7=>Y z!pE2CG=$zPQFf{EkpcMF<4VVM#LQWhb?kjgdPfY^JPI(fIqCB#B(ETxy4aWB4|{Wu zTe=>V;mzz@mn6YTj!va@!XSV_I@r#wY!mFz@jN8%<+hGzJPozU`@%oZSV zb2~7*+M_;hde+)+s!@R92|f4x|0xMD#m?)0N`Tek|Azz^I?63hFXOYgedUCAg_zq! zo<3t+j%05nhn6AsPzL-W2<$!kZOSCz#(W2?1p1iaHO}}ieezeeEQ%uo(&OJMwLcUy zqrXh+za%e5ftEiQ8-r^b9U#@FQdaR+f{y4hL)?qUFX8lc>!Cq+DoGg{3 zbmZ-1iXW;bG{T?FzV>U7WaV^LM3uoyy}r!kGzT$)N(f2Si!FLgk`&e=q)W!PAwmxP z_6xfUO6Vr4YS+PP2BkW4fG+}dJ2$dh<_2GBB-&@4r&ljde9>;GtVO`h>Q^E#|Tj_I@Q` zNjBNyHvTf?i|>8u5xA5+d4o7c2ldAx!_IpVq0XL-K_8o8Zl zCgzW2WWw;6^^ei~b3T$#A1#4=jJ;ow74Tlf57pyVZGG|WWilKbe~OuQkO_O99c5QX zm$OOHRFAbdQUk^>lSmzF$vhs(>5V7gEhhW@B?gaSFa;$8g|v&7 z=4-oDpUp*Orp=~}GKJ(Wt*yH&%|0PdN0#M})1)M+^4K64smT@HO+AW{f2i%X6gNgf zNPZf&FKUfP(J@g`E^C~2*f@oKNcT*l1-u)GC;7b#NcC7OA9~(AYsBIf9S}L3zmokl z)}oZa>&A6Z+-tV)_1d_5xUqafIV$JFD+7rw%49b9W7##IR0}z`ZNH5&?C$);M8dWE zZ`!~*h}8;N5DlitZjt8?hZtMqDYKBlho+K^pX7FqS4FdVr*2%H{n5=P8e-DbW`t|Se zG$DJZg>OXH)TT*2UH_=o<&M)MnSMo z4gf#hv0D-^9C=Px|$yn8a$Y`8dKwcW3uAZTqUAz1+7MKEH3; z%-P(9$pX==6ZG<}rAO@y-1oU(YGo?43`lw{1Tyr+VE|;j)%@dg1i(OTMIHf(@Zn}1 zDZ>iHolX`)O!ut~t#lcQ7JLg@NR(vKOq@q+qmH|zM(-4)>10s4$0*t_rDK7x57JJi zmJ3GLJth){r&RA^xg9$uTqYYf)1*jVJXcIt?x@cqkO^GKa^b^_w9FZIB+FPQX`=Ex zguW3UhiJHuB_Uemm99KLLeIx>HSdC5O31b|bA-b6>M^&xbSbKj0WnId8lmJ`cUcJ(@FW_{)>7uHi1UfyQQ z?6#fZ2P12h)_nG(3`YZfg|v5N?;Q>etPD&NyMV4NzX^$(-JRlnab5|%ix$cDDDkwL z!Ir3jKVv_*SyM>gT~ETREIP8i_OY|2V@-JSy144r|5P z4BHbuWoC?FxSymeV9zs=`<8vJdXzv-h3C&^#VN9N?=^HWV~PbU+wVzy3K{k*Q3#TT zS6|9DZ!%GA^WDkxdcoj5cr2GEN;ZnmYM@hY(~-^jCC^3+)mW{iOwjrxvXj*LQ>ci- zKTk!dX-@`!^4>F~in$#$&BYq0P8NhZ9E<@#=vBxT|^! z!397an$_fSMKX{EW4;0B0WwY^5~)6PL0{eOqgRH*$liUFQSu?DMo6wsd?52!^w zEa|-Z5qTAm?QDa6`R4HlAWlg*&xXXOVIpNWb8Hf>?>=>GF|mnWsA!~4;in!iaH2ic zQsjNym(Kmwmi>=#;p40CBap~7`MDZ@=Sw?lX1WCoM(p(SEf1QyZ02PUGvmsF!P9b+ z<7TyI{)bTm2f!3Sj-=3@;ub$zyBWzStD^ zNu?MtYOuLES;25{)XuyQ?oUP59Q^r7>e zIMQvm$nLTYwK$P&U}{sPSSOPf4!AX}!PzQafOs+_L=;4e3&VyY-UPwi@Ff6}*a$ex z8eI~h3|)AYDfRJk8Vq1!zwr5ksF>r3IT2W443Z1;>hu(EchqvcKWV1rm)T}xQt?Wv z+Szm&V+6}9As4>F7hGFsi2Lgk#jkm-&e7<9&#oZ~I8v)5PEtAk>4UTy*iAC9YLvlS zCFS>mvElryZKWZj$Gu}?f$6iOfg!cIVO1iJEDIT^TUTvIr&$XMhwXY^pV>W`6dc7P zdgHmf08Ll{?4%%XkBFjDaKAe?JU54eQS`JGbg#9kkDWLo+C-?&c@s(emqnljcSJt3Ufer#M%OBnLm_R%0wD8K>K!9`1q56f(+im;|9 z_;Fj?#s0+H(;_YRmEJY43&H1)IKxJnaSG3s(FO;w;AbPLlwbWiDC!#nj3bqt6g|a) z%cpLL>!6BEpj*oCn>QUPVt(7a-0!KBWzSzOFah~(59))sUu>AiDq^j*EBiTeJi=hr zD+FYLLP{$o8?N1iMWo-A^IVy;A-!yUVv?ZUX9<@z!S<^NYz%rWV_cm9`T*fN--chU zV#R7vCIk;FZvcf4epn06LZnKT^;!PrVaBn=t}l%`L;Vfb^^k{xn^7XLy@hKSSe@Kq zB~%-Hq6tUJ-52nYY+fJ6uqeR|%spk6Sg?p~jZemhdi|q=nFP-*R85gFo%y_~h^LeH z%#vPisqf$%=1Zm>G3sT*LYcy=v)*=8isRT2&t+Vr_~J?Pz1Q)tw-ua>XAU-l-~}OD z;27Ato_#aCen{F&BSqF8ll?2oYc`IOPvDeW16^jgu6wo_n~r`~km>Kuv(YYP)*~KR z_I=#w3gPzgaq*WL|Fhn1CY(X@o&-T>^B;@**s{hb`R(g=;EhLU zqISdY{w#|B0aCsF0ZS)L;W9F`$Zmv{-S68ajDDOh;^*%4EAtHqBTQ)yOlcHslrPqb z@X4+vSFq1cbEC>XF>;iYD@m;cev>`aPHm%&rFjwFVZqDAOsm@-%x!L%4v13)qYPTl ze(W)#i`4eBU&$VWyNDd)W;0DXC*}Y2N+g~fJ(whq+f*n3lzx)xLoW8iWFO3JsMBmF zHOJ)Oj80j@w}uawMBH5+uNjRXZ{mFD+DeDsbBR|ly({!si&-BWH0X>C8kam&`Finy zXYB=D>i;Kml(l~=+2e2oxVd!1vHmVJgw=Sz6Da#8@kfr0vWE)j(NlO{08VeA5+=r7 zda=4xPADY$;*Qol#JelUCxw zBV0wQM}aXh1s+)&#FRY_ti~LD6NG-DvtHGYQ^NQA8*G2&3zT{Yg{)`7{6*)zw@ZRrHIgz6F(^|gc}p+p z&Bs>4pkqD}4TqEDJ@qK2N8oN0!$A#&QfTtOP+ExyAkacN*fewWH{FqAfQ z2*7oYK9onMm0j{`}0Yo@t0UiuE$$qwlVuh@ubEj2z_dRR_geCRgX`Os?g zQ?&;*u-eZQx;2c&qK=Ow)uYR7ji`Hd3C+5h_$60s|I0TpyV1s}udPQrau1eAaSl%d zqI1)eAJ+(id%u7<^V1dXrKdWjwk|ULihk3Gjr%$T@GcZGPr9n>2enq)b(PTE2zw#3xC55n_?NeAe>Qc`mF zcxhOn&9CEX@#V%G7<9>wo0YmNh+zRi?#N4$CK7CCx5}=N-)A^Xc{fgVQ{mKCq0pA( zPM)uM|B+*n%@;?S1;7~}I;oCu2yfG$cQ&q3EX?%Ip%cJ>7Z%onu9UH`|X`?0c{t<=b+6VXlBi_Fb8*^4b z^p-}3A;%(IRbC1uC}=0J>VIQj&_%PLcG8qn?1WU zlk%Nz*kp`102>4)GLXvFO}hHqcj736l&iiMS0J}-qrrhT!^5&0GPWL{?E%(bE*q6oQ;jJ(pOd_DO#UQ%NX2UMh>LyY!U^7 zGHZO}8}n|tH8D1sN(jOI}oq)^etL{sZy|)zwUfL=Xe|lqrz_U@bS?qqg(WR(5HPmv@1-zg%i8a+`f5@p8nqVfSY%ZkoQ8* z-qJub8{Ew1<4MP4;-_Vk23H06e!$Cyu_!Mqw6x7od{tG`I&z+D8MUb^RY`t~JPNz4 zJoNr#8;GO^QO~U6d&!nShC773Y!Z1F8?{g z{%~2Gef%kkcC}nn{(iJPef)qn4@HILyf2CQW?T;ECTeBDWh|n&X#34g-|y@A;mU?S zSN~0MYN9&GPceKOQ3ev*Xt;fbTZ#VTS^7(7Z!te!$czji4k6H%#8MEAH}!op-S&U~ z^Jb_bbKuQWO7s-QOUF>U4YHt3Rkc6Psc^hBXXj1BoAYafvByPjYdhUIT#9OaFbByqJ-FDL_E53!H@^mE*TVQ57>$oMo^1KzW^k9;vf_Ta*qh*i z+yYAs9ZrF;!t&Qg?@e}j`SZ%kN{-`;0*X>%TS~uaaYJ(0XPeVi1#w|V?eg=>(O_X1 zX|V;jH{Vp3=HG}nmr5Z4t5yDkl=j^pIZ#};-sNt zF9Y}OM_p=`J01QS8ee7+Oq?>u-l}`eSZ!JyqRtU@i_~*wnTCD}7+Lo(>-i@GC!r4a zCx80JX6*V$)w%t&iM9ALL6gQ0Vd7Jgd9{Y3xRdb=^5S&-In%=4^ytPtiD9P1h-7es zcZVHOy(UN7-AxQ4lq_a4V<%bp=JdVm2P8kMC$;a(UK)@?C4 zMfVG}mKs$q!e4Vr;T_XU$IfZl!5)lX-=)hz;ZfK5uKE)zfG~_RG^;-cIHu#{1k>$a z#l5R&Hn}U$pEldiFmjKQ7FGR*hev(p-IIF(-m)&W{Y$eVh&(ksU$`PyfN|;~%VBfT z&C~3NJ5y_HtkJc+CamTSetV9U@22R?#u&?*)M&uh)B;ozLAc6p+GA%L!K)@m3yi95 zwfPDdT7TR6dTJTKl_?AFX--*Z_i#QG<#1`+Ql)^3Pe z))X>MdsQ0j#wbU+sU*oS)Y)IypbsnRXslFQ4viPo=hy1~}Wt8CJK z8!n^!0V+m_#-xzm$wFv@OBwkaNCkb$qZf~GPg?oKQOGRH5c4_Si@6;2hwQ4o1Sof ztm}xMP?#7jRp3qzLxWw!cIbBDBMemY949C~7%`WJu#DVT@}>wi6URoKTC+Bf0#bIP!Td?*B4_&Pyo@fwPa$AP5TGE8d`}g#OeGZM)iw#k| zWu7>9<0GH1AG1?~#kFF2oVplUHJs1(*iw=U$6T=U6>A)ierUUG-*ubb%LDn*w8*93G%v@`k7nnyaBHFlNg;!orVZ^4gxyz zdhO{r?yV-PUHL?*;;TmA)gm&!xbhL-)J|omQ(8hQi$6`&9r@mx=7E)=?spv_pmmr0kDaRBz_>{Qe6R6lxlxlBT zp&rIqWG5kaW^0Fz9N$x^G$~2l-@r!q`_B6F1i@xOmVXwld*HDBkqSmHYW-&P8g$x9 zFoOK*SMao1)|1+tuAIoU)14ab!3yx^X>5`J11Oaq=W(je-xvC)En5tQ%5aYy&g_9BSf_h z&g&qcO8r+M`j4`;Ul!U1yP$|3)f5qW)oieHJEm2QTiA_=UQDU zv!tD9X#6M5y~MOKlQ_&PJB?q2y1Su@(D!$Dr^=OUBb)zBunaY+-sRr2I^CaILep}_ z{&WDc%dxws3Qf7$FXp*pC`LQNt}sXUh-QSBJw5Zy$!4;R+=Jd&e$AD|5N`MR`xmS< z=a@JiJt#i)v{bLmglR_-M)9Tn)+PSRSfIC;_v{9`al6!I*b?$+kzRW3n}yM9nUmLL zCcCabRDkK(No0sgcIScZd}GbB5VZ70Vy)+ma%UHp)rR#97e7j#JD~L1r1=ae#jd$V zo?&F;!>$chTc+La@3N`$CZQT+0)l6HQE$gqdi{! z&GFEB;5uO~)zN4^afe@0&c_B!doH#i`o6!!yYUYv2qTxsIFZeqhc|GSn>cQ1snE1c ziX!CC7DOJgb_I-3rvyusGJgBf@eMRb z{2IZJ<=0J$6nY+`uhSu*Q?$)vW~$d$rD8NGS%s=b-BjOM`5klL+_nn#C(q2~YV(-R zWrR_a6up>6y?&%cE#VEek}i=CSPK9{w_>kOPH-UpFTq#v0m?;2O6 z*KllL>u>F$$G{O+IvptqBY)kQ%h>d!fW)5uetEm#2D6vyOK%POERVpt&fV|q!na$# zYfQErITX6#)U|CGlc`spt`r!g$b+&ts^5)j#vZOVl_K3&wo?`#=!;R(`0sRZxymKV z+Rx$r^#p4-U99_#BDeXoP3Y7o-+vZ8k2&?S`h8o8c5ohS8|t54B;scZQjEU;MF=DObN1CnXk&uMSqk9&BDIEL||~=Xhi> zcR~4D=Tp<~(q_o%nKe`C!|ZO3@Bzm{-R9*9*Ny(zAIXHQX1AiNo`hhNDsb;!db5C# z2F+pLdDGv@yfof}SF@xJ4X2HQt&IQJlgA&0mApb&9UG0{Z<)OPmG~qjVWjQHfc^!d zNimI{NGT&NKR05qcd%(yY&yN+)w=ZQjTTb2l#P(_&Ez{p--q<=GGNbYZ3Q4=j<0q1 z-(r;19?3SOd=~RKbky!v7br1bQa%ee7z>7#?9sBZ zB7MX9t*7^X%hSm3?DP%CMO@Xyo%WJWkCttBu4be8meK!wKD;#6AUh%eD(9WaCqmJx z3Vr>-?<+S)jz)noU&y9T-N;N*Mr=vSpLnvM;VpDc_WSg@G2C4L5*yR+akmYIOG7VZ zf2TtPSWD>l)z7pfocBagoTh2K6KFRWIaUWsy**+r{q_wWvYK(xwA4Z%A9fkfvuVR% zu|;UKZ@laNi%~xM5kms5qtdua^5o9B0OT$mhuuU^ps?X>eTBH;=Eo@}TZ3b=E>(xb zb?YR*#MNm-CeJ5EPgExiqz_cpsia-==yX&P9BE5hr&vD+-P*5vY}y%mX%ERKDOr2= zQ4}6RGk$aHjQO&ZEV~@z9<;j)NJ07|o{JJKocIKxJhZ z(%f-_zx*-r{CpDi&W+*u)lLfo&fBjXJ?AE{{=}!W-n+TJ2|vZi2@I>#`puftQVH}U z;bW`Mf#N2-IaQG(jyve)4iVqE$}m!7($eUIY&32EcuU0F^8nk)0_oui@th8KfRo+p zT!l0nCku7E0}&riy@|^kCRQsnuzl zOgA?L8eGM*y^3zGdprHDKY+4$_ukFoSMc_s@zJl*pV}qt)gVq;dCKxkx@B@I@4D_N zmt8+K#p1IWIVxP;xz;DR$5Odqd3&m0kT)mqb$_kuL)w4}jbHR}=H^ z-+I{>%rJrt_^ug(yC<$#=8ZPYTU1ZE0lBjqt&jO#u4XmcC{a3(sn?yuw3KFZhl71J z{jZB_1m2sDawBnqo_1F?Z;#W(_$?m?$W2PUzjw!F{b`2vDmD&feX@@33GNkXa1b+* zXqb@Yu9Pf}1MTe=Ek8Y16g$5?m3pGS2FmOkax2PJy)8R6>ZlO6yByqPrP=Z8QbLKB zcWLW>ZKqxtkL=ZbWp@c=;d_lAJc1D%BC8Ub#^2(hF&RI*tsCg(%5g=8T)G6J3YTJ8 z!6`-;O9Ia6_@7k>#d;f&tgR$_ndL5H}C)gA*^+gJAp;lZiZkNsErCtucT z?bAGXr7feEfL=YhpJ`j4Eq!N9OLTo}bIrZerrayE=3Ncm z*%`7`-SC@L$n+f{)}QFCM)?Pi4bm5A^Cz1hJZz?S(wv7snuh~aoZh;m^t&|{UXeh^ zRaJ$!&(kE$(hsLBZ7dsXD;p&m@lLiQzv=u_BsC@1OY|2@JB&`JS(6Dx)^~A3c5!#? zH)(NQ(oR$k9X2vRNy{Us>h)#o8KFD7q5k=n_H)dy<(o|yr=RC!r^#bpb@%JnK2Nlp z6bIL^k-qnL)@afWqM=@;)j!Kswp`&lN#P9On;2{yncoR8l1XUU+LU1HIR}9+9UEQ= zsN0)XDs3f?#I1(5stz~JZwbQ4?;_K?AWG>pqF7zTo>f(K#1pa_k;WT|ceizIxMd-1 zhMd^e?;X-jyx<_UB~;g3vpo`hWzeKgtnYb0j|E?;lErjNrOq|mNp*%Vlh_X`IqtDy zkoDq$?=G*yEg-RDMDQj+&+~*xHd8*nM_{+=A`Ms99Oanr_6x$Woiu_SYV&s!^0W>g z+xm`?bq>pyIbgkr%swfI{8Fjj^{cMP%~7(m^l{}qD*~+aMSw|uwar2iN*~5~GQe+l7D3;??w?AxsLdQb<+t;N#Rm+Rc2EXwkapVstMT%bBM*h2zHOIA@6xv!{%l*9GnPa^5}G&!O7?JT@VpM9CNd2= zhncP#6I-cP%Sg-*;a=|SecCUvQ;7(!#0iu4E)cAH=$uV=-#HN8!sq=aWFx8O&|69{ z=0GvE0GQ%ZodW){sp`c!Yg5UKYy!b(=vGg~jm*(<-u*)M8Emv zmvfqOFQ-NvL_pX%XRO07!+zI%mGFae$w+Ez#QphMG&}Wn48&vMhP9KkGu*7RX{1~x zG7~K&ZD-$X2nNR-T8!Za$`Wd++S$e2YgxtKUojVlPPK`=oTc5mIDY2baRg_`ek2#U z_Rnxw`+O*;Yl(~)@nMWO=ZrrUmkfh*oFur4Q#Z<$rar#kIaUKECx(#N!JT&#Uw0Y! z{f^rNC=m;Pf*o5cfZXMQ(p@+~D)a7TE)n-7H@p3Q+-6+QweHi~H17>&PHUda9EFLF z9pTNUR*FB_SYoQ}Pd$MC+;A{onC<+W7I^eSW$N>LF9R%hZI0i51j)^^xFrepDhowG z=$uZ!FREV#vh>F9T|I+K-p#uBuOlM`d3Imko*mUstB6KNI+_ao6V&`C1bQ>H4K8|$ zDn!$wDcq1dzF3qmlFRTiI_~E>G;7-HJl|e*3$6F{e#(d96@LkR@eTg|(g-0P?W&lU zo24Qphsd|Y73Q~^(5!J!qpJ4KE_LMn(;E`+1r1?d#$1#S74PruXC&;|nbP2TZqiol z>s@AtDYyu=6wogWWP3)C1u)1)4d$zBT+efa9=`NTAya} zg#aI4j}imtN}EFu;|;M+f=Wh`g=Kq?r~c6&HSPu(?tt}r20oT~i)i_^<7kDGAEe{u z=u)nn`2%T84{ryJe8A^`{qn)C*qVT=(^6-jbG}rsTAy;+2Z({st_vPm!GXc9_R4+| z)PIx4duoXwm8GchooL@q#Bkq ze|u0HA8^aEVFuH&u9MYm)4ta?y4&8J8zqb~;@BOHuug@O-{_#Y1OuRb$_c$$1^S*@ z{6YOpBbu)l5@~T6@|&i9FDhrPn2WO3H;>Yr@`gjeGK#-X!2WR_==#@zA6EJA)P8TZ z8*wSOS8Fgm?jMq}VAwIk*==1j3!7$}_^FY8tt3}ta7KrxFl9&k$6bcQ=B_Y%i{7V^ z(&OdBoUt5zEBNVvCab|}bZ(=tRG-e505h=*xQWQtU#7{^`Q4d!BORNEH|@U>s&XUQ zHn#Zvs>kz8m+i)#Z(Vqpdaa*OS-crl%h02aXNvDrM;>wvJ_!_NZ(NK_3b!PN3$R8e zxpLjW0r=ss?fx?(hB^IQ+|uSBUpkHsB%Ao+U!^45wG`>u&MPT>LHgD`R{F9n(ZSVU zrCj1_Yect^#{`=?*s{&9H4sc+-Eu*4i1Z^pRn4y+C+4ghS_hsgb-ja<;dy>Z`IWYU zp1~&?Z_PbCjW^)9{zJbj3owRt#MC4`-R-Nm%&pr_`{Ipq74e5&o&#}6+qzvSsgKE6 zn1#l0wxCNI8KIXEm&^i9)M$L^YMytUr{m>B6hm(V#2d?zJS%CNDEVXg9=GhiMsxdBgyxhc?94%}k`A|3G8xnRD|!qH)2RF4y(q8^Rzbzds6Z6g;;f(A%c2&mN5# zJZyL?N2N@2T-Fk1i_R-ycSj2u`P1%DsuNv2{pxJ=emGxh}dR8r&%KuDl}1 zPM?!0A!pBT{Dw(EKh%-3W?@`QGPS*S$~d*#Ufh3#zb54A=ey@dm6E#G=C|Zd7w&o6 z6o-Wl>c2WnE1mrr$v5G+u~uySDt2YT1bHwm>C>1SaeX1N)g-_F#Dvo8S^&rOM_a8u zMf=b{aWj6>proAUI$rF$dX?tFhU2eQ8}&R+LTv83e3nDy$m*6GYYyVqrSqMidd&4+ ztR|876MPl+k^8RCc z+!UV49AekzafQ(SlO(zQMf8mZ=P4}@%~=N+Ua6aGl-W$8_8XD3P{6bIX?lLDHhK&&Ef-L(*fwZ-FOxM zkpgZp!*Q*o(XBNU3c@LGIRMFp;TDoP<0gE7)ZF4xAx)_>w3BZ^BTv{hNLhjpuDa3n zu;#Eo;`_LHdf?uloZa04E_tiZt0PK?ofk`EGn7<@kMAW19Re}?(P=2KWOLBcfmZZo z>Ft6jVc#Q$rrJMGn0_Trt0hK~&36RUz`keM*SMu;@@?EV3WkrqHWJ3(P4{vn8dv=Y zW@Ij%uI9|KXO~??*;;Po;Lz2(*DGVD9~zHki=+tq@>>2sguRDTQ}Mg)9YBgy6%nZc zY0{-jZwk_zfOM25(o5(B6a^9K5Tth$>7jQNq(}=jgcdrXh7t&bcH@1|ne#g{cjo;E z0@;(jpS_;-S?fDY4Na6RcOxa1XQC+HI@|je#;-Ht8yoL-6Df#en^V{9znq|nfAvc& zP*c}(S2-2rBDb1m!>mN3w)V$^HnKCGf5e21}f4L zTqu;RT|5P#uEe~k%SrxcCHv0;{5LJnq@FK@;a4uzfuR~5I2qo_^{EwIw6$x0Ei%x+ zyECNrMVK^k{4TZNYjyS5MBt8L^I?+IF~`{bJ4qsFABKaI-YY^Bo!6R6HRm4Q#oLFx zu6Omp`+H3`vgd2b>yt)$sd)FZWwTttXqnGe76ST|A>qQU8bu8{NwW^(ZKEu=`=}rT z+UBHDILmWczQ9A8RQ{_`hsyZF6_R+3N}60Bas!sAl$g8ZQTb7<-r;iFBru|beE(y;HTw%2%76+37?2y(HHhUx3uRd^<}_N9}-|lWWsY;nTa3qK7H{kLOOH8 z9>F62NC!Qo+g2SfF55>`R5`g$TC0M{c;G%(Y;;Usyi5?KIk>6|!R^UvO!ex-IJ!}o zaje3($0AOlR`Rv`CP~8II7Zuu7;Da z5eSkFHSt75=n~AvQCh+*h68N|FUZo`ACuB{s|uEz>6zPrV(?}NqxHDtJj2hT(JbyA z)g>9x6#|*L`a*r~>_RPB9-fbV@1Lf_ApC448gJUf<(~DG4lb+k+Jvyp;UP%;U=wG; zec|L=iga~7#${C~y&w+VhW-|lpfG7};v2vGL0g1K?9<$vcH>eeaL6J`OgWN6EOf-$ zr_JcfR5jA%Z4x}ydU*gMJQ$Ka5|=g?BUKR?&cIFcS1zJv!G>4gjI6F!Wvfzqx5})t z<4riMu>=@a?@KGU7EL&54%r|;e_jDCl|~oiAYdwNU1Zz5F#aN5_~rWAaR{J&$C9M| zZ)}Fv&M)DnYXtex-1UCbBdrX=g0EX8gHG0<_0W@5{&N`NLdwH??-&8uB-Y(qr7Eiza|ddQfI#LKyNO&1%)W%o=Pi8g@B9mF6~A zX*)z%iaZB6=fiCysI7{ECN|v7MibsOu^q2}=|fXBY8jQjYz03IZ+e;5aBI!tfu`J! zsI%Xpv97~dcDs1QYVV`%@P`BT{__=BX)t3tk4@Ov6q7Zml{42fvMelURA-zGl-{b~ zf@v~fM2$DX3V47CADW-nhBi|p)wQ#6H)YSGAROyMcwAsPRQQ zU)|4YTeV=w$tWe6KPcy*xUA}GUkq`yeefigd~mK|!sV{{< z`+(TFw59yK-hrgn4~91Oh_(RuSi2Tbitr8My-}ZbQds64TKTKoX`4MKpElm~@^tT7NMTaevMR=3bb^xWaq#uXYf_=K&Iez&Ephhk63D=B^Fx|zb~=xnG%LP zH88ctFseL8E-0p!;k18kDP6GBYSqR6t_n@3<7ick8*X_yt>%{)!?8z;Nrqg@!EV{- zmc+w^UnM8!S|J%!Ofdr)9rZOaHe^f(6>d;Rrt~Xru?8f`%ezdJk>h?}TZj?3JzMpC zPPczbaU!z3M}a`;0W|OIqI4pj`Q%HBSAtIOrTOh#q7PXEXM4ZJ%qkunI(uVOr%%y^ zow{LM3lC}7WSKbd#WxWwwoLKJP6YNs%P_llqC_{lUzJiw^X8+yTPE3=$1_#rEb)*k zCHDhIMsbz+IC&|kr@Qq_PW+;a*5>)fr&bQ%^?uZ5` zDr-KLJ+l{1AYcsR2cVkIZv8KKnvrO|KC+^p_x;#VdqT~Sd{<{v{j zHH1knlRpv#ESsLRedJej?>OJ^d>}3M_i7G5+vaQSpzF#JBvjtv;@kLlaSEbc04fxZ zs#M45Z;oWg05JFf=iPm$+q1#@&3*MY0n5bar*j_Np(fHh<+Z+CDT|fTo=ZyUieVjP zow)5XA)nql=Lt)055F3B%Q2{fc)V7-L&r`X8@+8yPh^LGbn?+$W7jcj@mlC+xq-IiIxy9KIXttCgHv@Ql(g> zFi6m%d1Q*-AT2(9-6xYM?T=0LE_JaCjrx!SaV0KNKO&F+>(U#)<|qh43`eYmQv|78o%(DTm#h#L zSI)GZttFXrH07f4-HE$-gKt({uKX*no}mPViE+_OnEl^SzyBy?_}&Rvq305QNpdW!e0U`^X)Mvs{+ zOtyo}ys)X$tI%VD0?y=A11{pC$#)C78Nk3SUzrP)(ma68u+8w2tG$&fjMJQLHaEAlTL(MFgn_UX=`DnjB8Z&(9kc$;;=6_TS2n6QSI) zSkL#viH$$rl4scgZHW%{fXFxHKeV&UKXx_f08zex3JPV;y?nEGjL)FQWTQq6%ghl*jL+doXrtCDeQKKE^J?wK|+uZ$+%6F{>QKcaJ03$zlx}5(OEs

4G4mbutMEY`h_b%o)dg~m2*Fx9% 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 z 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

Z(wTzn754H;yUGzY4?*(G>C(jf5+JbjJiq)Ob} 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%0DRH5FL7`ttLb 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

ATs&7Cx}0?43OECt)k#HF6` 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

%(Af-h7( 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 On z5V!m8bbG2o`Q$23(7z7APZZNOY_bmr)RtUxmp=SwZK?RTwyb>nT(o9i&o4jU2iU0& zKS|hJPp(u6naMO!(6F;l>XW`Chzc_aJ|5vKmo4IQ8^{yI1NRU9NMS8 zLxH5aA9-9MQbDlD%f&zkqr6el&IgoD>`pJy0E21%kCLtQu&Sq$Y`W) zswdPlT8?|X7o!+w?%!}3HF0aG6%>@~R2ZYvn3FWPk>W${@j!rJl1{Xqx6H*|G&&o@ zT2)qXL3ZT|zO5ntcB{f1XwALLs{Qj67T&0q884c;%2H&c^O(^DO!!GNVOG_#RHW!7QcWTa5+b;0Tz+-+f;-<>WULmbd- zOP2V|y?H@H1+c_ts~&q;455?QD?yP;ogbj9x%?8ED zH?oAqN^*!v2(-3Px`8^=CDk9vz!IDMIi6nmP?6_H7FM#*#hJ9uX zVci~T5`-a3Ngh^t1C*z-I?+7!A@b~J()Atc*K6DMboKsJYDlbVp>*4wEi9n1`JS56 zh|lrLX)qV%coNDKbSs2=QgDAl&u55jnVgA}N{&K|&u`F}ifSovoi`n&T9!qU6Q$@( zH2J_l%G26NSp`#Iu?r7DbMvbAIn`e;&B`QV9YTMoG z*8k9hJxoET+RguW>W?*Yz`WgjoV@w9aJ0!B!@nRdhQk>6(y>)@5!%{E59T>CPPj9e4*UHb&u zZG($z`DOaY+VlioS~#Pk&~ml>Le!XcbVeZk(eO%W1_qeNb94m@LIW9@$-g2r)jp6pkly%QHY(5k z-`_H`I~|DOOELM0&=wd8W@IKZ7eMrxA@F_NV5=Ilj>&<~vpNHPK2Lz!%&d=Il%R9Z z5#Y!0%&jJiUO)ZTS1wqM2XG@xjs^kGSUU6=jf~B%cZRc>8|wy~s1kd5mg8Rc1z?V5 z^dzm`G3wmkc#;V@CHBcPax)qR`>#GiK3ij~g>ek-%F*MQTE zT9pNFo-?e}6Qsd+Mey5l5A;)BH6;ioNp+`grc(BRc{>`_1Hdxfh zV_Lo6=80+}KNrxH-BFhV?ox{0f83>{nKQZXgA&Jpx0dp2pDf;)rUpIdJW|h4{(cl%0y`Hih}zpi2$9ALM^FSyLysY%Lk(fcwjM31Rr zoa=m=RZwued%ryUmUf^XJ)%4dbW{S+5KyGIhePqZEye_%0k$KK5N?wxbF+ApuCovH zGp^`^2K6HiY%PXtCiBdOrWH_$->%%j6Ru`Iu7fa!{E>a&Ei}P9FkXpb$eYe(i1L8=&W;M{BCa z533Mh%Xx818zPFv*Ak|<#{8Myy|^+lHW0bNFQITsV(~q{d9OEaCC=n9@8$ew?6y$6 zdz@OanCL_JOEtQK6zESVT;@Rqypxn=7aB7jN zB`KXy8SOx+`oq;cQFR8)+y8b}xhdeR0o%khs)iM-^f&)`R%=4YXSMUAv2?sTt$&*Q zI?wg(s_BOPi9BYcD~sN(==KHS#y?$;OJo*OA)Of|lj08ji%ud@BKR+bB; z(au&sHt+Lj@gGN)t%=aO1bnxhK-VR{KCLLok9`o-7m-i>COT!B5lB{<-WtJ0NClln zc>a3rly;}GIjo+xgsgzQ2e3NOLoT)@;R}=lwv4lIW}4Yr%WzG@+oo;}d)FOVjuj;O z=e+|^r^8bFuBKAz)L1cok!PILRI2`0VPxN5X&q4J2u>EUP( zz}MMFpkohZc58tHqpEuPGjjaihLNP>nIr|X-0cFYBu#n6|vm7S>QaD+-nLoNp z&FOsKh#`Ee8)x=0E)(c;oSV8U+F=pzRs?j*9)eJoQLj3`WBnN^5)}{M4cX$Y zl|H4DpDGTN0}^qxddREV!%KqHllYL?OzHC>+%;dL2X3DCk71K26g9nF&tnLa(Ef=jVn z$zOAO+Wmswx+_K+3~A%HpjnUaB}l~+LEjWVQkJY3<*$W`$)Vm!hUqKg(__A7J7MMR zrPlN$%&K6C7tXd_u|YLUN(trmMi1IqzvVuY3EHEzrONU2lAzbWT*-yH4HOQ&Ds7kV z?~Pf;7!TSzdzNz~9Opc1WzlLOy&wC8Ori{sNMcVmT}@|TQ)RY^I`&KEl5RjMN96FL&3HLCG z%|vgbSbbfF)qhvJ=>>p_eYeM054uQf4zu9$9$$QChLG(B|7&+4=}twswEw3}<-9*j zqynYTzpXU{C}8ww%{zHFo@6XdscorKUJc8n;c5bk;p^w=rA?s00@Ts`7n-)zoh?%* z&3{$=T$N8T_2~F%GIbRTxEhRFe!!2zQbxds{gKys@26Hj&r-T$s5{}&B_`T@aT=(H zIj?{NBkf{l$eL{WrXwHN=~54zUKQWJ1O_a2b#jl#>^^QBj2TuV)n+W6ruN^b9Ip@5 z*F0M>rx&%SMr5G;iojcbzGsKW=0rz>28_h-AKHCbwto_mVTw)x04`MAZ9aa#Lb( z34MGwqiYmXUPxXRf`xc~?=#N~{6<5CZgDKs$owsAVR9kd^IVH{W=(zb3R@3o{RswZ z+_5%YhqjEb?w{v)x7D+ODs7kMi{ilGdI$2wNi>vjV zM~2dRaTY^XA%mdF6l9L16{Fv{_}*l-XSv4=f9IH@?;ht-{l^l`KFwEyH0O>XYC|gq z$enUrvrX)WCJ@qhsl~!V4>n;incNCwll9NFuvVf9=0)U!KJqet0yj>`B}8v%P%8jo zL#b;;P25kW0}r$${2vsQ{Q@uKBlgF?6`C8rD*$u4)w>^0lE~K5+6KGzrJMyoXZh4< z@pWFPdptRNSdOe#yPrRp)+I2~_Nzw5lTESwD&!k85{Ihxu`IXU-q z+g}(JM|nXw=W!m#d!t2tdJxV@>E*qD?liV8Fy3OK{WR&;bo@|r;S-<_n07{@sgWB; z;c^X~j?icYsAG$3h=s+Bh-IYpkLhY=tx}*!T99qb zAH1CqZ}Do#OX&AXOqu{KBI?-Vdp`&A!$u3?&^@F*oZI}edxx7iUjOaGh7**w^CNkv z7fR|rIzDZ=I9s0{@Qm)FtH=D7+0g1pVuk3BLKMktQSwSiyy)H6y3d%4Kq-|zmspr@ z=p8R7cm@9&tv&PmYdrKzrFY=r9J_ON3p!atH3=81n~PG2WpJO0Z6Tr56HxGx6(C%x zl|)GV2D)e=m4%83J$$kF!N?FGu3H>7IM$RjWFZv#v2+IM3_N-WhoeLhskP8wjqC=T z>rA_eEi@N%_9q-7%}ey-m$SLe>JogHWW3Yt*R$yzcUE`9Jr6YcWeSO9|4psa!S~a? ziUwH+Or35ta)|xs)G3BmhcD#kTaN>+GZfSku72mKtX$$`N0v{fef`R6cRNMbI$ao> zd6MpF5GEyV37TJ$;WqE3sqPm%{_#5yN$Cxeuj|}UrUl)VTrv`bc%Ub`dejPm(1n} z5NQCK{FCPs!iA%! z$*c9FMpx1OL@$`!S&tUW^BfCC-k+|kwO**h;Fl`m-8;|v2;oz2Oq5QZkdRW8l9T!@ zB_bsSIe9!9M0~M1o9=%-&vIY+{PrkN2z;7WT)UpP(WNp!m6eYGW0_wn;R&qlV`mYI zO-yTuNfK^z9$G;x>M-?udRig%)}6l=ad#;%hn`3Up2W*S%8pUEXZe3U`TiwNbKr}l ztgG@ib9wOZKC$rz^)}yK+WFM-&_-$Mg&iq6pI?d8B!9j}jVRJUn}%?~18;68=t8K@ zcfiEnc)bUh*cqJe5S@&k8sQ^^@rCa6)Qwu46szRjF74C_7KDWg$Jkk;`v_^v z+>VLq-nX+pMc0RfJDc<>=xt1L>G&Y>{B)F2mt^UvC7i;qtceXRqqXXz%3b2Djj_Ex zxgP57%l(#)e#_MMbX8hWO9DebBqhtkk>5!%!~M3Jq4lnCjV$UTT^!6RV7U#pB&`AV zE+Me|M9BENS0|zw&pfN8=5ycPeYB?vO)*QgFCR?4MX+_%S@#WT=C z!RMkALiX{z4fVKgs{nY81k~PMvuqau<8ZvNEF61EK4)B;b6T2f=_T#&l%0^R>FYw% z$4k%=_S(`KDQPKj_#^i8?uc-mJ6r7b4jzY_Fxd0t9>!wL7ddMd;Fz_Gd+Lr*O@6vtDhE1q-lKgU&;jkkAD5^O95PW z?!dcX^?%D6?%d{~(c^E5(_*^KQ`A61@!pd0WdlE@kurM7!_e5i>>I76jgtyo-83M? z$4=f$`?NDkPwvnQEjTMWT&98)k-Qt89wC$0)CHN>{~FlzP!8^b+Ze^cSX~p$0}sM! zFJkOY(<*ON{Im!&mbpi7Z=|b@Vn`Am!wu=iV^x3fF1fj7{rHJ!GQPbzU?|FDf4GBX z=|7_oEkrec>aN?MeZ0+Dw(6XGK9hJkMW*7&> zZE@(%yVjTFA?PK3x)>V1ll02ilmK_4bDC$=@^-d1J1OB0SvocD6D&MOr;}@OSAbGe z-2|(|-VcosP(PK{h zv!7>v-m$N!bMD8oKQiW~+&Zm=T`lYc`ZMYjFD^M`5Y-?2#& zn7)0Uo9NwTOcQccykS1ycp~m6X>Sy- zTZ@wX+r49Y*ZjY?7I!Jzl)!I?coAQS;Ex=c9;JWwLUm^2EX9;Kr~h_;_hZ|Fq2kjR zQXJ4LI3xxv6M4tZy(O`ZIS8#BUbp|*+P8QVr&!AD=A;)HuperB&oweSp)~Ym-<>`N z;YHge>=|cNi?H#;y50lBm{U>oVL`l`@e5bQ`!t5G3U(w=+taw|8V(wSpJJr}fdZKi z3_qI|GRtncT^`7lP#)u2U{;;){{)R|LzlOH9DAP%7NB7bRfBmF5PLhkcs!;{J5doX zZuLsir{#MR4xYT*cRR@WH3k3qz7FXdZo`<_45fs$G+lUh0c*JC^|1}3vJwHs+s0}A zKZa8!_d}ac-|<`hWr$Nj7UYfn&`w1Zf9xe?jU@-~ht8k%B3krP7{_8PkY>J`ZH;HW z&2+LJ+i%`_HaX|f|Mj&Ho{?kr&Cf;E%17QOyavk06)lS6XC5AXgV4AWHf#P?OqrXB+&2eoqoB7jZb5Jzjl)R%p)9a1U6LtKH8XG z1*DA3H|h`4&GMd|djV-(h7_9O}QAtqKn~>=#!Y6E3QCDFIuUwa52Z<1CsldU^*Kbah`h+5 zX4zYhQHu>4)IJ_#&*@9lr*;lSN8lr{30=KLt5Rr>gF6bcW8zlNQKDzK6>ejrrQ6_< zA=MtnX;);DE+{hm@q+J6bXKW7*O8{-X~pG!HRy7PWXctStuO_ud_JRRwpEq00mMuS z)%zbZNUX`Ov*W#R6;8(tu5kVUq;(-(R z(h+v;^R?yYrAOB6)8ZEB6v>Ip^Y77$^E!N^%SGmESD>3PpZ)ZaDYnIIv90_;cA@g_ z2uKF4`yw)@WU`-bKbmL$tT@{ZM(tu*Dvb_{({0fdG~G0?@r*)?0f=;RO(9dT!7qB( zmW09i*J@q3yj16_L%ISp?^FKG0)Vebw`(@AGW*PBW)@1*ZG(1fqUA}wiQB<*&CoO< zh{s@=RbhB=IpM`5xY=z}8?5^~@>#N-0L@Y&)Q9WxRAtoYYNqOv%A0ZsrA8}N&`}JL zNdFy66(8V!Pf!tFdnqsTN{I+U6w-X4^CU@a!wb{gFcx3!DnaKj-eCVHS{n$uSE4Sc z$4CA3n?%DJd!K74Hb;8K9Qf(V?9|rxdw8!#OKt;gV6@gf17y zWSL%-&kE1*FBRlg+@8&zLH7h8zH6KI#LSof0TrSP6hv_yavMw9W!~9jq>`xh#5TVi;4@3I&L8L2JkdBEI@`;8WUQZ5rO8@^Wa+Px?oZW9g3NOS(||wZ8EU z_0RTgrd%dtx;HOxP3vw=TfO-?u>;wyVEI0GYs6$=wYpQd27}T3TM_Nxr-$b4=W7Q| zEr|Do{JY!yx8~YJg@?w+buE0s>#tS+e_RrkzWh!t46r|d!*7LgTc8%trE!}hYl7if z-qic~=JW`A_fg#?f0iUxx_z+&YZYT&v|s$F7=w0=Q54MBwauA6Ix`uHY8EeUT?5m> zdd*NzZ<*1#hYpOS%V#vyZ__PP`-C_8XosKflu=-H5U-?ovBGW-}6)}!y&pU|qa(K>8U_S+K90E@SYM%oJ zDZ#(4vCC*B(t6{P!~btR1U`*N;J&-mZoR2QUwL^rnNxP^euv6C0ocWT{(gw>7}04{ zQMe6n%36Je==GrR+r99FY3T(RE)4GAUn=ClfjsJ;p2$zD02di1XzJ%rr^Ne)t--=- zF74KX3}>1sp2G@tb45#nxB`e4OO3fq=cX9_ml3rY>rq=dt{_s!xp*l}tgYDI{8yoO zA4u_K!e7|t2!F(`&6c&VStg7tRSq?8X~tNP7V|gbS+Kf()_(p2S~7z(%VX?8@K&&-e|W3O!MjxP zek7`LRKMcBI#gV~Yoiv^1O(4mG?BMdM)MBrZ23gn>ZRq;0c{#?nsl^Jsctr>{i{l1r|V5AOfLI0$t7iMx5dehsET6sUx z^Ddk^1r7CHOh-2-DC&f(BoYf7v(1N?q1^Y}zmCP;ba-wX0Bh6l*2+dC$;u;E z$iaVm!Zt6iH(9y;f1bEZl%TsbY%B*o8fC)bmHK>1^W42>!N_m+tWOk{XNiKoR={mp zvy5?X;bMAxG$qwpWn_`6{F(N25szeLv3^zq<|+fm37tE>tIJ? zG#xwf!NT52s#XX)v*t({`t02P8}!OVyPpUGVDgiWzY1yIuXjq z8z;o=t3-M4H0M#_Lm?haYUSe1IG&6OZf-(era7nLA`C69xW!Kt4>XzXhI$Y8VD zw#e4(aBM_CxhNy)K(LcWB{Kf4aYKf4YYCK=Q}P9pg>J65Czuu=Zy zvp#wGUo_%bPg+ri$}_av*GB7Ur&9U&=VVqq(7vkuCSYt!7k&@X%2@NG-Df+I3aZNK zgN3UH%0a889mXua{Q8u5yRW92Ln>YPB<2hsZK%Mn{`E*(S-~WJC6n9NmvQ~GDxpx! z!aesh^#WSIK9h2LI&hqif7|93ik2Jy)Sicnz{CI10nhCYeP1UesCYXU(NBs z_+QxWmnehXmI$u}wFV8DMG>RonFsC9sf9b#U*)~sYGzN7l)52RFFU3SOJ<*@Vo+rK z8KPNdt1W;2E!z^^Rk>G8@YI!E&-1wH9`XaAS$pT|ac1>C(f2D{T!h@2MjEv;>% zEuPn%QaC(;372brNtGc!fyj%?&5V{)8z+G@PCe+>e6U5>6luACcK)RzDlvc{SDta{ zKF6r_6sH)R4c7O|`S!9kLWn2s-kW-B$66yBBr4(FRCWD}w_M`p+hO?P^!rdnjv&+& zklc8~wX`^7l8~6LJdvY82D?b>dE%JlXs!gLp_?JtTQQ9TZ3LY0Le2;ueLVop=E=jK z2!UKUz_`wg>D#QRsB-S&Us`bOge5TqncfLWU?nAe708e-S zog7VgunOb;En2%Hu zWl|jc#h5RFHv+=*{KHw-Lgu9rliu`l2k1&s5h$ z?NlS<++1@b)ybw}{q0Os?lW0W(%J-B;Md!|1(l>&J@B))CrSO<3QxhvQPBUas%pTm zH{lg?8p2Y0S0NU5n+2JvnBSVur*#ANf1+Qh_c7J|%a?3~ z#{I}Doz6==8DxTb;?eGSQK8xQ&Q&t8k^rPTp1Gb(b*mYuhTzq@y{T>>zCFrWAKn0N zs#{p@K);fX%ZYC8kN)=V0tL>9h2l6gDA46a_!&c0m&7NM@;Qd6yR%5Jq*GDIGGW>t zWL_&1R5W2Z!VH*kR&h`r5x>1pN2waS>hXzlRp&^t$ReJj#bgO3%jUees-UTYtVBxs z#TiNG8@g^=@A;P0;mPH#`DYam^eXNr8A-7S!s-04Flds0^*m+bOZ(MK)XX?VxjxL% z#GeE0171^cZO*lvd0J+6I97H-9yYFe|7tR;ze*U*8xK2~8`cyr9xPG{B*@&Qw&Cun0mgptT#f~v*zh1Pxqb|^U6_dEpegSl zA^)Ct((tZ?(ZXTr#ca2Gqa|ep<714hfry0Efz=}vTeHqoe1}+zt>F~I}<`{o| zIbCX$;BsN@{RRLU8{R^xelE?Q5jE@8wk5|0E80T3cTCTcuNE>b4@PK$1Qg4FH+!59 z`o?wTjVMjg=VX)L!SM@E7T{7u5Mr|Bv#J(9*nS{G_PWVH*AFqw{Cm@ZzXeYjX{|M$ zg4mH2c@Of)BJKCkzyQJvD*3d104nVF1G3Sg1M)ty`&V}AR6eHdQfFw~p_CIio*q2)ph;wbHCN)2nbs)yNHzpuxNgMT+VsaCNfl5AYN+a zuCx~NnoC^KeG3L%QVuvsfZjGW`3xWBrc8PztpvX~5Zb?Mq38U4v`W*) zq2|TZ|F@{RgF^6RU_7-6s9N0=R2+RI(h{_YfaokCv%fIv7~z|OS?N6M7p+aZ03h=?d}9Pm9btMG5Vc{rm?hb^UGG+ygXSl+wp&Eo`pM2Buc7IPuSri1pP%~_ zTv2deJa@PBUCszgU0O@P@&XoB{X!qMsu)E0in^1 zA{Ep=kV4hR$Y1wMi!{;WK9H?s?4_bTq7G;a*C7udMjtf?T6pcJ!98n7qR3&$Et`KpPYwXhu6H zC6WkQgsLjCpkX@6TiNUP;dEfmgUGr@chCake#xm%>?CfZn{C)o3esm&OFlV<;~>eb934QPTjlnQB)nJ2kb-_7&MpcI$4%!mP99>rU* zEBN#lx~4P9_)L)_90T0fS|znAoYTFn&76BV#2I6Gy+>0{a}{iY*@LE@CEB;KQ~Z3p?5iA=xL=Xhak#gi&(3sY2JyGP#HrLs%%YN=H=_w^Q13BJ9|C;l)+MhR^<}Ln zO-r*-4g2;?r;_)Rg?#LA65RHb#;c{u+NPlg3DL6tnAB>S9Hw|8g63r#^GlaLtrUur zAu?Cy1)jTFpgDJ`@!_wzwk|Pcsg|~ip3K+2bqyMl-6P&736X_ILYH?k(I)iEU1;<^ zres~dOXcdX9_O%g&iK|lzFW~$>_<2iF$_8?V0#qIs+w6uOuVj%HC2gMg)*#6d|aNR zz5YmaY;K;GOVeI}IBN^_7yO}TJYl14hREP=@aAOldF6%qxXyvA!MCxmv>2K`jlIOb znC*~QIrz@FliQ8R-=0F)!@+grwqXD6u_LMPaZo_fSNG*X%hbZ#^WyKn3VFAZL>>Zr zPF~#yQAK05bIe6Kr-*=@GAs{%SMz5#$jx<4UN9$!#r)IWS4jJ$lDvzNSxR!f78*`> z%+cNt44lJ6 z;~PQiB97jg1OVMFE+2>Td?x42IOj$gXF-HZgP~;qB6usr^IRY zYdJ8`mJ2@pSrTh#R`saZLb>Gee)dNBjq-x>vCj@x)vYYXe+VVJ>5aS^>KoNyp1xui zd;n0TFInNblcnNm1Q0}1FixQ#2x3Vl?HZ1DAFPyrj&7_wBMeQTS||eq=CXYtZ!;g- zc`87}EKl%r;X?{jG<<6_lS;Bq(*2mJat5wXDS#oh`Vb*CRq61krk1|z-3kdrMOYEO z$JdvBXaE3J&JSsx!;h?P9j;ZF?^r#JTLWRP?+59rnouh)KuT9g6h#c`)e>9990I`I zFGZH6uOw8)kA1yG;SJdbH^;O*043WeK9T#cGLptK!&2dgj;G?=c&+y?$%=crN!oe^ zSuow5!Ns}pC4|?rb#!~S$Ui@izi__{=s{Zk5c6pvw#|ET-+eXuxw*%y4Savo&flPw zt9o4l#;C+^{k+t%8t>?IKQ&v<#fvxUAvuwx%OM_4DB|h!b>*e|H^a=ASgQqPibIda zaK_bnMc#uqY#e(vFZQ`Q* zfBi1N0?7o*`$nN0EnqOCYbfi`ATOkw%o=-o=FgS1L$*2=g!PTsRsD<`dJ{XmJLS7k z?ekvi*ndP4ACjl^*ayr6%@e7(yevup*kVxj;|&@gKn?#r_-At{@W&B+pDfz$rjuKx zH`wvS0@zZWrDENJCB)aL`w--ilog)GCdCQaiG5>x2l1OZMJrrb_7fPc%v8)M8E43b z_LcmD3gFYamG3pI$+h`{>W}Os7Yzagkn<NMFd+@C>G+Yc1OEN_ z-A^^B<0JRxBnzC$XW(hn`5a=0c7R@J9Kc77RBxP3IT+0Ls0c_F={n77(pP-VLVz80 zyKnx(8^2KcXnPl58sQ~nGgELAU22m{+?1kUr#+@SSrzO0U2`QCeIJ+|{=CC_HoH{zn)G2GfOw`#j?UfC{nD>Mq z?_#5TNT!;Bng==2NWD6Q$MtP~;et{yxbM^?l)EVXp)wkT=bqiB&e zub>kb=+=<5P+i@@(lIts|c4p)bm?J)gt zSiZqGjMgLNjSI)Y{fQ+~CIU2>C7c|(Q!K*uyTsJ}NA+7Pui zS|6K`|B#mkWw6Ji!y8P$U5tp8d-&cLXn^mQ$N;7D$~P-gO8dhKt5kmv&lQ7!z?NNr z8_F-we^N1zl6&}NfJ{06j7-SBaR>XU(6D1VnwNG8IN98dbt{A;%0Y%h%?EA&W&It; zh3TVp&qSpB0pK-ZP2yI##+ zv0u)eUw|&2N_PZSTzilkxAQEjG8*ZscJE2_eaYNc_noZR4ethlc#+3z-WZA^^bsb*84Ic5S7EOLDA`fCu!s!KhD`eAQ{1lt>aiJ8Lgj4|T5=6C zU5@PL^D|*w<}TL3^~v1H0gG1WK?^S;3i5mD4U-RDb2}B_H|YsPK21(VX2GLTiV&Zb z&4fPQ7F99BFh$iVCZCVr1D|PNmCqxh&5hkg2ZkZZLda2$@P4DkW;)D$_4D)eDyez} z`xsuRAiPjo$PNA`S+cF-eyEWL`2aM|pFQQF*RrLWYZbYmtj%eBs8P0?4qNI-FHAjA zcJ!P{(;rMYQR1cjJtjDX=hDkal=CZgt`t zYJF0Hh)nChL}YYI9pp99Cu)y3TK|^${qLi&NPSYhuVzK71ti0RfQLW_&^enA8q65k zi=G|#Id1s9_j?(79}3!NTXOEg@H+7B)hZ$6#sDkwk2m?_QD2g;Zh>`Bp@Xf)5tt$T zaxko(eZwvZ$c@?YKTx~ffNkO0cG1d0ar3OtX#G6rMh@kzHZWkzcn0VeYNoHJAMs9! zkC1zveK4go*@^mMUAv^P@e5Vp5y##2Qsm*gyTxx`No|qU_c`MfhRvIZsLGN{sS8cs zghc}r-a0iIkfgV46NvlM$!frqTY;79l4%a4pLIOQU-g^|6_O-BghzgoS@EVr?+j>v zq}X!2v!hyM1yeGmbRG+r4W~K~!ezd^()>2sPAy!Cand4~_F(Mxl$%;d!1&_w`R9Z< zV~5;vh2J0qBYXL;7t)`F<{AA=jqGoWW@ziCg7!NopJjxnZsgERD$h2*lQulrOBbv0 z!!Ld@)rW7omDtjnqM~foAn2d}4D0#$VV=iR5NL*E3=IH$suW2AJfCCqgL&Xu#p!PBv4)-Pm9jt!I-J*aW+7k6kOwPoB_fIpQ#2+8e}g!(L5 z{?-u$jSNEihR|)3WiBl`z7ITz%s%aKY2M`^_0*#v2X#7t#dMT|=54=EReW`G5v}N4 z8-7}DORu6Or52U_Adj;iceRfANDw0D-}UrS^=GzegVPZz0d&Vd?bo)b-st}};o_Od zSB(5Dbw@%<-v6dgzq1z;!q`3Q$xnHIFtO)d3vg?JO$QXS@uMQDZwJb89ffxTiJOD< z!|M>kMV71syv23#;)1Gg&C8BiTI?=UWM9W3bjtniUK7VrNy=X}Ct9Vk*G)qa2{vmo zb`pAjJsbWs;oLA}0D2x%&u4ACI6!n1vjszp)FFfUKaJa9r?coHbdy?n<592ALjvH2 zxxF`9N(~H<0FQys$e3+%Yd_5ERKJcBx6@(aFC(bR7e}~_PjlPtsA(sY#-dLp+xx%$oH)()FP-QM^^j8xN*eAb zR3=sW-gCGMsfTh4MV@PC%X&_afu-HjCXFYAuziMSu? z6+JLKCF}ohUS!q&uaVwLQdD4vnAmg4F`Rh!CEI*ms`XRY+PGKBUFy%1y%sVTl!)4Q z5*l|bUz>M0a%as0TifqgL(?B7fk(7IE9+&5)6+ka^=T9S+7hb*P|0T1M$?iH=wRub z&-~3v@@M5)rLL!Z+dRg+x^N++o-;W|Ik~wSdX+g4==d?dNs=WB; zX94Mlx#N~d&d(hUzYiM>Z!-n%Jw4PnYusThKmU}u))D}e0;(rH#)sByu0Hy4&pAte zF#zzThiW5#@Z9G``>!GrL1vc@Axq;S>q0A+@tmkpaoVoh*Ks@JBrQfyv&UROY<%lC z`5#mryRLUC`8mkUB54x9gEG5N>FdLiyBr(EOLmv-die@(gix?y;FDls^}vw%*RMa` zxLg3F*gd@VQ6!FMV2A0TQjuYC$c*{s0Y;4ghLAc2N9|E#B|A5Xd;E87;{UUHBkT3{ zo=_68QRHDX6nO9Wr6Hh{lh!_8y z;bg7f(!ohJ$Y0#T%e9cLrESw;kKErI6kvqTAezj$&WT$$TZIxDhbP1XRl^x4iAG;s=l0LXve0;w@ zF|~3*ALjdnx4rVK1sey|*O}9;>T)>hwCFSRtEE?m9%r|3$-zG$B^5{KVchV519^4a zY3AQ-z2b0m3kk*UyS<3*A&olWiXisbdk$l59@kr%xnB0aH49v(uEHQhkKMoG=bJBW zqOVZa=~v3kpURj>b{DMrZq9uohFYp1YZsTpuc+f??Zl%Zv7h&-D#q-p#Zl@kmD`r@h&BINg^Nalc~IaCklg3^si9w3_tp8+JIChdoY z60+&h#z+vwJTe!j2YU6<;~^1eghgRA*-QSJPuUSnm-F&|;J4QDOM2dlY7Pkw(yH|F zpAi1xd;3K7~vV1a}@0;2P&=4x0(sm?liwhh;A{R;}l~h zZ`gJ@x5zW_bq!}$6DQ?KAKOU$uAG%WQ!E`#{OG0&BO?w-?QbP^8u@1eN}#~)2Me{% z#|JcdqScoKghgG}cA_f{Bmga0V^xrp{K|lDf4qb2BII!EQ?BdMi~s933vE=mL{VQv z;7k#5c*F~-rY&uO8f9?r)Qh8;#~>*BEn2mlgP!aRr_n zuso{oNg{$#BOX|a3b>#LS7q8YQ}^E|x_;sohhlON+T0%HnY2CxK#!@{HUH2YcIwiU zYbezzWwvnq9F6jZ#jk8&{JBpC5w?V~x-%bi2^s}i1suo}-%3%8S;T^kAnpp#{hIw(JESYuVWddMLEs@0|?G9~o?U8)uC zbZ^+(DIC5Q^GlZj@r5f|0?v~8H`-Xz@^2#V1*c(c-0U!&-@N}ERSFxmIO|MNpF0-ZS5|9%7WW1g=O7<$H%(K4RR`*vWp3bH^4e> zrB?}JcYg8-FYH9iMW^k7aI`9Kkkm2Cd3GsQ#FQ8AP>XLfJ^FYJe5)e`a}AI+4m%Xyvj>rU`d2CSGV6vpOz-}eKJqiGHW3X?f^(3 z*=W1CuySgu*d4lzIK0+O|l3P|Z;l$y|)-L}RyaebGs z-9@y5jD$q?y8UsCtWeDWH)2M`7&@jBMu7x~%r#|d#Z#;T-I&vC2RY}?2--KX)Owt^ zyRgi`aANs|R%J_8{R;WvP%H0hG?ub|NqdV&;mWmq`Q>><2NJAIhkJXo}0ns zG57~^0J=fogfsS*u|w5QGObntWe?>wQhtm`y!-@+=pA|bc>yXY83bz63Zr=GcSawV zi;xuF+bdrjD5g|^uT`%Uc0&R-gR5KD8DJd!m6xV{RtiS^Kv3+;r{E_$uY}~&k4@RT zcEK*$VS4LYaQ@v9;Wp{YlBXL;(D7aJC>L=sCwv(BgDiSDbZ{PbY;Dj5B+DE5TrS_$ zg@#sefVGa(N(6HGWy}ypOtU7L{~>@NIVXGH4+QU5JIOKY%#!Yf`fKOFluij0=g zPRx1o`tFT+#f5-X!TgCOmOe6=HZfcN=hgpH(dF0dGj=z?-OvniVjSsfx~e=Ax_K1E zc>LC9nHs-YgUblBVL!=fzxFHskPj^wC;eksn^Vxaj{t$SkVRBFp09~SeZIvnleexj z6O3f3#z$r!BY)zWDv-^ zZ~4#oFABxk&ogQE({UcPfK^ZP8%4FiwQ$XjbOlTf|MI4#obh3w1f-(UpttrRnbYV0 zLByf%|HSDt{THXtVX1j$?yGeDr+hQ1jaf*ZFiwpdE{Bs%+iIrb0wco=bI!nDhx$L} zc7Ym2+w^N`V&LUB`&Y$&uQ{^s(gn5$gY62?4D6uqgg@_9Sn|Z&(2o1tXZ?tBc}XF4 z|L2SZ`O|Kd$`t&kHICt5pZ05!4@Sx7y|Hpr{i|QjZCJ;}p#w?t-Q=93&j91WT36U` zd{E6P@=E?;yv1vUCzk-~Jd@lT+xVHqD8I5Pvc8;7mkF>LVD4>|NRF0rPaG%b1Qhs^ z_bs=mIGmK4ues?8JXNNqtWkdYAjm8ndVQTd6P)~%z!n}WUhz6sz8o~u8XpjybL23B z59e=A>C*V1D8BMjRx)Wxr_Vk%F!GL!otMr*^Meu$7AM@dX+Yohc;<@Q{c!u%$NVTLoWOu62YeoGu*ad zbCX>CJ=uh@-l{`f8C!G3EyOH zn`Y=Ii!hx_@#P3fmZ#xXQ1A94X`yXW{e#6uvB3D)`C%8O)>)+)<{xjaw{wMWJ&w0whGz_5J-X0h2xqRWF-|ED{;*(nGDqBru3AA^NKl$CF4Svlwb{@= z92UMSeOk3HU@<#FT2h1VfZ;%Jqg8R<=qBAkxBllc6dn6vF~8Y$d_O7{Z=IN0EyT(0 zc$UCoFk&d@hr_aPUuj;sF1=B!Pkbsjl`z#Fb64Q2bLL?qp7&%EM1hf;x-`^QT^_Oj zBJF74%ad&535U{t#PX?Ab^9HN^Ya79Dg1*|0Wr>%w4yS{L@YFhs{7k576{+mwSzCM z8;;+^4)Rkfj?b(B71%4qV{142eRQ4STA9@;#lM$m1xjMq?hHWzkU^Ve`TvK<^Yp(y zeu=TJi?4`C*ow$hlALJg+L$=X*5VdwqsW zY>vS|ZitzhOj{i;hZ-eE8k}V)PdRP-BodF(?8^)N207L`F&n`=&mwA)Q(Z`+cRqP^?pm0VG%|kNKwBbNz4s6CJeoDw#xQKZQ_ViOtM#zczdTMPMJI%gr`VQmmzy z9#jl>rs?TG$_Mq7=lU>QD@JOV(N3de)bMhy!PQK?k7;m0>$`U=1qB#IDdbm5b`QP3 zeDP2Wd;+`@1@_Ab$&VPyWQ@@;Y(Sw@;PA@a_*jF;ZBA3l4auk zv#)k{8#zwa2uML*YeC&cnRn~karx*5=h6OCZtQtt67cYy0`*$BKVkwQWd_c-l~L-g z`mUB0Y}bo+BxfMLI6mXERU?GG9`<|5z|cQPtm!C{(6k+FylOz~%e3;Mu(*>@_re>0 zaTi;3G?R#w7X3qhZg<#tBt{O$Il+1Oaeg_|7LSEsxCwHGi2d0q?|2typUQ>H$LlUs zb^8R?ZC2@<8Z#vupm=5)*Q}R26bXjaoQmgqutGrJA*p=5Xm!14spR1z4?Sg&5;^ukTsF}IhVO$oykq)Q?^cC zLwbTJCilqD3p73?e_EIR&jxwR4He|D(E`s$a;wG7)kArPo)ZOgKulsn8(iGR4}bTA z2lvi%zAd86kqaZ2q9hx9g$UYlZw*QXm)lzN__}Z4+)aQ13pc*2>T}IhDGVk8jWI#qCG7_o;z zQqMj^jGL&Ly6TvpNX8RdEefVCj?XX|vZ%GA?WG%b@J%S`lHJ#LuofGMF_%{Rqp^ye zUv}FPxtbh`;6Ze=?C7UGd>H=x>Tk@0XuA*Zr@O(4kZw``=ZTWli%z)^PE?_>Uub0h57I9gd?Cq-*#wy%RD*P z8up{-k}`TC@`G3S74*^ebU^>WDFJ1!63yTGRl!`|$MewR%m!bML;N}l$yEhbNY&&G z=p+!{Na%zU2;h05)%r&4{JT)VX-`z2=s?zjf#RwnNTsHeoF~1K_ibf1bR+j;j>&f$ zN|gIbUV=JMGW7#pbEq&&qmA28&GFA5ps0O-b;9Fo&(5nbh`9ek;gYg6AwPNnpDp^m|X2(wT0^*1R^SThG%Ugs(>YZ6DCAs+>FH3RT7Z znYJ#Owzl+$jnUEZ#G?xa5#n(d6RR*KLJym;eucSVqg1vl6|&pWEYaGsPDv+RXqV>c zHGFT-&G4R}$hahy(;~G+{Uotsh&BFLtsi;O`O~wS-EJ#?n;XROQp)NttL8eS5UV>z z6*B$4cU+gPOcDLAim%Q5PJKWs%1Z^{@G4#CF#3@T0G=erke-%j$}Z^LPP(m zKoVgm8ql01I*794GyMJX{}iTwef)2!U#0Eg8m`GpZlB^ND%II?nQ!sX|L9RXT=g-$ zvGGF6Z={gSy`Lmge|>~#xGtCzM^i;{%5YB z)q??3&q;%go7gw7&n{HemX9hNOsR5dFV-hMS~=$&R@2~&;z!GWAp^QTU)-7k&|O!UH`YZrZUp45yoT1<4|9kvKlm{3~#9EcHc##WSCepR%>JVdv5+Tr;?ON);nl zXhXheCGvDVRz<^#O9AazRB{_1rxRYV&3*~WB$G25*|S+ZD@vc#D=^94l?r|?{KSxG zBkYcc0>Hr-NW+6)cwVZC7(K#SR?sO8F5J3+_N<@f%}@#5>!cc43yzL2vC%H|MC~xB z%kMSU%E8Au0B0kAiST`y3a~GG<M&Q{I@aC zeaEM@md<}d+Zml8rl>c*of{uJ$vNbWu63gnW{;{oM~M>2yV$iPu6E?Phkp|=5jh$u zyih`aHCF4ZUR}Aft8vhZO}SK{b@rI!-}Oz1+wVAcO#~z~=L+q0n`$reNy9xB7$Gnp64` zut{x-Ku{Kllk)C9)YTL?Vr#rMr~_MZg*ddv9qSq_5pvv8%{YcG7W9k?>@D#hARQEnYYWwyZ@pc4OX89DF?zQDuhpet<cWjDjWdZXqomJ&`bAgQ zadLVGSL;Vj{%*ZVNB40Mesr`BaOO!*Gce+>M*ZI%d3gQ2lu-ESe9cks zqJ%hcHNRcD-$~x3x}EJ2fIMrl{6|m5W38R7Z<*WoZ`IDoyARCXDEqle|JCTwB=~~q z5l}p?GF{ExX68}-!7$lR{?|!fm!;~n6KG_1k>A75yQif-TTJASFU)jDy;Ldvo(}dy zO+?f?-Du(LI-}1%&N7nFgK+Y`Hrw6A6(AkU5llZEG#QvyJcm~Moaj-OV(|~n5?|P! zXyFSv)S)Crs=wjTjF9@}g@JIJPed~>n#TGT)1dC^w_!oLiUZ_9W%F17va@^80!He%lUbbhlCQV-RYlw@<+TH1X!1g|U0%kq zi+j`$E5>4-+-zfu^Cl!B1s+979z7`re_cw?2DFT!R)Zrx&~I(@sMX*<9`iZHlfaZ=*9h5 z2|m?r-Wh9Ze}By_i;w_mJLh5G_yi*+pw%B|T~pa?(K0~U`YgE~xuf>_t~MscTEE+} z(60WeDz9pg?@yXD*eCujeT;-8c(vS4xEW9_=|9iCt zcdZ4t*1P}sDn#vm6{2c{yes2$zL)4wfve)UJ`oSB=F+_e8PiSBx7{(tV%aUyGZVvn zhx42fu6h1*y$6zk4R>V(#9!K`^d9{W1Cv27OYJJo(M6W}__GUX30jSk>wu4CFz#ek zzI7@{GLWuI3bTQ(Gl}e%sQh=|z5J^+8$%nw4LFMG=xE_oKe>>wLeU1_C3^Aj1%3ET zvEq?9{%F9cuNZs2QIgr+uH_)$9}}T0-Yyn);*ny_$-5UWh_NOb31#9q#p7eqDj~#Y z2|=uL6wpIae8+?p30`+i$9HKF40o`Vzaebl@E%T|vQ{_xv@b2Xga=j??AhUNvL+TGxnf{e0ELA^ zpy=zsJ>}*u@P*nf;kkpc0=7ia>e?&ZzvqHrh+ZkMpRa4^u+df&Al+D4{r-7skB|;N z_`+tE;PTe^D|ek%c93-alELNFs+##iWMSPKt8U;Zh_$~*Ro_lRhL2Tf&pTeZTAC)= z)YS`bN*z-3Zyw5%Rw zB3rSulZJ?UH9$U)e#6(u>Po$8z1BkU-F=5$1ls{4|r!QxDo zbZ2uGs-Gq+e>gdxfAq2?=!%Ir3UpZ#v-g?G1?8z+MOE^s!*i>_&&B!sBhAT6n7yP9 zn@?#PG4J=`GepJpAPy9?nU!Jj4!?~P0K9T|M?+fD zM;rl-#kRgcIq+etQA4oA%u(C3Em!XT^6%MHh}-$t-jEGV7F;rXl%Ffj=SQ0OH<-gM z%%|(lZTpAD;35CC)22_p?IP*EyC}-8Iyy+U))5CUM+1DX5qYatoySH$x|ko+!M{6F zIbEFAeB0#}l864WE7g%&$FW2U9f)U)_GX*uQnVKbgs4Te{YKIg5(xl3`@`zD@Xhg&x2G4cB?49G= z_mU&KKDbB3B)+KG5g8}Y(D`yN_=zaA>i5;m?$m=?o9~PjST_z$P#hhdrAWkIX>C|& z&}tc@C_yC5?zB;isCeVrx2u@%a_zsel^tbx?3YFHIJY|vtM^ZyX_!_98y{a7{*ZIu z_AT=|Wv@`E;Ax60q@NfVuqGVA7f)C!nuyTxB{kp+6chL4AUj-a@s`S&8iT>i>1z@y zB;~YzH6cWe24$*o)Vt77iZ01411<@PfZ!}C>aQW{19bbDl`=l4xek$ZiAsG5(xEbs zH$bHGt-brJvF(z}`QMj!mX@>pX+@?BTX=U@FBg3tm(_AGl=@W**EM4?IPGAbX@zgA zaB5FndhVbFoUzb`)`Ou}$05LlB--TI)BS)FgKYR?-dZML7FO}fPDZU+$MiGS^3 z2G!h#DS3Cw-q-actb}yUWJt^pCxAmfFI6v(N_rB7N8(Rj{T2L}!=m$9W8z>)bgs6~ zr6E~Q_De2k;CUi=D>1=D^V=cB*{>CE*)@wf&OKC9en#7U=zOawKMM7SlQsG%bxI$>qd7J`&u}vAF7sW_O$=I< zDzpUu;W@vv0mv_2lW+`u686ZXMBAN}2+KuB{$YD9@SZiL3UqL-RHbusi`M)~)X)@8 zC)?%(DZ7Xe11@?;jx?7#NDqiv0`2MY?1MqE~#sU(*Lb%Qu@O6lH z^%&v1-}l75%65x`Wg`GGyL|b{A2I*L8isoqYG^m>@5>hi!+DzNz)hymq3MY$#B=D-&@@)5UDiHMy?XZhuMQ~y%ml+_IS~MCseIy@P)tUZ zbww3vnKb2mlCu(J`G~`ZSVwNHF#C!)h50a!co%tA&o)3g)daCQ4T}l6B`UO3=`F!I z$zydqz<@-XICoi3uKh}*G!NvE=N{S6UnEhJt@bqoAw%+zPV=Hu!j?ucq zFqn4C3ajuo?WXPO=f+QwrQ4KuP52B-IiW1(V}U7jUKr@f;&tRT+X`KW?;A?nqPzW! zbI6X)e8C6tLAI5Xw=tH`u;!LDRvBV`#nJitm`&g2zAW%1@;qi@y|2Zp>CahxoM2C` z_0@WPEEEwHsLmB()6q1@o*%qXURDSH96X;yU^Rh~v`C9zLoRL7*?S}LEi$MPt%OIu zTK&drjRzkinpY?0mi%n^>(C>WLVcd#5Triy^lP1cw+?ZUa>lxilPDA)7!Qr-^W@0z~Nhl%F7%lQSQHAqSU@^ z6XdKv1_&#k+i&}S4y&*M5LRJ~{g>PSJ*-cUd$gTQ^1(`YU8=Ba2>*OAOgx;vC1NFf zaXVU-(Pti#g%oO}$+%TDN`6EY)RupInGoRi%gOBgj;TAg-mjAANW>~A20oZj16h^o zb#4t+u7e@iM>DHK7-pdi{44flQSHgZ6MMMpqE%q%hpV&p^A8!Cq$cFRNIG)w3538Er_*@LRMcWZ z#?W+vAmm`-xu-WXAJ-5I_t4Je1X*df@R3fZBVUHlP2?yv#jw<$-T}a@w+;hY~zwqPfYVq#Vp7a|icA7a8vnE&Z=w^dT81l<6nuOGN z?D49n7H<68_>4y`ou?i_puzO%XSB zvCLU)gq5ujCw6wtPWsN|rmen-_rE2&k+kG0#jjr^hlA;Nkh{F|2+=+fn76ODzQ zM>a>)xng4wcV7PShvi{F4*zTCF5m&!UOapqj z#|OdW<<#+Lr8|h|yV@Ej=|(~tC-FV+HiRpL=DV!{>Ci}`y!MQ*RCC!TJ>l!8k9jy9 zwPa1;{3dGOfrp66qqamsT&}yf<`h=4hzI2`!LD>B0Me=udN{adJl(14J-^^XF5m*) zIjK_Rc8z%36VjkinmqJ?z+yrUOR9luPdm+1!hgT1(+YlgY^P z(ADECA$Oba?i;=Ls8hI3d(0NTpcc-h%E`N#cvB?CL_SF9Bp*#(3H{QosTRw_r)wa4 zofvT4*>$$mwxK6eG`q8~KqI+hyDQ6BA#F1n}lHiWg+op7OHmOfcOS{7m@A*66@ zmKh$ltg^$f9r@^sqRO~Q&)YjDw;X&DNNdufKd40o6 zn?VTbHyU_QIXewR__EI7xApqBG59$ou_lQ(?*2{zgBhL=-q$RGCK- zWy5EC(R*L{BbB{}xPyeX$;}5HP>QpJZ4YggxD8_$%qqG=xq8Q#%=hL&~== zT;2H*JI3j)?~X%?nJ z(!&Ke+uq+A0TfxiwR0nL8(<~OIo`iZ>+a4YMv|id%+CMI&O_}tq@NRwF&dSOa>|;2(%hQO`3xPxhvEWiqu=e`F&#>km zna;ALc<=rq?Xov=fmoeg^|g+*|X2lA8YR3okdk(t!W8D*eg$S>3nxS&sGIdgG!a zwq_Bz!NrlEWh&l%@%d~+h!1Sh3+hZtJ9Ym8tH@ACYK@;ct#4}Ddx35+tv3;2o?2ET z=e#cXefM)p40o}MMr_90u2G4pz80{(n{p9hD`0y;`vvqwT0Z4)Aa{D%g%4j%3+cKo z_H-v;_9d|^#)TUvEImG#cQuJ=IfQt>a*R`|sOq-BmLcm+;hGKs6SRThnzy}9%h%GV z#dy6m#I%DkqU%oLtz4)dQM=dTdb7>0#wK(z&pohx6LeTl40;cd_6xB*^93Bd2SEzS zDw^s)3Ny5IZaNsX;wq_lR6GCZD+z+&7DfE33EApVceTGUVv8yz}9BtMaxn?HBnIq4mh=X{Y|1shI4ajJ4nl`K>h|%?+X5$zjMNY{GGFU z<@G<`lE0zz&anC>u@-%-0 z*nbGYkZ#`AR@68)yB17Y>3c(X8zia9A%)?T^K?*6>^zg9N624H%(RmQ4%E|W+1)aY zWqmk*4^GciBQ0hr=JluzX))s%HOc7+hBDt0tJnz6Kl?#a()aDR)X!{#zB+qzYWuZL z)q**qY3){yjBH~FLpEs>0LH*a{FZxmIDmfj^>D45&F1-jPyy5#F>E7og1C}xR6}8f zG4&pHsFN8E*PUOHt|}0%o~^xgmFEn`90a!Jo(m~M$EYwJ4qaaoS2c6=O_n=eRxECKTECBTLu zk8^laaS*!|ec!vtsC%Ls5ZhiMO|6u>V#w2X4I|eog1j33R3pavnq(<;mzyKI48r-N|<`>?t5A%%Kq50SiLo{=9gZ57p32g^6sD= zRFe{&sJc}+Bz}h+71ZBJDU$9jGh!}S$S@y+JbTqbEpAKmRM*}&!-=4%=TgB#ubcKI z2ul2tbze+6lUvow{A;0c@rDNxNcgccZeB!S9TCzsSc8u)LzHL~2AXN2$BPP?4h6s= z3yytQr(6UgPo{fX4G69fHghXJ!hF5A5jr7YYO@aDT_x~|F7M1CHZhgUcCx6XdFSCS z*LP0Rcl!AbFRqHwXtTbB%>Zdbt$b;KKUTYCsF(!OA`B=m-h`C+u7bXih=;Fci?I zIwk%N8A*K~XUUgd4fpR(^^8hT`Z@c?O6*QZ!&l=Y|1-pV`@F>f4d(83v5FQ5`gezy z+F;O3hN$2#W0$4zGoSBGq2;z_KFmADa$i_2^_(9XE^9THTy-!qmz#C=bHxPr7M*%p z>l;ZG!3sjjyS5z#Api-CjXddNEV_}nx8QQd7xJkm#eBmjd??FuT!IPQaLnGPDzFfb zczPI>7_^7>FzKTFn(|cR!-Bi=fyT3UBVS*{OZ*z#O`XbMFT|FBT*!b?zstH2hCJVT zGV`+)@k=J7416mTK_<&S4TEmB-G5q)M=cmzTv8Wth?qVn8z)2S^W+1?2||&ArvmU; zOw9Y{b2817xjI3s6?!4Q>_PDmrn8_6;leyce0en4;k_THEp9vq7`p?=Ow!87jpnv$GVl9!8Xj$UEKc=^d1~L`IWj!pZpq9Z|RUuaMebw1qs)i zu1xlj8zXIo=!4p>l8(teU%{SfRLIh+3J?2}Tn=)AhwIAxokPjABc%F$*@N~bk3z&UHn zP-?}dm1SMWS1l+KF+V59E&_Bg_mCaFn-i?PwTy? zniDjy_`7L@d2Q?aZLW7SrYC4e2!c*BGfAPu~n`ppn zP&ba@@cUM3NL$zieqd#k^jD$Wdt&nk)?`N(8sDgm_>0LV)_eJ%*ZEgMHRJ)9Y=*Oc zUXuAa1MgPL^nGEwQY6`VPbrOGtGDgbKZBywVhQTpzMlL7?== zcv&VhiV!7Lmg!Z|YLO}qHo@~v-rwe2+=4&*yHRZcmL$P*i_Osa^-LuiVmk8&s40vh zv-+(2@}xefpHC@y;%tNCZ$`1xWyN?65*Hs!W^vG}`5SI|&$wI1DN>4_H+ui!#ApHmWzrlbgvonHU^p(0vRP$}HkFe_<9~#=gmXV& z(a+BxM1_DpWvK712WI1a-|UCfZYysn9`>`@LyKbYR_h{sGZNswLO#=3Z-U5_0ZZud zG~cKqGfr=k(^xg~wc;uT8uX|pwj80#!Mh7io?O;bB7w5 z-fY0TqTdzE+B?gopezVS2iIircd;+gWfEidh1{wXinFf4!_!1`6fX_(G(=?D+)e9Q zkQEvh#v#L|O3;D5d0+)*>}VbSIl5iOtv}DQUtVXcG>Gt?^iL;acUy?Qp$rSn2WsSP zJCiSeH^P6lI7+|m;{U%X8om4<@c%&WVB+E{gP0%)->}f8B1C9XZ0z#=2*po!ilN-L zK9@cuS?WDaG>w3&uAQqud5#mk2S>i@;EFl+P%2(Gc>=qewz7uBD?2&`yK-@<;3pvfxSob<)zDWGK)SUB+?EvpQ` znF*3v`|b5V+upxhR+F&$lSx)z z3jM^A#9-bXqKappb!Y6#;82Q+-|E{6fGp_sIq?442RXH(J2#gyHpl>HWV>=2*vkjM z*(-{av*%B@dR>h7^PxYlsfGk`3(d$Xiz5XCuHe(#i`nBbCZW!eA^9sghF6>Ah6rxe zkfkOuriqCUKat%@{sMx3A?Jd)(;aFw*I=jwUc*>F*V&YHmxjx{s(V#+6~xPRH}-^E z+dAvYw~JvxC)6-KRHVcvUDsTk>+Qbt*ZzPd4yX_a(w~c;RJF<}uwgkyQ4BoOQ33e= z3366YRDEKEflwJq8_x4l>7gqA;2A5O%AkXAP#p6KS)uV^nR_{D#^ zmK3AG} zxm4LJhh&Vw^pq75m1$KY=uK3wnZ%lmP;7*|bE9wL zp0a!IQ!7@Qdi&3JvWe15dALqBgmP37KCVQT$xex=4Px61w1JfSUlot;aC9~k%s9o6e)&ZF~Bzs z+LR69R51Y4FKM-M==*|<`!|;)>(3<({&GtEzfF#gm;tdIa;@-1W&|4Y1s!?*H#n$- z=3^oEIERE{v((V$vfe-MV2&N(*6S93VRjtzV@g6^H14?Mmp zb7+L6@XIHOv?JVF`!Zi!ClvGvw`61kog9IGlFU0re)Q7hq+t`8P4h=cMvj}}K^Pg$f8@<3%PiQi|NXF(-4dq@7 z7)rA_Yaz#cRYzDHCVwqRhX&0z=rvc@jVc!$mh&fz2RCDgiv!5a5!>Xv)PEK*$reDK z?IbO;fkb;3E8p9?2IUaucE06cbg-6=a#)d~(xsz=uxCPaiM zeA>8Pos=v8`Q&}fV3}v*S|QGFeb&EY_!mMi7GEJ#WELFz9Oh_cX(owi1r9c?&6EJA z2#WReYVuq{??e(+`PAqUl_HRulbNGu#x5bA!?y872@(59G*L=N9whWZq0z3zzUG4* z87Rtyj}Wy@;tN_^Fy+_WVEtCXkQ;J!7#Q-m%&fePH&u9Cw)LvyHkGPTIFO`4OQM{K zZp%G9%ss$o{L4#CP=uByGs3^muET!aDUlQjLK7pXNNx05LJPaGXnv*7_LX=MU(llg zwL*>V8)FiLd-FZ_Z!T{ZO4BS7a09hP(+$oU`<(<*x;PX{g@(DK*<0hWG}HuO%HTN< z$X^0xqfG-p7kGPmjMK0Z>5nw~DR)InnmcnGK0q60!m%Uj!BI2E!=SjF89jYR8;?Sn zPG4BLEGUQvwc4lc|0wY4?g|<_yBT?#9!o=T1fb4 ztbW>~pJJzLH@%AtOxwhtKg|740{&MZlfUv=0oKYRyL;CI0fz>sv6pP79tO)kt{2v& zP`kwTr3W8!<{YEnpzF_V+?gMMv7WY9uVuIJ!oMu7z?#*mj*fA4oTI@M%eqr%bt2cs z*8t-;kk{xAx(mMHF;`>k?=@^t5V>oS25Hhh4smHsY4e~1Uq~N>m+@}tKJ&8I*jjIX}&+1vSWwlw|Lhqfgl)s6K z|Kd$M^VTK&A9&M)a`7Sm8A|{H0PiK(-YIf0z!2sATO&@l_?vp@rD>!~2s`uov5w~z zgvcLf%~SE|?D!2U%YM;Xl@7(OCN@ioChQOgUFw4SddlO|m?BVss=!7NVOA(tPmALhp_^+`fbmd=@|f za8Lv*9;Cx0u?ovKiic0}XgNS#G1NfS4K{4b9nNG%W~A|<*2%>c_HaVNQ9-zMw(ujK z4&)lG2Q9TB@rf&2q#i&6XpOwRw#UUhAGSb>2%GqJTFgBt;WTkTq@;*qAv5b+?(bE` zSTVqk$IPR;21lm2bi34~xAA%I?!@N_DPb9+!%_AHop4;u$Odq~VC8b%2D?AA=x$rQ zzTK3UGQH832ETz*QB}M|W2_yIczW=W#xPpf-p#<)nP<8x^F@PL19ZgA5!_HNn6hqA zkX%x5%WJ|6eJrLy&A(fu=w{mp()Yi=Rk9sPoNdIBZ6jLn1$rJ^e1_`i_)KGb=FHe#1+c& zrKd?V*`L7SkFbJTD4!SMH=Q|!x}TK6Fb5N+x?V?Y_q2xdlPU{brpW~KASC!%4X#Q`2m2H!PEiHQDlBkv;AH+Hs}qc zm(gOUtF^6kdv`?zE2+VlE75si9>q(npdzW;@RF*ijaL!d6NhB>g5ZAZM@VlFfjxkq z>#QTLw~Dx^c^m3#8+sOU{5aC8HpqA5Wq-}b<&sma|7Boo7N&2g!s?QMNBI8}hdT_qfA1@Z2BlWunYdUSsUDB$WtXOJ4pVc3xicDcPfGR=r(lw9rfY zxPX9u(jcCCFeeVqdjf};e(uvOmWqH7Ms7x!dlxYc8bHbwi~$j(e6Y~^{2hlhG)g?C zt~Ogn&2!cOi5a^%FXYTq6__R;So%)xz0I=d;{McavK>hHnQm><8G(n%-Q)Mg(KB&MiM6J2t@%&6`P`@TEehHwx=ES}G=uo2JU4fW?b{i=< zS=kPOG2bgv%Wc^g@SuPVx6$E|kAAKjFU{)S<|0-1q*S{p5OQQEqQmIOa;zW%wRo^v7~}GxNRRvo4qcZh_J~_ z)c?|)wGnx9Aw7>v)KpT%{N|V#*|)r+T+wCvIcf?rvMX0|0>m!;yDrx|v%4C5cd)}~ zq{EnbGXS0M(H*o;R3nlggZ$LJ?~qi&+h27q>rBy6RhMTCv7oe5K0w#ChDFk+rE1h56uT(`<0 zC}PcE_rSrmKOVn%BX@pIT06`5`IzDU`k;NfHL3tN&;2khT({<7mQmsJE;d^XDe&DP zGVN3rC0fPQa*X1Tk2z;)Ye`*BtzzgKDUw?Z>*ibSm&r!%%WU8yyR2x!p5c@hQFSmZ zP}s{$7QQ~8C8jtC_*pPRW?`9u#Du4CzkzMQ0>Ed7OOR4MZ0+t@)xD^(Yl!q&a>4IR zg}_LO)kVLx@TvX8gO+VyZKrFZbm@&P6+)vKeF7%p_tH1R<{I5;Y{=Ff&TC8+neS)t~d;K3x z((BzO>9x(%^CJJfNm}E>n-{%0v_9LB+P`K}a}@#z9kh*w1rMTm#!QuEysnQY-fJ|2 zI&ZKFjk@2-=FjCG-fjb^pEeuw(f5JozyFTYRyXj=p?8=d@bOW&fvWpp>9?ib<0@N& z$NOzVx84K%Sd@+enlCW*b7cWPpZl;1C^u7Fnso2_x~L$HrQEmcL_G|clGWmVP*xCZeAb2767Ki>85E;b|N zook4)U4bGZe)Y3g>L_3=2k$b)OhxPK)bXziGJ73_P#7=i`9U@@P|)Q`z;6)~n-(ZX z!`9r+;E?Wj?jgYxx%r{B)FGRq#Zc3c>gC7 zuPb-+B~PeAZecX?awecGQ_U ztI#gin2}vDEQ%@%TukA}Zwf;B0<{y5!qGh2WbE6P3=TkSp*&v&Jun>lrZO+Z>0#vKzw@6K~N@yErCNn1kj$)9e-$0;;F4|6h zJ0Pw}gjk5g*p=w$sIvw@?jAZ1Nkrue6$_E8{EaWkW~O+*e%g`M)rLMpck)JK_)~iU zAb4az2eABAECZ_ZpfnuBNJ+{kIQ0!V!7EHGe&BR``(W6I)7rDZ_$b)_UugG#HK{qV zyW=Bg;dRA-CRJd3)Xy4jTI#ymPyPJxEe{k31V@M^>v5r5x!uS<(lT7|xh&D;Y}(;R zwGtxzw3#>KMv$%aqMN)uncL&j zqlHzeH@xRpk) z*X-qnR9`sMXrt6!5xCxn4O6$wgojKUQ4+W$x%844?Ov%tWGJ};O=c+zt-`c{lW$IMdO5qboe!}bnYD`J3xPBTu$tmJ< ze|O{cg(z7QT^v-;mDzivd%|5|a>bth5@HT0@!XcO%$`O4fLW3afO?i{;E|xo_v1%E z#|elpPw(y#=MN^7{|`gN;V`{!wEz9Br{|XB^$~n&LIKCUE?YH<^h6fCE-A)uQznS> zGD(jD$n$acy;EaE8=N6ba!cn+UHMk8#=xk?r*=7R)wzgQCZmTur)49vZ7s+)$#AYB zJUm8a{&G6zzN6utNon+gU<_Q{u?5E=pMq-g)JU$D`*k6$y+j*bLK{PxdSg@%l;4bK#WA&ESvw-iCL@^3O4zQPi`rj;fG)ZeyvK_p__d z76wXAffW@>0!z!_<5WoXR4HX@NIATdJ5GmW;eb9ETmL_ zz;JpkG9~7(cghG5$z6GYex-!A^#NU5+fP4Xj0`BtPNUy){hGIc3 zf$%?sLIeoK_s}bI6^RX!ljAv3^o!$3O8VQ+c4eoqU|>$TPLGHQ7Ze{pu=pG+uS zVIA+BH9}%I7E_JG%_YdzcVUg;nSnJ_2+%93j&9RN)SVq$+r*&GOnl!|`=<2g`#C&Z zk}$oq;igp7va2g+xcXE^iA7Qhd^7Ju-rM)3Di*NV9OPQGsOqD^s5v`#jIBS=DWDvq z-KjaqX9+3Vy}ku#^ID8@z zIbfUm!_GodN_|LW85WKtD+bFw?{JA;UtuIwk^%TkV zL8DtjDPu7;K>ghM6%#KRmV?YF;m)drU+_v#=PUtg~=g9FuI20I*i;VDMME+n4a^DBA!iAyRgpT^$5G0g%&X?4sdd> zk0Ju78%I-o>_qIImfryBC(I9lMMHfCWA&FW^s|pOUQ^IDv;Dm<(?V-AFYIaXx>M}O zSMP(Elw*9`0Pz$A)1-b-Ln`-yDPTTZ;&Aix>XW12zIOJiWN0#*2fgXe$8$H^VxFo& zVU5~E%eu4QjT#R{7~48yI#5vN1%3?Wpx;{I8^ORr>Q%h?IsGfdNTt*WbtbE_{PvB$ zQ4-7wTFuxvO^pD|PltupAD;a2PVAVwEitpu_&*!1_q*HD_XXG3{{!t4a3ssW-*4>? zFYpOL?-EDcxib!MzyVVEGuic58?e&;+zQd2t5+!cb~3!0RdP-in6`*#Ty?5oWkmeZ z+KWo7fb-MvQ6@i=_{}nL=o#&;sVS?hWOEUO9!g-o%GV2dl)`2WC8(q=J`Q?w?k3hc&AcLrifS=5S+#7pV!di~me>|t=Vww0hu}YwrTL?dh?xHRrH(ui#5e~#=8ku1%SQOevRL;fpX1+J2fyb zCS!26NKq%4806f~dLoCKDk?#~A>b$g$+z*EHMb5Xx*|jKd+8}yI22*kYc4`P4NT?W zVU4U4o9ct;N*WUl4rCt{88J5>v;;z2csLi^W97%lUzJgYcb4kaSp;5T+p$(fYV! zK&5Cs3}WA9*X7|J!Xzh!K6)yV5uxr`?_U{m!}aS`%S;KfQJ2_ADY4O5?(%`7hgZ9g zz3Qyhe93cO*S;LoF#V7~2_J{pI<^<*M~mmT5IS034PJYhWigz=kYemS#&4G%**0@qe$6^&pWmv6N zNyuwqE_SqJzU3N(TZal;o5%tM7Xq}1F>(bDVK#Eyzy4)kMa|p_Bo8DCfbdr5fHTSS{BIZ6_!>`b71MVtf>>Qg5I*?;TsagN#eigqB z)(7ON0zFC2+hyxLD@6ztdYwa}bfD5-z1Lht!4f%a;R0(odaVR9`W3sv#DZRhs0)f~ za^5wP3PUVz!&lOfHSF2*iN`L&QIo>HOT2@Zw@mP_0tVTI2YrRnzZ} zA^4oSYrioaq&(xY%H4x0A~_kycr_nOxMG4n+m^Hxv7kjxETs#9>yM z@J-=hVk&%dL@URL_$tp`0eP(TYX9iR*%1)pG)+ZS=bxTQ)DX~riSnHP_Ro)Yqfsw$ zVLT}=Ya^vA_{|Ui82WQo08~8i^Uc|Mx$|1`A%Ng}nXt9!?mrV#vb1ZbRx#wpxw)7l z%NbHE5C~P=6@!mT0-p3Z8<>oZhPg3qKN~oH+6~z9_>Od_jSb7+DSe9`q1yC!q_*@6 z(HStV{*u8rCFHSumeO=tW83?$#G4rK&nfZ$o(SUiX|H8XmCZl3*OzWCsQSHmG zmr}YdF50P%9W0?RbK-;0=J5DThSALU88P5LVG?#>6Wv@jBPFyBNKVs)TOnRI$FZkZ zuTE!G&MBUzU!9IG-5$LU(sJP66!rr66ac?eBj)3iqUldys6)!Y&ALU&(97YYo&|5& znzJ%I(vWnGK2(X?g8`J5h^hOuU0f(It_1PGtC`x(g)K?LPc-sI*e_$$xow+DDBvKk zR_kJ3AAHl7AYciD*jhhXz$lU?4(g+i`ZiAjjWE$W=7^>%9;kBZK$W`y`(<-5q8uew zmI3o4@3Tzw9ovT;$<~2wM#0Q1n0ty071i?>`+^C30N!Eu_fy^AT1H2Vn>rFz(lSZj zc&DSeNbWaGFGmD*U5VZLW`t`_bjnjn6M=H;Y;}BPJIE+%KA3O^gs*WWp+2)G$jAB( z0Of4pBD9v!xLK540zEW=>Kea`apC*^*h!+0op@_`7K;44=LoN-?ULJR_Njm4_y79N z*!?b?d=)r`0N7QIU^W7|BBN#4Lx3mb$gZI!m(;5hBaP=>?XzTCr9Ko z4dr%Cnks;U0=HF)sqbuZcaP!v?4DGx?PBa6BoQ{ZqTfywLX_KcZ{~uj%9+h<7zK_q8GwD<=Sy@(+T2W(ZPUD)un3grAOj(+x zP+B>qN$!d)X_lH>YNh2utCpx_<}Og~W=d}0PU0>i3IekK-pupNJkR&}oZlZEPk4?V z;r)8u*L~gBeO*qfhvpEI^D;Z|-w%ym^jR%nu3&0>P#8Z{KDll=A@LZ&?^$ z?eT_Mma*2c5*5)Ig-LFp3kT?C`T9eH9(?-=YE(I;=pyy~NItMX6!p;VO=nqp0cZW; z$fktyX{R-A^KtB`V|-196&OulF`U{1O0Dv`U=S!B1z_r*|2#7P|1kBVr_oGq1S`SS zXojrHCkoGCS!DgZboDHf`c_y@Hj@`TMb!iv<~ncxbgA5@hywU&g|%mzkz9rWB{Up+ zLsZoQDT$gs%pB+-!0;`fQg4TFnCA7{%_oKL(7Rx4-Md$OKVe=>CnEteoVq0%um>$}%1~bZq4H>o#<2E} z!`dr50e72@Pp8vd8@~K8Xzkr!IbjiOZqoe0rmLJXail19J#>8(tLUm}wI$v6Sdvcw z--j>zGG$K!S=5;r*uJX|Hxh6N)@Yw=dyCqP6*EJ5U1gPz*97M%9s z-s{r(Ob9ww;_cUY86UKsffCU_P$HAIbvljgOSqfA(QfmV;O)Qd!~lGL^HNzLw#(Q6 zp$)MPbMoV_zNdLuuTJ@X4Jbk*ARvC6M13G2o;{7CW=1roRt<<;U8L;FI z3V!Z1c-~)fG5g6=;g$8*{PRGEZJ{9(6Z<6>UcQkair@jfZznY+;d|D21KQ-KHKj~W zUnMnK^vsNYz-2x`6zc5^UwBK3*ux$&i;`I@UjR<3WUv}J#_{iV|Kolm;D*^BlimAw zqx0_@#__Kk23TCGtra2i9(*_#;mJ|$r52vA3Ar9Vk>(U&ky8AZS3WIjls^|x*qBK; zY1^`CNZPIJvUNM|tLp?k&)GtxN{G}sl`p{@P?>NaqUdFL<>R-V`X#EI6#Oz-2Lz0=Xg2bRvJKbgTGu(9+5Ct3D_tFx#8E% zLqwb8hZ?y@)$*l?Z<e0+|Uq?yL7AM~7w_c`XY zBTmp!oJ+Rx7;o86xEs-^pO>%&JAae_*mbVh*BfV658+zx=GkjrqtTK+RF__4THuPc z{35JwqP$P{LMr-o{3k+CSajt*=mMt$5pR)VAt-(B1IKLhp}bhYE;=o~)D-9}OI|wl z8%sP0kOo9+7u^?fwRGm8Zqg4GzeV(0`bM>mt?s@P=B;+mj-wBfZrUy@?ikcV)nOWe zyKR^0HNUKjplgiVF59DGC6uhW_<|CEhpq0ojKvhua_2GjU1iNot2&#dmXcK8OU=G3 z+lBXF;;bbHW^=_W7?z{QtiTP>gI$Ro(OQw(((68@m6EYT-x5nWY5bSI=T8zUU_Om& zklu@9)DJr%0J@utoq2v8d+hh8$N!m3y)y=wqahvJ(*K!B*#47s_Y7Ey@dB69+vG z5(Z~=HvzaLLVaV*XzhK4@E5=e$x+M3@Ty0(@%--FAJ<-955D^Z_OaRxc@`p0D$m(q zy{||IGx_`h!Qv2f!gbLBzWtD8^?@&q0~ytcg(Or_`4`%{>ASMV%T8Y}#*qcUHtc=a zD@de6|JMFeKsOv9f9sRF5|bPGHsKvu6Bc@PK$@nttu&9Rf3$BcbVh*k%}KgRyFXf0 zVTq<)GwAFPW9131%VU7o6fJiBb@og_9$AnJg!k>Ye*JAvtDQkgWJGcl@nz((sGXdd z^U|2it0Tm1d#-4xh0(vPW40Eh(F3rEUEjC3bO@6ZcYJF8sCT$tKk8zSh3`Q z(Jt{)7veG2Yfjhi0HA-7l=;%`xOAn;>wgiNsF7jo?covsEMI2rP!WbZJTol*;Sm4D z-Tnd)hM^;J5tAvOae~b~K5&r^0sO0SzqU7x_|XCR^9WALQT=1=hyYf*PiaS6qDF^{ zJ<9ThjXS=Nj0L66<|GYc_#Gp6w4nWexs&)9G{9(zI=iPx$(^mKVzsi>n%2)Otxk6j zgal4=$wYV3!kh3`!?=(rPC0{i=TOSEn$QzAX^g8?%P$i)kr#1wv-#OIz>lk<=*3C5 zp}0|7zC?VOKZP-ECYC||@)}+MmPyWt002Xg0y%iooa%EBNX*jB$`Lo16f?DX|M_C$yipn52Kk$9ec)$_g0j+?5#2dkd z8>waH%*g3nK{;!%3fO!(RjbA&0MQe#M+Y7;@S+j&n&uQ&nwsKp$s(Wr))Rk?T~f$AbtgcU6FW*c$gl4rlZKnj? z_;QD|v|>nig2QD;6D*e0%~uY#!c83yqeB{hd+6G$>jMG?Ve>m0PaJ7*+W+Qds%?}} z^C1tW;;XB>i?&T`AH78{*L=!174HWo*g&FA_eI!1@*bU!jR@hT##@DZ1Y{tQ5@7#u zTMykg`A@5S$Voq7JH|+pSpnl`6SE3TEun&S7meE{7cXshTpYSL2lB;JlztRAzZj4zhDo1Wv575OkQeK7 z!>$Q&+Eu#S0bf|BoVO09=-nxYd66aWi!4R`Z=DQe+WzZ;&Vy=wuQ_AqBHTh&eyJ49 zCRhUlFRjSpXqex!q|^#|k$LFyOX##iQG3#P!d4^=j$moF?O6Wlr+-@NGS$GSY~8Ky z|BRRZDx^99|NZ2d2-x9&R=Zfgww8+%)vCtoe`tLF0F79>?;b)z_Ys@1UFQmOLAtkeK;PbyUr@D{YXNPZ1oDZ+C%n<46) zld_pB$;>yq>Q(U!wLl2oS!MkbCmr0k)u0)-63+qYk?tr}fR0>3Qldp)e4%A?G(fV7 zo*I3-KR+fakp=|RPcEPoQ>Yp({7S!1tPT=NKL^^f$l6MaIEKAx z_-b$Mg6+yrF*I;$qS4vy~Q*R{s<=z!lW;o}u z84|%4j{|nKa|)iB^1W0cq9RF=GlsMB&m`IJSb`>DplWGqsl;$4O=%1gAFl*f6%|Y4 zGZ&R8ymV+}8m1I40ImbYYA5E^8OV2{w29RmGetG|sbh==LrlU*yT&lw2s)v!umdvN;U$DIAURGy zc+>G5yZk52b$v-ejVaASA|JIm|3hk?ik7;w?-xi9{%PX;hX-!e5+SiCUkTC4x9 zKUN&{G1`tUZI>z^^}Ga8WUtj1)Vq17cD1zKP3wt)t$wa)@ooB9gI;cAF^MXEo2rSt zHh1XDom|O8bPH<`npg+}TfFnRW5rLL8>j6Q-NH%_`3Ant(dYFP1onET!fdaF2%QkI z!C4t(K_e)4n&ATFeaHdRXEu3jBXxNgup7m?W0BCal7-Lerg d>8oSdW`O>>v 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

!Wz! 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 ySr@e#>f;FmFyNDYZ}c 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 literal 0 HcmV?d00001 diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift new file mode 100644 index 0000000..28094e1 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift @@ -0,0 +1,14 @@ +import SwiftUI + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift new file mode 100644 index 0000000..c0affa7 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift @@ -0,0 +1,15 @@ +import SwiftUI +import CouchDBClient + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift new file mode 100644 index 0000000..ca41ff2 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift @@ -0,0 +1,25 @@ +import SwiftUI +import CouchDBClient + +let couchDBClient = CouchDBClient( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) + +let dbName = "fortests" + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift new file mode 100644 index 0000000..eabf63b --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift @@ -0,0 +1,31 @@ +import SwiftUI +import CouchDBClient + +let couchDBClient = CouchDBClient( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) + +let dbName = "fortests" + +class MyDoc: Identifiable, CouchDBRepresentable { + var _id: String? + var _rev: String? + var title: String +} + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift new file mode 100644 index 0000000..625204f --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift @@ -0,0 +1,58 @@ +import SwiftUI +import CouchDBClient + +let couchDBClient = CouchDBClient( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) + +let dbName = "fortests" + +class MyDoc: Identifiable, CouchDBRepresentable { + var _id: String? + var _rev: String? + var title: String +} + +@Observable class DocsStore { + var docs = [MyDoc]() + + func getDocs() async throws { + let response = try await couchDBClient.get( + fromDB: dbName, + uri: "_design/all/_view/list" + ) + + let expectedBytes = response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + + guard let data = bytes.readData(length: bytes.readableBytes) else { return } + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .secondsSince1970 + + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) + + await MainActor.run { [self] in + docs = decodeResponse.rows.map({ $0.value }) + } + } +} + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift new file mode 100644 index 0000000..5e18938 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift @@ -0,0 +1,69 @@ +import SwiftUI +import CouchDBClient + +let couchDBClient = CouchDBClient( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) + +let dbName = "fortests" + +class MyDoc: Identifiable, CouchDBRepresentable { + var _id: String? + var _rev: String? + var title: String +} + +@Observable class DocsStore { + var docs = [MyDoc]() + + func getDocs() async throws { + let response = try await couchDBClient.get( + fromDB: dbName, + uri: "_design/all/_view/list" + ) + + let expectedBytes = response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + + guard let data = bytes.readData(length: bytes.readableBytes) else { return } + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .secondsSince1970 + + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) + + await MainActor.run { [self] in + docs = decodeResponse.rows.map({ $0.value }) + } + } +} + +struct ContentView: View { + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + + List(docsStore.docs) { doc in + Text(doc.title) + } + } + .padding() + .task { + do { + try await docsStore.getDocs() + } catch { + print(error.localizedDescription) + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial new file mode 100644 index 0000000..8bae6b0 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial @@ -0,0 +1,65 @@ +@Tutorial(time: 10) { + @Intro(title: "Using with a SwiftUI app") { + A SwiftUI app example + + @Image(source: curlybraces.square.fill.svg, alt: "Application icon") + } + + @Section(title: "Initialization") { + @ContentAndMedia { + Adding CouchDBClient to your project. + + @Image(source: swift.svg, alt: "Swift icon") + } + + @Steps { + @Step { + Open the "Package Dependencies" tab in Xcode. + + @Image(source: swiftui-example-1.png, alt: "Xcode") + } + + @Step { + Add `CouchDBClient` as a Swift Package dependency. + + @Image(source: swiftui-example-2.png, alt: "Add CouchDBClient as a Swift Package dependency.") + } + + @Step { + Open your View file. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-1.swift) + } + + @Step { + Import `CouchDBClient`. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-2.swift) + } + + @Step { + Create a CouchDBClient object, define connection settings and database name. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-3.swift) + } + + @Step { + Define a model for your CouchDB document. It should conform to the `CouchDBRepresentable` and `Identifiable` protocols. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-4.swift) + } + + @Step { + Add a data source for your View. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-5.swift) + } + + @Step { + Add getting the data and displaying it in the UI. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-6.swift) + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index bc0dbae..23ef9f9 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -11,6 +11,7 @@ @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient logo") @TutorialReference(tutorial: "doc:macOSTutorial") + @TutorialReference(tutorial: "doc:SwiftUITutorial") @TutorialReference(tutorial: "doc:VaporTutorial") } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index 9e306b4..4235591 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -1,6 +1,6 @@ @Tutorial(time: 10) { - @Intro(title: "Using in macOS app") { - Learn how to use CouchDBClient in your macOS app + @Intro(title: "macOS app example") { + Learn how to use `CouchDBClient` in a macOS app @Image(source: curlybraces.square.fill.svg, alt: "Application icon") } @@ -32,7 +32,7 @@ } @Step { - Create a CouchDBClient object, define database name and create a worker to perform requests. + Create a CouchDBClient object, define connection settings and database name. @Code(name: "main.swift", file: macOSTutorial-3.swift) } From 8b6e347426f5aa6a3a386eb37baebf039f009d66 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 16 Apr 2024 01:33:52 +0300 Subject: [PATCH 068/202] tutorial fixed --- .../Tutorials/SwiftUI/SwiftUITutorial-1.swift | 1 - .../Tutorials/SwiftUI/SwiftUITutorial-2.swift | 1 - .../Tutorials/SwiftUI/SwiftUITutorial-3.swift | 1 - .../Tutorials/SwiftUI/SwiftUITutorial-4.swift | 1 - .../Tutorials/SwiftUI/SwiftUITutorial-5.swift | 13 ++++++------- .../Tutorials/SwiftUI/SwiftUITutorial-6.swift | 12 ++++++------ 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift index 28094e1..acf0f45 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift @@ -1,7 +1,6 @@ import SwiftUI struct ContentView: View { - @State var docsStore = DocsStore() var body: some View { VStack { Image(systemName: "globe") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift index c0affa7..7d3e0b0 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift @@ -2,7 +2,6 @@ import SwiftUI import CouchDBClient struct ContentView: View { - @State var docsStore = DocsStore() var body: some View { VStack { Image(systemName: "globe") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift index ca41ff2..94d6077 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift @@ -12,7 +12,6 @@ let couchDBClient = CouchDBClient( let dbName = "fortests" struct ContentView: View { - @State var docsStore = DocsStore() var body: some View { VStack { Image(systemName: "globe") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift index eabf63b..7947b84 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift @@ -18,7 +18,6 @@ class MyDoc: Identifiable, CouchDBRepresentable { } struct ContentView: View { - @State var docsStore = DocsStore() var body: some View { VStack { Image(systemName: "globe") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift index 625204f..26e2eba 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift @@ -19,25 +19,25 @@ class MyDoc: Identifiable, CouchDBRepresentable { @Observable class DocsStore { var docs = [MyDoc]() - + func getDocs() async throws { let response = try await couchDBClient.get( fromDB: dbName, uri: "_design/all/_view/list" ) - + let expectedBytes = response.headers .first(name: "content-length") .flatMap(Int.init) ?? 1024 * 1024 * 10 var bytes = try await response.body.collect(upTo: expectedBytes) - + guard let data = bytes.readData(length: bytes.readableBytes) else { return } - + let decoder = JSONDecoder() decoder.dateDecodingStrategy = .secondsSince1970 - + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) - + await MainActor.run { [self] in docs = decodeResponse.rows.map({ $0.value }) } @@ -45,7 +45,6 @@ class MyDoc: Identifiable, CouchDBRepresentable { } struct ContentView: View { - @State var docsStore = DocsStore() var body: some View { VStack { Image(systemName: "globe") diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift index 5e18938..c521315 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift @@ -19,25 +19,25 @@ class MyDoc: Identifiable, CouchDBRepresentable { @Observable class DocsStore { var docs = [MyDoc]() - + func getDocs() async throws { let response = try await couchDBClient.get( fromDB: dbName, uri: "_design/all/_view/list" ) - + let expectedBytes = response.headers .first(name: "content-length") .flatMap(Int.init) ?? 1024 * 1024 * 10 var bytes = try await response.body.collect(upTo: expectedBytes) - + guard let data = bytes.readData(length: bytes.readableBytes) else { return } - + let decoder = JSONDecoder() decoder.dateDecodingStrategy = .secondsSince1970 - + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) - + await MainActor.run { [self] in docs = decodeResponse.rows.map({ $0.value }) } From 6e734f40b6dd9bda9ad2884f9886f0e449381775 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 12 May 2024 22:12:02 +0300 Subject: [PATCH 069/202] updated dependencies --- Package.resolved | 14 +++++++------- Package.swift | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Package.resolved b/Package.resolved index 422111b..285a3ea 100644 --- a/Package.resolved +++ b/Package.resolved @@ -3,10 +3,10 @@ { "identity" : "async-http-client", "kind" : "remoteSourceControl", - "location" : "https://github.com/swift-server/async-http-client.git", + "location" : "https://github.com/swift-server/async-http-client", "state" : { - "revision" : "fb308ee72f3d4c082a507033f94afa7395963ef3", - "version" : "1.21.0" + "revision" : "a22083713ee90808d527d0baa290c2fb13ca3096", + "version" : "1.21.1" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "fc63f0cf4e55a4597407a9fc95b16a2bc44b4982", - "version" : "2.64.0" + "revision" : "359c461e5561d22c6334828806cc25d759ca7aa6", + "version" : "2.65.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "0904bf0feb5122b7e5c3f15db7df0eabe623dd87", - "version" : "1.30.0" + "revision" : "c6afe04165c865faaa687b42c32ed76dfcc91076", + "version" : "1.31.0" } }, { diff --git a/Package.swift b/Package.swift index e57410c..d7a5530 100644 --- a/Package.swift +++ b/Package.swift @@ -11,8 +11,8 @@ let package = Package( .library(name: "CouchDBClient", targets: ["CouchDBClient"]), ], dependencies: [ - .package(url: "https://github.com/swift-server/async-http-client", from: "1.21.0"), - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.3.0") + .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.21.0"), + .package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.3.0") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. From 253922aba87828fce9d941be4c6d3a7771d96097 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 12 May 2024 22:45:18 +0300 Subject: [PATCH 070/202] Package.resolved --- Package.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.resolved b/Package.resolved index 285a3ea..de1d77b 100644 --- a/Package.resolved +++ b/Package.resolved @@ -3,7 +3,7 @@ { "identity" : "async-http-client", "kind" : "remoteSourceControl", - "location" : "https://github.com/swift-server/async-http-client", + "location" : "https://github.com/swift-server/async-http-client.git", "state" : { "revision" : "a22083713ee90808d527d0baa290c2fb13ca3096", "version" : "1.21.1" From e160d362b29b356fa3ed037266e439185982ac2c Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:20:45 +0300 Subject: [PATCH 071/202] docs updated --- Sources/CouchDBClient/CouchDBClient.swift | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 0e2b92a..5438044 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -99,9 +99,18 @@ public class CouchDBClient { // MARK: - Initializer - /// Initialize CouchDB with connection params and credentials. + /// Initializes a new instance of a CouchDB client. /// - /// Example: + /// This initializer sets up the client with default values for connecting to a CouchDB server. It allows for optional customization of the connection parameters such as protocol, host, port, and user credentials. + /// + /// - Parameters: + /// - couchProtocol: The protocol used for connecting to the CouchDB server. Defaults to `.http`. + /// - couchHost: The hostname or IP address of the CouchDB server. Defaults to `"127.0.0.1"`. + /// - couchPort: The port number on which the CouchDB server is listening. Defaults to `5984`. + /// - userName: The username for authentication with the CouchDB server. + /// - userPassword: The password for authentication with the CouchDB server. If left empty, the initializer attempts to read the password from the `COUCHDB_PASS` environment variable. If the environment variable is also not set, it defaults to an empty string. + /// + /// Example usage: /// ```swift /// // use default params /// let myClient = CouchDBClient() From 6a7688eb35c0ad418d5e7db920020596a96fafcc Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:21:04 +0300 Subject: [PATCH 072/202] userName param is now required for CouchDB init --- Sources/CouchDBClient/CouchDBClient.swift | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5438044..a88a5a5 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -139,13 +139,8 @@ public class CouchDBClient { /// ) /// ``` /// - /// - Parameters: - /// - couchProtocol: Protocol for requests (check the ``CouchDBProtocol`` enum for available values). - /// - couchHost: Host of the CouchDB instance. - /// - couchPort: Port that CouchDB works on. - /// - userName: Username. - /// - userPassword: User password. - public init(couchProtocol: CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String = "", userPassword: String = "") { + /// - Note: It's important to ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` before attempting to connect. + public init(couchProtocol: CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String, userPassword: String = "") { self.couchProtocol = couchProtocol self.couchHost = couchHost self.couchPort = couchPort From 6065ecf49e239eda2d72ee4607eda3b6fb0b040d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:21:09 +0300 Subject: [PATCH 073/202] cleanup --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 7e04c4a..e718967 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -14,7 +14,6 @@ final class CouchDBClientTests: XCTestCase { let testsDB = "fortests" - let c1 = CouchDBClient() let couchDBClient = CouchDBClient( couchProtocol: .http, couchHost: "127.0.0.1", From 217ad06a51650d666409f87e50e00229e6e52f0d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:25:22 +0300 Subject: [PATCH 074/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index a88a5a5..777f151 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -60,11 +60,15 @@ extension CouchDBClientError: LocalizedError { /// A CouchDB client class with methods using Swift Concurrency. public class CouchDBClient { - /// Protocol (URL scheme) that should be used to perform requests to CouchDB. + /// An enumeration that defines the protocol types supported for connecting to a CouchDB server. + /// + /// - Cases: + /// - http: Represents the HTTP protocol for unencrypted network communication. + /// - https: Represents the HTTPS protocol for secure, encrypted network communication. + /// + /// - Note: Always prefer using `https` for secure communication, especially when transmitting sensitive data. public enum CouchDBProtocol: String { - /// HTTP protocol. case http - /// HTTPS protocol. case https } From be0d222b382cce97836a72b3c40127679ddfd499 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:36:21 +0300 Subject: [PATCH 075/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 777f151..6b77f19 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -158,15 +158,24 @@ public class CouchDBClient { // MARK: - Public methods - /// Get a database list. + /// Retrieves a list of all database names from the CouchDB server. /// - /// Example: - /// ```swift - /// let dbs = try await couchDBClient.getAllDBs() + /// This asynchronous function sends a GET request to the CouchDB server to fetch the names of all databases. It can optionally use a NIO's `EventLoopGroup` for the network request. + /// + /// - Parameter eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An array of `String` containing the names of all databases on the server. + /// - Throws: An error of type `CouchDBClientError` if the request fails or if there is no data returned. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request, it executes the request and processes the response. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. Finally, it decodes the response data into an array of strings representing the database names. + /// + /// Example usage: + /// ``` + /// let dbNames = try await couchDBClient.getAllDBs() /// ``` /// - /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Array of strings containing database names. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 716e5c4e881ed8dda4d5ee73010ec0c346f21113 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:42:21 +0300 Subject: [PATCH 076/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 24 ++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 6b77f19..76b4825 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -160,7 +160,7 @@ public class CouchDBClient { /// Retrieves a list of all database names from the CouchDB server. /// - /// This asynchronous function sends a GET request to the CouchDB server to fetch the names of all databases. It can optionally use a NIO's `EventLoopGroup` for the network request. + /// This asynchronous function sends a GET request to the CouchDB server to fetch the names of all databases. It can optionally use a custom NIO's `EventLoopGroup` for the network request. /// /// - Parameter eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. /// - Returns: An array of `String` containing the names of all databases on the server. @@ -214,18 +214,24 @@ public class CouchDBClient { return try JSONDecoder().decode([String].self, from: data) } - /// Check if database exists. + /// Checks if a database exists on the CouchDB server. /// - /// Example: + /// This asynchronous function sends a HEAD request to the CouchDB server to determine the existence of a specified database. It can optionally use a custom NIO's `EventLoopGroup` for the network request. /// - /// ```swift - /// let exists = try await couchDBClient.dbExists("myDBName") + /// - Parameters: + /// - dbName: The name of the database to check for existence. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A `Bool` indicating whether the database exists (`true`) or not (`false`). + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and checks the response status. + /// + /// Example usage: + /// ``` + /// let doesExist = try await couchDBClient.dbExists("myDatabase") /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: True or false. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. public func dbExists(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Bool { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 90eb7ac45364fdc4d356f960ea2ce42f96890a7c Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:47:13 +0300 Subject: [PATCH 077/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 33 +++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 76b4825..1fea6fe 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -262,17 +262,28 @@ public class CouchDBClient { return response.status == .ok } - /// Create a database. - /// - /// Example: - /// ```swift - /// try await couchDBClient.deleteDB("myDBName") - /// ``` - /// - /// - Parameters: - /// - dbName: Database name. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Creation response. + /// Creates a new database on the CouchDB server. + /// + /// This asynchronous function sends a PUT request to the CouchDB server to create a new database with the specified name. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database to be created. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An `UpdateDBResponse` object containing the result of the database creation operation. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, or a `noData` error if there is no response data. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and processes the response. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into an `UpdateDBResponse` object. + /// + /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: + /// ``` + /// let creationResult = try await couchDBClient.createDB("newDatabase") + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and potential conflicts if the database already exists. @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 25aaaf82f906caf0b0b54c72db65e686b75cc2ce Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 22:50:51 +0300 Subject: [PATCH 078/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 27 ++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 1fea6fe..c5b4a3b 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -334,17 +334,28 @@ public class CouchDBClient { } } - /// Delete a database. + /// Deletes a database from the CouchDB server. /// - /// Example: - /// ```swift - /// try await couchDBClient.deleteDB("myDBName") - /// ``` + /// This asynchronous function sends a DELETE request to the CouchDB server to remove a database with the specified name. It can optionally use a custom `EventLoopGroup` for the network request. /// /// - Parameters: - /// - dbName: Database name. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Deletion response. + /// - dbName: The name of the database to be deleted. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An `UpdateDBResponse` object containing the result of the database deletion operation. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, or a `noData` error if there is no response data. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and processes the response. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into an `UpdateDBResponse` object. + /// + /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: + /// ``` + /// let deletionResult = try await couchDBClient.deleteDB("obsoleteDatabase") + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and potential conflicts if the database does not exist. @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 50dd93364a7d627bef2a270af23bd8dc49321f49 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:03:59 +0300 Subject: [PATCH 079/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 32 ++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index c5b4a3b..bff17bb 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -406,9 +406,23 @@ public class CouchDBClient { } } - /// Get data from a database. + /// Fetches data from a specified database and URI on the CouchDB server. /// - /// Examples: + /// This asynchronous function sends a GET request to the CouchDB server to retrieve data from a specific database and URI. It can optionally use a custom `EventLoopGroup` for the network request and include query items. + /// + /// - Parameters: + /// - dbName: The name of the database from which to fetch data. + /// - uri: The URI path to the specific resource or endpoint within the database (view or document id). + /// - queryItems: An optional array of `URLQueryItem` to specify query parameters for the request. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An `HTTPClientResponse` object containing the server's response to the request. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, URI, and query items, it executes the request and processes the response. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. The response body is then updated with the collected bytes before returning. + /// + /// Example usage: /// /// Define your document data model: /// ```swift @@ -419,13 +433,12 @@ public class CouchDBClient { /// var _rev: String? /// } /// ``` - /// /// Get document by ID: /// ```swift /// // get data from DB by document ID /// var response = try await couchDBClient.get( - /// fromDB: "databaseName", - /// uri: "documentId" + /// fromDB: "myDatabase", + /// uri: "documentID" /// ) /// /// // parse JSON @@ -446,7 +459,7 @@ public class CouchDBClient { /// Get data and parse `RowsResponse`: /// ```swift /// let response = try await couchDBClient.get( - /// fromDB: "databaseName", + /// fromDB: "myDatabase", /// uri: "_design/all/_view/by_url", /// query: ["key": "\"\(url)\""] /// ) @@ -466,12 +479,7 @@ public class CouchDBClient { /// print(decodedResponse.rows.first?.value) /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - uri: URI (view or document id). - /// - query: Request query items. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 89ac47557e81deb66e75f342de767ffa30cf7253 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:10:25 +0300 Subject: [PATCH 080/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 45 ++++++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index bff17bb..53899a2 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -517,14 +517,41 @@ public class CouchDBClient { return response } - /// Get a document from a database. It will parse JSON using the provided generic type. Check an example in Discussion. /// - /// Example: + /// + /// - Parameters: + /// - dbName: Database name. + /// - uri: URI (view or document id). + /// - queryItems: Request query items. + /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Returns: An object or a struct (of generic type) parsed from JSON. + + + /// Retrieves a document of a specified type from a database on the CouchDB server. + /// + /// This asynchronous generic function sends a GET request to the CouchDB server to retrieve a document from a specific database and URI. It decodes the document into the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request, include query items, and specify a date decoding strategy. + /// + /// - Parameters: + /// - dbName: The name of the database from which to fetch the document. + /// - uri: The URI path to the specific document within the database. + /// - queryItems: An optional array of `URLQueryItem` to specify query parameters for the request. + /// - dateDecodingStrategy: The strategy to use for decoding dates. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A document of type `T`, where `T` conforms to `CouchDBRepresentable`. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or a `getError` with the underlying `CouchDBError` if the decoding fails. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, URI, and query items, it executes the request and processes the response. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. The function then uses a `JSONDecoder` with the specified date decoding strategy to decode the response data into the specified type `T`. + /// + /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws a `getError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable { + /// struct MyDocumentType: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -534,15 +561,13 @@ public class CouchDBClient { /// Get document by ID: /// ```swift /// // get data from the database by document ID - /// let doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") + /// let doc: MyDocumentType = try await couchDBClient.get( + /// fromDB: "myDatabase", + /// uri: "documentID" + /// ) /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - uri: URI (view or document id). - /// - queryItems: Request query items. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: An object or a struct (of generic type) parsed from JSON. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and data decoding. public func get (fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) From 51270141d8c74eac1ed440a604fd25f2fc453033 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:14:33 +0300 Subject: [PATCH 081/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 34 +++++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 53899a2..2bcda3c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -606,12 +606,34 @@ public class CouchDBClient { /// let selector = ["selector": ["name": "Sam"]] /// let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) /// ``` - /// - /// - Parameters: - /// - in dbName: Database name. - /// - selector: Codable representation of the JSON selector query. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Array of `[T]` documents. + + /// Performs a query to find documents in a database on the CouchDB server that match the given selector. + /// + /// This asynchronous generic function sends a query to the CouchDB server to find documents in a specific database that match the criteria defined by the selector. It decodes the resulting documents into an array of the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request and specify a date decoding strategy. + /// + /// - Parameters: + /// - dbName: The name of the database in which to perform the query. + /// - selector: A `Codable` object that defines the criteria used to select documents. + /// - dateDecodingStrategy: The strategy to use for decoding dates within the documents. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An array of documents of type `T`, where `T` conforms to `CouchDBRepresentable`. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically a `noData` error if there is no response data, or a `findError` with the underlying `CouchDBError` if the decoding fails. + /// + /// The function encodes the selector into JSON and sends it as the body of the request. It then processes the response from the server, collecting the response body up to a specified byte limit or the `content-length` header's value. The function uses a `JSONDecoder` with the specified date decoding strategy to decode the response data into a `CouchDBFindResponse` object, from which it extracts and returns the documents. + /// + /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws a `findError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: + /// ```swift + /// // find documents in the database by selector + /// let selector = ["selector": ["name": "Sam"]] + /// let documents: [MyDocumentType] = try await couchDBClient.find( + /// inDB: "myDatabase", + /// selector: selector + /// ) + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with data decoding and query criteria. public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) From 2d05724451517976c289346a68d401bb68045f87 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:18:06 +0300 Subject: [PATCH 082/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 36 ++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 2bcda3c..8da2e4d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -666,23 +666,39 @@ public class CouchDBClient { throw parsingError } } - - /// Find data in a database by selector. + + /// Executes a find query on a specified database on the CouchDB server. + /// + /// This asynchronous function sends a POST request with a custom body to the CouchDB server's `_find` endpoint to execute a query in the specified database. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database in which to perform the find query. + /// - body: The `HTTPClientRequest.Body` containing the encoded query to be sent to the server. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: An `HTTPClientResponse` object containing the server's response to the find query. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the `_find` endpoint, it sets the request body and executes the request. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. The response body is then updated with the collected bytes before returning. /// - /// Example: + /// Example usage: /// ```swift /// let selector = ["selector": ["name": "Greg"]] /// let bodyData = try JSONEncoder().encode(selector) - /// var findResponse = try await couchDBClient.find(inDB: testsDB, body: .data(bodyData)) + /// var findResponse = try await couchDBClient.find( + /// inDB: testsDB, + /// body: .data(bodyData) + /// ) /// /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! - /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs + /// let docs = try JSONDecoder().decode( + /// CouchDBFindResponse.self, + /// from: Data(bytes) + /// ).docs /// ``` - /// - Parameters: - /// - dbName: Database name. - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Response. + /// + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From a2b3104c68487e5e1e0db68b9d7abb094d5c63f9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:22:46 +0300 Subject: [PATCH 083/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 35 ++++++++++++++++------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 8da2e4d..4be21e6 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -737,9 +737,25 @@ public class CouchDBClient { return response } - /// Update data in a database. + /// Updates a document in a specified database on the CouchDB server. /// - /// Examples: + /// This asynchronous function sends a PUT request to the CouchDB server to update a document at the specified URI within the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database containing the document to be updated. + /// - uri: The URI path to the specific document within the database. + /// - body: The `HTTPClientRequest.Body` containing the updated content for the document. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A `CouchUpdateResponse` object containing the result of the update operation. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or an `updateError` with the underlying `CouchDBError` if the decoding fails. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the document, it sets the request body and executes the request. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. + /// + /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws an `updateError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: /// /// Define your document model: /// ```swift @@ -753,7 +769,10 @@ public class CouchDBClient { /// Get document by ID and update it: /// ```swift /// // get data from the database by document ID - /// var response = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") + /// var response = try await couchDBClient.get( + /// fromDB: "myDatabase", + /// uri: "documentID" + /// ) /// /// // parse JSON /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! @@ -767,7 +786,7 @@ public class CouchDBClient { /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: data)) /// /// let response = try await couchDBClient.update( - /// dbName: testsDB, + /// dbName: "myDatabase", /// uri: doc._id!, /// body: body /// ) @@ -775,13 +794,7 @@ public class CouchDBClient { /// print(response) /// ``` /// - /// - /// - Parameters: - /// - dbName: Database name. - /// - uri: URI (view or document id). - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Update response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document updates. public func update(dbName: String, uri: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 267a1518a22cd4bbaddd8a647c42847b1b6848d9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:28:45 +0300 Subject: [PATCH 084/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 4be21e6..2ad879a 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -845,14 +845,26 @@ public class CouchDBClient { } } - /// Update document in a database. That method will mutate `doc` to update its `_rev` with the value from CouchDB response. + /// Updates a document conforming to `CouchDBRepresentable` in a specified database on the CouchDB server. /// - /// Examples: + /// This asynchronous generic function updates a document in the specified database. The document must conform to the `CouchDBRepresentable` protocol, which requires `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request and specify a date encoding strategy. + /// + /// - Parameters: + /// - dbName: The name of the database containing the document to be updated. + /// - doc: A reference to the document of type `T` that will be updated. The document must have valid `_id` and `_rev` properties. + /// - dateEncodingStrategy: The strategy to use for encoding dates within the document. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Throws: An error of type `CouchDBClientError` if the document's `_id` or `_rev` is missing, or if the server responds with an unknown response. + /// + /// The function first checks for the presence of the document's `_id` and `_rev`. It then encodes the document using a `JSONEncoder` with the specified date encoding strategy. The encoded document is sent as the body of a PUT request to the server. /// + /// If the server's response indicates success, the function updates the document's `_rev` (and `_id` if necessary) with the new revision information from the server. If the server's response is not successful, it throws an `unknownResponse` error. + /// + /// Example usage: /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable { + /// struct MyCouchDBDocument: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -861,25 +873,24 @@ public class CouchDBClient { /// Get a document by ID and update it: /// ```swift /// // get data from the database by document ID - /// var doc: ExpectedDoc = try await couchDBClient.get(fromDB: "databaseName", uri: "documentId") + /// var doc: MyCouchDBDocument = try await couchDBClient.get( + /// fromDB: "myDatabase", + /// uri: "documentID" + /// ) /// print(doc) /// /// // Update value /// doc.name = "Updated name" /// /// try await couchDBClient.update( - /// dbName: testsDB, + /// dbName: "myDatabase", /// doc: &doc /// ) /// /// print(doc) // doc will have updated name and _rev values now /// ``` /// - /// - Parameters: - /// - dbName: Database name. That method will mutate `doc` to update its `_id` and `_rev` properties from insert request. - /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Update response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document updates and server responses. public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { guard let id = doc._id else { throw CouchDBClientError.idMissing } guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } From f07ce312f1afd040b9afe0fc3599f63cac63aea1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:33:58 +0300 Subject: [PATCH 085/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 31 +++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 2ad879a..2172581 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -916,14 +916,29 @@ public class CouchDBClient { doc._id = updateResponse.id } - /// Insert data in a database. Accepts `HTTPClientRequest.Body` as body parameter. + /// Inserts a new document into a specified database on the CouchDB server. /// - /// Examples: + /// This asynchronous function sends a POST request to the CouchDB server to insert a new document into the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database into which the new document will be inserted. + /// - body: The `HTTPClientRequest.Body` containing the content of the new document. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A `CouchUpdateResponse` object containing the result of the insert operation. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or an `insertError` with the underlying `CouchDBError` if the decoding fails. + /// + /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the database, it sets the request body and executes the request. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. + /// + /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. + /// + /// Example usage: /// /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable { + /// struct MyCouchDBDocument: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -932,24 +947,20 @@ public class CouchDBClient { /// /// Create a new document and insert: /// ```swift - /// let testDoc = ExpectedDoc(name: "My name") + /// let testDoc = MyCouchDBDocument(name: "My name") /// let data = try JSONEncoder().encode(testData) /// /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: insertEncodeData)) /// /// let response = try await couchDBClient.insert( - /// dbName: "databaseName", + /// dbName: "myDatabase", /// body: body /// ) /// /// print(response) /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Insertion response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document insertion. public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 1abd1ff678b05e89f36efe6e66abc9636203b5bd Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:37:45 +0300 Subject: [PATCH 086/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 27 +++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 2172581..5a3a517 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1012,14 +1012,26 @@ public class CouchDBClient { } } - /// Insert document in a database. That method will mutate `doc` to update its `_id` and `_rev` with the values from CouchDB response. + /// Inserts a new document conforming to `CouchDBRepresentable` into a specified database on the CouchDB server. /// - /// Examples: + /// This asynchronous generic function inserts a new document into the specified database. The document must conform to the `CouchDBRepresentable` protocol, which includes `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request and specify a date encoding strategy. + /// + /// - Parameters: + /// - dbName: The name of the database into which the new document will be inserted. + /// - doc: A reference to the document of type `T` that will be inserted. The document type `T` must conform to `CouchDBRepresentable`. + /// - dateEncodingStrategy: The strategy to use for encoding dates within the document. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Throws: An error of type `CouchDBClientError` if the server responds with an unknown response. + /// + /// The function encodes the document using a `JSONEncoder` with the specified date encoding strategy. The encoded document is sent as the body of a POST request to the server. + /// + /// If the server's response indicates success, the function updates the document's `_rev` (and `_id` if necessary) with the new revision information from the server. If the server's response is not successful, it throws an `unknownResponse` error. /// + /// Example usage: /// Define your document model: /// ```swift /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable { + /// struct MyCouchDBDocument: CouchDBRepresentable { /// var name: String /// var _id: String? /// var _rev: String? @@ -1028,20 +1040,17 @@ public class CouchDBClient { /// /// Create a new document and insert: /// ```swift - /// var testDoc = ExpectedDoc(name: "My name") + /// var testDoc = MyCouchDBDocument(name: "My name") /// /// try await couchDBClient.insert( - /// dbName: "databaseName", + /// dbName: "myDatabase", /// doc: &testDoc /// ) /// /// print(testDoc) // testDoc has _id and _rev values now /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document insertion and server responses. public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy From 7de12c62f9596f8032b01e46e56b4b1e6487d02b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:40:30 +0300 Subject: [PATCH 087/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 32 ++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5a3a517..f67389c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1072,20 +1072,34 @@ public class CouchDBClient { doc._id = insertResponse.id } - /// Delete a document from a database by URI. + /// Deletes a document from a specified database on the CouchDB server. /// - /// Examples: + /// This asynchronous function sends a DELETE request to the CouchDB server to remove a document identified by its URI and revision number from the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database from which the document will be deleted. + /// - uri: The URI path to the specific document within the database. + /// - rev: The revision number of the document to be deleted. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A `CouchUpdateResponse` object containing the result of the delete operation. + /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. + /// + /// The function creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, document URI, and revision query parameter, it executes the DELETE request. + /// + /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. + /// + /// If there is no response data, the function returns a `CouchUpdateResponse` with `ok` set to `false`, indicating the delete operation was not successful. /// + /// Example usage: /// ```swift - /// let response = try await couchDBClient.delete(fromDb: "databaseName", uri: doc._id, rev: doc._rev) + /// let response = try await couchDBClient.delete( + /// fromDb: "myDatabase", + /// uri: doc._id, + /// rev: doc._rev + /// ) /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - uri: document uri (usually _id). - /// - rev: document revision. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Delete request response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document deletion. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { let httpClient: HTTPClient if let eventLoopGroup = eventLoopGroup { From 5060dbf662255f619a5e4877d05ff8ae6d01ae19 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:50:22 +0300 Subject: [PATCH 088/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 53 +++++++++-------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index f67389c..a506317 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -171,7 +171,7 @@ public class CouchDBClient { /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. Finally, it decodes the response data into an array of strings representing the database names. /// /// Example usage: - /// ``` + /// ```swift /// let dbNames = try await couchDBClient.getAllDBs() /// ``` /// @@ -227,7 +227,7 @@ public class CouchDBClient { /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and checks the response status. /// /// Example usage: - /// ``` + /// ```swift /// let doesExist = try await couchDBClient.dbExists("myDatabase") /// ``` /// @@ -279,7 +279,7 @@ public class CouchDBClient { /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. /// /// Example usage: - /// ``` + /// ```swift /// let creationResult = try await couchDBClient.createDB("newDatabase") /// ``` /// @@ -351,7 +351,7 @@ public class CouchDBClient { /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. /// /// Example usage: - /// ``` + /// ```swift /// let deletionResult = try await couchDBClient.deleteDB("obsoleteDatabase") /// ``` /// @@ -517,16 +517,6 @@ public class CouchDBClient { return response } - /// - /// - /// - Parameters: - /// - dbName: Database name. - /// - uri: URI (view or document id). - /// - queryItems: Request query items. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: An object or a struct (of generic type) parsed from JSON. - - /// Retrieves a document of a specified type from a database on the CouchDB server. /// /// This asynchronous generic function sends a GET request to the CouchDB server to retrieve a document from a specific database and URI. It decodes the document into the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request, include query items, and specify a date decoding strategy. @@ -597,16 +587,6 @@ public class CouchDBClient { } } - /// Find data in a database by selector. - /// - /// Example: - /// - /// ```swift - /// // find documents in the database by selector - /// let selector = ["selector": ["name": "Sam"]] - /// let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) - /// ``` - /// Performs a query to find documents in a database on the CouchDB server that match the given selector. /// /// This asynchronous generic function sends a query to the CouchDB server to find documents in a specific database that match the criteria defined by the selector. It decodes the resulting documents into an array of the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request and specify a date decoding strategy. @@ -1139,19 +1119,28 @@ public class CouchDBClient { return try JSONDecoder().decode(CouchUpdateResponse.self, from: data) } - /// Delete a document from a database. + /// Deletes a document conforming to `CouchDBRepresentable` from a specified database on the CouchDB server. + /// + /// This asynchronous function deletes a document from the specified database. The document must conform to the `CouchDBRepresentable` protocol, which includes `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request. + /// + /// - Parameters: + /// - dbName: The name of the database from which the document will be deleted. + /// - doc: The document that will be deleted. The document type must conform to `CouchDBRepresentable`. + /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - Returns: A `CouchUpdateResponse` object containing the result of the delete operation. + /// - Throws: An error of type `CouchDBClientError` if the document's `_id` or `_rev` is missing. /// - /// Examples: + /// The function checks for the presence of the document's `_id` and `_rev`. It then calls the `delete(fromDb:uri:rev:eventLoopGroup:)` function with the document's `_id` and `_rev` to perform the deletion. /// + /// Example usage: /// ```swift - /// let response = try await couchDBClient.delete(fromDb: "databaseName", doc: doc) + /// let deleteResult = try await couchDBClient.delete( + /// fromDb: "myDatabase", + /// doc: myDocument + /// ) /// ``` /// - /// - Parameters: - /// - dbName: Database name. - /// - doc: Document object/struct. Should conform to the ``CouchDBRepresentable`` protocol. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Delete request response. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document deletion. public func delete(fromDb dbName: String, doc: CouchDBRepresentable, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { guard let id = doc._id else { throw CouchDBClientError.idMissing } guard let rev = doc._rev else { throw CouchDBClientError.revMissing } From fbe962046e2c2c3f6f656146b1858651322408e1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 14 May 2024 23:58:54 +0300 Subject: [PATCH 089/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index a506317..b57658d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -105,7 +105,7 @@ public class CouchDBClient { /// Initializes a new instance of a CouchDB client. /// - /// This initializer sets up the client with default values for connecting to a CouchDB server. It allows for optional customization of the connection parameters such as protocol, host, port, and user credentials. + /// This initializer sets up the client with default values for connecting to a CouchDB server. It allows for optional customization of the connection parameters such as protocol, host and port. /// /// - Parameters: /// - couchProtocol: The protocol used for connecting to the CouchDB server. Defaults to `.http`. From cdbc2a254f26d20fb2b2968dbed2d461d027d0f0 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 12 Jun 2024 13:32:04 +0300 Subject: [PATCH 090/202] dependencices updated --- Package.resolved | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Package.resolved b/Package.resolved index de1d77b..7197d81 100644 --- a/Package.resolved +++ b/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", - "version" : "1.1.0" + "revision" : "ee97538f5b81ae89698fd95938896dec5217b148", + "version" : "1.1.1" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types", "state" : { - "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", - "version" : "1.0.3" + "revision" : "9bee2fdb79cc740081abd8ebd80738063d632286", + "version" : "1.1.0" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "359c461e5561d22c6334828806cc25d759ca7aa6", - "version" : "2.65.0" + "revision" : "9428f62793696d9a0cc1f26a63f63bb31da0516d", + "version" : "2.66.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "c6afe04165c865faaa687b42c32ed76dfcc91076", - "version" : "1.31.0" + "revision" : "8d8eb609929aee75336a0a3d2417280786265868", + "version" : "1.32.0" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", - "version" : "2.26.0" + "revision" : "2b09805797f21c380f7dc9bedaab3157c5508efb", + "version" : "2.27.0" } }, { @@ -113,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "6cbe0ed2b394f21ab0d46b9f0c50c6be964968ce", - "version" : "1.20.1" + "revision" : "38ac8221dd20674682148d6451367f89c2652980", + "version" : "1.21.0" } }, { @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", - "version" : "1.2.1" + "revision" : "f9266c85189c2751589a50ea5aec72799797e471", + "version" : "1.3.0" } } ], From 3eb4598f280d8ecc3de0ff55b3161dd8a11dd192 Mon Sep 17 00:00:00 2001 From: Sergei Armodin Date: Thu, 19 Sep 2024 14:47:47 +0300 Subject: [PATCH 091/202] updated swift-docc-plugin URL. Updated dependencies to latest versions. --- Package.resolved | 44 ++++++++++++++++++++++---------------------- Package.swift | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Package.resolved b/Package.resolved index 7197d81..a5db573 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "a22083713ee90808d527d0baa290c2fb13ca3096", - "version" : "1.21.1" + "revision" : "6df8e1c17e68f0f93de2443b8c8cafca9ddcc89a", + "version" : "1.22.2" } }, { @@ -32,23 +32,23 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "ee97538f5b81ae89698fd95938896dec5217b148", - "version" : "1.1.1" + "revision" : "9bf03ff58ce34478e66aaee630e491823326fd06", + "version" : "1.1.3" } }, { "identity" : "swift-docc-plugin", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-plugin", + "location" : "https://github.com/swiftlang/swift-docc-plugin.git", "state" : { - "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", - "version" : "1.3.0" + "revision" : "85e4bb4e1cd62cec64a4b8e769dcefdf0c5b9d64", + "version" : "1.4.3" } }, { "identity" : "swift-docc-symbolkit", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-symbolkit", + "location" : "https://github.com/swiftlang/swift-docc-symbolkit", "state" : { "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", "version" : "1.0.0" @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types", "state" : { - "revision" : "9bee2fdb79cc740081abd8ebd80738063d632286", - "version" : "1.1.0" + "revision" : "ae67c8178eb46944fd85e4dc6dd970e1f3ed6ccd", + "version" : "1.3.0" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", - "version" : "1.5.4" + "revision" : "9cb486020ebf03bfa5b5df985387a14a98744537", + "version" : "1.6.1" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "9428f62793696d9a0cc1f26a63f63bb31da0516d", - "version" : "2.66.0" + "revision" : "9746cf80e29edfef2a39924a66731249223f42a3", + "version" : "2.72.0" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63", - "version" : "1.22.0" + "revision" : "d1ead62745cc3269e482f1c51f27608057174379", + "version" : "1.24.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "8d8eb609929aee75336a0a3d2417280786265868", - "version" : "1.32.0" + "revision" : "b5f7062b60e4add1e8c343ba4eb8da2e324b3a94", + "version" : "1.34.0" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "2b09805797f21c380f7dc9bedaab3157c5508efb", - "version" : "2.27.0" + "revision" : "7b84abbdcef69cc3be6573ac12440220789dcd69", + "version" : "2.27.2" } }, { @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "f9266c85189c2751589a50ea5aec72799797e471", - "version" : "1.3.0" + "revision" : "d2ba781702a1d8285419c15ee62fd734a9437ff5", + "version" : "1.3.2" } } ], diff --git a/Package.swift b/Package.swift index d7a5530..57c69c9 100644 --- a/Package.swift +++ b/Package.swift @@ -12,7 +12,7 @@ let package = Package( ], dependencies: [ .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.21.0"), - .package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.3.0") + .package(url: "https://github.com/swiftlang/swift-docc-plugin.git", from: "1.3.0") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. From 90e52fc4455cc179d583947b43743d5607488aa6 Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 19 Sep 2024 22:51:02 +0300 Subject: [PATCH 092/202] Update build-ubuntu.yml --- .github/workflows/build-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index 5eeb04c..87eb71b 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{matrix.swift}} strategy: matrix: - swift: ["5.10", "5.9", "5.8"] + swift: ["6.0", "5.10", "5.9", "5.8"] runs-on: ubuntu-latest container: image: swift:${{matrix.swift}} From dba42f9c68db2160e5a60dfe63731d5cc00c0e7e Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:41:41 +0700 Subject: [PATCH 093/202] dependencies updated --- Package.resolved | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Package.resolved b/Package.resolved index a5db573..750691a 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "6df8e1c17e68f0f93de2443b8c8cafca9ddcc89a", - "version" : "1.22.2" + "revision" : "0a9b72369b9d87ab155ef585ef50700a34abf070", + "version" : "1.23.1" } }, { @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "9bf03ff58ce34478e66aaee630e491823326fd06", - "version" : "1.1.3" + "revision" : "671108c96644956dddcd89dd59c203dcdb36cec7", + "version" : "1.1.4" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types", "state" : { - "revision" : "ae67c8178eb46944fd85e4dc6dd970e1f3ed6ccd", - "version" : "1.3.0" + "revision" : "ef18d829e8b92d731ad27bb81583edd2094d1ce3", + "version" : "1.3.1" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "9746cf80e29edfef2a39924a66731249223f42a3", - "version" : "2.72.0" + "revision" : "914081701062b11e3bb9e21accc379822621995e", + "version" : "2.76.1" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "d1ead62745cc3269e482f1c51f27608057174379", - "version" : "1.24.0" + "revision" : "2e9746cfc57554f70b650b021b6ae4738abef3e6", + "version" : "1.24.1" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "b5f7062b60e4add1e8c343ba4eb8da2e324b3a94", - "version" : "1.34.0" + "revision" : "eaa71bb6ae082eee5a07407b1ad0cbd8f48f9dca", + "version" : "1.34.1" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "7b84abbdcef69cc3be6573ac12440220789dcd69", - "version" : "2.27.2" + "revision" : "c7e95421334b1068490b5d41314a50e70bab23d1", + "version" : "2.29.0" } }, { @@ -113,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "38ac8221dd20674682148d6451367f89c2652980", - "version" : "1.21.0" + "revision" : "bbd5e63cf949b7db0c9edaf7a21e141c52afe214", + "version" : "1.23.0" } }, { @@ -131,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "d2ba781702a1d8285419c15ee62fd734a9437ff5", - "version" : "1.3.2" + "revision" : "c8a44d836fe7913603e246acab7c528c2e780168", + "version" : "1.4.0" } } ], From 786ed75ec20778e5083f59ee82f78bf19b717604 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:47:11 +0700 Subject: [PATCH 094/202] deleted deprecated methods --- .../CouchDBClient/CouchDB+Deprecated.swift | 168 ------------------ 1 file changed, 168 deletions(-) delete mode 100644 Sources/CouchDBClient/CouchDB+Deprecated.swift diff --git a/Sources/CouchDBClient/CouchDB+Deprecated.swift b/Sources/CouchDBClient/CouchDB+Deprecated.swift deleted file mode 100644 index fb253f3..0000000 --- a/Sources/CouchDBClient/CouchDB+Deprecated.swift +++ /dev/null @@ -1,168 +0,0 @@ -// -// CouchDB+Deprecated.swift -// -// -// Created by Sergei Armodin on 02.04.2024. -// - -import Foundation -import AsyncHTTPClient -import NIO -import NIOHTTP1 - -extension CouchDBClient { - /// Get data from DB. - /// - /// Examples: - /// - /// Define your document model: - /// ```swift - /// // Example struct - /// struct ExpectedDoc: CouchDBRepresentable, Codable { - /// var name: String - /// var _id: String? - /// var _rev: String? - /// } - /// ``` - /// - /// Get document by ID: - /// ```swift - /// // get data from DB by document ID - /// var response = try await couchDBClient.get(dbName: "databaseName", uri: "documentId") - /// - /// // parse JSON - /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let doc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) - /// ``` - /// - /// You can also provide CouchDB view document as uri and key in query. - /// - /// Get data and parse `RowsResponse`: - /// ```swift - /// let response = try await couchDBClient.get( - /// dbName: "databaseName", - /// uri: "_design/all/_view/by_url", - /// query: ["key": "\"\(url)\""] - /// ) - /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// let decodedResponse = try JSONDecoder().decode(RowsResponse.self, from: data) - /// print(decodedResponse.rows) - /// print(decodedResponse.rows.first?.value) - /// ``` - /// - /// - Parameters: - /// - dbName: DB name. - /// - uri: URI (view or document id). - /// - query: Request query items. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. - @available(*, deprecated, message: "Use the new `get(fromDB:uri:queryItems:eventLoopGroup)` method.") - public func get(dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { - try await authIfNeed(eventLoopGroup: eventLoopGroup) - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } - - defer { - if eventLoopGroup != nil { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } - } - } - - let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) - let request = try buildRequestOld(fromUrl: url, withMethod: .GET) - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } - - return response - } - - /// Find data in DB by selector. - /// - /// Example: - /// ```swift - /// let selector = ["selector": ["name": "Greg"]] - /// let bodyData = try JSONEncoder().encode(selector) - /// var findResponse = try await couchDBClient.find(in: testsDB, body: .data(bodyData)) - /// - /// let bytes = findResponse.body!.readBytes(length: findResponse.body!.readableBytes)! - /// let docs = try JSONDecoder().decode(CouchDBFindResponse.self, from: Data(bytes)).docs - /// ``` - /// - Parameters: - /// - dbName: DB name. - /// - body: Request body data. - /// - eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. - /// - Returns: Request response. - @available(*, deprecated, message: "Use the new 'find(inDB:body:eventLoopGroup)' method.") - public func find(in dbName: String, body: HTTPClient.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClient.Response { - try await authIfNeed(eventLoopGroup: eventLoopGroup) - - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } - - defer { - if eventLoopGroup != nil { - DispatchQueue.main.async { - try? httpClient.syncShutdown() - } - } - } - - let url = buildUrl(path: "/" + dbName + "/_find", query: []) - var request = try buildRequestOld(fromUrl: url, withMethod: .POST) - request.body = body - let response = try await httpClient - .execute(request: request, deadline: .now() + .seconds(requestsTimeout)) - .get() - - if response.status == .unauthorized { - throw CouchDBClientError.unauthorized - } - - return response - } - - /// Build HTTP request from url string. - /// - Parameters: - /// - url: URL string. - /// - method: HTTP method. - /// - Returns: HTTP Request. - private func buildRequestOld(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClient.Request { - var headers = HTTPHeaders() - headers.add(name: "Content-Type", value: "application/json") - if let cookie = sessionCookie { - headers.add(name: "Cookie", value: cookie) - } - return try HTTPClient.Request( - url: url, - method: method, - headers: headers, - body: nil - ) - } - - @available(*, deprecated, renamed: "get", message: "Renamed to: get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup)") - public func get (dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { - return try await get(fromDB: dbName, uri: uri, queryItems: queryItems, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) - } - - @available(*, deprecated, renamed: "find", message: "Renamed to: find(inDB:selector:dateDecodingStrategy:eventLoopGroup)") - public func find(in dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { - return try await find(inDB: dbName, selector: selector, dateDecodingStrategy: dateDecodingStrategy, eventLoopGroup: eventLoopGroup) - } -} From cc6b8303e6ba25da93c51d5fb34e0e3f701725a0 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:49:20 +0700 Subject: [PATCH 095/202] Sendable conformance --- Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 2 +- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 2 +- Sources/CouchDBClient/Models/CreateSessionResponse.swift | 8 ++++---- Sources/CouchDBClient/Models/RowsResponse.swift | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index dc5b045..bd5e6cf 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -7,7 +7,7 @@ import Foundation -public struct CouchDBFindResponse: Codable { +public struct CouchDBFindResponse: Codable, Sendable { var docs: [T] var bookmark: String? } diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 74409ee..3cbf7b7 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -18,7 +18,7 @@ import Foundation /// var _rev: String? /// } /// ``` -public protocol CouchDBRepresentable: Codable { +public protocol CouchDBRepresentable: Codable, Sendable { /// Document ID. var _id: String? { get set } /// Revision MVCC token. diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index 19134e4..a18bc85 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -8,10 +8,10 @@ import Foundation /// Resonse model for create session request -struct CreateSessionResponse: Codable { - var ok: Bool - var name: String? - var roles: [String]? +struct CreateSessionResponse: Codable, Sendable { + let ok: Bool + let name: String? + let roles: [String]? enum CodingKeys: String, CodingKey { case ok diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index 328609b..0e37742 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -8,8 +8,8 @@ import Foundation /// Rows response model. -public struct RowsResponse: Codable { - public struct Row: Codable { +public struct RowsResponse: Codable, Sendable { + public struct Row: Codable, Sendable { /// A CouchDB document. public let value: T } From 337a5623b0aa8705d2e3418ac53d4a3c1960cb10 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:52:07 +0700 Subject: [PATCH 096/202] swift-format added --- .swift-format | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .swift-format diff --git a/.swift-format b/.swift-format new file mode 100644 index 0000000..3912518 --- /dev/null +++ b/.swift-format @@ -0,0 +1,70 @@ +{ + "fileScopedDeclarationPrivacy" : { + "accessLevel" : "private" + }, + "indentConditionalCompilationBlocks" : false, + "indentSwitchCaseLabels" : false, + "indentation" : { + "tabs" : 1 + }, + "lineBreakAroundMultilineExpressionChainComponents" : false, + "lineBreakBeforeControlFlowKeywords" : false, + "lineBreakBeforeEachArgument" : false, + "lineBreakBeforeEachGenericRequirement" : false, + "lineLength" : 500, + "maximumBlankLines" : 1, + "multiElementCollectionTrailingCommas" : false, + "noAssignmentInExpressions" : { + "allowedFunctions" : [ + "XCTAssertNoThrow" + ] + }, + "prioritizeKeepingFunctionOutputTogether" : false, + "respectsExistingLineBreaks" : true, + "rules" : { + "AllPublicDeclarationsHaveDocumentation" : false, + "AlwaysUseLiteralForEmptyCollectionInit" : false, + "AlwaysUseLowerCamelCase" : false, + "AmbiguousTrailingClosureOverload" : true, + "BeginDocumentationCommentWithOneLineSummary" : false, + "DoNotUseSemicolons" : true, + "DontRepeatTypeInStaticProperties" : true, + "FileScopedDeclarationPrivacy" : false, + "FullyIndirectEnum" : true, + "GroupNumericLiterals" : false, + "IdentifiersMustBeASCII" : true, + "NeverForceUnwrap" : false, + "NeverUseForceTry" : false, + "NeverUseImplicitlyUnwrappedOptionals" : false, + "NoAccessLevelOnExtensionDeclaration" : false, + "NoAssignmentInExpressions" : true, + "NoBlockComments" : false, + "NoCasesWithOnlyFallthrough" : true, + "NoEmptyTrailingClosureParentheses" : false, + "NoLabelsInCasePatterns" : true, + "NoLeadingUnderscores" : false, + "NoParensAroundConditions" : false, + "NoPlaygroundLiterals" : true, + "NoVoidReturnOnFunctionSignature" : true, + "OmitExplicitReturns" : false, + "OneCasePerLine" : false, + "OneVariableDeclarationPerLine" : false, + "OnlyOneTrailingClosureArgument" : true, + "OrderedImports" : false, + "ReplaceForEachWithForLoop" : false, + "ReturnVoidInsteadOfEmptyTuple" : true, + "TypeNamesShouldBeCapitalized" : false, + "UseEarlyExits" : false, + "UseExplicitNilCheckInConditions" : true, + "UseLetInEveryBoundCaseVariable" : false, + "UseShorthandTypeNames" : true, + "UseSingleLinePropertyGetter" : true, + "UseSynthesizedInitializer" : true, + "UseTripleSlashForDocumentationComments" : false, + "UseWhereClausesInForLoops" : false, + "ValidateDocumentationComments" : false + }, + "spacesAroundRangeFormationOperators" : false, + "tabWidth" : 8, + "version" : 1 +} From ce45dd15e490cfe57f8ca80e5e200932b942a6da Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:52:55 +0700 Subject: [PATCH 097/202] formatting --- Sources/CouchDBClient/Models/CouchDBError.swift | 2 +- Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 6 +++--- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 2 +- Sources/CouchDBClient/Models/CouchUpdateResponse.swift | 1 - Sources/CouchDBClient/Models/CreateSessionResponse.swift | 9 ++++----- Sources/CouchDBClient/Models/RowsResponse.swift | 4 ++-- Sources/CouchDBClient/Models/UpdateDBResponse.swift | 6 +++--- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBError.swift b/Sources/CouchDBClient/Models/CouchDBError.swift index a232438..657e2fe 100644 --- a/Sources/CouchDBClient/Models/CouchDBError.swift +++ b/Sources/CouchDBClient/Models/CouchDBError.swift @@ -1,6 +1,6 @@ // // CouchDBError.swift -// +// // // Created by Sergey Armodin on 01.09.2022. // diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index bd5e6cf..e2a374e 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -1,6 +1,6 @@ // // CouchDBFindResponse.swift -// +// // // Created by Gregorio Gevartosky Torrezan on 2023-11-15. // @@ -8,6 +8,6 @@ import Foundation public struct CouchDBFindResponse: Codable, Sendable { - var docs: [T] - var bookmark: String? + var docs: [T] + var bookmark: String? } diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 3cbf7b7..1a8f709 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -1,6 +1,6 @@ // // CouchDBRepresentable.swift -// +// // // Created by Sergey Armodin on 30.08.2022. // diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index 8d6d7c8..e1471ce 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -7,7 +7,6 @@ import Foundation - /// Model for insert/update/delete request response. public struct CouchUpdateResponse: Codable { /// Operation status. diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index a18bc85..f4ae9e1 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -1,6 +1,6 @@ // // CreateSessionResponse.swift -// +// // // Created by Sergey Armodin on 15.05.2020. // @@ -12,7 +12,7 @@ struct CreateSessionResponse: Codable, Sendable { let ok: Bool let name: String? let roles: [String]? - + enum CodingKeys: String, CodingKey { case ok case name @@ -23,12 +23,11 @@ struct CreateSessionResponse: Codable, Sendable { extension CreateSessionResponse { init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - + let ok = try container.decodeIfPresent(Bool.self, forKey: .ok) ?? false let name = try container.decodeIfPresent(String.self, forKey: .name) let roles = try container.decodeIfPresent([String].self, forKey: .roles) - + self.init(ok: ok, name: name, roles: roles) } } - diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index 0e37742..eb9755d 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -1,6 +1,6 @@ // // RowsResponse.swift -// +// // // Created by Sergei Armodin on 07.04.2024. // @@ -13,7 +13,7 @@ public struct RowsResponse: Codable, Sendable { /// A CouchDB document. public let value: T } - + /// Total documents in a response. public let total_rows: Int /// Results offset. diff --git a/Sources/CouchDBClient/Models/UpdateDBResponse.swift b/Sources/CouchDBClient/Models/UpdateDBResponse.swift index 955e140..8d7e8e0 100644 --- a/Sources/CouchDBClient/Models/UpdateDBResponse.swift +++ b/Sources/CouchDBClient/Models/UpdateDBResponse.swift @@ -1,6 +1,6 @@ // // UpdateDBResponse.swift -// +// // // Created by Sergei Armodin on 26.12.2022. // @@ -9,6 +9,6 @@ import Foundation /// DB creation response. public struct UpdateDBResponse: Codable { - /// Operation status. - public let ok: Bool + /// Operation status. + public let ok: Bool } From 08186d595db99b04d7329db5c95492779fd41556 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 19:56:05 +0700 Subject: [PATCH 098/202] formatting --- Sources/CouchDBClient/CouchDBClient.swift | 71 ++++++++++------- .../CouchDBClientTests.swift | 78 +++++++++---------- 2 files changed, 80 insertions(+), 69 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index b57658d..7567fc2 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -71,15 +71,15 @@ public class CouchDBClient { case http case https } - + // MARK: - Public properties - + /// Flag if authorized in CouchDB. public var isAuthorized: Bool { authData?.ok ?? false } /// You can set a timeout for requests in seconds. Default value is 30. public var requestsTimeout: Int64 = 30 - + // MARK: - Private properties /// Requests protocol. private var couchProtocol: CouchDBProtocol = .http @@ -100,7 +100,6 @@ public class CouchDBClient { /// Authorization response from CouchDB. private var authData: CreateSessionResponse? - // MARK: - Initializer /// Initializes a new instance of a CouchDB client. @@ -150,12 +149,12 @@ public class CouchDBClient { self.couchPort = couchPort self.userName = userName - self.userPassword = userPassword.isEmpty - ? ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? userPassword - : userPassword + self.userPassword = + userPassword.isEmpty + ? ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? userPassword + : userPassword } - - + // MARK: - Public methods /// Retrieves a list of all database names from the CouchDB server. @@ -197,7 +196,8 @@ public class CouchDBClient { let url = buildUrl(path: "/_all_dbs") let request = try buildRequest(fromUrl: url, withMethod: .GET) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -252,7 +252,8 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName) let request = try buildRequest(fromUrl: url, withMethod: .HEAD) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -284,7 +285,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and potential conflicts if the database already exists. - @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { + @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -306,7 +307,8 @@ public class CouchDBClient { let request = try self.buildRequest(fromUrl: url, withMethod: .PUT) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -378,7 +380,8 @@ public class CouchDBClient { let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -500,7 +503,8 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/" + uri, query: queryItems ?? []) let request = try buildRequest(fromUrl: url, withMethod: .GET) - var response = try await httpClient + var response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -558,7 +562,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and data decoding. - public func get (fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { + public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) if response.status == .unauthorized { @@ -667,7 +671,7 @@ public class CouchDBClient { /// let selector = ["selector": ["name": "Greg"]] /// let bodyData = try JSONEncoder().encode(selector) /// var findResponse = try await couchDBClient.find( - /// inDB: testsDB, + /// inDB: testsDB, /// body: .data(bodyData) /// ) /// @@ -700,7 +704,8 @@ public class CouchDBClient { let url = buildUrl(path: "/" + dbName + "/_find", query: []) var request = try buildRequest(fromUrl: url, withMethod: .POST) request.body = body - var response = try await httpClient + var response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -784,7 +789,7 @@ public class CouchDBClient { } else { httpClient = HTTPClient.shared } - + defer { if eventLoopGroup != nil { DispatchQueue.main.async { @@ -797,7 +802,8 @@ public class CouchDBClient { var request = try buildRequest(fromUrl: url, withMethod: .PUT) request.body = body - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -871,7 +877,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document updates and server responses. - public func update (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + public func update(dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws { guard let id = doc._id else { throw CouchDBClientError.idMissing } guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } @@ -964,7 +970,8 @@ public class CouchDBClient { var request = try self.buildRequest(fromUrl: url, withMethod: .POST) request.body = body - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -1031,7 +1038,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document insertion and server responses. - public func insert (dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil ) async throws { + public func insert(dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy let insertEncodeData = try encoder.encode(doc) @@ -1096,12 +1103,16 @@ public class CouchDBClient { } } - let url = buildUrl(path: "/" + dbName + "/" + uri, query: [ - URLQueryItem(name: "rev", value: rev) - ]) + let url = buildUrl( + path: "/" + dbName + "/" + uri, + query: [ + URLQueryItem(name: "rev", value: rev) + ] + ) let request = try self.buildRequest(fromUrl: url, withMethod: .DELETE) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -1149,7 +1160,6 @@ public class CouchDBClient { } } - // MARK: - Private methods internal extension CouchDBClient { /// Build URL string. @@ -1206,7 +1216,8 @@ internal extension CouchDBClient { let dataString = "name=\(userName)&password=\(userPassword)" request.body = .bytes(ByteBuffer(string: dataString)) - let response = try await httpClient + let response = + try await httpClient .execute(request, timeout: .seconds(requestsTimeout)) if response.status == .unauthorized { @@ -1253,7 +1264,7 @@ internal extension CouchDBClient { return authData } - func buildRequest(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { + func buildRequest(fromUrl url: String, withMethod method: HTTPMethod) throws -> HTTPClientRequest { var headers = HTTPHeaders() headers.add(name: "Content-Type", value: "application/json") if let cookie = sessionCookie { diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index e718967..821fd32 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -3,7 +3,6 @@ import NIO import AsyncHTTPClient @testable import CouchDBClient - final class CouchDBClientTests: XCTestCase { struct ExpectedDoc: CouchDBRepresentable { @@ -11,7 +10,7 @@ final class CouchDBClientTests: XCTestCase { var _id: String? var _rev: String? } - + let testsDB = "fortests" let couchDBClient = CouchDBClient( @@ -21,33 +20,33 @@ final class CouchDBClientTests: XCTestCase { userName: "admin", userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "" ) - + override func setUp() async throws { - try await super.setUp() + try await super.setUp() + } + + func test00_CreateDB() async throws { + do { + let exists = try await couchDBClient.dbExists(testsDB) + if exists { + try await couchDBClient.deleteDB(testsDB) + } + + try await couchDBClient.createDB(testsDB) + } catch { + XCTFail(error.localizedDescription) + } + } + + func test01_DBExists() async throws { + do { + let exists = try await couchDBClient.dbExists(testsDB) + XCTAssertTrue(exists) + } catch { + XCTFail(error.localizedDescription) + } } - func test00_CreateDB() async throws { - do { - let exists = try await couchDBClient.dbExists(testsDB) - if exists { - try await couchDBClient.deleteDB(testsDB) - } - - try await couchDBClient.createDB(testsDB) - } catch { - XCTFail(error.localizedDescription) - } - } - - func test01_DBExists() async throws { - do { - let exists = try await couchDBClient.dbExists(testsDB) - XCTAssertTrue(exists) - } catch { - XCTFail(error.localizedDescription) - } - } - func test03_GetAllDbs() async throws { do { let dbs = try await couchDBClient.getAllDBs() @@ -145,7 +144,7 @@ final class CouchDBClientTests: XCTestCase { XCTFail(error.localizedDescription) } } - + func test05_InsertGetUpdateDelete() async throws { var testDoc = ExpectedDoc(name: "test name") var expectedInsertId: String = "" @@ -246,12 +245,14 @@ final class CouchDBClientTests: XCTestCase { XCTFail(error.localizedDescription) } } - + func test06_BuildUrl() { let expectedUrl = "http://127.0.0.1:5984?key=testKey" - let url = couchDBClient.buildUrl(path: "", query: [ - URLQueryItem(name: "key", value: "testKey") - ]) + let url = couchDBClient.buildUrl( + path: "", + query: [ + URLQueryItem(name: "key", value: "testKey") + ]) XCTAssertEqual(url, expectedUrl) } @@ -271,7 +272,6 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - let selector = ["selector": ["name": "Greg"]] let bodyData = try JSONEncoder().encode(selector) let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: bodyData)) @@ -329,11 +329,11 @@ final class CouchDBClientTests: XCTestCase { } } - func test99_deleteDB() async throws { - do { - try await couchDBClient.deleteDB(testsDB) - } catch { - XCTFail(error.localizedDescription) - } - } + func test99_deleteDB() async throws { + do { + try await couchDBClient.deleteDB(testsDB) + } catch { + XCTFail(error.localizedDescription) + } + } } From c0e594118ca4a122c951096d23e74cd2487cc72b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 24 Nov 2024 20:07:25 +0700 Subject: [PATCH 099/202] revert sendable --- Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 2 +- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 2 +- Sources/CouchDBClient/Models/CreateSessionResponse.swift | 2 +- Sources/CouchDBClient/Models/RowsResponse.swift | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index e2a374e..f84ff75 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -7,7 +7,7 @@ import Foundation -public struct CouchDBFindResponse: Codable, Sendable { +public struct CouchDBFindResponse: Codable { var docs: [T] var bookmark: String? } diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 1a8f709..9ba47cc 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -18,7 +18,7 @@ import Foundation /// var _rev: String? /// } /// ``` -public protocol CouchDBRepresentable: Codable, Sendable { +public protocol CouchDBRepresentable: Codable { /// Document ID. var _id: String? { get set } /// Revision MVCC token. diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index f4ae9e1..7e81ba7 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -8,7 +8,7 @@ import Foundation /// Resonse model for create session request -struct CreateSessionResponse: Codable, Sendable { +struct CreateSessionResponse: Codable { let ok: Bool let name: String? let roles: [String]? diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index eb9755d..ee301d8 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -8,8 +8,8 @@ import Foundation /// Rows response model. -public struct RowsResponse: Codable, Sendable { - public struct Row: Codable, Sendable { +public struct RowsResponse: Codable { + public struct Row: Codable { /// A CouchDB document. public let value: T } From 277ddd42a705454602bee8e53ee01ebcdb5be006 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Thu, 13 Feb 2025 13:15:07 +0700 Subject: [PATCH 100/202] updated dependencies --- Package.resolved | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Package.resolved b/Package.resolved index 750691a..d3914ba 100644 --- a/Package.resolved +++ b/Package.resolved @@ -5,17 +5,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "0a9b72369b9d87ab155ef585ef50700a34abf070", - "version" : "1.23.1" + "revision" : "b645ad40822b5c59ac92b758c5c17af054b5b01f", + "version" : "1.25.1" } }, { "identity" : "swift-algorithms", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-algorithms", + "location" : "https://github.com/apple/swift-algorithms.git", "state" : { - "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", - "version" : "1.2.0" + "revision" : "87e50f483c54e6efd60e885f7f5aa946cee68023", + "version" : "1.2.1" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "9cb486020ebf03bfa5b5df985387a14a98744537", - "version" : "1.6.1" + "revision" : "96a2f8a0fa41e9e09af4585e2724c4e825410b91", + "version" : "1.6.2" } }, { @@ -77,8 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "914081701062b11e3bb9e21accc379822621995e", - "version" : "2.76.1" + "revision" : "c51907a839e63ebf0ba2076bba73dd96436bd1b9", + "version" : "2.81.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "eaa71bb6ae082eee5a07407b1ad0cbd8f48f9dca", - "version" : "1.34.1" + "revision" : "170f4ca06b6a9c57b811293cebcb96e81b661310", + "version" : "1.35.0" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "c7e95421334b1068490b5d41314a50e70bab23d1", - "version" : "2.29.0" + "revision" : "0cc3528ff48129d64ab9cab0b1cd621634edfc6b", + "version" : "2.29.3" } }, { @@ -113,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "bbd5e63cf949b7db0c9edaf7a21e141c52afe214", - "version" : "1.23.0" + "revision" : "3c394067c08d1225ba8442e9cffb520ded417b64", + "version" : "1.23.1" } }, { From 24a57c46cfe4c266dd586582e1f405a578ef9909 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 13:55:27 +0700 Subject: [PATCH 101/202] Sensable conformance --- Sources/CouchDBClient/Models/CouchDBError.swift | 2 +- Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 6 +++--- Sources/CouchDBClient/Models/CouchUpdateResponse.swift | 8 ++++---- Sources/CouchDBClient/Models/CreateSessionResponse.swift | 2 +- Sources/CouchDBClient/Models/UpdateDBResponse.swift | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBError.swift b/Sources/CouchDBClient/Models/CouchDBError.swift index 657e2fe..ded72c0 100644 --- a/Sources/CouchDBClient/Models/CouchDBError.swift +++ b/Sources/CouchDBClient/Models/CouchDBError.swift @@ -8,7 +8,7 @@ import Foundation /// A model that represents errors that CouchDB might return. -public struct CouchDBError: Error, Codable { +public struct CouchDBError: Error, Codable, Sendable { /// Error message. public let error: String /// Error reason. diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index f84ff75..d71eacb 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -7,7 +7,7 @@ import Foundation -public struct CouchDBFindResponse: Codable { - var docs: [T] - var bookmark: String? +public struct CouchDBFindResponse: Codable, Sendable { + let docs: [T] + let bookmark: String? } diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index e1471ce..63bcc1a 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -8,11 +8,11 @@ import Foundation /// Model for insert/update/delete request response. -public struct CouchUpdateResponse: Codable { +public struct CouchUpdateResponse: Codable, Sendable { /// Operation status. - public var ok: Bool + public let ok: Bool /// Document ID. - public var id: String + public let id: String /// Revision MVCC token. - public var rev: String + public let rev: String } diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index 7e81ba7..f4ae9e1 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -8,7 +8,7 @@ import Foundation /// Resonse model for create session request -struct CreateSessionResponse: Codable { +struct CreateSessionResponse: Codable, Sendable { let ok: Bool let name: String? let roles: [String]? diff --git a/Sources/CouchDBClient/Models/UpdateDBResponse.swift b/Sources/CouchDBClient/Models/UpdateDBResponse.swift index 8d7e8e0..e9b8809 100644 --- a/Sources/CouchDBClient/Models/UpdateDBResponse.swift +++ b/Sources/CouchDBClient/Models/UpdateDBResponse.swift @@ -8,7 +8,7 @@ import Foundation /// DB creation response. -public struct UpdateDBResponse: Codable { +public struct UpdateDBResponse: Codable, Sendable { /// Operation status. public let ok: Bool } From 8b9a9951b88f8651827d53ef122d5bb4e6659329 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 13:55:50 +0700 Subject: [PATCH 102/202] updated CouchDBRepresentable protocol --- .../Models/CouchDBRepresentable.swift | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 9ba47cc..1221709 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -7,20 +7,35 @@ import Foundation -/// Every CouchDB document should have **\_id** and **\_rev** properties. Both should be optional **String?** type. Unfortunately DocC ignores properties starting with `_` symbol so check the example in the Overview section. +/// A protocol representing an object that can be stored in a CouchDB database. +/// Conforming types must support Codable and Sendable for serialization and thread safety. +/// Every CouchDB document should have **\_id** and **\_rev** properties. Unfortunately DocC ignores properties starting with `_` symbol so check the example in the Overview section. /// /// Example: /// ```swift /// // Example struct /// struct ExpectedDoc: CouchDBRepresentable { -/// var name: String -/// var _id: String? -/// var _rev: String? +/// var name: String +/// var _id: String = NSUUID().uuidString +/// var _rev: String? +/// +/// func updateRevision(_ newRevision: String) -> Self { +/// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) +/// } /// } /// ``` -public protocol CouchDBRepresentable: Codable { - /// Document ID. - var _id: String? { get set } - /// Revision MVCC token. - var _rev: String? { get set } +public protocol CouchDBRepresentable: Codable, Sendable { + /// The unique identifier for the CouchDB document. + /// This property is required and must contain a valid document ID. + var _id: String { get } + + /// The MVCC (Multi-Version Concurrency Control) revision token for the document. + /// Used for tracking changes to the document and resolving conflicts in CouchDB. + /// - Note: This property is optional and can be set to `nil` for new documents. + var _rev: String? { get set } + + /// Creates a new instance of the conforming type with the updated revision token. + /// - Parameter newRevision: The new MVCC revision token to associate with the document. + /// - Returns: A new instance of the conforming type with the updated `_rev` property. + func updateRevision(_ newRevision: String) -> Self } From 829d9e3a79d4df2c24a3130a4c1d769f9d3b79de Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 13:56:00 +0700 Subject: [PATCH 103/202] Sendable conformance --- Sources/CouchDBClient/Models/RowsResponse.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index ee301d8..eb9755d 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -8,8 +8,8 @@ import Foundation /// Rows response model. -public struct RowsResponse: Codable { - public struct Row: Codable { +public struct RowsResponse: Codable, Sendable { + public struct Row: Codable, Sendable { /// A CouchDB document. public let value: T } From cd550f23e5a736a24f6ecdb1331a00dc7bfdb147 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 13:57:00 +0700 Subject: [PATCH 104/202] Strict concurrency implemented --- Sources/CouchDBClient/CouchDBClient.swift | 74 +++++++++++-------- .../CouchDBClientTests.swift | 31 +++++--- 2 files changed, 62 insertions(+), 43 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 7567fc2..b659337 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -59,7 +59,25 @@ extension CouchDBClientError: LocalizedError { } /// A CouchDB client class with methods using Swift Concurrency. -public class CouchDBClient { +public actor CouchDBClient { + public struct Config: Sendable { + let couchProtocol: CouchDBProtocol + let couchHost: String + let couchPort: Int + let userName: String + let userPassword: String + let requestsTimeout: Int64 + + public init(couchProtocol: CouchDBClient.CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String, userPassword: String, requestsTimeout: Int64 = 30) { + self.couchProtocol = couchProtocol + self.couchHost = couchHost + self.couchPort = couchPort + self.userName = userName + self.userPassword = userPassword + self.requestsTimeout = requestsTimeout + } + } + /// An enumeration that defines the protocol types supported for connecting to a CouchDB server. /// /// - Cases: @@ -67,7 +85,7 @@ public class CouchDBClient { /// - https: Represents the HTTPS protocol for secure, encrypted network communication. /// /// - Note: Always prefer using `https` for secure communication, especially when transmitting sensitive data. - public enum CouchDBProtocol: String { + public enum CouchDBProtocol: String, Sendable { case http case https } @@ -77,26 +95,23 @@ public class CouchDBClient { /// Flag if authorized in CouchDB. public var isAuthorized: Bool { authData?.ok ?? false } - /// You can set a timeout for requests in seconds. Default value is 30. - public var requestsTimeout: Int64 = 30 - // MARK: - Private properties /// Requests protocol. - private var couchProtocol: CouchDBProtocol = .http + private let couchProtocol: CouchDBProtocol /// Host. - private var couchHost: String = "127.0.0.1" + private let couchHost: String /// Port. - private var couchPort: Int = 5984 - /// Base URL. - private var couchBaseURL: String = "" + private let couchPort: Int /// Session cookie for requests that need authorization. internal var sessionCookie: String? /// Session cookie as Cookie struct. internal var sessionCookieExpires: Date? /// CouchDB user name. - private var userName: String = "" + private let userName: String + /// You can set a timeout for requests in seconds. Default value is 30. + private var requestsTimeout: Int64 = 30 /// CouchDB user password. - private var userPassword: String = "" + private let userPassword: String /// Authorization response from CouchDB. private var authData: CreateSessionResponse? @@ -143,16 +158,17 @@ public class CouchDBClient { /// ``` /// /// - Note: It's important to ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` before attempting to connect. - public init(couchProtocol: CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String, userPassword: String = "") { - self.couchProtocol = couchProtocol - self.couchHost = couchHost - self.couchPort = couchPort - self.userName = userName + public init(config: CouchDBClient.Config) { + self.couchProtocol = config.couchProtocol + self.couchHost = config.couchHost + self.couchPort = config.couchPort + self.userName = config.userName + self.requestsTimeout = config.requestsTimeout self.userPassword = - userPassword.isEmpty - ? ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? userPassword - : userPassword + config.userPassword.isEmpty + ? ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? config.userPassword + : config.userPassword } // MARK: - Public methods @@ -483,7 +499,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. - public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { + public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient @@ -877,8 +893,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document updates and server responses. - public func update(dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws { - guard let id = doc._id else { throw CouchDBClientError.idMissing } + public func update(dbName: String, doc: T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } let encoder = JSONEncoder() @@ -889,7 +904,7 @@ public class CouchDBClient { let updateResponse = try await update( dbName: dbName, - uri: id, + uri: doc._id, body: body, eventLoopGroup: eventLoopGroup ) @@ -898,8 +913,7 @@ public class CouchDBClient { throw CouchDBClientError.unknownResponse } - doc._rev = updateResponse.rev - doc._id = updateResponse.id + return doc.updateRevision(updateResponse.rev) } /// Inserts a new document into a specified database on the CouchDB server. @@ -1038,7 +1052,7 @@ public class CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document insertion and server responses. - public func insert(dbName: String, doc: inout T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws { + public func insert(dbName: String, doc: T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy let insertEncodeData = try encoder.encode(doc) @@ -1055,8 +1069,7 @@ public class CouchDBClient { throw CouchDBClientError.unknownResponse } - doc._rev = insertResponse.rev - doc._id = insertResponse.id + return doc.updateRevision(insertResponse.rev) } /// Deletes a document from a specified database on the CouchDB server. @@ -1153,10 +1166,9 @@ public class CouchDBClient { /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document deletion. public func delete(fromDb dbName: String, doc: CouchDBRepresentable, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { - guard let id = doc._id else { throw CouchDBClientError.idMissing } guard let rev = doc._rev else { throw CouchDBClientError.revMissing } - return try await delete(fromDb: dbName, uri: id, rev: rev, eventLoopGroup: eventLoopGroup) + return try await delete(fromDb: dbName, uri: doc._id, rev: rev, eventLoopGroup: eventLoopGroup) } } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 821fd32..1754e3e 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -7,13 +7,17 @@ final class CouchDBClientTests: XCTestCase { struct ExpectedDoc: CouchDBRepresentable { var name: String - var _id: String? + var _id: String = NSUUID().uuidString var _rev: String? + + func updateRevision(_ newRevision: String) -> Self { + return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + } } let testsDB = "fortests" - let couchDBClient = CouchDBClient( + let config = CouchDBClient.Config( couchProtocol: .http, couchHost: "127.0.0.1", couchPort: 5984, @@ -21,6 +25,8 @@ final class CouchDBClientTests: XCTestCase { userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "" ) + lazy var couchDBClient = CouchDBClient(config: config) + override func setUp() async throws { try await super.setUp() } @@ -66,9 +72,9 @@ final class CouchDBClientTests: XCTestCase { // insert do { - try await couchDBClient.insert( + testDoc = try await couchDBClient.insert( dbName: testsDB, - doc: &testDoc + doc: testDoc ) } catch CouchDBClientError.insertError(let error) { XCTFail(error.reason) @@ -78,7 +84,7 @@ final class CouchDBClientTests: XCTestCase { return } - expectedInsertId = testDoc._id! + expectedInsertId = testDoc._id expectedInsertRev = testDoc._rev! // get inserted doc @@ -97,9 +103,9 @@ final class CouchDBClientTests: XCTestCase { let expectedName = testDoc.name do { - try await couchDBClient.update( + testDoc = try await couchDBClient.update( dbName: testsDB, - doc: &testDoc + doc: testDoc ) } catch CouchDBClientError.updateError(let error) { XCTFail(error.reason) @@ -233,7 +239,7 @@ final class CouchDBClientTests: XCTestCase { do { let response = try await couchDBClient.delete( fromDb: testsDB, - uri: testDoc._id!, + uri: testDoc._id, rev: testDoc._rev! ) @@ -246,9 +252,9 @@ final class CouchDBClientTests: XCTestCase { } } - func test06_BuildUrl() { + func test06_BuildUrl() async { let expectedUrl = "http://127.0.0.1:5984?key=testKey" - let url = couchDBClient.buildUrl( + let url = await couchDBClient.buildUrl( path: "", query: [ URLQueryItem(name: "key", value: "testKey") @@ -260,7 +266,8 @@ final class CouchDBClientTests: XCTestCase { let session: CreateSessionResponse? = try await couchDBClient.authIfNeed() XCTAssertNotNil(session) XCTAssertEqual(true, session?.ok) - XCTAssertNotNil(couchDBClient.sessionCookieExpires) + let sessionCookieExpires = await couchDBClient.sessionCookieExpires + XCTAssertNotNil(sessionCookieExpires) } func test08_find_with_body() async throws { @@ -321,7 +328,7 @@ final class CouchDBClientTests: XCTestCase { _ = try await couchDBClient.delete( fromDb: testsDB, - uri: docs.first!._id!, + uri: docs.first!._id, rev: docs.first!._rev! ) } catch { From 680090b2a18e1fbdf0680562f9fa52ec99447d58 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 13:57:16 +0700 Subject: [PATCH 105/202] Swift 6 --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 57c69c9..7f016f7 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.8 +// swift-tools-version:6.0 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription From b8b6956d9fc6ffd5ff161ea3417d42ab2ea11229 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 14:02:59 +0700 Subject: [PATCH 106/202] docs updated --- .../CouchDBClient/Models/CouchDBError.swift | 9 +++++-- .../Models/CouchDBFindResponse.swift | 11 ++++++++- .../Models/CouchDBRepresentable.swift | 24 +++++++++---------- .../Models/CouchUpdateResponse.swift | 14 +++++++---- .../Models/CreateSessionResponse.swift | 13 +++++++++- .../CouchDBClient/Models/RowsResponse.swift | 20 ++++++++++++---- .../Models/UpdateDBResponse.swift | 6 +++-- 7 files changed, 70 insertions(+), 27 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBError.swift b/Sources/CouchDBClient/Models/CouchDBError.swift index ded72c0..420311b 100644 --- a/Sources/CouchDBClient/Models/CouchDBError.swift +++ b/Sources/CouchDBClient/Models/CouchDBError.swift @@ -8,9 +8,14 @@ import Foundation /// A model that represents errors that CouchDB might return. +/// This structure conforms to `Error`, `Codable`, and `Sendable` protocols for flexibility, +/// serialization, and thread safety. public struct CouchDBError: Error, Codable, Sendable { - /// Error message. + /// A short description of the error returned by CouchDB. + /// This property contains a general error type or category, such as `"not_found"`. public let error: String - /// Error reason. + + /// A detailed explanation or reason for the error returned by CouchDB. + /// This property provides more context about why the error occurred. public let reason: String } diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index d71eacb..6406949 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -7,7 +7,16 @@ import Foundation +/// A model that represents the response from a CouchDB `_find` query. +/// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. +/// It conforms to `Codable` and `Sendable` for serialization and thread safety. public struct CouchDBFindResponse: Codable, Sendable { + /// The array of documents returned by the CouchDB query. + /// Each document conforms to the `CouchDBRepresentable` protocol. let docs: [T] - let bookmark: String? + + /// The bookmark for use in paginated queries. + /// This property is optional and will contain a string that can be used + /// as a reference to continue the query from where it left off. + let bookmark: String? } diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 1221709..158fa55 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -25,17 +25,17 @@ import Foundation /// } /// ``` public protocol CouchDBRepresentable: Codable, Sendable { - /// The unique identifier for the CouchDB document. - /// This property is required and must contain a valid document ID. - var _id: String { get } + /// The unique identifier for the CouchDB document. + /// This property is required and must contain a valid document ID. + var _id: String { get } - /// The MVCC (Multi-Version Concurrency Control) revision token for the document. - /// Used for tracking changes to the document and resolving conflicts in CouchDB. - /// - Note: This property is optional and can be set to `nil` for new documents. - var _rev: String? { get set } - - /// Creates a new instance of the conforming type with the updated revision token. - /// - Parameter newRevision: The new MVCC revision token to associate with the document. - /// - Returns: A new instance of the conforming type with the updated `_rev` property. - func updateRevision(_ newRevision: String) -> Self + /// The MVCC (Multi-Version Concurrency Control) revision token for the document. + /// Used for tracking changes to the document and resolving conflicts in CouchDB. + /// - Note: This property is optional and can be set to `nil` for new documents. + var _rev: String? { get set } + + /// Creates a new instance of the conforming type with the updated revision token. + /// - Parameter newRevision: The new MVCC revision token to associate with the document. + /// - Returns: A new instance of the conforming type with the updated `_rev` property. + func updateRevision(_ newRevision: String) -> Self } diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index 63bcc1a..59d6beb 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -7,12 +7,18 @@ import Foundation -/// Model for insert/update/delete request response. +/// A model for the response returned by CouchDB after performing insert, update, or delete operations. +/// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. public struct CouchUpdateResponse: Codable, Sendable { - /// Operation status. + /// Indicates whether the operation was successful. + /// This property is `true` if the operation was successful; otherwise, `false`. public let ok: Bool - /// Document ID. + + /// The unique identifier of the CouchDB document affected by the operation. + /// This property contains the document's ID. public let id: String - /// Revision MVCC token. + + /// The MVCC (Multi-Version Concurrency Control) revision token for the document. + /// This token is updated after each successful operation and is used to track document versions. public let rev: String } diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index f4ae9e1..c6a8ee5 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -7,12 +7,23 @@ import Foundation -/// Resonse model for create session request +/// A response model for a create session request. +/// This structure represents the data returned by the server upon a session creation request +/// and conforms to `Codable` and `Sendable` for serialization and thread safety. struct CreateSessionResponse: Codable, Sendable { + /// Indicates whether the session creation was successful. + /// This property is `true` if the request succeeded; otherwise, `false`. let ok: Bool + + /// The name of the user associated with the created session. + /// This property is optional and may be `nil` if the user's name is not included in the response. let name: String? + + /// The list of roles assigned to the user for the created session. + /// This property is optional and may be `nil` if no roles are specified in the response. let roles: [String]? + /// Custom keys for encoding and decoding the response properties. enum CodingKeys: String, CodingKey { case ok case name diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index eb9755d..f962699 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -7,17 +7,27 @@ import Foundation -/// Rows response model. +/// A response model for CouchDB query results organized in rows. +/// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. +/// It conforms to `Codable` and `Sendable` for serialization and thread safety. public struct RowsResponse: Codable, Sendable { + /// A nested structure representing an individual row in the response. + /// Each row contains a CouchDB document as its value. public struct Row: Codable, Sendable { - /// A CouchDB document. + /// A CouchDB document associated with this row. + /// The document type must conform to the `CouchDBRepresentable` protocol. public let value: T } - /// Total documents in a response. + /// The total number of documents available in the response. + /// This value represents the count of all documents matching the query, not just the ones included in the current response. public let total_rows: Int - /// Results offset. + + /// The offset position of the results in the query. + /// Indicates the starting point of the rows included in the response relative to the full dataset. public let offset: Int - /// CouchDB documents. + + /// The array of rows returned by the query. + /// Each row contains a CouchDB document and is represented by the nested `Row` structure. public let rows: [Row] } diff --git a/Sources/CouchDBClient/Models/UpdateDBResponse.swift b/Sources/CouchDBClient/Models/UpdateDBResponse.swift index e9b8809..ac8297a 100644 --- a/Sources/CouchDBClient/Models/UpdateDBResponse.swift +++ b/Sources/CouchDBClient/Models/UpdateDBResponse.swift @@ -7,8 +7,10 @@ import Foundation -/// DB creation response. +/// A response model for database creation and deletion requests in CouchDB. +/// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. public struct UpdateDBResponse: Codable, Sendable { - /// Operation status. + /// Indicates whether the database creation or deletion operation was successful. + /// This property is `true` if the operation succeeded; otherwise, `false`. public let ok: Bool } From eff7662aace054509ee4e53427481d184178a244 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 14:19:44 +0700 Subject: [PATCH 107/202] errors and docs --- Sources/CouchDBClient/CouchDBClient.swift | 67 +++++++++++++++-------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index b659337..aaebbe4 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -11,49 +11,72 @@ import NIOHTTP1 import NIOFoundationCompat import AsyncHTTPClient -/// CouchDB client errors. -public enum CouchDBClientError: Error { - /// **id** property is empty or missing in the provided document. +/// An enumeration representing the various errors that can occur when interacting with CouchDB through a client. +/// This enum conforms to both `Error` and `Sendable`, making it suitable for error handling and thread-safe operations. +public enum CouchDBClientError: Error, Sendable { + /// The `id` property is empty or missing in the provided document. + /// This error indicates that the document does not have a valid identifier. case idMissing - /// **\_rev** property is empty or missing in the provided document. + + /// The `_rev` property is empty or missing in the provided document. + /// This error indicates that the document does not have a valid revision token for concurrency control. case revMissing - /// The Get request wasn't successful. + + /// The `GET` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case getError(error: CouchDBError) - /// The Insert request wasn't successful. + + /// The `INSERT` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case insertError(error: CouchDBError) - /// The Update request wasn't successful. + + /// The `UPDATE` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case updateError(error: CouchDBError) - /// The Find request wasn't successful. + + /// The `FIND` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case findError(error: CouchDBError) - /// Unknown response from CouchDB. + + /// The response from CouchDB was unrecognized or could not be processed. + /// This error indicates that the response was not in the expected format. case unknownResponse - /// Wrong username or password. + + /// Authentication failed due to incorrect username or password. + /// This error suggests that the provided credentials were invalid. case unauthorized - /// Missing data in the response body. + + /// The response body is missing required data. + /// This error indicates that the server response lacked the expected content. case noData } +/// Extends the `CouchDBClientError` enumeration to provide localized error descriptions. +/// This extension conforms to the `LocalizedError` protocol, offering user-friendly messages +/// that describe the nature of each error in detail. extension CouchDBClientError: LocalizedError { + /// A textual description of the error, tailored for user-facing contexts. + /// The message provides specific details about the error type and underlying cause. public var errorDescription: String? { switch self { case .idMissing: - return "id property is empty or missing in the provided document." + return "The 'id' property is empty or missing in the provided document." case .revMissing: - return "_rev property is empty or missing in the provided document." + return "The '_rev' property is empty or missing in the provided document." case .getError(let error): - return "The Get request wasn't successful: \(error.localizedDescription)" + return "The GET request wasn't successful: \(error.localizedDescription)" case .insertError(let error): - return "The Insert request wasn't successful: \(error.localizedDescription)" + return "The INSERT request wasn't successful: \(error.localizedDescription)" case .updateError(let error): - return "The Update request wasn't successful: \(error.localizedDescription)" + return "The UPDATE request wasn't successful: \(error.localizedDescription)" case .findError(let error): - return "The Find request wasn't successful: \(error.localizedDescription)" + return "The FIND request wasn't successful: \(error.localizedDescription)" case .unknownResponse: - return "Unknown response from CouchDB." + return "The response from CouchDB was unrecognized or invalid." case .unauthorized: - return "Wrong username or password." + return "Authentication failed due to an incorrect username or password." case .noData: - return "Missing data in the response body." + return "The response body is missing the expected data." } } } @@ -109,7 +132,7 @@ public actor CouchDBClient { /// CouchDB user name. private let userName: String /// You can set a timeout for requests in seconds. Default value is 30. - private var requestsTimeout: Int64 = 30 + private var requestsTimeout: Int64 = 30 /// CouchDB user password. private let userPassword: String /// Authorization response from CouchDB. @@ -499,7 +522,7 @@ public actor CouchDBClient { /// ``` /// /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. - public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { + public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient: HTTPClient From 163bf1f64da20451f1cd85682eb63d88bc397c0b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 14:20:48 +0700 Subject: [PATCH 108/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 33 +++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index aaebbe4..dcc5c5b 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -81,17 +81,46 @@ extension CouchDBClientError: LocalizedError { } } -/// A CouchDB client class with methods using Swift Concurrency. +/// A CouchDB client actor with methods using Swift Concurrency. public actor CouchDBClient { + /// A configuration model for CouchDB client setup. + /// This structure is used to define the necessary parameters for connecting to a CouchDB database. + /// It conforms to the `Sendable` protocol for thread safety during concurrent operations. public struct Config: Sendable { + /// The protocol used for CouchDB communication (e.g., HTTP or HTTPS). let couchProtocol: CouchDBProtocol + + /// The hostname or IP address of the CouchDB server. let couchHost: String + + /// The port number used for CouchDB communication. let couchPort: Int + + /// The username for CouchDB authentication. let userName: String + + /// The password for CouchDB authentication. let userPassword: String + + /// The timeout duration for CouchDB requests, specified in seconds. let requestsTimeout: Int64 - public init(couchProtocol: CouchDBClient.CouchDBProtocol = .http, couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String, userPassword: String, requestsTimeout: Int64 = 30) { + /// Initializes a new `Config` instance with default values for certain parameters. + /// - Parameters: + /// - couchProtocol: The communication protocol, defaulting to `.http`. + /// - couchHost: The hostname or IP address, defaulting to `"127.0.0.1"`. + /// - couchPort: The port number, defaulting to `5984`. + /// - userName: The username for authentication (required). + /// - userPassword: The password for authentication (required). + /// - requestsTimeout: The timeout duration in seconds, defaulting to `30`. + public init( + couchProtocol: CouchDBClient.CouchDBProtocol = .http, + couchHost: String = "127.0.0.1", + couchPort: Int = 5984, + userName: String, + userPassword: String, + requestsTimeout: Int64 = 30 + ) { self.couchProtocol = couchProtocol self.couchHost = couchHost self.couchPort = couchPort From f5a50b5ca0bf3ad4ddcc0537ab6988a5688788d2 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 14:50:46 +0700 Subject: [PATCH 109/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 200 +++++++++++++--------- 1 file changed, 120 insertions(+), 80 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index dcc5c5b..187ab8d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -30,6 +30,10 @@ public enum CouchDBClientError: Error, Sendable { /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case insertError(error: CouchDBError) + /// The `DELETE` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case deleteError(error: CouchDBError) + /// The `UPDATE` request was unsuccessful. /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case updateError(error: CouchDBError) @@ -69,6 +73,8 @@ extension CouchDBClientError: LocalizedError { return "The INSERT request wasn't successful: \(error.localizedDescription)" case .updateError(let error): return "The UPDATE request wasn't successful: \(error.localizedDescription)" + case .deleteError(let error): + return "The DELETE request wasn't successful: \(error.localizedDescription)" case .findError(let error): return "The FIND request wasn't successful: \(error.localizedDescription)" case .unknownResponse: @@ -118,7 +124,7 @@ public actor CouchDBClient { couchHost: String = "127.0.0.1", couchPort: Int = 5984, userName: String, - userPassword: String, + userPassword: String = ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "", requestsTimeout: Int64 = 30 ) { self.couchProtocol = couchProtocol @@ -130,15 +136,13 @@ public actor CouchDBClient { } } - /// An enumeration that defines the protocol types supported for connecting to a CouchDB server. - /// - /// - Cases: - /// - http: Represents the HTTP protocol for unencrypted network communication. - /// - https: Represents the HTTPS protocol for secure, encrypted network communication. - /// - /// - Note: Always prefer using `https` for secure communication, especially when transmitting sensitive data. + /// An enumeration representing the available communication protocols for CouchDB. + /// This enum conforms to `String` for raw value representation and `Sendable` for thread safety. public enum CouchDBProtocol: String, Sendable { + /// HTTP protocol for CouchDB communication. case http + + /// HTTPS protocol for CouchDB communication, providing secure communication. case https } @@ -169,44 +173,41 @@ public actor CouchDBClient { // MARK: - Initializer - /// Initializes a new instance of a CouchDB client. + /// Initializes a new instance of the CouchDB client using the provided configuration. + /// This initializer sets up the client with connection parameters and handles the user password securely, + /// supporting environment variable fallback for sensitive data. /// /// This initializer sets up the client with default values for connecting to a CouchDB server. It allows for optional customization of the connection parameters such as protocol, host and port. /// /// - Parameters: - /// - couchProtocol: The protocol used for connecting to the CouchDB server. Defaults to `.http`. - /// - couchHost: The hostname or IP address of the CouchDB server. Defaults to `"127.0.0.1"`. - /// - couchPort: The port number on which the CouchDB server is listening. Defaults to `5984`. - /// - userName: The username for authentication with the CouchDB server. - /// - userPassword: The password for authentication with the CouchDB server. If left empty, the initializer attempts to read the password from the `COUCHDB_PASS` environment variable. If the environment variable is also not set, it defaults to an empty string. + /// - config: A `CouchDBClient.Config` instance containing the configuration details. /// /// Example usage: /// ```swift - /// // use default params - /// let myClient = CouchDBClient() - /// - /// // provide your own params - /// let couchDBClient = CouchDBClient( - /// couchProtocol: .http, - /// couchHost: "127.0.0.1", - /// couchPort: 5984, - /// userName: "admin", - /// userPassword: "myPassword" + /// // Create a cofig: + /// let config = CouchDBClient.Config( + /// couchProtocol: .http, + /// couchHost: "127.0.0.1", + /// couchPort: 5984, + /// userName: "user", + /// userPassword: "myPassword", + /// requestsTimeout: 30 /// ) + /// + /// // Create a client istance: + /// let couchDBClient = CouchDBClient(config: config) /// ``` /// If you don't want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. /// For example you can run your Server Side Swift project: /// ```bash /// COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run /// ``` - /// Just use initializer without `userPassword` param: + /// Just use config without `userPassword` param: /// ```swift - /// CouchDBClient( - /// couchProtocol: .http, - /// couchHost: "127.0.0.1", - /// couchPort: 5984, - /// userName: "admin" + /// let config = CouchDBClient.Config( + /// userName: "user" /// ) + /// let couchDBClient = CouchDBClient(config: config) /// ``` /// /// - Note: It's important to ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` before attempting to connect. @@ -215,34 +216,40 @@ public actor CouchDBClient { self.couchHost = config.couchHost self.couchPort = config.couchPort self.userName = config.userName + self.userPassword = config.userPassword self.requestsTimeout = config.requestsTimeout - - self.userPassword = - config.userPassword.isEmpty - ? ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? config.userPassword - : config.userPassword } // MARK: - Public methods /// Retrieves a list of all database names from the CouchDB server. /// - /// This asynchronous function sends a GET request to the CouchDB server to fetch the names of all databases. It can optionally use a custom NIO's `EventLoopGroup` for the network request. - /// - /// - Parameter eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Returns: An array of `String` containing the names of all databases on the server. - /// - Throws: An error of type `CouchDBClientError` if the request fails or if there is no data returned. + /// This asynchronous function sends a `GET` request to the CouchDB server to fetch the names of all databases. + /// It supports using a custom NIO's `EventLoopGroup` for network operations, providing flexibility for managing event loops. /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request, it executes the request and processes the response. + /// - Parameter eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function uses a shared instance of `HTTPClient`. + /// - Returns: An array of `String` containing the names of all databases available on the server. + /// - Throws: A `CouchDBClientError` if the request fails or if the response lacks required data. /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. Finally, it decodes the response data into an array of strings representing the database names. + /// ### Function Workflow: + /// 1. The function authenticates with the CouchDB server if authentication is required. + /// 2. An `HTTPClient` instance is created—either shared or scoped to the provided `EventLoopGroup`. + /// 3. The request URL is built using the server's `/all_dbs` endpoint. + /// 4. The function sends the `GET` request to CouchDB and processes the response. + /// 5. If the response status is `.unauthorized`, a `CouchDBClientError.unauthorized` is thrown. + /// 6. The response body is collected, with size limits based on `content-length` or a default maximum. + /// 7. The collected data is decoded into an array of database names. /// - /// Example usage: + /// ### Example Usage: /// ```swift /// let dbNames = try await couchDBClient.getAllDBs() + /// print("Available databases: \(dbNames)") /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle any thrown errors appropriately, particularly authentication-related issues. + public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -284,22 +291,35 @@ public actor CouchDBClient { /// Checks if a database exists on the CouchDB server. /// - /// This asynchronous function sends a HEAD request to the CouchDB server to determine the existence of a specified database. It can optionally use a custom NIO's `EventLoopGroup` for the network request. + /// This asynchronous function sends a `HEAD` request to the CouchDB server to verify the existence of a specified database. + /// It supports using a custom NIO's `EventLoopGroup` for managing network operations. /// /// - Parameters: /// - dbName: The name of the database to check for existence. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - eventLoopGroup: An optional `EventLoopGroup` used for executing network requests. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: A `Bool` indicating whether the database exists (`true`) or not (`false`). - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and checks the response status. - /// - /// Example usage: + /// - Throws: A `CouchDBClientError` if the operation fails, including: + /// - `.unauthorized`: If authentication fails. + /// - `.noData`: If the response lacks required data. + /// + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if authentication is required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL using the provided database name. + /// 4. Sends a `HEAD` request to the CouchDB server to check the database existence. + /// 5. Processes the server's response and checks its HTTP status code. + /// 6. Returns `true` for a `.ok` response status and `false` otherwise. + /// + /// ### Example Usage: /// ```swift /// let doesExist = try await couchDBClient.dbExists("myDatabase") + /// print("Database exists: \(doesExist)") /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially authentication-related issues. + public func dbExists(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Bool { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -333,26 +353,36 @@ public actor CouchDBClient { /// Creates a new database on the CouchDB server. /// - /// This asynchronous function sends a PUT request to the CouchDB server to create a new database with the specified name. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `PUT` request to the CouchDB server to create a new database with the specified name. + /// It supports using a custom `EventLoopGroup` for network operations, providing flexibility for managing event loops. /// /// - Parameters: /// - dbName: The name of the database to be created. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Returns: An `UpdateDBResponse` object containing the result of the database creation operation. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, or a `noData` error if there is no response data. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and processes the response. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into an `UpdateDBResponse` object. - /// - /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. - /// - /// Example usage: + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. + /// - Returns: An `UpdateDBResponse` object that contains the result of the database creation operation. + /// - Throws: A `CouchDBClientError` if the operation fails, including: + /// - `.unauthorized`: If authentication fails. + /// - `.noData`: If the response lacks required data. + /// - `.insertError`: If the database creation fails and CouchDB returns an error. + /// + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL using the specified database name. + /// 4. Sends a `PUT` request to the CouchDB server to create the database. + /// 5. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 6. Decodes the response body into an `UpdateDBResponse` object if successful. + /// 7. If decoding fails, attempts to decode the response into a `CouchDBError` object and throws it as an `.insertError`. + /// + /// ### Example Usage: /// ```swift /// let creationResult = try await couchDBClient.createDB("newDatabase") + /// print("Database creation successful: \(creationResult.ok)") /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and potential conflicts if the database already exists. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle any thrown errors appropriately, including authentication issues and potential conflicts if the database already exists. @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -406,26 +436,36 @@ public actor CouchDBClient { /// Deletes a database from the CouchDB server. /// - /// This asynchronous function sends a DELETE request to the CouchDB server to remove a database with the specified name. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `DELETE` request to the CouchDB server to remove a database with the specified name. + /// It supports using a custom `EventLoopGroup` for managing network operations. /// /// - Parameters: - /// - dbName: The name of the database to be deleted. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Returns: An `UpdateDBResponse` object containing the result of the database deletion operation. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, or a `noData` error if there is no response data. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL and request for the database, it executes the request and processes the response. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into an `UpdateDBResponse` object. - /// - /// If the decoding fails, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. - /// - /// Example usage: + /// - dbName: The name of the database to delete. + /// - eventLoopGroup: An optional `EventLoopGroup` used for executing network operations. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. + /// - Returns: An `UpdateDBResponse` object that contains the result of the database deletion operation. + /// - Throws: A `CouchDBClientError` if the operation fails, including: + /// - `.unauthorized`: If authentication fails. + /// - `.noData`: If the response lacks required data. + /// - `.insertError`: If the deletion fails and CouchDB returns an error. + /// + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL using the specified database name. + /// 4. Sends a `DELETE` request to the CouchDB server to delete the database. + /// 5. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 6. Decodes the response body into an `UpdateDBResponse` object if successful. + /// 7. If decoding fails, attempts to decode the response into a `CouchDBError` object and throws it as an `.deleteError`. + /// + /// ### Example Usage: /// ```swift /// let deletionResult = try await couchDBClient.deleteDB("obsoleteDatabase") + /// print("Database deletion successful: \(deletionResult.ok)") /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and potential conflicts if the database does not exist. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially authentication issues and conflicts if the database does not exist. @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -471,7 +511,7 @@ public actor CouchDBClient { return decodedResponse } catch let parsingError { if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.insertError(error: couchdbError) + throw CouchDBClientError.deleteError(error: couchdbError) } throw parsingError } From e0de8053ab08b382b746a0c5b84a426f13b9cc32 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:07:24 +0700 Subject: [PATCH 110/202] docs wip --- Sources/CouchDBClient/CouchDBClient.swift | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 187ab8d..c362498 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -299,9 +299,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` used for executing network requests. /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: A `Bool` indicating whether the database exists (`true`) or not (`false`). - /// - Throws: A `CouchDBClientError` if the operation fails, including: - /// - `.unauthorized`: If authentication fails. - /// - `.noData`: If the response lacks required data. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data. /// /// ### Function Workflow: /// 1. Authenticates with the CouchDB server if authentication is required. @@ -361,10 +359,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: An `UpdateDBResponse` object that contains the result of the database creation operation. - /// - Throws: A `CouchDBClientError` if the operation fails, including: - /// - `.unauthorized`: If authentication fails. - /// - `.noData`: If the response lacks required data. - /// - `.insertError`: If the database creation fails and CouchDB returns an error. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data, `.insertError` if the database creation fails and CouchDB returns an error. /// /// ### Function Workflow: /// 1. Authenticates with the CouchDB server if required. @@ -444,10 +439,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` used for executing network operations. /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: An `UpdateDBResponse` object that contains the result of the database deletion operation. - /// - Throws: A `CouchDBClientError` if the operation fails, including: - /// - `.unauthorized`: If authentication fails. - /// - `.noData`: If the response lacks required data. - /// - `.insertError`: If the deletion fails and CouchDB returns an error. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data, `.insertError` if the deletion fails and CouchDB returns an error. /// /// ### Function Workflow: /// 1. Authenticates with the CouchDB server if required. From fd63ca5213c3e86710ad014a5371712eb2d10354 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:08:26 +0700 Subject: [PATCH 111/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 127 +++++++++++++--------- 1 file changed, 75 insertions(+), 52 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index c362498..476022d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -511,40 +511,47 @@ public actor CouchDBClient { /// Fetches data from a specified database and URI on the CouchDB server. /// - /// This asynchronous function sends a GET request to the CouchDB server to retrieve data from a specific database and URI. It can optionally use a custom `EventLoopGroup` for the network request and include query items. + /// This asynchronous function sends a `GET` request to the CouchDB server to retrieve data from a specific database and resource URI. + /// It supports using a custom `EventLoopGroup` for network operations and allows the inclusion of query parameters. /// /// - Parameters: /// - dbName: The name of the database from which to fetch data. - /// - uri: The URI path to the specific resource or endpoint within the database (view or document id). + /// - uri: The URI path of the specific resource or endpoint within the database (e.g., document ID or view path). /// - queryItems: An optional array of `URLQueryItem` to specify query parameters for the request. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: An `HTTPClientResponse` object containing the server's response to the request. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, URI, and query items, it executes the request and processes the response. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. The response body is then updated with the collected bytes before returning. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data. /// - /// Example usage: + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance, either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Builds the request URL using the database name, resource URI, and optional query items. + /// 4. Sends a `GET` request to the CouchDB server and processes the server's response. + /// 5. If the response status is `.unauthorized`, throws a `CouchDBClientError.unauthorized` error. + /// 6. Updates the response body with the collected data bytes before returning. /// - /// Define your document data model: + /// ### Example Usage: + /// #### Define Your Document Data Model /// ```swift - /// // Example struct /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = NSUUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` - /// Get document by ID: + /// + /// #### Fetch Document by ID: /// ```swift - /// // get data from DB by document ID - /// var response = try await couchDBClient.get( + /// let response = try await couchDBClient.get( /// fromDB: "myDatabase", /// uri: "documentID" /// ) /// - /// // parse JSON /// let expectedBytes = response.headers /// .first(name: "content-length") /// .flatMap(Int.init) ?? 1024 * 1024 * 10 @@ -555,16 +562,17 @@ public actor CouchDBClient { /// ExpectedDoc.self, /// from: data! /// ) + /// print(doc) /// ``` /// - /// You can also provide a CouchDB view document as uri and key in the query. - /// - /// Get data and parse `RowsResponse`: + /// #### Fetch Data from a CouchDB View: /// ```swift /// let response = try await couchDBClient.get( /// fromDB: "myDatabase", /// uri: "_design/all/_view/by_url", - /// query: ["key": "\"\(url)\""] + /// queryItems: [ + /// URLQueryItem(name: "key", value: "\"\(url)\"") + /// ] /// ) /// /// let expectedBytes = response.headers @@ -577,12 +585,10 @@ public actor CouchDBClient { /// RowsResponse.self, /// from: data! /// ) - /// /// print(decodedResponse.rows) - /// print(decodedResponse.rows.first?.value) /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. + /// - Note: Ensure that the CouchDB server is running and accessible. Handle thrown errors appropriately, especially for authentication issues. public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -623,45 +629,52 @@ public actor CouchDBClient { /// Retrieves a document of a specified type from a database on the CouchDB server. /// - /// This asynchronous generic function sends a GET request to the CouchDB server to retrieve a document from a specific database and URI. It decodes the document into the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request, include query items, and specify a date decoding strategy. + /// This asynchronous generic function sends a `GET` request to the CouchDB server to retrieve a document + /// from a specific database and resource URI. The retrieved data is decoded into the specified `CouchDBRepresentable` type. + /// It supports using a custom `EventLoopGroup`, query parameters, and a configurable date decoding strategy. /// /// - Parameters: /// - dbName: The name of the database from which to fetch the document. - /// - uri: The URI path to the specific document within the database. + /// - uri: The URI path of the specific document within the database (e.g., a document ID). /// - queryItems: An optional array of `URLQueryItem` to specify query parameters for the request. - /// - dateDecodingStrategy: The strategy to use for decoding dates. Defaults to `.secondsSince1970`. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - dateDecodingStrategy: The date decoding strategy to use when decoding dates. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function uses a shared `HTTPClient`. /// - Returns: A document of type `T`, where `T` conforms to `CouchDBRepresentable`. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or a `getError` with the underlying `CouchDBError` if the decoding fails. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, URI, and query items, it executes the request and processes the response. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. It collects the response body up to a specified byte limit or the `content-length` header's value. The function then uses a `JSONDecoder` with the specified date decoding strategy to decode the response data into the specified type `T`. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data, `.getError` if the document decoding fails, with the underlying `CouchDBError`. /// - /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws a `getError` with the decoded error. If this also fails, it throws the original parsing error. - /// - /// Example usage: + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Sends a `GET` request to the specified database and URI, optionally including query parameters. + /// 3. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 4. Decodes the response body into the specified type `T` using a `JSONDecoder` configured with the provided date decoding strategy. + /// 5. If decoding fails, attempts to decode the response as a `CouchDBError` and throws it as a `.getError`. /// - /// Define your document model: + /// ### Example Usage: + /// #### Define Your Document Model: /// ```swift - /// // Example struct /// struct MyDocumentType: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = UUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return MyDocumentType(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` /// - /// Get document by ID: + /// #### Retrieve a Document by ID: /// ```swift - /// // get data from the database by document ID /// let doc: MyDocumentType = try await couchDBClient.get( /// fromDB: "myDatabase", /// uri: "documentID" /// ) + /// print(doc) /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and data decoding. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for authentication failures and data decoding issues. public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let response: HTTPClientResponse = try await get(fromDB: dbName, uri: uri, queryItems: queryItems, eventLoopGroup: eventLoopGroup) @@ -693,31 +706,41 @@ public actor CouchDBClient { /// Performs a query to find documents in a database on the CouchDB server that match the given selector. /// - /// This asynchronous generic function sends a query to the CouchDB server to find documents in a specific database that match the criteria defined by the selector. It decodes the resulting documents into an array of the specified `CouchDBRepresentable` type. The function can optionally use a custom `EventLoopGroup` for the network request and specify a date decoding strategy. + /// This asynchronous generic function sends a query to the CouchDB server to search for documents in a specific database + /// based on the criteria defined by the selector. The resulting documents are decoded into an array of the specified + /// `CouchDBRepresentable` type. It supports using a custom `EventLoopGroup` for network operations and allows the specification + /// of a custom date decoding strategy. /// /// - Parameters: /// - dbName: The name of the database in which to perform the query. - /// - selector: A `Codable` object that defines the criteria used to select documents. - /// - dateDecodingStrategy: The strategy to use for decoding dates within the documents. Defaults to `.secondsSince1970`. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - selector: A `Codable` object that defines the criteria for selecting documents. + /// - dateDecodingStrategy: The date decoding strategy to use for decoding dates within the documents. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. /// - Returns: An array of documents of type `T`, where `T` conforms to `CouchDBRepresentable`. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically a `noData` error if there is no response data, or a `findError` with the underlying `CouchDBError` if the decoding fails. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.noData` if the response lacks required data, `.findError` if decoding fails, with the underlying `CouchDBError`. /// - /// The function encodes the selector into JSON and sends it as the body of the request. It then processes the response from the server, collecting the response body up to a specified byte limit or the `content-length` header's value. The function uses a `JSONDecoder` with the specified date decoding strategy to decode the response data into a `CouchDBFindResponse` object, from which it extracts and returns the documents. - /// - /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws a `findError` with the decoded error. If this also fails, it throws the original parsing error. + /// ### Function Workflow: + /// 1. Encodes the selector criteria into JSON format and includes it as the request body. + /// 2. Sends the query request to the specified database on the CouchDB server. + /// 3. Collects the response body up to a size limit defined by `content-length` or a default maximum. + /// 4. Uses a `JSONDecoder` configured with the specified date decoding strategy to decode the response data + /// into a `CouchDBFindResponse` object. + /// 5. Extracts and returns the documents from the `CouchDBFindResponse` object. + /// 6. Handles decoding errors by attempting to decode a `CouchDBError` object and throwing it as `.findError`. /// - /// Example usage: + /// ### Example Usage: /// ```swift - /// // find documents in the database by selector /// let selector = ["selector": ["name": "Sam"]] /// let documents: [MyDocumentType] = try await couchDBClient.find( /// inDB: "myDatabase", /// selector: selector /// ) + /// print(documents) /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with data decoding and query criteria. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for data decoding issues or query mismatches. public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) From 341b0942ca7a5c186f29fd5bb296ebaf79e63370 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:10:32 +0700 Subject: [PATCH 112/202] wip --- Sources/CouchDBClient/CouchDBClient.swift | 33 +++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 476022d..d5f9397 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -776,25 +776,33 @@ public actor CouchDBClient { /// Executes a find query on a specified database on the CouchDB server. /// - /// This asynchronous function sends a POST request with a custom body to the CouchDB server's `_find` endpoint to execute a query in the specified database. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `POST` request with a custom body to the CouchDB server's `_find` endpoint to perform a query + /// in the specified database. It allows the use of a custom `EventLoopGroup` for network operations. /// /// - Parameters: - /// - dbName: The name of the database in which to perform the find query. + /// - dbName: The name of the database in which to execute the query. /// - body: The `HTTPClientRequest.Body` containing the encoded query to be sent to the server. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. + /// If not provided, the function uses a shared instance of `HTTPClient`. /// - Returns: An `HTTPClientResponse` object containing the server's response to the find query. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the `_find` endpoint, it sets the request body and executes the request. + /// - Throws: A `CouchDBClientError` if the operation fails, including: + /// - `.unauthorized`: If authentication fails. /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. The response body is then updated with the collected bytes before returning. + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL for the `_find` endpoint using the database name. + /// 4. Sets the request body with the encoded query and sends a `POST` request to the CouchDB server. + /// 5. Processes the server's response, throwing errors for unauthorized access. + /// 6. Updates the response body with the collected bytes before returning the response object. /// - /// Example usage: + /// ### Example Usage: + /// #### Perform a Find Query: /// ```swift /// let selector = ["selector": ["name": "Greg"]] /// let bodyData = try JSONEncoder().encode(selector) - /// var findResponse = try await couchDBClient.find( - /// inDB: testsDB, + /// let findResponse = try await couchDBClient.find( + /// inDB: "myDatabase", /// body: .data(bodyData) /// ) /// @@ -803,9 +811,12 @@ public actor CouchDBClient { /// CouchDBFindResponse.self, /// from: Data(bytes) /// ).docs + /// print(docs) /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially authentication-related issues. + public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 3b070856692a3d66622c7203c918150c6ebb4e0b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:25:57 +0700 Subject: [PATCH 113/202] wip --- Sources/CouchDBClient/CouchDBClient.swift | 66 ++++++++++++++--------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index d5f9397..6750377 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -858,62 +858,78 @@ public actor CouchDBClient { /// Updates a document in a specified database on the CouchDB server. /// - /// This asynchronous function sends a PUT request to the CouchDB server to update a document at the specified URI within the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `PUT` request to the CouchDB server to update a document at a given URI within a specified database. + /// It allows the use of a custom `EventLoopGroup` for network operations. /// /// - Parameters: /// - dbName: The name of the database containing the document to be updated. - /// - uri: The URI path to the specific document within the database. - /// - body: The `HTTPClientRequest.Body` containing the updated content for the document. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - uri: The URI path of the specific document within the database. + /// - body: The `HTTPClientRequest.Body` containing the updated content of the document. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function uses a shared instance of `HTTPClient`. /// - Returns: A `CouchUpdateResponse` object containing the result of the update operation. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or an `updateError` with the underlying `CouchDBError` if the decoding fails. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the document, it sets the request body and executes the request. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. - /// - /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws an `updateError` with the decoded error. If this also fails, it throws the original parsing error. + /// - Throws: A `CouchDBClientError` if the operation fails, including: + /// - `.unauthorized`: If authentication fails. + /// - `.noData`: If the response lacks required data. + /// - `.updateError`: If decoding the response fails, with the underlying `CouchDBError`. /// - /// Example usage: + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL for the document using the database name and URI. + /// 4. Sets the request body with the updated document content and sends a `PUT` request to the server. + /// 5. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 6. Decodes the response body into a `CouchUpdateResponse` object and returns it. + /// 7. If decoding fails, attempts to decode the response as a `CouchDBError` and throws it as `.updateError`. /// - /// Define your document model: + /// ### Example Usage: + /// #### Define Your Document Model: /// ```swift - /// // Example struct /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = UUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` - /// Get document by ID and update it: + /// + /// #### Update a Document: /// ```swift - /// // get data from the database by document ID + /// // Fetch the document by ID /// var response = try await couchDBClient.get( /// fromDB: "myDatabase", /// uri: "documentID" /// ) /// - /// // parse JSON + /// // Parse the document /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! - /// var doc = try JSONDecoder().decode(ExpectedDoc.self, from: Data(bytes)) + /// var doc = try JSONDecoder().decode( + /// ExpectedDoc.self, + /// from: Data(bytes) + /// ) /// - /// // update some value + /// // Modify the document /// doc.name = "Updated name" /// - /// // encode document into a JSON string - /// let data = try encoder.encode(updatedData) + /// // Encode the updated document into JSON + /// let data = try JSONEncoder().encode(doc) /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: data)) /// - /// let response = try await couchDBClient.update( + /// // Send the update request + /// let updateResponse = try await couchDBClient.update( /// dbName: "myDatabase", /// uri: doc._id!, /// body: body /// ) /// - /// print(response) + /// print(updateResponse) /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document updates. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for authentication or data-related issues. public func update(dbName: String, uri: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From bb4e14e21889a44cb35d545b7176e3e3b7df0da9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:32:13 +0700 Subject: [PATCH 114/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 120 ++++++++++++---------- 1 file changed, 68 insertions(+), 52 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 6750377..598e427 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -785,8 +785,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. /// If not provided, the function uses a shared instance of `HTTPClient`. /// - Returns: An `HTTPClientResponse` object containing the server's response to the find query. - /// - Throws: A `CouchDBClientError` if the operation fails, including: - /// - `.unauthorized`: If authentication fails. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized`: If authentication fails. /// /// ### Function Workflow: /// 1. Authenticates with the CouchDB server if required. @@ -868,10 +867,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. /// If not provided, the function uses a shared instance of `HTTPClient`. /// - Returns: A `CouchUpdateResponse` object containing the result of the update operation. - /// - Throws: A `CouchDBClientError` if the operation fails, including: - /// - `.unauthorized`: If authentication fails. - /// - `.noData`: If the response lacks required data. - /// - `.updateError`: If decoding the response fails, with the underlying `CouchDBError`. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data, `.updateError` if decoding the response fails, with the underlying `CouchDBError`. /// /// ### Function Workflow: /// 1. Authenticates with the CouchDB server if required. @@ -907,9 +903,9 @@ public actor CouchDBClient { /// // Parse the document /// let bytes = response.body!.readBytes(length: response.body!.readableBytes)! /// var doc = try JSONDecoder().decode( - /// ExpectedDoc.self, - /// from: Data(bytes) - /// ) + /// ExpectedDoc.self, + /// from: Data(bytes) + /// ) /// /// // Modify the document /// doc.name = "Updated name" @@ -983,50 +979,62 @@ public actor CouchDBClient { /// Updates a document conforming to `CouchDBRepresentable` in a specified database on the CouchDB server. /// - /// This asynchronous generic function updates a document in the specified database. The document must conform to the `CouchDBRepresentable` protocol, which requires `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request and specify a date encoding strategy. + /// This asynchronous generic function updates a document in the specified database. The document must conform to the + /// `CouchDBRepresentable` protocol, which requires `_id` and `_rev` properties. The function supports using a custom + /// `EventLoopGroup` for network operations and allows a configurable date encoding strategy. /// /// - Parameters: /// - dbName: The name of the database containing the document to be updated. /// - doc: A reference to the document of type `T` that will be updated. The document must have valid `_id` and `_rev` properties. - /// - dateEncodingStrategy: The strategy to use for encoding dates within the document. Defaults to `.secondsSince1970`. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Throws: An error of type `CouchDBClientError` if the document's `_id` or `_rev` is missing, or if the server responds with an unknown response. - /// - /// The function first checks for the presence of the document's `_id` and `_rev`. It then encodes the document using a `JSONEncoder` with the specified date encoding strategy. The encoded document is sent as the body of a PUT request to the server. + /// - dateEncodingStrategy: The date encoding strategy to use when encoding dates in the document. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function uses a shared instance of `HTTPClient`. + /// - Returns: The updated document of type `T`, with its `_rev` property reflecting the new revision token. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.revMissing` if the document's `_rev` is missing or empty, `.unknownResponse` if the server's response is not successful or unexpected. /// - /// If the server's response indicates success, the function updates the document's `_rev` (and `_id` if necessary) with the new revision information from the server. If the server's response is not successful, it throws an `unknownResponse` error. + /// ### Function Workflow: + /// 1. Verifies that the document has a valid `_rev` property. + /// 2. Encodes the document using a `JSONEncoder` configured with the specified date encoding strategy. + /// 3. Constructs the request body using the encoded document data. + /// 4. Sends a `PUT` request to update the document in the specified database. + /// 5. Processes the server's response and throws an error if the operation fails. + /// 6. Updates the document's `_rev` (and `_id` if necessary) based on the server's response. /// - /// Example usage: - /// Define your document model: + /// ### Example Usage: + /// #### Define Your Document Model: /// ```swift - /// // Example struct - /// struct MyCouchDBDocument: CouchDBRepresentable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = UUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` - /// Get a document by ID and update it: + /// + /// #### Retrieve and Update a Document: /// ```swift - /// // get data from the database by document ID - /// var doc: MyCouchDBDocument = try await couchDBClient.get( + /// var doc: ExpectedDoc = try await couchDBClient.get( /// fromDB: "myDatabase", /// uri: "documentID" /// ) - /// print(doc) /// - /// // Update value + /// // Modify the document /// doc.name = "Updated name" /// - /// try await couchDBClient.update( + /// // Update the document in the database + /// doc = try await couchDBClient.update( /// dbName: "myDatabase", - /// doc: &doc + /// doc: doc /// ) /// - /// print(doc) // doc will have updated name and _rev values now + /// print(doc) // Document now includes the updated name and a new `_rev` value /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document updates and server responses. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for document updates and server responses. public func update(dbName: String, doc: T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { guard doc._rev?.isEmpty == false else { throw CouchDBClientError.revMissing } @@ -1052,49 +1060,57 @@ public actor CouchDBClient { /// Inserts a new document into a specified database on the CouchDB server. /// - /// This asynchronous function sends a POST request to the CouchDB server to insert a new document into the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `POST` request to the CouchDB server to insert a new document into the given database. + /// It allows the use of a custom `EventLoopGroup` for managing network operations. /// /// - Parameters: /// - dbName: The name of the database into which the new document will be inserted. - /// - body: The `HTTPClientRequest.Body` containing the content of the new document. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Returns: A `CouchUpdateResponse` object containing the result of the insert operation. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`, a `noData` error if there is no response data, or an `insertError` with the underlying `CouchDBError` if the decoding fails. - /// - /// The function first authenticates with the server if needed. It then creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL for the database, it sets the request body and executes the request. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. - /// - /// If the decoding process encounters an error, it attempts to decode a `CouchDBError` object and throws an `insertError` with the decoded error. If this also fails, it throws the original parsing error. + /// - body: The `HTTPClientRequest.Body` containing the JSON-encoded content of the new document. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. + /// If not provided, the function uses a shared instance of `HTTPClient`. + /// - Returns: A `CouchUpdateResponse` object containing the result of the insertion operation. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData` if the response lacks required data, `.insertError` if decoding the response fails, with the underlying `CouchDBError`. /// - /// Example usage: + /// ### Function Workflow: + /// 1. Authenticates with the CouchDB server if required. + /// 2. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 3. Constructs the request URL using the database name. + /// 4. Sets the request body with the JSON-encoded content of the new document and sends a `POST` request to the server. + /// 5. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 6. Decodes the response body into a `CouchUpdateResponse` object and returns it. + /// 7. Handles decoding errors by attempting to decode the response as a `CouchDBError` and throws it as `.insertError`. /// - /// Define your document model: + /// ### Example Usage: + /// #### Define Your Document Model: /// ```swift - /// // Example struct - /// struct MyCouchDBDocument: CouchDBRepresentable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = UUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` /// - /// Create a new document and insert: + /// #### Create and Insert a Document: /// ```swift - /// let testDoc = MyCouchDBDocument(name: "My name") - /// let data = try JSONEncoder().encode(testData) + /// let testDoc = ExpectedDoc(name: "My name") + /// let encodedData = try JSONEncoder().encode(testDoc) /// - /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: insertEncodeData)) + /// let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: encodedData)) /// /// let response = try await couchDBClient.insert( /// dbName: "myDatabase", /// body: body /// ) /// - /// print(response) + /// print(response) // Response includes operation status and revision token /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document insertion. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 7cee97b762a962c6eb2b97eaca4b70df99159bf7 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:37:13 +0700 Subject: [PATCH 115/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 105 +++++++++++++--------- 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 598e427..1049f74 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1165,43 +1165,53 @@ public actor CouchDBClient { /// Inserts a new document conforming to `CouchDBRepresentable` into a specified database on the CouchDB server. /// - /// This asynchronous generic function inserts a new document into the specified database. The document must conform to the `CouchDBRepresentable` protocol, which includes `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request and specify a date encoding strategy. + /// This asynchronous generic function inserts a new document into the specified database. The document must conform to the + /// `CouchDBRepresentable` protocol, which requires `_id` and `_rev` properties. It supports using a custom `EventLoopGroup` for + /// network operations and allows a configurable date encoding strategy. /// /// - Parameters: - /// - dbName: The name of the database into which the new document will be inserted. - /// - doc: A reference to the document of type `T` that will be inserted. The document type `T` must conform to `CouchDBRepresentable`. - /// - dateEncodingStrategy: The strategy to use for encoding dates within the document. Defaults to `.secondsSince1970`. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. - /// - Throws: An error of type `CouchDBClientError` if the server responds with an unknown response. - /// - /// The function encodes the document using a `JSONEncoder` with the specified date encoding strategy. The encoded document is sent as the body of a POST request to the server. + /// - dbName: The name of the database where the new document will be inserted. + /// - doc: The document of type `T` to be inserted. The type `T` must conform to `CouchDBRepresentable`. + /// - dateEncodingStrategy: The strategy used for encoding dates within the document. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` for managing network operations. If not provided, a shared instance of `HTTPClient` is used. + /// - Returns: The newly inserted document of type `T`, updated with its `_id` and `_rev` properties. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unknownResponse` if the server's response is unexpected or unsuccessful. /// - /// If the server's response indicates success, the function updates the document's `_rev` (and `_id` if necessary) with the new revision information from the server. If the server's response is not successful, it throws an `unknownResponse` error. + /// ### Function Workflow: + /// 1. Encodes the document using a `JSONEncoder` configured with the specified date encoding strategy. + /// 2. Prepares a `POST` request with the encoded document as the request body. + /// 3. Sends the request to the CouchDB server and processes the response. + /// 4. Updates the document's `_id` and `_rev` based on the server's response. + /// 5. Throws an error if the server's response is unexpected or unsuccessful. /// - /// Example usage: - /// Define your document model: + /// ### Example Usage: + /// #### Define Your Document Model: /// ```swift - /// // Example struct - /// struct MyCouchDBDocument: CouchDBRepresentable { + /// struct ExpectedDoc: CouchDBRepresentable { /// var name: String - /// var _id: String? + /// var _id: String = UUID().uuidString /// var _rev: String? + /// + /// func updateRevision(_ newRevision: String) -> Self { + /// return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + /// } /// } /// ``` /// - /// Create a new document and insert: + /// #### Insert a New Document: /// ```swift - /// var testDoc = MyCouchDBDocument(name: "My name") + /// var testDoc = ExpectedDoc(name: "My name") /// - /// try await couchDBClient.insert( + /// testDoc = try await couchDBClient.insert( /// dbName: "myDatabase", - /// doc: &testDoc + /// doc: testDoc /// ) /// - /// print(testDoc) // testDoc has _id and _rev values now + /// print(testDoc) // Document now contains its assigned `_id` and `_rev`. /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document insertion and server responses. + /// - Note: Ensure that the CouchDB server is operational and accessible before using this function. + /// Handle thrown errors appropriately, especially for unexpected server responses. public func insert(dbName: String, doc: T, dateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> T { let encoder = JSONEncoder() encoder.dateEncodingStrategy = dateEncodingStrategy @@ -1224,32 +1234,38 @@ public actor CouchDBClient { /// Deletes a document from a specified database on the CouchDB server. /// - /// This asynchronous function sends a DELETE request to the CouchDB server to remove a document identified by its URI and revision number from the given database. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function sends a `DELETE` request to the CouchDB server to remove a document identified by its URI and revision number. + /// It supports using a custom `EventLoopGroup` for managing network operations. /// /// - Parameters: /// - dbName: The name of the database from which the document will be deleted. - /// - uri: The URI path to the specific document within the database. + /// - uri: The URI path of the specific document within the database. /// - rev: The revision number of the document to be deleted. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. + /// If not provided, the function uses a shared instance of `HTTPClient`. /// - Returns: A `CouchUpdateResponse` object containing the result of the delete operation. - /// - Throws: An error of type `CouchDBClientError` if the request fails, specifically an `unauthorized` error if the response status is `.unauthorized`. - /// - /// The function creates an `HTTPClient` instance, either shared or using the provided `EventLoopGroup`. After building the URL with the database name, document URI, and revision query parameter, it executes the DELETE request. - /// - /// If the response status is `.unauthorized`, it throws an `unauthorized` error. The function collects the response body up to a specified byte limit or the `content-length` header's value. It then decodes the response data into a `CouchUpdateResponse` object. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.unauthorized` if authentication fails, `.noData`: if the response lacks required data. /// - /// If there is no response data, the function returns a `CouchUpdateResponse` with `ok` set to `false`, indicating the delete operation was not successful. + /// ### Function Workflow: + /// 1. Creates an `HTTPClient` instance—either scoped to the provided `EventLoopGroup` or using the shared instance. + /// 2. Constructs the request URL using the database name, document URI, and revision query parameter. + /// 3. Sends a `DELETE` request to remove the document from the CouchDB server. + /// 4. Processes the server's response, throwing errors for unauthorized access or missing data. + /// 5. Decodes the response body into a `CouchUpdateResponse` object if the deletion is successful. + /// 6. Returns a `CouchUpdateResponse` with `ok` set to `false` if there is no response data. /// - /// Example usage: + /// ### Example Usage: /// ```swift /// let response = try await couchDBClient.delete( /// fromDb: "myDatabase", - /// uri: doc._id, - /// rev: doc._rev + /// uri: "documentID", + /// rev: "documentRevision" /// ) + /// print(response) // Response includes operation status and revision token /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with authentication issues and document deletion. + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { let httpClient: HTTPClient if let eventLoopGroup = eventLoopGroup { @@ -1295,26 +1311,35 @@ public actor CouchDBClient { /// Deletes a document conforming to `CouchDBRepresentable` from a specified database on the CouchDB server. /// - /// This asynchronous function deletes a document from the specified database. The document must conform to the `CouchDBRepresentable` protocol, which includes `_id` and `_rev` properties. It can optionally use a custom `EventLoopGroup` for the network request. + /// This asynchronous function removes a document from the specified database. The document must conform to the + /// `CouchDBRepresentable` protocol, which includes the `_id` and `_rev` properties required for the deletion process. + /// It supports using a custom `EventLoopGroup` for network operations. /// /// - Parameters: /// - dbName: The name of the database from which the document will be deleted. - /// - doc: The document that will be deleted. The document type must conform to `CouchDBRepresentable`. - /// - eventLoopGroup: An optional `EventLoopGroup` that the function will use for its network operations. If not provided, the function uses a shared `HTTPClient`. + /// - doc: The document of type `CouchDBRepresentable` to be deleted. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network requests. + /// If not provided, a shared instance of `HTTPClient` is used. /// - Returns: A `CouchUpdateResponse` object containing the result of the delete operation. - /// - Throws: An error of type `CouchDBClientError` if the document's `_id` or `_rev` is missing. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.revMissing` if the document's `_rev` property is missing. /// - /// The function checks for the presence of the document's `_id` and `_rev`. It then calls the `delete(fromDb:uri:rev:eventLoopGroup:)` function with the document's `_id` and `_rev` to perform the deletion. + /// ### Function Workflow: + /// 1. Validates the presence of the document's `_rev` property. + /// 2. Calls `delete(fromDb:uri:rev:eventLoopGroup:)` with the document's `_id` and `_rev` to execute the deletion. + /// 3. Processes and returns the server's response as a `CouchUpdateResponse` object. /// - /// Example usage: + /// ### Example Usage: /// ```swift /// let deleteResult = try await couchDBClient.delete( /// fromDb: "myDatabase", /// doc: myDocument /// ) + /// print(deleteResult) // Response includes operation status and revision token /// ``` /// - /// - Note: Ensure that the CouchDB server is running and accessible. Handle any thrown errors appropriately, especially when dealing with document deletion. + /// - Note: Ensure that the CouchDB server is operational and accessible before using this function. + /// Handle thrown errors appropriately, especially for missing document properties or unexpected server responses. + public func delete(fromDb dbName: String, doc: CouchDBRepresentable, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { guard let rev = doc._rev else { throw CouchDBClientError.revMissing } From 9be480b7a0945baad9d2f39092a2339f4049216d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 15:51:47 +0700 Subject: [PATCH 116/202] get only _rev --- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 158fa55..7c9c5a2 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -32,7 +32,7 @@ public protocol CouchDBRepresentable: Codable, Sendable { /// The MVCC (Multi-Version Concurrency Control) revision token for the document. /// Used for tracking changes to the document and resolving conflicts in CouchDB. /// - Note: This property is optional and can be set to `nil` for new documents. - var _rev: String? { get set } + var _rev: String? { get } /// Creates a new instance of the conforming type with the updated revision token. /// - Parameter newRevision: The new MVCC revision token to associate with the document. From ece077a09d622416b1562bd3b5604f782b0b24c5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 16:23:44 +0700 Subject: [PATCH 117/202] tutorials updated --- .../ErrorsHandlingTutorial-1.swift | 6 +- .../ErrorsHandlingTutorial-2.swift | 6 +- .../ErrorsHandlingTutorial-3.swift | 6 +- .../ErrorsHandlingTutorial-4.swift | 6 +- .../Tutorials/SwiftUI/SwiftUITutorial-1.swift | 18 +-- .../Tutorials/SwiftUI/SwiftUITutorial-2.swift | 18 +-- .../Tutorials/SwiftUI/SwiftUITutorial-3.swift | 31 ++--- .../Tutorials/SwiftUI/SwiftUITutorial-4.swift | 53 +++++--- .../Tutorials/SwiftUI/SwiftUITutorial-5.swift | 91 ++++++++------ .../Tutorials/SwiftUI/SwiftUITutorial-6.swift | 115 ++++++++++-------- .../Tutorials/macOS/macOSTutorial-1.swift | 1 - .../Tutorials/macOS/macOSTutorial-3.swift | 13 +- .../Tutorials/macOS/macOSTutorial-4.swift | 23 ++-- .../Tutorials/macOS/macOSTutorial-5.swift | 29 +++-- .../Tutorials/macOS/macOSTutorial-6.swift | 37 +++--- .../Tutorials/macOS/macOSTutorial-7.swift | 43 ++++--- .../Tutorials/macOS/macOSTutorial-8.swift | 49 ++++---- .../Tutorials/vapor/VaporTutorial-0.swift | 71 ++++++----- .../Tutorials/vapor/VaporTutorial-1.swift | 6 +- .../Tutorials/vapor/VaporTutorial-2.swift | 15 ++- .../Tutorials/vapor/VaporTutorial-3.swift | 27 ++-- .../Tutorials/vapor/VaporTutorial-4.swift | 47 ++++--- .../Tutorials/vapor/VaporTutorial-5.swift | 70 +++++++---- .../Tutorials/vapor/VaporTutorial-6.swift | 70 +++++++---- .../vapor/VaporTutorial-package-1.swift | 16 +-- .../vapor/VaporTutorial-package-2.swift | 14 ++- 26 files changed, 516 insertions(+), 365 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift index ed19d18..b93a77d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift @@ -1,14 +1,14 @@ Task { var doc = MyDoc(title: "My Document") - try await couchDBClient.insert(dbName: dbName, doc: &doc) + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) print(doc) doc.title = "Updated title" - try await couchDBClient.update(dbName: dbName, doc: &doc) + doc = try await couchDBClient.update(dbName: dbName, doc: doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift index 5d0c975..e659041 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift @@ -2,7 +2,7 @@ Task { var doc = MyDoc(title: "My Document") do { - try await couchDBClient.insert(dbName: dbName, doc: &doc) + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) } catch CouchDBClientError.insertError(let error) { print(error.reason) return @@ -13,10 +13,10 @@ Task { print(doc) doc.title = "Updated title" - try await couchDBClient.update(dbName: dbName, doc: &doc) + doc = try await couchDBClient.update(dbName: dbName, doc: doc) print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift index 0e883b3..8f95002 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift @@ -2,7 +2,7 @@ Task { var doc = MyDoc(title: "My Document") do { - try await couchDBClient.insert(dbName: dbName, doc: &doc) + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) } catch CouchDBClientError.insertError(let error) { print(error.reason) return @@ -14,7 +14,7 @@ Task { doc.title = "Updated title" do { - try await couchDBClient.update(dbName: dbName, doc: &doc) + doc = try await couchDBClient.update(dbName: dbName, doc: doc) } catch CouchDBClientError.updateError(let error) { print(error.reason) return @@ -24,7 +24,7 @@ Task { } print(doc) - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) print(docFromDB) let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift index 840aaf2..5d0ef0d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift @@ -2,7 +2,7 @@ Task { var doc = MyDoc(title: "My Document") do { - try await couchDBClient.insert(dbName: dbName, doc: &doc) + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) } catch CouchDBClientError.insertError(let error) { print(error.reason) return @@ -14,7 +14,7 @@ Task { doc.title = "Updated title" do { - try await couchDBClient.update(dbName: dbName, doc: &doc) + doc = try await couchDBClient.update(dbName: dbName, doc: doc) } catch CouchDBClientError.updateError(let error) { print(error.reason) return @@ -25,7 +25,7 @@ Task { print(doc) do { - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) } catch CouchDBClientError.getError(let error) { print(error.reason) return diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift index acf0f45..68e333b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-1.swift @@ -1,13 +1,13 @@ import SwiftUI struct ContentView: View { - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - } - .padding() - } + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift index 7d3e0b0..a62f40b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-2.swift @@ -2,13 +2,13 @@ import SwiftUI import CouchDBClient struct ContentView: View { - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - } - .padding() - } + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift index 94d6077..c6c34b3 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-3.swift @@ -1,24 +1,25 @@ import SwiftUI import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct ContentView: View { - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - } - .padding() - } + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift index 7947b84..17d2700 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-4.swift @@ -1,30 +1,45 @@ import SwiftUI import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" -class MyDoc: Identifiable, CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String +final class MyDoc: Identifiable, CouchDBRepresentable { + internal init(_id: String = NSUUID().uuidString, _rev: String? = nil, title: String) { + self._id = _id + self._rev = _rev + self.title = title + } + + let _id: String + let _rev: String? + let title: String + + func updateRevision(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: newValue, title: title) + } + + func updateTitle(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: _rev, title: newValue) + } } struct ContentView: View { - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - } - .padding() - } + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift index 26e2eba..f1ac495 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-5.swift @@ -1,57 +1,72 @@ import SwiftUI import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" -class MyDoc: Identifiable, CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String +final class MyDoc: Identifiable, CouchDBRepresentable { + internal init(_id: String = NSUUID().uuidString, _rev: String? = nil, title: String) { + self._id = _id + self._rev = _rev + self.title = title + } + + let _id: String + let _rev: String? + let title: String + + func updateRevision(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: newValue, title: title) + } + + func updateTitle(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: _rev, title: newValue) + } } -@Observable class DocsStore { - var docs = [MyDoc]() +@MainActor +@Observable final class DocsStore { + var docs = [MyDoc]() - func getDocs() async throws { - let response = try await couchDBClient.get( - fromDB: dbName, - uri: "_design/all/_view/list" - ) + func getDocs() async throws { + let response = try await couchDBClient.get( + fromDB: dbName, + uri: "_design/all/_view/list" + ) - let expectedBytes = response.headers - .first(name: "content-length") - .flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await response.body.collect(upTo: expectedBytes) + let expectedBytes = + response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) - guard let data = bytes.readData(length: bytes.readableBytes) else { return } + guard let data = bytes.readData(length: bytes.readableBytes) else { return } - let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .secondsSince1970 + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .secondsSince1970 - let decodeResponse = try decoder.decode(RowsResponse.self, from: data) + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) - await MainActor.run { [self] in - docs = decodeResponse.rows.map({ $0.value }) - } - } + docs = decodeResponse.rows.map({ $0.value }) + } } struct ContentView: View { - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - } - .padding() - } + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift index c521315..9ec820f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial-6.swift @@ -1,69 +1,84 @@ import SwiftUI import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" -class MyDoc: Identifiable, CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String +final class MyDoc: Identifiable, CouchDBRepresentable { + internal init(_id: String = NSUUID().uuidString, _rev: String? = nil, title: String) { + self._id = _id + self._rev = _rev + self.title = title + } + + let _id: String + let _rev: String? + let title: String + + func updateRevision(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: newValue, title: title) + } + + func updateTitle(_ newValue: String) -> MyDoc { + return MyDoc(_id: _id, _rev: _rev, title: newValue) + } } -@Observable class DocsStore { - var docs = [MyDoc]() +@MainActor +@Observable final class DocsStore { + var docs = [MyDoc]() - func getDocs() async throws { - let response = try await couchDBClient.get( - fromDB: dbName, - uri: "_design/all/_view/list" - ) + func getDocs() async throws { + let response = try await couchDBClient.get( + fromDB: dbName, + uri: "_design/all/_view/list" + ) - let expectedBytes = response.headers - .first(name: "content-length") - .flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await response.body.collect(upTo: expectedBytes) + let expectedBytes = + response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) - guard let data = bytes.readData(length: bytes.readableBytes) else { return } + guard let data = bytes.readData(length: bytes.readableBytes) else { return } - let decoder = JSONDecoder() - decoder.dateDecodingStrategy = .secondsSince1970 + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .secondsSince1970 - let decodeResponse = try decoder.decode(RowsResponse.self, from: data) + let decodeResponse = try decoder.decode(RowsResponse.self, from: data) - await MainActor.run { [self] in - docs = decodeResponse.rows.map({ $0.value }) - } - } + docs = decodeResponse.rows.map({ $0.value }) + } } struct ContentView: View { - @State var docsStore = DocsStore() - var body: some View { - VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - - List(docsStore.docs) { doc in - Text(doc.title) - } - } - .padding() - .task { - do { - try await docsStore.getDocs() - } catch { - print(error.localizedDescription) - } - } - } + @State var docsStore = DocsStore() + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + + List(docsStore.docs) { doc in + Text(doc.title) + } + } + .padding() + .task { + do { + try await docsStore.getDocs() + } catch { + print(error.localizedDescription) + } + } + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-1.swift index 3435484..00f3daf 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-1.swift @@ -1,4 +1,3 @@ import Foundation RunLoop.main.run() - diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-3.swift index acb94a0..d04ea11 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-3.swift @@ -1,13 +1,14 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift index dfe5228..0d16df0 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-4.swift @@ -1,20 +1,25 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct MyDoc: CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String + var _id: String = NSUUID().uuidString + var _rev: String? + var title: String + + func updateRevision(_ newRevision: String) -> Self { + return MyDoc(_id: _id, _rev: newRevision, title: title) + } } RunLoop.main.run() diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift index 54a647c..19d509c 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-5.swift @@ -1,26 +1,31 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct MyDoc: CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String + var _id: String = NSUUID().uuidString + var _rev: String? + var title: String + + func updateRevision(_ newRevision: String) -> Self { + return MyDoc(_id: _id, _rev: newRevision, title: title) + } } Task { - var doc = MyDoc(title: "My Document") - try await couchDBClient.insert(dbName: dbName, doc: &doc) - print(doc) + var doc = MyDoc(title: "My Document") + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + print(doc) } RunLoop.main.run() diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift index 1307d3b..67f47d1 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-6.swift @@ -1,30 +1,35 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct MyDoc: CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String + var _id: String = NSUUID().uuidString + var _rev: String? + var title: String + + func updateRevision(_ newRevision: String) -> Self { + return MyDoc(_id: _id, _rev: newRevision, title: title) + } } Task { - var doc = MyDoc(title: "My Document") - try await couchDBClient.insert(dbName: dbName, doc: &doc) - print(doc) - - doc.title = "Updated title" - try await couchDBClient.update(dbName: dbName, doc: &doc) - print(doc) + var doc = MyDoc(title: "My Document") + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + print(doc) + + doc.title = "Updated title" + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + print(doc) } RunLoop.main.run() diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift index 6a3ec12..1c370b7 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-7.swift @@ -1,33 +1,38 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct MyDoc: CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String + var _id: String = NSUUID().uuidString + var _rev: String? + var title: String + + func updateRevision(_ newRevision: String) -> Self { + return MyDoc(_id: _id, _rev: newRevision, title: title) + } } Task { - var doc = MyDoc(title: "My Document") - try await couchDBClient.insert(dbName: dbName, doc: &doc) - print(doc) - - doc.title = "Updated title" - try await couchDBClient.update(dbName: dbName, doc: &doc) - print(doc) - - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) - print(docFromDB) + var doc = MyDoc(title: "My Document") + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + print(doc) + + doc.title = "Updated title" + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + print(doc) + + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + print(docFromDB) } RunLoop.main.run() diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift index 0c86289..4c2186e 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial-8.swift @@ -1,36 +1,41 @@ import Foundation import CouchDBClient -let couchDBClient = CouchDBClient( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: "yourPassword" +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" ) +let couchDBClient = CouchDBClient(config: config) let dbName = "fortests" struct MyDoc: CouchDBRepresentable { - var _id: String? - var _rev: String? - var title: String + var _id: String = NSUUID().uuidString + var _rev: String? + var title: String + + func updateRevision(_ newRevision: String) -> Self { + return MyDoc(_id: _id, _rev: newRevision, title: title) + } } Task { - var doc = MyDoc(title: "My Document") - try await couchDBClient.insert(dbName: dbName, doc: &doc) - print(doc) - - doc.title = "Updated title" - try await couchDBClient.update(dbName: dbName, doc: &doc) - print(doc) - - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id!) - print(docFromDB) - - let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) - print(deleteResponse) + var doc = MyDoc(title: "My Document") + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + print(doc) + + doc.title = "Updated title" + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + print(doc) + + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + print(docFromDB) + + let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) + print(deleteResponse) } RunLoop.main.run() diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift index d49994b..6d18124 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-0.swift @@ -1,37 +1,52 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) struct MyApp: Content, CouchDBRepresentable { - let title: String - let url: String - let _id: String - var _rev: String + let _id: String + var _rev: String? + let title: String + let url: String + + func updateRevision(_ newRevision: String) -> MyApp { + return MyApp(_id: _id, _rev: newRevision, title: title, url: url) + } } func routes(_ app: Application) throws { - let couchDBClient = CouchDBClient() - - app.get(":appUrl") { req async throws -> View in - let response = try await couchDBClient.get( - fromDB: "myDB", - uri: "_design/all/_view/by_url", - queryItems: [ - URLQueryItem(name: "key", value: "\"\(url)\"") - ], - eventLoopGroup: req.eventLoop - ) - - guard let bytes = response.body else { throw Abort(.notFound) } - - let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) - - guard let myApp = decodeResponse.rows.first?.value else { - throw Abort(.notFound) - } - - return try await req.view.render("app-page", ["app": myApp]) - } + app.get(":appUrl") { req async throws -> View in + let url = req.parameters.get("appUrl")! + let response = try await couchDBClient.get( + fromDB: "myDB", + uri: "_design/all/_view/by_url", + queryItems: [ + URLQueryItem(name: "key", value: "\"\(url)\"") + ], + eventLoopGroup: req.eventLoop + ) + + let expectedBytes = + response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + + guard let data = bytes.readData(length: bytes.readableBytes) else { throw Abort(.notFound) } + + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + + guard let myApp = decodeResponse.rows.first?.value else { + throw Abort(.notFound) + } + + return try await req.view.render("app-page", ["app": myApp]) + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-1.swift index ec9660a..6ee5ca9 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-1.swift @@ -1,7 +1,7 @@ import Vapor func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - return try await req.view.render("app-page") - } + app.get(":appUrl") { req async throws -> View in + return try await req.view.render("app-page") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-2.swift index 9618630..ba1c9da 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-2.swift @@ -1,10 +1,17 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - return try await req.view.render("app-page") - } + app.get(":appUrl") { req async throws -> View in + return try await req.view.render("app-page") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift index bd1b9a1..b076afb 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-3.swift @@ -1,17 +1,28 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) struct MyApp: Content, CouchDBRepresentable { - let title: String - let url: String - let _id: String - var _rev: String + let _id: String + var _rev: String? + let title: String + let url: String + + func updateRevision(_ newRevision: String) -> MyApp { + return MyApp(_id: _id, _rev: newRevision, title: title, url: url) + } } func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - return try await req.view.render("app-page") - } + app.get(":appUrl") { req async throws -> View in + return try await req.view.render("app-page") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift index 385976b..654c844 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-4.swift @@ -1,27 +1,38 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) struct MyApp: Content, CouchDBRepresentable { - let title: String - let url: String - let _id: String - var _rev: String + let _id: String + var _rev: String? + let title: String + let url: String + + func updateRevision(_ newRevision: String) -> MyApp { + return MyApp(_id: _id, _rev: newRevision, title: title, url: url) + } } func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - let url = req.parameters.get("appUrl")! - let response = try await couchDBClient.get( - fromDB: "myDB", - uri: "_design/all/_view/by_url", - queryItems: [ - URLQueryItem(name: "key", value: "\"\(url)\"") - ], - eventLoopGroup: req.eventLoop - ) - - return try await req.view.render("app-page") - } + app.get(":appUrl") { req async throws -> View in + let url = req.parameters.get("appUrl")! + let response = try await couchDBClient.get( + fromDB: "myDB", + uri: "_design/all/_view/by_url", + queryItems: [ + URLQueryItem(name: "key", value: "\"\(url)\"") + ], + eventLoopGroup: req.eventLoop + ) + + return try await req.view.render("app-page") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift index 97f6212..db5e37a 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-5.swift @@ -1,36 +1,52 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) struct MyApp: Content, CouchDBRepresentable { - let title: String - let url: String - let _id: String - var _rev: String + let _id: String + var _rev: String? + let title: String + let url: String + + func updateRevision(_ newRevision: String) -> MyApp { + return MyApp(_id: _id, _rev: newRevision, title: title, url: url) + } } func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - let url = req.parameters.get("appUrl")! - let response = try await couchDBClient.get( - fromDB: "myDB", - uri: "_design/all/_view/by_url", - queryItems: [ - URLQueryItem(name: "key", value: "\"\(url)\"") - ], - eventLoopGroup: req.eventLoop - ) - - guard let bytes = response.body else { throw Abort(.notFound) } - - let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) - - guard let myApp = decodeResponse.rows.first?.value else { - throw Abort(.notFound) - } - - return try await req.view.render("app-page") - } + app.get(":appUrl") { req async throws -> View in + let url = req.parameters.get("appUrl")! + let response = try await couchDBClient.get( + fromDB: "myDB", + uri: "_design/all/_view/by_url", + queryItems: [ + URLQueryItem(name: "key", value: "\"\(url)\"") + ], + eventLoopGroup: req.eventLoop + ) + + let expectedBytes = + response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + + guard let data = bytes.readData(length: bytes.readableBytes) else { throw Abort(.notFound) } + + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + + guard let myApp = decodeResponse.rows.first?.value else { + throw Abort(.notFound) + } + + return try await req.view.render("app-page") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift index 67081a6..6d18124 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-6.swift @@ -1,36 +1,52 @@ import Vapor import CouchDBClient -let couchDBClient = CouchDBClient() +let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: "yourPassword" +) +let couchDBClient = CouchDBClient(config: config) struct MyApp: Content, CouchDBRepresentable { - let title: String - let url: String - let _id: String - var _rev: String + let _id: String + var _rev: String? + let title: String + let url: String + + func updateRevision(_ newRevision: String) -> MyApp { + return MyApp(_id: _id, _rev: newRevision, title: title, url: url) + } } func routes(_ app: Application) throws { - app.get(":appUrl") { req async throws -> View in - let url = req.parameters.get("appUrl")! - let response = try await couchDBClient.get( - fromDB: "myDB", - uri: "_design/all/_view/by_url", - queryItems: [ - URLQueryItem(name: "key", value: "\"\(url)\"") - ], - eventLoopGroup: req.eventLoop - ) - - guard let bytes = response.body else { throw Abort(.notFound) } - - let data = Data(buffer: bytes) - let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) - - guard let myApp = decodeResponse.rows.first?.value else { - throw Abort(.notFound) - } - - return try await req.view.render("app-page", ["app": myApp]) - } + app.get(":appUrl") { req async throws -> View in + let url = req.parameters.get("appUrl")! + let response = try await couchDBClient.get( + fromDB: "myDB", + uri: "_design/all/_view/by_url", + queryItems: [ + URLQueryItem(name: "key", value: "\"\(url)\"") + ], + eventLoopGroup: req.eventLoop + ) + + let expectedBytes = + response.headers + .first(name: "content-length") + .flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + + guard let data = bytes.readData(length: bytes.readableBytes) else { throw Abort(.notFound) } + + let decodeResponse = try JSONDecoder().decode(RowsResponse.self, from: data) + + guard let myApp = decodeResponse.rows.first?.value else { + throw Abort(.notFound) + } + + return try await req.view.render("app-page", ["app": myApp]) + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift index c19202d..e371ad3 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-1.swift @@ -4,25 +4,27 @@ import PackageDescription let package = Package( name: "spaceinbox.me", platforms: [ - .macOS(.v13) + .macOS(.v13) ], dependencies: [ // 💧 A server-side Swift web framework. .package(url: "https://github.com/vapor/vapor", from: "4.0.0"), - .package(url: "https://github.com/vapor/leaf", from: "4.0.0"), + .package(url: "https://github.com/vapor/leaf", from: "4.0.0") ], targets: [ .target( name: "App", dependencies: [ .product(name: "Leaf", package: "leaf"), - .product(name: "Vapor", package: "vapor"), + .product(name: "Vapor", package: "vapor") ] ), .executableTarget(name: "Run", dependencies: [.target(name: "App")]), - .testTarget(name: "AppTests", dependencies: [ - .target(name: "App"), - .product(name: "XCTVapor", package: "vapor"), - ]) + .testTarget( + name: "AppTests", + dependencies: [ + .target(name: "App"), + .product(name: "XCTVapor", package: "vapor") + ]) ] ) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift index 12ff663..bfe1079 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift @@ -4,13 +4,13 @@ import PackageDescription let package = Package( name: "spaceinbox.me", platforms: [ - .macOS(.v13) + .macOS(.v13) ], dependencies: [ // 💧 A server-side Swift web framework. .package(url: "https://github.com/vapor/vapor", from: "4.0.0"), .package(url: "https://github.com/vapor/leaf", from: "4.0.0"), - .package(url: "https://github.com/makoni/couchdb-vapor", from: "1.5.0") + .package(url: "https://github.com/makoni/couchdb-vapor", from: "2.0.0") ], targets: [ .target( @@ -22,9 +22,11 @@ let package = Package( ] ), .executableTarget(name: "Run", dependencies: [.target(name: "App")]), - .testTarget(name: "AppTests", dependencies: [ - .target(name: "App"), - .product(name: "XCTVapor", package: "vapor"), - ]) + .testTarget( + name: "AppTests", + dependencies: [ + .target(name: "App"), + .product(name: "XCTVapor", package: "vapor") + ]) ] ) From a5a971d39ecd261743d8b9bf7fc3fdf244dcae1c Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 16:30:01 +0700 Subject: [PATCH 118/202] docs --- README.md | 30 +++++++++++-------- Sources/CouchDBClient/CouchDBClient.swift | 2 +- .../CouchDBClientTests.swift | 3 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d0cab54..8fd63a1 100644 --- a/README.md +++ b/README.md @@ -42,17 +42,15 @@ dependencies: [ ## Initialization ```swift -// use default params -let myClient = CouchDBClient() - -// provide your own params -let couchDBClient = CouchDBClient( +let config = CouchDBClient.Config( couchProtocol: .http, couchHost: "127.0.0.1", couchPort: 5984, userName: "admin", - userPassword: "myPassword" + userPassword: "", + requestsTimeout: 30 ) +let couchDBClient = CouchDBClient(config: config) ``` If you don’t want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. For example you can run your Server Side Swift project: @@ -62,12 +60,14 @@ COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run Just use initializer without userPassword param: ```swift -let couchDBClient = CouchDBClient( +let config = CouchDBClient.Config( couchProtocol: .http, couchHost: "127.0.0.1", couchPort: 5984, - userName: "admin" + userName: "admin", + requestsTimeout: 30 ) +let couchDBClient = CouchDBClient(config: config) ``` ## Usage examples @@ -78,8 +78,12 @@ Define your document model: // Example struct struct ExpectedDoc: CouchDBRepresentable { var name: String - var _id: String? + var _id: String = NSUUID().uuidString var _rev: String? + + func updateRevision(_ newRevision: String) -> Self { + return ExpectedDoc(name: name, _id: _id, _rev: newRevision) + } } ``` @@ -87,9 +91,9 @@ struct ExpectedDoc: CouchDBRepresentable { ```swift var testDoc = ExpectedDoc(name: "My name") -try await couchDBClient.insert( +testDoc = try await couchDBClient.insert( dbName: "databaseName", - doc: &testDoc + doc: testDoc ) print(testDoc) // testDoc has _id and _rev values now @@ -105,9 +109,9 @@ print(doc) // Update value doc.name = "Updated name" -try await couchDBClient.update( +doc = try await couchDBClient.update( dbName: testsDB, - doc: &doc + doc: doc ) print(doc) // doc will have updated name and _rev values now diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 1049f74..832b07c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -917,7 +917,7 @@ public actor CouchDBClient { /// // Send the update request /// let updateResponse = try await couchDBClient.update( /// dbName: "myDatabase", - /// uri: doc._id!, + /// uri: doc._id, /// body: body /// ) /// diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 1754e3e..d054cf2 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -22,7 +22,8 @@ final class CouchDBClientTests: XCTestCase { couchHost: "127.0.0.1", couchPort: 5984, userName: "admin", - userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "" + userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "", + requestsTimeout: 30 ) lazy var couchDBClient = CouchDBClient(config: config) From 729c8309c23a14f2ad4353d2fbb916333ee2593d Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 31 Mar 2025 20:08:40 +0700 Subject: [PATCH 119/202] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8fd63a1..db6b464 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-vapor%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/makoni/couchdb-vapor) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-vapor%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/makoni/couchdb-vapor) -[![Vapor 4](https://img.shields.io/badge/vapor-4.50.0-blue.svg?style=flat)](https://vapor.codes) +[![Vapor 4](https://img.shields.io/badge/vapor-4-blue.svg?style=flat)](https://vapor.codes) [![Build on macOS](https://github.com/makoni/couchdb-vapor/actions/workflows/build-macos.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-vapor/actions/workflows/build-macos.yml) [![Build on Ubuntu](https://github.com/makoni/couchdb-vapor/actions/workflows/build-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-vapor/actions/workflows/build-ubuntu.yml) @@ -17,9 +17,10 @@ This is a simple lib to work with CouchDB in Swift. -- Latest version is based on async/await and requires Swift 5.8 or newer. Works with Vapor 4.50 and newer. +- Latest version supports Strict Concurrency, CouchDBClient is an actor and requires Swift 5.10 or newer. Compatible with Swift 6. +- Works with Vapor 4. - Version 1.0.0 can be used with Vapor 4 without async/await. Swift 5.3 is required -- You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. +- You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. The only dependency for this lib is async-http-client From 63fb9c4dbd52651a9ad8f6a929649394b89bf5d9 Mon Sep 17 00:00:00 2001 From: Sergey Date: Mon, 31 Mar 2025 20:16:19 +0700 Subject: [PATCH 120/202] Update README.md --- README.md | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index db6b464..7066d6d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# CouchDB Client +# CouchDB Client for Swift

@@ -16,29 +16,34 @@ -This is a simple lib to work with CouchDB in Swift. -- Latest version supports Strict Concurrency, CouchDBClient is an actor and requires Swift 5.10 or newer. Compatible with Swift 6. -- Works with Vapor 4. -- Version 1.0.0 can be used with Vapor 4 without async/await. Swift 5.3 is required -- You can use the old version for Vapor 3 from vapor3 branch or using version < 1.0.0. +This is a simple library to work with CouchDB in Swift. -The only dependency for this lib is async-http-client +- The latest version supports strict concurrency: `CouchDBClient` is an actor and requires Swift 6.0 or newer. For Swift 5, you can still use version `1.7.0`. +- Compatible with Vapor 4. +- Version `1.0.0` can be used with Vapor 4 without `async/await`; Swift 5.3 is required. +- You can use the old version for Vapor 3 by checking out the `vapor3` branch or using versions earlier than `1.0.0`. + +The only dependency for this library is [`async-http-client`](https://github.com/swift-server/async-http-client). +--- ## Documentation -You can find docs, examples and even tutorials [here](https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient). +Find documentation, examples, and tutorials [here](https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient). + +--- ## Installation ### Swift Package Manager -Add to the `dependencies` value of your `Package.swift`. +Add the following to the `dependencies` section of your `Package.swift`: ```swift dependencies: [ .package(url: "https://github.com/makoni/couchdb-vapor.git", from: "1.6.0"), ] -``` + +--- ## Initialization @@ -54,11 +59,11 @@ let config = CouchDBClient.Config( let couchDBClient = CouchDBClient(config: config) ``` -If you don’t want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. For example you can run your Server Side Swift project: +To avoid hardcoding your password, you can pass the COUCHDB_PASS parameter via the command line. For example, you can run your server-side Swift project as follows: ```bash COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run ``` -Just use initializer without userPassword param: +In this case, use the initializer without the userPassword parameter: ```swift let config = CouchDBClient.Config( @@ -73,7 +78,7 @@ let couchDBClient = CouchDBClient(config: config) ## Usage examples -Define your document model: +### Define Your Document Model ```swift // Example struct @@ -88,7 +93,8 @@ struct ExpectedDoc: CouchDBRepresentable { } ``` -### Insert data +### Insert Data + ```swift var testDoc = ExpectedDoc(name: "My name") @@ -100,7 +106,7 @@ testDoc = try await couchDBClient.insert( print(testDoc) // testDoc has _id and _rev values now ``` -### Update data +### Update Data ```swift // get data from a database by document ID @@ -118,7 +124,7 @@ doc = try await couchDBClient.update( print(doc) // doc will have updated name and _rev values now ``` -Delete data: +### Delete Data ```swift let response = try await couchDBClient.delete(fromDb: "databaseName", doc: doc) @@ -126,7 +132,7 @@ let response = try await couchDBClient.delete(fromDb: "databaseName", doc: doc) let response = try await couchDBClient.delete(fromDb: "databaseName", uri: doc._id,rev: doc._rev) ``` -Get all databases example: +### Get All Databases ```swift let dbs = try await couchDBClient.getAllDBs() @@ -134,7 +140,7 @@ print(dbs) // prints: ["_global_changes", "_replicator", "_users", "yourDBname"] ``` -Find documents in a database by selector: +### Find Documents in a Database by Selector ```swift let selector = ["selector": ["name": "Sam"]] let docs: [ExpectedDoc] = try await couchDBClient.find(in: "databaseName", selector: selector) From 61bba298b34445b129f6e1273350076de7864ccc Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 31 Mar 2025 20:19:58 +0700 Subject: [PATCH 121/202] updated GitHub actions configs --- .github/workflows/build-macos.yml | 2 +- .github/workflows/build-ubuntu.yml | 2 +- .github/workflows/test-ubuntu.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 1b848ce..ec1f0df 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -12,7 +12,7 @@ on: jobs: macOS: name: Build on macOS - runs-on: macOS-14 + runs-on: macOS-15 steps: - name: Print Swift version run: swift --version diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index 87eb71b..f5c1280 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{matrix.swift}} strategy: matrix: - swift: ["6.0", "5.10", "5.9", "5.8"] + swift: ["6.0", "6.0.3"] runs-on: ubuntu-latest container: image: swift:${{matrix.swift}} diff --git a/.github/workflows/test-ubuntu.yml b/.github/workflows/test-ubuntu.yml index e4b3dfe..cd52b3f 100644 --- a/.github/workflows/test-ubuntu.yml +++ b/.github/workflows/test-ubuntu.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - couchdb: [latest, "3.3", "3.2", "3.1"] + couchdb: [latest, "3.4", "3.3", "3.2"] runs-on: ubuntu-latest services: swift: From 71ae1ac062a0e3f302bc19987e9e05b897333034 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 1 Apr 2025 02:08:50 +0700 Subject: [PATCH 122/202] dependencies updated --- Package.resolved | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Package.resolved b/Package.resolved index d3914ba..3129e5d 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,12 +1,13 @@ { + "originHash" : "fc96995b948e91f8b447c43c9954f2be85cb048b6bec565f15ba239879e82cf2", "pins" : [ { "identity" : "async-http-client", "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "b645ad40822b5c59ac92b758c5c17af054b5b01f", - "version" : "1.25.1" + "revision" : "333f51104b75d1a5b94cb3b99e4c58a3b442c9f7", + "version" : "1.25.2" } }, { @@ -54,6 +55,15 @@ "version" : "1.0.0" } }, + { + "identity" : "swift-http-structured-headers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-structured-headers.git", + "state" : { + "revision" : "8e769facea6b7d46ea60e5e93635a384fd573480", + "version" : "1.2.1" + } + }, { "identity" : "swift-http-types", "kind" : "remoteSourceControl", @@ -68,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "96a2f8a0fa41e9e09af4585e2724c4e825410b91", - "version" : "1.6.2" + "revision" : "3d8596ed08bd13520157f0355e35caed215ffbfa", + "version" : "1.6.3" } }, { @@ -86,8 +96,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "2e9746cfc57554f70b650b021b6ae4738abef3e6", - "version" : "1.24.1" + "revision" : "00f3f72d2f9942d0e2dc96057ab50a37ced150d4", + "version" : "1.25.0" } }, { @@ -122,8 +132,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-numerics.git", "state" : { - "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", - "version" : "1.0.2" + "revision" : "e0ec0f5f3af6f3e4d5e7a19d2af26b481acb6ba8", + "version" : "1.0.3" } }, { @@ -131,10 +141,10 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "c8a44d836fe7913603e246acab7c528c2e780168", - "version" : "1.4.0" + "revision" : "a34201439c74b53f0fd71ef11741af7e7caf01e1", + "version" : "1.4.2" } } ], - "version" : 2 + "version" : 3 } From 5631a6ce7049f3381d637a0d0aae0f9ec58c5ce8 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 1 Apr 2025 02:17:19 +0700 Subject: [PATCH 123/202] updated docs --- .../CouchDBClient/CouchDBClient.docc/Extensions/Client.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md index 35cd017..99bc733 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md @@ -9,7 +9,7 @@ A CouchDB client class with methods using Swift Concurrency. ## Topics ### Initializer -- ``init(couchProtocol:couchHost:couchPort:userName:userPassword:)`` +- ``init(config:)`` ### Methods for databases - ``getAllDBs(eventLoopGroup:)`` @@ -31,9 +31,3 @@ A CouchDB client class with methods using Swift Concurrency. - ``find(inDB:selector:dateDecodingStrategy:eventLoopGroup:)`` - ``delete(fromDb:doc:eventLoopGroup:)`` - ``delete(fromDb:uri:rev:eventLoopGroup:)`` - -### Deprecated methods -- ``get(dbName:uri:queryItems:eventLoopGroup:)`` -- ``get(dbName:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` -- ``find(in:body:eventLoopGroup:)`` -- ``find(in:selector:dateDecodingStrategy:eventLoopGroup:)`` From a0b1201f36a89bf58ee8f35739f9a64a2cb9e2b9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 1 Apr 2025 02:21:41 +0700 Subject: [PATCH 124/202] code formatting --- Package.swift | 4 +- .../ErrorsHandlingTutorial-1.swift | 26 +++---- .../ErrorsHandlingTutorial-2.swift | 42 +++++------ .../ErrorsHandlingTutorial-3.swift | 58 +++++++-------- .../ErrorsHandlingTutorial-4.swift | 74 +++++++++---------- .../CouchDBClientTests.swift | 2 +- 6 files changed, 103 insertions(+), 103 deletions(-) diff --git a/Package.swift b/Package.swift index 7f016f7..5b6e395 100644 --- a/Package.swift +++ b/Package.swift @@ -8,7 +8,7 @@ let package = Package( platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. - .library(name: "CouchDBClient", targets: ["CouchDBClient"]), + .library(name: "CouchDBClient", targets: ["CouchDBClient"]) ], dependencies: [ .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.21.0"), @@ -24,6 +24,6 @@ let package = Package( ]), .testTarget( name: "CouchDBClientTests", - dependencies: ["CouchDBClient"]), + dependencies: ["CouchDBClient"]) ] ) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift index b93a77d..c2b0762 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-1.swift @@ -1,15 +1,15 @@ Task { - var doc = MyDoc(title: "My Document") - - doc = try await couchDBClient.insert(dbName: dbName, doc: doc) - print(doc) - - doc.title = "Updated title" - doc = try await couchDBClient.update(dbName: dbName, doc: doc) - print(doc) - - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) - print(docFromDB) - - let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) + var doc = MyDoc(title: "My Document") + + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + print(doc) + + doc.title = "Updated title" + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + print(doc) + + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + print(docFromDB) + + let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift index e659041..34a7338 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-2.swift @@ -1,23 +1,23 @@ Task { - var doc = MyDoc(title: "My Document") - - do { - doc = try await couchDBClient.insert(dbName: dbName, doc: doc) - } catch CouchDBClientError.insertError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(doc) - - doc.title = "Updated title" - doc = try await couchDBClient.update(dbName: dbName, doc: doc) - print(doc) - - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) - print(docFromDB) - - let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) + var doc = MyDoc(title: "My Document") + + do { + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + } catch CouchDBClientError.insertError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(doc) + + doc.title = "Updated title" + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + print(doc) + + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + print(docFromDB) + + let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift index 8f95002..186828f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-3.swift @@ -1,31 +1,31 @@ Task { - var doc = MyDoc(title: "My Document") - - do { - doc = try await couchDBClient.insert(dbName: dbName, doc: doc) - } catch CouchDBClientError.insertError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(doc) - - doc.title = "Updated title" - do { - doc = try await couchDBClient.update(dbName: dbName, doc: doc) - } catch CouchDBClientError.updateError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(doc) - - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) - print(docFromDB) - - let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) + var doc = MyDoc(title: "My Document") + + do { + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + } catch CouchDBClientError.insertError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(doc) + + doc.title = "Updated title" + do { + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + } catch CouchDBClientError.updateError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(doc) + + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + print(docFromDB) + + let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift index 5d0ef0d..7e97830 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial-4.swift @@ -1,39 +1,39 @@ Task { - var doc = MyDoc(title: "My Document") - - do { - doc = try await couchDBClient.insert(dbName: dbName, doc: doc) - } catch CouchDBClientError.insertError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(doc) - - doc.title = "Updated title" - do { - doc = try await couchDBClient.update(dbName: dbName, doc: doc) - } catch CouchDBClientError.updateError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(doc) - - do { - let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) - } catch CouchDBClientError.getError(let error) { - print(error.reason) - return - } catch { - print(error.localizedDescription) - return - } - print(docFromDB) - - let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) + var doc = MyDoc(title: "My Document") + + do { + doc = try await couchDBClient.insert(dbName: dbName, doc: doc) + } catch CouchDBClientError.insertError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(doc) + + doc.title = "Updated title" + do { + doc = try await couchDBClient.update(dbName: dbName, doc: doc) + } catch CouchDBClientError.updateError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(doc) + + do { + let docFromDB: MyDoc = try await couchDBClient.get(fromDB: dbName, uri: doc._id) + } catch CouchDBClientError.getError(let error) { + print(error.reason) + return + } catch { + print(error.localizedDescription) + return + } + print(docFromDB) + + let deleteResponse = try await couchDBClient.delete(fromDb: dbName, doc: doc) } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index d054cf2..0895545 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -23,7 +23,7 @@ final class CouchDBClientTests: XCTestCase { couchPort: 5984, userName: "admin", userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "", - requestsTimeout: 30 + requestsTimeout: 30 ) lazy var couchDBClient = CouchDBClient(config: config) From ddcc5ef5e0b9f76aeff365733f5c0fff8926dde5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 5 Apr 2025 14:07:59 +0700 Subject: [PATCH 125/202] refactoring --- Sources/CouchDBClient/CouchDBClient.swift | 76 ----------------- .../Models/CouchDBClientError.swift | 84 +++++++++++++++++++ 2 files changed, 84 insertions(+), 76 deletions(-) create mode 100644 Sources/CouchDBClient/Models/CouchDBClientError.swift diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 832b07c..5a5abd7 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -11,82 +11,6 @@ import NIOHTTP1 import NIOFoundationCompat import AsyncHTTPClient -/// An enumeration representing the various errors that can occur when interacting with CouchDB through a client. -/// This enum conforms to both `Error` and `Sendable`, making it suitable for error handling and thread-safe operations. -public enum CouchDBClientError: Error, Sendable { - /// The `id` property is empty or missing in the provided document. - /// This error indicates that the document does not have a valid identifier. - case idMissing - - /// The `_rev` property is empty or missing in the provided document. - /// This error indicates that the document does not have a valid revision token for concurrency control. - case revMissing - - /// The `GET` request was unsuccessful. - /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. - case getError(error: CouchDBError) - - /// The `INSERT` request was unsuccessful. - /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. - case insertError(error: CouchDBError) - - /// The `DELETE` request was unsuccessful. - /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. - case deleteError(error: CouchDBError) - - /// The `UPDATE` request was unsuccessful. - /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. - case updateError(error: CouchDBError) - - /// The `FIND` request was unsuccessful. - /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. - case findError(error: CouchDBError) - - /// The response from CouchDB was unrecognized or could not be processed. - /// This error indicates that the response was not in the expected format. - case unknownResponse - - /// Authentication failed due to incorrect username or password. - /// This error suggests that the provided credentials were invalid. - case unauthorized - - /// The response body is missing required data. - /// This error indicates that the server response lacked the expected content. - case noData -} - -/// Extends the `CouchDBClientError` enumeration to provide localized error descriptions. -/// This extension conforms to the `LocalizedError` protocol, offering user-friendly messages -/// that describe the nature of each error in detail. -extension CouchDBClientError: LocalizedError { - /// A textual description of the error, tailored for user-facing contexts. - /// The message provides specific details about the error type and underlying cause. - public var errorDescription: String? { - switch self { - case .idMissing: - return "The 'id' property is empty or missing in the provided document." - case .revMissing: - return "The '_rev' property is empty or missing in the provided document." - case .getError(let error): - return "The GET request wasn't successful: \(error.localizedDescription)" - case .insertError(let error): - return "The INSERT request wasn't successful: \(error.localizedDescription)" - case .updateError(let error): - return "The UPDATE request wasn't successful: \(error.localizedDescription)" - case .deleteError(let error): - return "The DELETE request wasn't successful: \(error.localizedDescription)" - case .findError(let error): - return "The FIND request wasn't successful: \(error.localizedDescription)" - case .unknownResponse: - return "The response from CouchDB was unrecognized or invalid." - case .unauthorized: - return "Authentication failed due to an incorrect username or password." - case .noData: - return "The response body is missing the expected data." - } - } -} - /// A CouchDB client actor with methods using Swift Concurrency. public actor CouchDBClient { /// A configuration model for CouchDB client setup. diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift new file mode 100644 index 0000000..7366dec --- /dev/null +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -0,0 +1,84 @@ +// +// CouchDBClientError.swift +// couchdb-vapor +// +// Created by Sergei Armodin on 05.04.2025. +// + +import Foundation + +/// An enumeration representing the various errors that can occur when interacting with CouchDB through a client. +/// This enum conforms to both `Error` and `Sendable`, making it suitable for error handling and thread-safe operations. +public enum CouchDBClientError: Error, Sendable { + /// The `id` property is empty or missing in the provided document. + /// This error indicates that the document does not have a valid identifier. + case idMissing + + /// The `_rev` property is empty or missing in the provided document. + /// This error indicates that the document does not have a valid revision token for concurrency control. + case revMissing + + /// The `GET` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case getError(error: CouchDBError) + + /// The `INSERT` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case insertError(error: CouchDBError) + + /// The `DELETE` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case deleteError(error: CouchDBError) + + /// The `UPDATE` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case updateError(error: CouchDBError) + + /// The `FIND` request was unsuccessful. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. + case findError(error: CouchDBError) + + /// The response from CouchDB was unrecognized or could not be processed. + /// This error indicates that the response was not in the expected format. + case unknownResponse + + /// Authentication failed due to incorrect username or password. + /// This error suggests that the provided credentials were invalid. + case unauthorized + + /// The response body is missing required data. + /// This error indicates that the server response lacked the expected content. + case noData +} + +/// Extends the `CouchDBClientError` enumeration to provide localized error descriptions. +/// This extension conforms to the `LocalizedError` protocol, offering user-friendly messages +/// that describe the nature of each error in detail. +extension CouchDBClientError: LocalizedError { + /// A textual description of the error, tailored for user-facing contexts. + /// The message provides specific details about the error type and underlying cause. + public var errorDescription: String? { + switch self { + case .idMissing: + return "The 'id' property is empty or missing in the provided document." + case .revMissing: + return "The '_rev' property is empty or missing in the provided document." + case .getError(let error): + return "The GET request wasn't successful: \(error.localizedDescription)" + case .insertError(let error): + return "The INSERT request wasn't successful: \(error.localizedDescription)" + case .updateError(let error): + return "The UPDATE request wasn't successful: \(error.localizedDescription)" + case .deleteError(let error): + return "The DELETE request wasn't successful: \(error.localizedDescription)" + case .findError(let error): + return "The FIND request wasn't successful: \(error.localizedDescription)" + case .unknownResponse: + return "The response from CouchDB was unrecognized or invalid." + case .unauthorized: + return "Authentication failed due to an incorrect username or password." + case .noData: + return "The response body is missing the expected data." + } + } +} From 17e00a086ac722b26ccad167766429253365c9ef Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 5 Apr 2025 14:19:39 +0700 Subject: [PATCH 126/202] localized error messages --- Package.swift | 7 +- Sources/CouchDBClient/Localizable.xcstrings | 126 ++++++++++++++++++ .../Models/CouchDBClientError.swift | 107 ++++++++++++--- 3 files changed, 218 insertions(+), 22 deletions(-) create mode 100644 Sources/CouchDBClient/Localizable.xcstrings diff --git a/Package.swift b/Package.swift index 5b6e395..65a8133 100644 --- a/Package.swift +++ b/Package.swift @@ -5,6 +5,7 @@ import PackageDescription let package = Package( name: "couchdb-vapor", + defaultLocalization: "en", platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. @@ -21,7 +22,11 @@ let package = Package( name: "CouchDBClient", dependencies: [ .product(name: "AsyncHTTPClient", package: "async-http-client") - ]), + ], + resources: [ + .process("Localizable.xcstrings") + ] + ), .testTarget( name: "CouchDBClientTests", dependencies: ["CouchDBClient"]) diff --git a/Sources/CouchDBClient/Localizable.xcstrings b/Sources/CouchDBClient/Localizable.xcstrings new file mode 100644 index 0000000..67c276f --- /dev/null +++ b/Sources/CouchDBClient/Localizable.xcstrings @@ -0,0 +1,126 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "DELETE_ERROR" : { + "comment" : "DELETE request failure message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The DELETE request wasn't successful: %@" + } + } + } + }, + "FIND_ERROR" : { + "comment" : "FIND request failure message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The FIND request wasn't successful: %@" + } + } + } + }, + "GET_ERROR" : { + "comment" : "GET request failure message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The GET request wasn't successful: %@" + } + } + } + }, + "ID_MISSING_ERROR" : { + "comment" : "Error description for missing document ID", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The 'id' property is empty or missing in the provided document." + } + } + } + }, + "INSERT_ERROR" : { + "comment" : "INSERT request failure message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The INSERT request wasn't successful: %@" + } + } + } + }, + "NO_DATA_ERROR" : { + "comment" : "No data error message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The response body is missing the expected data." + } + } + } + }, + "REV_MISSING_ERROR" : { + "comment" : "Error description for missing revision field", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The '_rev' property is empty or missing in the provided document." + } + } + } + }, + "UNAUTHORIZED_ERROR" : { + "comment" : "Unauthorized access message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Authentication failed due to an incorrect username or password." + } + } + } + }, + "UNKNOWN_RESPONSE_ERROR" : { + "comment" : "Unknown response message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The response from CouchDB was unrecognized or invalid." + } + } + } + }, + "UPDATE_ERROR" : { + "comment" : "UPDATE request failure message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The UPDATE request wasn't successful: %@" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 7366dec..8c5e5b6 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -58,27 +58,92 @@ extension CouchDBClientError: LocalizedError { /// A textual description of the error, tailored for user-facing contexts. /// The message provides specific details about the error type and underlying cause. public var errorDescription: String? { - switch self { - case .idMissing: - return "The 'id' property is empty or missing in the provided document." - case .revMissing: - return "The '_rev' property is empty or missing in the provided document." - case .getError(let error): - return "The GET request wasn't successful: \(error.localizedDescription)" - case .insertError(let error): - return "The INSERT request wasn't successful: \(error.localizedDescription)" - case .updateError(let error): - return "The UPDATE request wasn't successful: \(error.localizedDescription)" - case .deleteError(let error): - return "The DELETE request wasn't successful: \(error.localizedDescription)" - case .findError(let error): - return "The FIND request wasn't successful: \(error.localizedDescription)" - case .unknownResponse: - return "The response from CouchDB was unrecognized or invalid." - case .unauthorized: - return "Authentication failed due to an incorrect username or password." - case .noData: - return "The response body is missing the expected data." + if #available(macOS 12, *) { + switch self { + case .idMissing: + return String( + localized: "ID_MISSING_ERROR", + defaultValue: "The 'id' property is empty or missing in the provided document.", + bundle: Bundle.module + ) + case .revMissing: + return String( + localized: "REV_MISSING_ERROR", + defaultValue: "The '_rev' property is empty or missing in the provided document.", + bundle: Bundle.module + ) + case .getError(let error): + return String( + localized: "GET_ERROR", + defaultValue: "The GET request wasn't successful: \(error.localizedDescription)", + bundle: Bundle.module + ) + case .insertError(let error): + return String( + localized: "INSERT_ERROR", + defaultValue: "The INSERT request wasn't successful: \(error.localizedDescription)", + bundle: Bundle.module + ) + case .updateError(let error): + return String( + localized: "UPDATE_ERROR", + defaultValue: "The UPDATE request wasn't successful: \(error.localizedDescription)", + bundle: Bundle.module + ) + case .deleteError(let error): + return String( + localized: "DELETE_ERROR", + defaultValue: "The DELETE request wasn't successful: \(error.localizedDescription)", + bundle: Bundle.module + ) + case .findError(let error): + return String( + localized: "FIND_ERROR", + defaultValue: "The FIND request wasn't successful: \(error.localizedDescription)", + bundle: Bundle.module + ) + case .unknownResponse: + return String( + localized: "UNKNOWN_RESPONSE_ERROR", + defaultValue: "The response from CouchDB was unrecognized or invalid.", + bundle: Bundle.module + ) + case .unauthorized: + return String( + localized: "UNAUTHORIZED_ERROR", + defaultValue: "Authentication failed due to an incorrect username or password.", + bundle: Bundle.module + ) + case .noData: + return String( + localized: "NO_DATA_ERROR", + defaultValue: "The response body is missing the expected data.", + bundle: Bundle.module + ) + } + } else { + switch self { + case .idMissing: + return NSLocalizedString("ID_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The 'id' property is empty or missing in the provided document.", comment: "Error description for missing document ID") + case .revMissing: + return NSLocalizedString("REV_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The '_rev' property is empty or missing in the provided document.", comment: "Error description for missing revision field") + case .getError(let error): + return NSLocalizedString("GET_ERROR", tableName: nil, bundle: Bundle.module, value: "The GET request wasn't successful: \(error.localizedDescription)", comment: "GET request failure message") + case .insertError(let error): + return NSLocalizedString("INSERT_ERROR", tableName: nil, bundle: Bundle.module, value: "The INSERT request wasn't successful: \(error.localizedDescription)", comment: "INSERT request failure message") + case .updateError(let error): + return NSLocalizedString("UPDATE_ERROR", tableName: nil, bundle: Bundle.module, value: "The UPDATE request wasn't successful: \(error.localizedDescription)", comment: "UPDATE request failure message") + case .deleteError(let error): + return NSLocalizedString("DELETE_ERROR", tableName: nil, bundle: Bundle.module, value: "The DELETE request wasn't successful: \(error.localizedDescription)", comment: "DELETE request failure message") + case .findError(let error): + return NSLocalizedString("FIND_ERROR", tableName: nil, bundle: Bundle.module, value: "The FIND request wasn't successful: \(error.localizedDescription)", comment: "FIND request failure message") + case .unknownResponse: + return NSLocalizedString("UNKNOWN_RESPONSE_ERROR", tableName: nil, bundle: Bundle.module, value: "The response from CouchDB was unrecognized or invalid.", comment: "Unknown response message") + case .unauthorized: + return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") + case .noData: + return NSLocalizedString("NO_DATA_ERROR", tableName: nil, bundle: Bundle.module, value: "The response body is missing the expected data.", comment: "No data error message") + } } } } From f74ed516fb85a4a3cb8b092acb375e3ffaef4883 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Apr 2025 01:05:03 +0700 Subject: [PATCH 127/202] Added error messages translations --- Sources/CouchDBClient/Localizable.xcstrings | 2506 ++++++++++++++++++- 1 file changed, 2423 insertions(+), 83 deletions(-) diff --git a/Sources/CouchDBClient/Localizable.xcstrings b/Sources/CouchDBClient/Localizable.xcstrings index 67c276f..e43d556 100644 --- a/Sources/CouchDBClient/Localizable.xcstrings +++ b/Sources/CouchDBClient/Localizable.xcstrings @@ -1,126 +1,2466 @@ { - "sourceLanguage" : "en", - "strings" : { - "DELETE_ERROR" : { - "comment" : "DELETE request failure message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The DELETE request wasn't successful: %@" + "sourceLanguage": "en", + "strings": { + "DELETE_ERROR": { + "comment": "DELETE request failure message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The DELETE request wasn't successful: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "DELETE-запрос не был выполнен успешно: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête DELETE n'a pas abouti : %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta DELETE non è riuscita: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die DELETE-Anfrage war nicht erfolgreich: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud DELETE no fue exitosa: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "DELETE 请求未成功:%@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب DELETE: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "DELETEリクエストが失敗しました:%@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "DELETE isteği başarısız oldu: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "DELETE 요청이 성공하지 못했습니다: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição DELETE não foi bem-sucedida: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek DELETE nebyl úspěšný: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het DELETE-verzoek was niet succesvol: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт DELETE не быў паспяховым: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит DELETE не був успішним: %@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "DELETE сұрауы сәтсіз аяқталды: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "DELETE үтенече уңышсыз булды: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "DELETE һорауы уңышһыҙ булды: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "DELETE захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "DELETE-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ DELETE ไม่สำเร็จ: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "DELETE-pyyntö epäonnistui: %@" + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "DELETE-forespørselen var ikke vellykket: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "DELETE-anmodningen var ikke succesfuld: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie DELETE nie powiodło się: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu DELETE không thành công: %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "DELETE अनुरोध सफल नहीं था: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "DELETE درخواست کامیاب نہیں ہوئی: %@" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het DELETE-verzoek was niet succesvol: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "DELETE заявката не бе успешна: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα DELETE δεν ήταν επιτυχές: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea DELETE nu a reușit: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "DELETE сурамы ийгиликсиз болду: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "DELETE so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "DELETE zahtjev nije uspio: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka DELETE nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva DELETE ni uspela: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan DELETE tidak berhasil: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang DELETE request ay hindi matagumpay: %@" } } } }, - "FIND_ERROR" : { - "comment" : "FIND request failure message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The FIND request wasn't successful: %@" + "FIND_ERROR": { + "comment": "FIND request failure message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The FIND request wasn't successful: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "FIND-запрос не был выполнен успешно: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête FIND n'a pas abouti : %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta FIND non è riuscita: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die FIND-Anfrage war nicht erfolgreich: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud FIND no fue exitosa: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "FIND 请求未成功:%@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب FIND: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "FINDリクエストが失敗しました:%@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "FIND isteği başarısız oldu: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "FIND 요청이 성공하지 못했습니다: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição FIND não foi bem-sucedida: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek FIND nebyl úspěšný: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het FIND-verzoek was niet succesvol: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт FIND не быў паспяховым: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит FIND не був успішним: %@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "FIND сұрауы сәтсіз аяқталды: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "FIND үтенече уңышсыз булды: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "FIND һорауы уңышһыҙ булды: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "FIND захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "FIND-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ FIND ไม่สำเร็จ: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "FIND-pyyntö epäonnistui: %@" + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "FIND-forespørselen var ikke vellykket: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "FIND-anmodningen var ikke succesfuld: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie FIND nie powiodło się: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu FIND không thành công: %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "FIND अनुरोध सफल नहीं था: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "FIND درخواست کامیاب نہیں ہوئی: %@" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het FIND-verzoek was niet succesvol: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "FIND заявката не бе успешна: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα FIND δεν ήταν επιτυχές: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea FIND nu a reușit: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "FIND сурамы ийгиликсиз болду: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "FIND so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "FIND zahtjev nije uspio: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka FIND nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva FIND ni uspela: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan FIND tidak berhasil: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang FIND request ay hindi matagumpay: %@" } } } }, - "GET_ERROR" : { - "comment" : "GET request failure message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The GET request wasn't successful: %@" + "GET_ERROR": { + "comment": "GET request failure message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The GET request wasn't successful: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "GET-запрос не был выполнен успешно: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête GET n'a pas abouti : %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta GET non è riuscita: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die GET-Anfrage war nicht erfolgreich: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud GET no fue exitosa: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "GET 请求未成功:%@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب GET: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "GETリクエストが失敗しました:%@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "GET isteği başarısız oldu: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "GET 요청이 성공하지 못했습니다: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição GET não foi bem-sucedida: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek GET nebyl úspěšný: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het GET-verzoek was niet succesvol: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт GET не быў паспяховым: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит GET не був успішним: %@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "GET сұрауы сәтсіз аяқталды: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "GET үтенече уңышсыз булды: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "GET һорауы уңышһыҙ булды: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "GET захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "GET-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ GET ไม่สำเร็จ: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "GET-pyyntö epäonnistui: %@" + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "GET-forespørselen var ikke vellykket: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "GET-anmodningen var ikke succesfuld: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie GET nie powiodło się: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu GET không thành công: %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "GET अनुरोध सफल नहीं था: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "GET درخواست کامیاب نہیں ہوئی: %@" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het GET-verzoek was niet succesvol: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "GET заявката не бе успешна: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα GET δεν ήταν επιτυχές: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea GET nu a reușit: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "GET сурамы ийгиликсиз болду: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "GET so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "GET zahtjev nije uspio: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka GET nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva GET ni uspela: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan GET tidak berhasil: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang GET request ay hindi matagumpay: %@" } } } }, - "ID_MISSING_ERROR" : { - "comment" : "Error description for missing document ID", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The 'id' property is empty or missing in the provided document." + "ID_MISSING_ERROR": { + "comment": "Error description for missing document ID", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The 'id' property is empty or missing in the provided document." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Свойство 'id' отсутствует или пусто в предоставленном документе." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété 'id' est vide ou manquante dans le document fourni." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La proprietà 'id' è vuota o mancante nel documento fornito." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die 'id'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad 'id' está vacía o falta en el documento proporcionado." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "提供的文档中 'id' 属性为空或缺失。" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "خاصية 'id' فارغة أو مفقودة في المستند المقدم." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "提供されたドキュメントに 'id' プロパティが空またはありません。" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Sağlanan belgede 'id' özelliği boş veya eksik." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공된 문서에서 'id' 속성이 비어 있거나 없습니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade 'id' está vazia ou ausente no documento fornecido." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Vlastnost 'id' je prázdná nebo chybí v poskytnutém dokumentu." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Уласцівасць 'id' пустая або адсутнічае ў прадастаўленым дакуменце." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Властивість 'id' порожня або відсутня в наданому документі." + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Ұсынылған құжатта 'id' қасиеті бос немесе жоқ." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Тәкъдим ителгән документта 'id' үзенчәлеге буш яки юк." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Тәҡдим ителгән документта 'id' ҡасиәте буш йәки юҡ." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Својство 'id' је празно или недостаје у датом документу." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Egenskapen 'id' är tom eller saknas i det angivna dokumentet." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คุณสมบัติ 'id' ว่างหรือหายไปในเอกสารที่ให้มา" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "'id'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "'id'-egenskapen er tom eller mangler i det oppgitte dokumentet." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "'id'-egenskaben er tom eller mangler i det leverede dokument." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Właściwość 'id' jest pusta lub brakuje jej w dostarczonym dokumencie." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thuộc tính 'id' trống hoặc thiếu trong tài liệu được cung cấp." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "'id' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "'id' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Свойството 'id' е празно или липсва в предоставения документ." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η ιδιότητα 'id' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Proprietatea 'id' este goală sau lipsă din documentul furnizat." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Берилген документте 'id' касиети бош же жок." + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Ta'minlangan hujjatda 'id' xususiyati bo'sh yoki yo'q." + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Svojstvo 'id' je prazno ili nedostaje u dostavljenom dokumentu." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Vlastnosť 'id' je prázdna alebo chýba v poskytnutom dokumente." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Lastnost 'id' je prazna ali manjka v predloženem dokumentu." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Properti 'id' kosong atau tidak ada dalam dokumen yang diberikan." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang 'id' property ay walang laman o nawawala sa ibinigay na dokumento." } } } }, - "INSERT_ERROR" : { - "comment" : "INSERT request failure message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The INSERT request wasn't successful: %@" + "INSERT_ERROR": { + "comment": "INSERT request failure message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The INSERT request wasn't successful: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "INSERT-запрос не был выполнен успешно: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête INSERT n'a pas abouti : %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta INSERT non è riuscita: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die INSERT-Anfrage war nicht erfolgreich: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud INSERT no fue exitosa: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "INSERT 请求未成功:%@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب INSERT: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "INSERTリクエストが失敗しました:%@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "INSERT isteği başarısız oldu: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "INSERT 요청이 성공하지 못했습니다: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição INSERT não foi bem-sucedida: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek INSERT nebyl úspěšný: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het INSERT-verzoek was niet succesvol: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт INSERT не быў паспяховым: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит INSERT не був успішним: %@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "INSERT сұрауы сәтсіз аяқталды: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "INSERT үтенече уңышсыз булды: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "INSERT һорауы уңышһыҙ булды: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "INSERT захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "INSERT-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ INSERT ไม่สำเร็จ: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "INSERT-pyyntö epäonnistui: %@" + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "INSERT-forespørselen var ikke vellykket: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "INSERT-anmodningen var ikke succesfuld: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie INSERT nie powiodło się: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu INSERT không thành công: %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "INSERT अनुरोध सफल नहीं था: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "INSERT درخواست کامیاب نہیں ہوئی: %@" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het INSERT-verzoek was niet succesvol: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "INSERT заявката не бе успешна: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα INSERT δεν ήταν επιτυχές: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea INSERT nu a reușit: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "INSERT сурамы ийгиликсиз болду: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "INSERT so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "INSERT zahtjev nije uspio: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka INSERT nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva INSERT ni uspela: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan INSERT tidak berhasil: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang INSERT request ay hindi matagumpay: %@" } } } }, - "NO_DATA_ERROR" : { - "comment" : "No data error message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The response body is missing the expected data." + "NO_DATA_ERROR": { + "comment": "No data error message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The response body is missing the expected data." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "В теле ответа отсутствуют ожидаемые данные." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le corps de la réponse ne contient pas les données attendues." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il corpo della risposta non contiene i dati previsti." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Antwortkörper enthält nicht die erwarteten Daten." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El cuerpo de la respuesta no contiene los datos esperados." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "响应正文中缺少预期的数据。" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "هيئة الاستجابة تفتقد البيانات المتوقعة." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "レスポンスボディに期待されるデータがありません。" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yanıt gövdesinde beklenen veri eksik." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "응답 본문에 예상된 데이터가 없습니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O corpo da resposta está sem os dados esperados." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "V těle odpovědi chybí očekávaná data." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De respons bevat niet de verwachte gegevens." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "У адказе адсутнічаюць чаканыя дадзеныя." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "У відповіді відсутні очікувані дані." + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Жауап денесінде күтілген деректер жоқ." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Җавап җисемендә көтелгән мәгълүматлар юк." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Яуап һүлеһендә көтелгән мәғлүмәт юҡ." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "У телу одговора недостају очекивани подаци." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Svarskroppen saknar den förväntade datan." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เนื้อหาการตอบกลับขาดข้อมูลที่คาดหวัง" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Vastauksen runko ei sisällä odotettuja tietoja." + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "Responsen mangler de forventede dataene." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Responskroppen mangler de forventede data." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "W treści odpowiedzi brakuje oczekiwanych danych." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Phản hồi thiếu dữ liệu mong đợi." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "प्रतिक्रिया में अपेक्षित डेटा गायब है।" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "جواب میں توقع کے مطابق ڈیٹا موجود نہیں ہے۔" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "De respons bevat niet de verwachte gegevens." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "В тялото на отговора липсват очакваните данни." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το σώμα της απάντησης δεν περιέχει τα αναμενόμενα δεδομένα." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Corpul răspunsului nu conține datele așteptate." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Жооптун денесинде күтүлгөн маалыматтар жок." + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Javob tarkibida kutilgan ma'lumotlar yo'q." + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Tijelo odgovora ne sadrži očekivane podatke." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "V tele odpovede chýbajú očakávané dáta." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Vsebina odgovora ne vsebuje pričakovanih podatkov." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Badan respons tidak memiliki data yang diharapkan." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang response body ay kulang sa inaasahang data." } } } }, - "REV_MISSING_ERROR" : { - "comment" : "Error description for missing revision field", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The '_rev' property is empty or missing in the provided document." + "REV_MISSING_ERROR": { + "comment": "Error description for missing revision field", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The '_rev' property is empty or missing in the provided document." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Свойство '_rev' отсутствует или пусто в предоставленном документе." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété '_rev' est vide ou manquante dans le document fourni." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La proprietà '_rev' è vuota o mancante nel documento fornito." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die '_rev'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad '_rev' está vacía o falta en el documento proporcionado." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "提供的文档中 '_rev' 属性为空或缺失。" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "خاصية '_rev' فارغة أو مفقودة في المستند المقدم." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "提供されたドキュメントに '_rev' プロパティが空またはありません。" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Sağlanan belgede '_rev' özelliği boş veya eksik." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공된 문서에서 '_rev' 속성이 비어 있거나 없습니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade '_rev' está vazia ou ausente no documento fornecido." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Vlastnost '_rev' je prázdná nebo chybí v poskytnutém dokumentu." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Уласцівасць '_rev' пустая або адсутнічае ў прадастаўленым дакуменце." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Властивість '_rev' порожня або відсутня в наданому документі." + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Ұсынылған құжатта '_rev' қасиеті бос немесе жоқ." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Тәкъдим ителгән документта '_rev' үзенчәлеге буш яки юк." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Тәҡдим ителгән документта '_rev' ҡасиәте буш йәки юҡ." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Својство '_rev' је празно или недостаје у датом документу." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Egenskapen '_rev' är tom eller saknas i det angivna dokumentet." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คุณสมบัติ '_rev' ว่างหรือหายไปในเอกสารที่ให้มา" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-egenskapen er tom eller mangler i det oppgitte dokumentet." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-egenskaben er tom eller mangler i det leverede dokument." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Właściwość '_rev' jest pusta lub brakuje jej w dostarczonym dokumencie." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thuộc tính '_rev' trống hoặc thiếu trong tài liệu được cung cấp." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "'_rev' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "'_rev' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Свойството '_rev' е празно или липсва в предоставения документ." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η ιδιότητα '_rev' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Proprietatea '_rev' este goală sau lipsă din documentul furnizat." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Берилген документте '_rev' касиети бош же жок." + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Ta'minlangan hujjatda '_rev' xususiyati bo'sh yoki yo'q." + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Svojstvo '_rev' je prazno ili nedostaje u dostavljenom dokumentu." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Vlastnosť '_rev' je prázdna alebo chýba v poskytnutom dokumente." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Lastnost '_rev' je prazna ali manjka v predloženem dokumentu." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Properti '_rev' kosong atau tidak ada dalam dokumen yang diberikan." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang '_rev' property ay walang laman o nawawala sa ibinigay na dokumento." } } } }, - "UNAUTHORIZED_ERROR" : { - "comment" : "Unauthorized access message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Authentication failed due to an incorrect username or password." + "UNAUTHORIZED_ERROR": { + "comment": "Unauthorized access message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication failed due to an incorrect username or password." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ошибка аутентификации из-за неправильного имени пользователя или пароля." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'authentification a échoué en raison d'un nom d'utilisateur ou d'un mot de passe incorrect." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Autenticazione fallita a causa di un nome utente o una password non corretti." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Authentifizierung aufgrund eines falschen Benutzernamens oder Passworts fehlgeschlagen." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La autenticación falló debido a un nombre de usuario o contraseña incorrectos." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "由于用户名或密码不正确,认证失败。" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل المصادقة بسبب اسم مستخدم أو كلمة مرور غير صحيحة." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名またはパスワードが間違っているため、認証に失敗しました。" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 사용자 이름 또는 비밀번호로 인해 인증에 실패했습니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A autenticação falhou devido a um nome de usuário ou senha incorretos." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Ověření selhalo kvůli nesprávnému uživatelskému jménu nebo heslu." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Аўтэнтыфікацыя не ўдалася з-за няправільнага імя карыстальніка або пароля." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Помилка аутентифікації через неправильне ім'я користувача або пароль." + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Қате пайдаланушы аты немесе құпия сөз себебінен аутентификация сәтсіз аяқталды." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Дөрес булмаган кулланучы исеме яки серсүз сәбәпле аутентификация уңышсыз булды." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Дөрөҫ булмаған ҡулланыусы исеме йәки серһүҙ сәбәпле аутентификация уңышһыҙ булды." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Аутентификација није успела због нетачног корисничког имена или лозинке." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Autentisering misslyckades på grund av ett felaktigt användarnamn eller lösenord." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การตรวจสอบสิทธิ์ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Tunnistautuminen epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "Autentisering mislyktes på grunn av feil brukernavn eller passord." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Godkendelse mislykkedes på grund af et forkert brugernavn eller adgangskode." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Uwierzytelnienie nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xác thực thất bại do tên người dùng hoặc mật khẩu không chính xác." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "गलत उपयोगकर्ता नाम या पासवर्ड के कारण प्रमाणीकरण विफल हुआ।" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "غلط صارف نام یا پاس ورڈ کی وجہ سے تصدیق ناکام ہو گئی۔" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Удостоверяването не бе успешно поради неправилно потребителско име или парола." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η πιστοποίηση απέτυχε λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Autentificarea a eșuat din cauza unui nume de utilizator sau parolă incorectă." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Туура эмес колдонуучу аты же сырсөз себебинен аутентификация ийгиликсиз болду." + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Noto'g'ri foydalanuvchi nomi yoki parol tufayli autentifikatsiya muvaffaqiyatsiz tugadi." + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Autentifikacija nije uspjela zbog netočnog korisničkog imena ili lozinke." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Overenie zlyhalo kvôli nesprávnemu používateľskému menu alebo heslu." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Preverjanje pristnosti ni uspelo zaradi napačnega uporabniškega imena ali gesla." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Autentikasi gagal karena nama pengguna atau kata sandi salah." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Nabigo ang authentication dahil sa maling username o password." } } } }, - "UNKNOWN_RESPONSE_ERROR" : { - "comment" : "Unknown response message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The response from CouchDB was unrecognized or invalid." + "UNKNOWN_RESPONSE_ERROR": { + "comment": "Unknown response message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The response from CouchDB was unrecognized or invalid." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ответ от CouchDB не распознан или недействителен." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La réponse de CouchDB n'a pas été reconnue ou est invalide." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La risposta da CouchDB non è stata riconosciuta o è invalida." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Antwort von CouchDB wurde nicht erkannt oder ist ungültig." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La respuesta de CouchDB no fue reconocida o no es válida." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "来自 CouchDB 的响应无法识别或无效。" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "الاستجابة من CouchDB غير معروفة أو غير صالحة." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "CouchDBからの応答が認識できないか無効です。" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "CouchDB'den gelen yanıt tanınmadı veya geçersiz." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "CouchDB의 응답을 인식할 수 없거나 유효하지 않습니다." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A resposta do CouchDB não foi reconhecida ou é inválida." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Odpověď z CouchDB nebyla rozpoznána nebo je neplatná." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Адказ ад CouchDB не быў распазнаны альбо несапраўдны." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відповідь від CouchDB не розпізнана або недійсна." + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "CouchDB жауабы танылмады немесе жарамсыз." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "CouchDB җавабы танылмады яки дөрес түгел." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "CouchDB яуабы танылманы йәки дөрөҫ түгел." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Одговор од CouchDB није препознат или је неважећи." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Svaret från CouchDB var okänt eller ogiltigt." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การตอบกลับจาก CouchDB ไม่เป็นที่รู้จักหรือไม่ถูกต้อง" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "CouchDB:n vastaus oli tunnistamaton tai virheellinen." + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "Svaret fra CouchDB ble ikke gjenkjent eller var ugyldig." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Svaret fra CouchDB blev ikke genkendt eller er ugyldigt." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Odpowiedź z CouchDB była nierozpoznana lub nieprawidłowa." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Phản hồi từ CouchDB không được nhận dạng hoặc không hợp lệ." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "CouchDB से प्रतिक्रिया अपरिचित या अमान्य थी।" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "CouchDB کا جواب غیر معروف یا غلط تھا۔" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Отговорът от CouchDB беше неразпознат или невалиден." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η απάντηση από το CouchDB δεν αναγνωρίστηκε ή ήταν άκυρη." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Răspunsul de la CouchDB a fost nerecunoscut sau invalid." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "CouchDB жообу таанылган эмес же жараксыз болгон." + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "CouchDB dan javob tanilmagan yoki yaroqsiz edi." + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Odgovor iz CouchDB-a nije prepoznat ili je nevažeći." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Odpoveď z CouchDB nebola rozpoznaná alebo je neplatná." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Odgovor iz CouchDB ni bil prepoznan ali je neveljaven." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tanggapan dari CouchDB tidak dikenali atau tidak valid." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang response mula sa CouchDB ay hindi nakilala o hindi wasto." } } } }, - "UPDATE_ERROR" : { - "comment" : "UPDATE request failure message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The UPDATE request wasn't successful: %@" + "UPDATE_ERROR": { + "comment": "UPDATE request failure message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The UPDATE request wasn't successful: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-запрос не был выполнен успешно: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête UPDATE n'a pas abouti : %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta UPDATE non è riuscita: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die UPDATE-Anfrage war nicht erfolgreich: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud UPDATE no fue exitosa: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "UPDATE 请求未成功:%@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب UPDATE: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "UPDATEリクエストが失敗しました:%@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE isteği başarısız oldu: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "UPDATE 요청이 성공하지 못했습니다: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição UPDATE não foi bem-sucedida: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek UPDATE nebyl úspěšný: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het UPDATE-verzoek was niet succesvol: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт UPDATE не быў паспяховым: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит UPDATE не був успішним: %@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "UPDATE сұрауы сәтсіз аяқталды: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "UPDATE үтенече уңышсыз булды: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "UPDATE һорауы уңышһыҙ булды: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ UPDATE ไม่สำเร็จ: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-pyyntö epäonnistui: %@" + } + }, + "no": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-forespørselen var ikke vellykket: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-anmodningen var ikke succesfuld: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie UPDATE nie powiodło się: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu UPDATE không thành công: %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "UPDATE अनुरोध सफल नहीं था: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "UPDATE درخواست کامیاب نہیں ہوئی: %@" + } + }, + "nl-be": { + "stringUnit": { + "state": "translated", + "value": "Het UPDATE-verzoek was niet succesvol: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "UPDATE заявката не бе успешна: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα UPDATE δεν ήταν επιτυχές: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea UPDATE nu a reușit: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "UPDATE сурамы ийгиликсиз болду: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "UPDATE so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE zahtjev nije uspio: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka UPDATE nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva UPDATE ni uspela: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan UPDATE tidak berhasil: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang UPDATE request ay hindi matagumpay: %@" } } } } }, - "version" : "1.0" + "version": "1.0" } \ No newline at end of file From 8147a69d12a6ecd74cb05aa14282ce2c591498be Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 9 Apr 2025 01:17:29 +0700 Subject: [PATCH 128/202] More translations --- Sources/CouchDBClient/Localizable.xcstrings | 3276 +++++++++---------- 1 file changed, 1633 insertions(+), 1643 deletions(-) diff --git a/Sources/CouchDBClient/Localizable.xcstrings b/Sources/CouchDBClient/Localizable.xcstrings index e43d556..f5296e5 100644 --- a/Sources/CouchDBClient/Localizable.xcstrings +++ b/Sources/CouchDBClient/Localizable.xcstrings @@ -1,2466 +1,2456 @@ { - "sourceLanguage": "en", - "strings": { - "DELETE_ERROR": { - "comment": "DELETE request failure message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The DELETE request wasn't successful: %@" + "sourceLanguage" : "en", + "strings" : { + "DELETE_ERROR" : { + "comment" : "DELETE request failure message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل طلب DELETE: %@" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "DELETE-запрос не был выполнен успешно: %@" + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE һорауы уңышһыҙ булды: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête DELETE n'a pas abouti : %@" + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запыт DELETE не быў паспяховым: %@" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta DELETE non è riuscita: %@" + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE заявката не бе успешна: %@" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die DELETE-Anfrage war nicht erfolgreich: %@" + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požadavek DELETE nebyl úspěšný: %@" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud DELETE no fue exitosa: %@" + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE-anmodningen var ikke succesfuld: %@" } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "DELETE 请求未成功:%@" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die DELETE-Anfrage war nicht erfolgreich: %@" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل طلب DELETE: %@" + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το αίτημα DELETE δεν ήταν επιτυχές: %@" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "DELETEリクエストが失敗しました:%@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The DELETE request wasn't successful: %@" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "DELETE isteği başarısız oldu: %@" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La solicitud DELETE no fue exitosa: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "DELETE 요청이 성공하지 못했습니다: %@" + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE-pyyntö epäonnistui: %@" } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição DELETE não foi bem-sucedida: %@" + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang DELETE request ay hindi matagumpay: %@" } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek DELETE nebyl úspěšný: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La requête DELETE n'a pas abouti : %@" } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het DELETE-verzoek was niet succesvol: %@" + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE अनुरोध सफल नहीं था: %@" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт DELETE не быў паспяховым: %@" + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE zahtjev nije uspio: %@" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит DELETE не був успішним: %@" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permintaan DELETE tidak berhasil: %@" } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "DELETE сұрауы сәтсіз аяқталды: %@" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La richiesta DELETE non è riuscita: %@" } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "DELETE үтенече уңышсыз булды: %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETEリクエストが失敗しました:%@" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "DELETE һорауы уңышһыҙ булды: %@" + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE сұрауы сәтсіз аяқталды: %@" } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "DELETE захтев није успео: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE 요청이 성공하지 못했습니다: %@" } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "DELETE-begäran lyckades inte: %@" + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE сурамы ийгиликсиз болду: %@" } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอ DELETE ไม่สำเร็จ: %@" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE-forespørselen var ikke vellykket: %@" } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "DELETE-pyyntö epäonnistui: %@" + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het DELETE-verzoek was niet succesvol: %@" } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "DELETE-forespørselen var ikke vellykket: %@" + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het DELETE-verzoek was niet succesvol: %@" } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "DELETE-anmodningen var ikke succesfuld: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie DELETE nie powiodło się: %@" } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie DELETE nie powiodło się: %@" + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A requisição DELETE não foi bem-sucedida: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu DELETE không thành công: %@" + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cererea DELETE nu a reușit: %@" } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "DELETE अनुरोध सफल नहीं था: %@" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE-запрос не был выполнен успешно: %@" } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "DELETE درخواست کامیاب نہیں ہوئی: %@" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požiadavka DELETE nebola úspešná: %@" } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het DELETE-verzoek was niet succesvol: %@" + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zahteva DELETE ni uspela: %@" } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "DELETE заявката не бе успешна: %@" + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE захтев није успео: %@" } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα DELETE δεν ήταν επιτυχές: %@" + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE-begäran lyckades inte: %@" } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea DELETE nu a reușit: %@" + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คำขอ DELETE ไม่สำเร็จ: %@" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "DELETE сурамы ийгиликсиз болду: %@" + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE isteği başarısız oldu: %@" } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "DELETE so'rovi muvaffaqiyatsiz yakunlandi: %@" + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE үтенече уңышсыз булды: %@" } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "DELETE zahtjev nije uspio: %@" + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запит DELETE не був успішним: %@" } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka DELETE nebola úspešná: %@" + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE درخواست کامیاب نہیں ہوئی: %@" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva DELETE ni uspela: %@" + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE so'rovi muvaffaqiyatsiz yakunlandi: %@" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan DELETE tidak berhasil: %@" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu DELETE không thành công: %@" } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang DELETE request ay hindi matagumpay: %@" + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "DELETE 请求未成功:%@" } } } }, - "FIND_ERROR": { - "comment": "FIND request failure message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The FIND request wasn't successful: %@" + "FIND_ERROR" : { + "comment" : "FIND request failure message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل طلب FIND: %@" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "FIND-запрос не был выполнен успешно: %@" + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND һорауы уңышһыҙ булды: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête FIND n'a pas abouti : %@" + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запыт FIND не быў паспяховым: %@" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta FIND non è riuscita: %@" + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND заявката не бе успешна: %@" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die FIND-Anfrage war nicht erfolgreich: %@" + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požadavek FIND nebyl úspěšný: %@" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud FIND no fue exitosa: %@" + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND-anmodningen var ikke succesfuld: %@" } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "FIND 请求未成功:%@" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die FIND-Anfrage war nicht erfolgreich: %@" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل طلب FIND: %@" + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το αίτημα FIND δεν ήταν επιτυχές: %@" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "FINDリクエストが失敗しました:%@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The FIND request wasn't successful: %@" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "FIND isteği başarısız oldu: %@" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La solicitud FIND no fue exitosa: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "FIND 요청이 성공하지 못했습니다: %@" + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND-pyyntö epäonnistui: %@" } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição FIND não foi bem-sucedida: %@" + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang FIND request ay hindi matagumpay: %@" } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek FIND nebyl úspěšný: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La requête FIND n'a pas abouti : %@" } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het FIND-verzoek was niet succesvol: %@" + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND अनुरोध सफल नहीं था: %@" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт FIND не быў паспяховым: %@" + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND zahtjev nije uspio: %@" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит FIND не був успішним: %@" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permintaan FIND tidak berhasil: %@" } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "FIND сұрауы сәтсіз аяқталды: %@" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La richiesta FIND non è riuscita: %@" } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "FIND үтенече уңышсыз булды: %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "FINDリクエストが失敗しました:%@" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "FIND һорауы уңышһыҙ булды: %@" + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND сұрауы сәтсіз аяқталды: %@" } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "FIND захтев није успео: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND 요청이 성공하지 못했습니다: %@" } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "FIND-begäran lyckades inte: %@" + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND сурамы ийгиликсиз болду: %@" } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอ FIND ไม่สำเร็จ: %@" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND-forespørselen var ikke vellykket: %@" } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "FIND-pyyntö epäonnistui: %@" + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het FIND-verzoek was niet succesvol: %@" } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "FIND-forespørselen var ikke vellykket: %@" + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het FIND-verzoek was niet succesvol: %@" } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "FIND-anmodningen var ikke succesfuld: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie FIND nie powiodło się: %@" } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie FIND nie powiodło się: %@" + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A requisição FIND não foi bem-sucedida: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu FIND không thành công: %@" + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cererea FIND nu a reușit: %@" } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "FIND अनुरोध सफल नहीं था: %@" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND-запрос не был выполнен успешно: %@" } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "FIND درخواست کامیاب نہیں ہوئی: %@" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požiadavka FIND nebola úspešná: %@" } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het FIND-verzoek was niet succesvol: %@" + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zahteva FIND ni uspela: %@" } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "FIND заявката не бе успешна: %@" + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND захтев није успео: %@" } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα FIND δεν ήταν επιτυχές: %@" + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND-begäran lyckades inte: %@" } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea FIND nu a reușit: %@" + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คำขอ FIND ไม่สำเร็จ: %@" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "FIND сурамы ийгиликсиз болду: %@" + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND isteği başarısız oldu: %@" } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "FIND so'rovi muvaffaqiyatsiz yakunlandi: %@" + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND үтенече уңышсыз булды: %@" } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "FIND zahtjev nije uspio: %@" + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запит FIND не був успішним: %@" } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka FIND nebola úspešná: %@" + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND درخواست کامیاب نہیں ہوئی: %@" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva FIND ni uspela: %@" + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND so'rovi muvaffaqiyatsiz yakunlandi: %@" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan FIND tidak berhasil: %@" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu FIND không thành công: %@" } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang FIND request ay hindi matagumpay: %@" + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIND 请求未成功:%@" } } } }, - "GET_ERROR": { - "comment": "GET request failure message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The GET request wasn't successful: %@" + "GET_ERROR" : { + "comment" : "GET request failure message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل طلب GET: %@" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "GET-запрос не был выполнен успешно: %@" + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET һорауы уңышһыҙ булды: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête GET n'a pas abouti : %@" + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запыт GET не быў паспяховым: %@" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta GET non è riuscita: %@" + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET заявката не бе успешна: %@" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die GET-Anfrage war nicht erfolgreich: %@" + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požadavek GET nebyl úspěšný: %@" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud GET no fue exitosa: %@" + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET-anmodningen var ikke succesfuld: %@" } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "GET 请求未成功:%@" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die GET-Anfrage war nicht erfolgreich: %@" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل طلب GET: %@" + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το αίτημα GET δεν ήταν επιτυχές: %@" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "GETリクエストが失敗しました:%@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The GET request wasn't successful: %@" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "GET isteği başarısız oldu: %@" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La solicitud GET no fue exitosa: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "GET 요청이 성공하지 못했습니다: %@" + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET-pyyntö epäonnistui: %@" } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição GET não foi bem-sucedida: %@" + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang GET request ay hindi matagumpay: %@" } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek GET nebyl úspěšný: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La requête GET n'a pas abouti : %@" } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het GET-verzoek was niet succesvol: %@" + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET अनुरोध सफल नहीं था: %@" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт GET не быў паспяховым: %@" + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET zahtjev nije uspio: %@" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит GET не був успішним: %@" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permintaan GET tidak berhasil: %@" } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "GET сұрауы сәтсіз аяқталды: %@" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La richiesta GET non è riuscita: %@" } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "GET үтенече уңышсыз булды: %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "GETリクエストが失敗しました:%@" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "GET һорауы уңышһыҙ булды: %@" + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET сұрауы сәтсіз аяқталды: %@" } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "GET захтев није успео: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET 요청이 성공하지 못했습니다: %@" } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "GET-begäran lyckades inte: %@" + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET сурамы ийгиликсиз болду: %@" } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอ GET ไม่สำเร็จ: %@" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET-forespørselen var ikke vellykket: %@" } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "GET-pyyntö epäonnistui: %@" + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het GET-verzoek was niet succesvol: %@" } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "GET-forespørselen var ikke vellykket: %@" + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het GET-verzoek was niet succesvol: %@" } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "GET-anmodningen var ikke succesfuld: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie GET nie powiodło się: %@" } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie GET nie powiodło się: %@" + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A requisição GET não foi bem-sucedida: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu GET không thành công: %@" + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cererea GET nu a reușit: %@" } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "GET अनुरोध सफल नहीं था: %@" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET-запрос не был выполнен успешно: %@" } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "GET درخواست کامیاب نہیں ہوئی: %@" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požiadavka GET nebola úspešná: %@" } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het GET-verzoek was niet succesvol: %@" + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zahteva GET ni uspela: %@" } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "GET заявката не бе успешна: %@" + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET захтев није успео: %@" } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα GET δεν ήταν επιτυχές: %@" + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET-begäran lyckades inte: %@" } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea GET nu a reușit: %@" + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คำขอ GET ไม่สำเร็จ: %@" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "GET сурамы ийгиликсиз болду: %@" + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET isteği başarısız oldu: %@" } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "GET so'rovi muvaffaqiyatsiz yakunlandi: %@" + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET үтенече уңышсыз булды: %@" } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "GET zahtjev nije uspio: %@" + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запит GET не був успішним: %@" } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka GET nebola úspešná: %@" + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET درخواست کامیاب نہیں ہوئی: %@" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva GET ni uspela: %@" + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET so'rovi muvaffaqiyatsiz yakunlandi: %@" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan GET tidak berhasil: %@" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu GET không thành công: %@" } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang GET request ay hindi matagumpay: %@" + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "GET 请求未成功:%@" } } } }, - "ID_MISSING_ERROR": { - "comment": "Error description for missing document ID", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The 'id' property is empty or missing in the provided document." + "ID_MISSING_ERROR" : { + "comment" : "Error description for missing document ID", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خاصية 'id' فارغة أو مفقودة في المستند المقدم." } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Свойство 'id' отсутствует или пусто в предоставленном документе." + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тәҡдим ителгән документта 'id' ҡасиәте буш йәки юҡ." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La propriété 'id' est vide ou manquante dans le document fourni." + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Уласцівасць 'id' пустая або адсутнічае ў прадастаўленым дакуменце." } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La proprietà 'id' è vuota o mancante nel documento fornito." + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свойството 'id' е празно или липсва в предоставения документ." } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die 'id'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastnost 'id' je prázdná nebo chybí v poskytnutém dokumentu." } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La propiedad 'id' está vacía o falta en el documento proporcionado." + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "'id'-egenskaben er tom eller mangler i det leverede dokument." } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "提供的文档中 'id' 属性为空或缺失。" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die 'id'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "خاصية 'id' فارغة أو مفقودة في المستند المقدم." + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Η ιδιότητα 'id' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "提供されたドキュメントに 'id' プロパティが空またはありません。" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The 'id' property is empty or missing in the provided document." } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Sağlanan belgede 'id' özelliği boş veya eksik." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La propiedad 'id' está vacía o falta en el documento proporcionado." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "제공된 문서에서 'id' 속성이 비어 있거나 없습니다." + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'id'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A propriedade 'id' está vazia ou ausente no documento fornecido." + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang 'id' property ay walang laman o nawawala sa ibinigay na dokumento." } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Vlastnost 'id' je prázdná nebo chybí v poskytnutém dokumentu." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La propriété 'id' est vide ou manquante dans le document fourni." } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'id' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Уласцівасць 'id' пустая або адсутнічае ў прадастаўленым дакуменце." + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svojstvo 'id' je prazno ili nedostaje u dostavljenom dokumentu." } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Властивість 'id' порожня або відсутня в наданому документі." + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Properti 'id' kosong atau tidak ada dalam dokumen yang diberikan." } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "Ұсынылған құжатта 'id' қасиеті бос немесе жоқ." + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La proprietà 'id' è vuota o mancante nel documento fornito." } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "Тәкъдим ителгән документта 'id' үзенчәлеге буш яки юк." + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供されたドキュメントに 'id' プロパティが空またはありません。" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "Тәҡдим ителгән документта 'id' ҡасиәте буш йәки юҡ." + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ұсынылған құжатта 'id' қасиеті бос немесе жоқ." } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "Својство 'id' је празно или недостаје у датом документу." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "제공된 문서에서 'id' 속성이 비어 있거나 없습니다." } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Egenskapen 'id' är tom eller saknas i det angivna dokumentet." + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "Берилген документте 'id' касиети бош же жок." } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คุณสมบัติ 'id' ว่างหรือหายไปในเอกสารที่ให้มา" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "'id'-egenskapen er tom eller mangler i det oppgitte dokumentet." } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "'id'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "'id'-egenskapen er tom eller mangler i det oppgitte dokumentet." + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "'id'-egenskaben er tom eller mangler i det leverede dokument." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Właściwość 'id' jest pusta lub brakuje jej w dostarczonym dokumencie." } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Właściwość 'id' jest pusta lub brakuje jej w dostarczonym dokumencie." + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A propriedade 'id' está vazia ou ausente no documento fornecido." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thuộc tính 'id' trống hoặc thiếu trong tài liệu được cung cấp." + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proprietatea 'id' este goală sau lipsă din documentul furnizat." } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "'id' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свойство 'id' отсутствует или пусто в предоставленном документе." } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "'id' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastnosť 'id' je prázdna alebo chýba v poskytnutom dokumente." } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lastnost 'id' je prazna ali manjka v predloženem dokumentu." } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "Свойството 'id' е празно или липсва в предоставения документ." + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Својство 'id' је празно или недостаје у датом документу." } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Η ιδιότητα 'id' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egenskapen 'id' är tom eller saknas i det angivna dokumentet." } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Proprietatea 'id' este goală sau lipsă din documentul furnizat." + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คุณสมบัติ 'id' ว่างหรือหายไปในเอกสารที่ให้มา" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "Берилген документте 'id' касиети бош же жок." + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sağlanan belgede 'id' özelliği boş veya eksik." } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "Ta'minlangan hujjatda 'id' xususiyati bo'sh yoki yo'q." + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тәкъдим ителгән документта 'id' үзенчәлеге буш яки юк." } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Svojstvo 'id' je prazno ili nedostaje u dostavljenom dokumentu." + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Властивість 'id' порожня або відсутня в наданому документі." } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Vlastnosť 'id' je prázdna alebo chýba v poskytnutom dokumente." + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "'id' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Lastnost 'id' je prazna ali manjka v predloženem dokumentu." + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta'minlangan hujjatda 'id' xususiyati bo'sh yoki yo'q." } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Properti 'id' kosong atau tidak ada dalam dokumen yang diberikan." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thuộc tính 'id' trống hoặc thiếu trong tài liệu được cung cấp." } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang 'id' property ay walang laman o nawawala sa ibinigay na dokumento." + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供的文档中 'id' 属性为空或缺失。" } } } }, - "INSERT_ERROR": { - "comment": "INSERT request failure message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The INSERT request wasn't successful: %@" + "INSERT_ERROR" : { + "comment" : "INSERT request failure message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل طلب INSERT: %@" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "INSERT-запрос не был выполнен успешно: %@" + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT һорауы уңышһыҙ булды: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête INSERT n'a pas abouti : %@" + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запыт INSERT не быў паспяховым: %@" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta INSERT non è riuscita: %@" + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT заявката не бе успешна: %@" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die INSERT-Anfrage war nicht erfolgreich: %@" + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požadavek INSERT nebyl úspěšný: %@" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud INSERT no fue exitosa: %@" + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT-anmodningen var ikke succesfuld: %@" } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "INSERT 请求未成功:%@" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die INSERT-Anfrage war nicht erfolgreich: %@" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل طلب INSERT: %@" + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το αίτημα INSERT δεν ήταν επιτυχές: %@" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "INSERTリクエストが失敗しました:%@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The INSERT request wasn't successful: %@" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "INSERT isteği başarısız oldu: %@" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La solicitud INSERT no fue exitosa: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "INSERT 요청이 성공하지 못했습니다: %@" + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT-pyyntö epäonnistui: %@" } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição INSERT não foi bem-sucedida: %@" + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang INSERT request ay hindi matagumpay: %@" } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek INSERT nebyl úspěšný: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La requête INSERT n'a pas abouti : %@" } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het INSERT-verzoek was niet succesvol: %@" + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT अनुरोध सफल नहीं था: %@" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт INSERT не быў паспяховым: %@" + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT zahtjev nije uspio: %@" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит INSERT не був успішним: %@" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permintaan INSERT tidak berhasil: %@" } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "INSERT сұрауы сәтсіз аяқталды: %@" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La richiesta INSERT non è riuscita: %@" } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "INSERT үтенече уңышсыз булды: %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERTリクエストが失敗しました:%@" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "INSERT һорауы уңышһыҙ булды: %@" + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT сұрауы сәтсіз аяқталды: %@" } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "INSERT захтев није успео: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT 요청이 성공하지 못했습니다: %@" } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "INSERT-begäran lyckades inte: %@" + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT сурамы ийгиликсиз болду: %@" } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอ INSERT ไม่สำเร็จ: %@" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT-forespørselen var ikke vellykket: %@" } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "INSERT-pyyntö epäonnistui: %@" + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het INSERT-verzoek was niet succesvol: %@" } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "INSERT-forespørselen var ikke vellykket: %@" + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het INSERT-verzoek was niet succesvol: %@" } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "INSERT-anmodningen var ikke succesfuld: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie INSERT nie powiodło się: %@" } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie INSERT nie powiodło się: %@" + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A requisição INSERT não foi bem-sucedida: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu INSERT không thành công: %@" + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cererea INSERT nu a reușit: %@" } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "INSERT अनुरोध सफल नहीं था: %@" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT-запрос не был выполнен успешно: %@" } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "INSERT درخواست کامیاب نہیں ہوئی: %@" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požiadavka INSERT nebola úspešná: %@" } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het INSERT-verzoek was niet succesvol: %@" + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zahteva INSERT ni uspela: %@" } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "INSERT заявката не бе успешна: %@" + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT захтев није успео: %@" } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα INSERT δεν ήταν επιτυχές: %@" + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT-begäran lyckades inte: %@" } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea INSERT nu a reușit: %@" + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คำขอ INSERT ไม่สำเร็จ: %@" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "INSERT сурамы ийгиликсиз болду: %@" + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT isteği başarısız oldu: %@" } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "INSERT so'rovi muvaffaqiyatsiz yakunlandi: %@" + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT үтенече уңышсыз булды: %@" } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "INSERT zahtjev nije uspio: %@" + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запит INSERT не був успішним: %@" } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka INSERT nebola úspešná: %@" + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT درخواست کامیاب نہیں ہوئی: %@" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva INSERT ni uspela: %@" + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT so'rovi muvaffaqiyatsiz yakunlandi: %@" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan INSERT tidak berhasil: %@" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu INSERT không thành công: %@" } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang INSERT request ay hindi matagumpay: %@" + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "INSERT 请求未成功:%@" } } } }, - "NO_DATA_ERROR": { - "comment": "No data error message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The response body is missing the expected data." + "NO_DATA_ERROR" : { + "comment" : "No data error message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "هيئة الاستجابة تفتقد البيانات المتوقعة." } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "В теле ответа отсутствуют ожидаемые данные." + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "Яуап һүлеһендә көтелгән мәғлүмәт юҡ." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Le corps de la réponse ne contient pas les données attendues." + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "У адказе адсутнічаюць чаканыя дадзеныя." } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Il corpo della risposta non contiene i dati previsti." + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "В тялото на отговора липсват очакваните данни." } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Der Antwortkörper enthält nicht die erwarteten Daten." + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "V těle odpovědi chybí očekávaná data." } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "El cuerpo de la respuesta no contiene los datos esperados." + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Responskroppen mangler de forventede data." } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "响应正文中缺少预期的数据。" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der Antwortkörper enthält nicht die erwarteten Daten." } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "هيئة الاستجابة تفتقد البيانات المتوقعة." + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το σώμα της απάντησης δεν περιέχει τα αναμενόμενα δεδομένα." } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "レスポンスボディに期待されるデータがありません。" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The response body is missing the expected data." } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Yanıt gövdesinde beklenen veri eksik." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "El cuerpo de la respuesta no contiene los datos esperados." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "응답 본문에 예상된 데이터가 없습니다." + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vastauksen runko ei sisällä odotettuja tietoja." } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "O corpo da resposta está sem os dados esperados." + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang response body ay kulang sa inaasahang data." } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "V těle odpovědi chybí očekávaná data." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le corps de la réponse ne contient pas les données attendues." } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "De respons bevat niet de verwachte gegevens." + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "प्रतिक्रिया में अपेक्षित डेटा गायब है।" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "У адказе адсутнічаюць чаканыя дадзеныя." + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tijelo odgovora ne sadrži očekivane podatke." } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "У відповіді відсутні очікувані дані." + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Badan respons tidak memiliki data yang diharapkan." } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "Жауап денесінде күтілген деректер жоқ." + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il corpo della risposta non contiene i dati previsti." } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "Җавап җисемендә көтелгән мәгълүматлар юк." + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "レスポンスボディに期待されるデータがありません。" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "Яуап һүлеһендә көтелгән мәғлүмәт юҡ." + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Жауап денесінде күтілген деректер жоқ." } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "У телу одговора недостају очекивани подаци." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "응답 본문에 예상된 데이터가 없습니다." } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Svarskroppen saknar den förväntade datan." + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "Жооптун денесинде күтүлгөн маалыматтар жок." } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "เนื้อหาการตอบกลับขาดข้อมูลที่คาดหวัง" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Responsen mangler de forventede dataene." } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "Vastauksen runko ei sisällä odotettuja tietoja." + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "De respons bevat niet de verwachte gegevens." } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "Responsen mangler de forventede dataene." + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "De respons bevat niet de verwachte gegevens." } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Responskroppen mangler de forventede data." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W treści odpowiedzi brakuje oczekiwanych danych." } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "W treści odpowiedzi brakuje oczekiwanych danych." + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "O corpo da resposta está sem os dados esperados." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Phản hồi thiếu dữ liệu mong đợi." + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corpul răspunsului nu conține datele așteptate." } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "प्रतिक्रिया में अपेक्षित डेटा गायब है।" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "В теле ответа отсутствуют ожидаемые данные." } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "جواب میں توقع کے مطابق ڈیٹا موجود نہیں ہے۔" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "V tele odpovede chýbajú očakávané dáta." } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "De respons bevat niet de verwachte gegevens." + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vsebina odgovora ne vsebuje pričakovanih podatkov." } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "В тялото на отговора липсват очакваните данни." + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "У телу одговора недостају очекивани подаци." } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το σώμα της απάντησης δεν περιέχει τα αναμενόμενα δεδομένα." + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svarskroppen saknar den förväntade datan." } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Corpul răspunsului nu conține datele așteptate." + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เนื้อหาการตอบกลับขาดข้อมูลที่คาดหวัง" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "Жооптун денесинде күтүлгөн маалыматтар жок." + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yanıt gövdesinde beklenen veri eksik." } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "Javob tarkibida kutilgan ma'lumotlar yo'q." + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Җавап җисемендә көтелгән мәгълүматлар юк." } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Tijelo odgovora ne sadrži očekivane podatke." + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "У відповіді відсутні очікувані дані." } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "V tele odpovede chýbajú očakávané dáta." + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "جواب میں توقع کے مطابق ڈیٹا موجود نہیں ہے۔" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Vsebina odgovora ne vsebuje pričakovanih podatkov." + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "Javob tarkibida kutilgan ma'lumotlar yo'q." } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Badan respons tidak memiliki data yang diharapkan." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Phản hồi thiếu dữ liệu mong đợi." } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang response body ay kulang sa inaasahang data." + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "响应正文中缺少预期的数据。" } } } }, - "REV_MISSING_ERROR": { - "comment": "Error description for missing revision field", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The '_rev' property is empty or missing in the provided document." + "REV_MISSING_ERROR" : { + "comment" : "Error description for missing revision field", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "خاصية '_rev' فارغة أو مفقودة في المستند المقدم." } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Свойство '_rev' отсутствует или пусто в предоставленном документе." + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тәҡдим ителгән документта '_rev' ҡасиәте буш йәки юҡ." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La propriété '_rev' est vide ou manquante dans le document fourni." + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Уласцівасць '_rev' пустая або адсутнічае ў прадастаўленым дакуменце." } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La proprietà '_rev' è vuota o mancante nel documento fornito." + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свойството '_rev' е празно или липсва в предоставения документ." } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die '_rev'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastnost '_rev' je prázdná nebo chybí v poskytnutém dokumentu." } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La propiedad '_rev' está vacía o falta en el documento proporcionado." + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "'_rev'-egenskaben er tom eller mangler i det leverede dokument." } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "提供的文档中 '_rev' 属性为空或缺失。" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die '_rev'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "خاصية '_rev' فارغة أو مفقودة في المستند المقدم." + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Η ιδιότητα '_rev' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "提供されたドキュメントに '_rev' プロパティが空またはありません。" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The '_rev' property is empty or missing in the provided document." } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Sağlanan belgede '_rev' özelliği boş veya eksik." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La propiedad '_rev' está vacía o falta en el documento proporcionado." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "제공된 문서에서 '_rev' 속성이 비어 있거나 없습니다." + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'_rev'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A propriedade '_rev' está vazia ou ausente no documento fornecido." + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang '_rev' property ay walang laman o nawawala sa ibinigay na dokumento." } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Vlastnost '_rev' je prázdná nebo chybí v poskytnutém dokumentu." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La propriété '_rev' est vide ou manquante dans le document fourni." } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "'_rev' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Уласцівасць '_rev' пустая або адсутнічае ў прадастаўленым дакуменце." + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svojstvo '_rev' je prazno ili nedostaje u dostavljenom dokumentu." } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Властивість '_rev' порожня або відсутня в наданому документі." + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Properti '_rev' kosong atau tidak ada dalam dokumen yang diberikan." } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "Ұсынылған құжатта '_rev' қасиеті бос немесе жоқ." + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La proprietà '_rev' è vuota o mancante nel documento fornito." } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "Тәкъдим ителгән документта '_rev' үзенчәлеге буш яки юк." + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供されたドキュメントに '_rev' プロパティが空またはありません。" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "Тәҡдим ителгән документта '_rev' ҡасиәте буш йәки юҡ." + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ұсынылған құжатта '_rev' қасиеті бос немесе жоқ." } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "Својство '_rev' је празно или недостаје у датом документу." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "제공된 문서에서 '_rev' 속성이 비어 있거나 없습니다." } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Egenskapen '_rev' är tom eller saknas i det angivna dokumentet." + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "Берилген документте '_rev' касиети бош же жок." } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คุณสมบัติ '_rev' ว่างหรือหายไปในเอกสารที่ให้มา" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "'_rev'-egenskapen er tom eller mangler i det oppgitte dokumentet." } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "'_rev'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "'_rev'-egenskapen er tom eller mangler i det oppgitte dokumentet." + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "'_rev'-egenskaben er tom eller mangler i det leverede dokument." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Właściwość '_rev' jest pusta lub brakuje jej w dostarczonym dokumencie." } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Właściwość '_rev' jest pusta lub brakuje jej w dostarczonym dokumencie." + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A propriedade '_rev' está vazia ou ausente no documento fornecido." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thuộc tính '_rev' trống hoặc thiếu trong tài liệu được cung cấp." + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proprietatea '_rev' este goală sau lipsă din documentul furnizat." } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "'_rev' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Свойство '_rev' отсутствует или пусто в предоставленном документе." } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "'_rev' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vlastnosť '_rev' je prázdna alebo chýba v poskytnutom dokumente." } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lastnost '_rev' je prazna ali manjka v predloženem dokumentu." } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "Свойството '_rev' е празно или липсва в предоставения документ." + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Својство '_rev' је празно или недостаје у датом документу." } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Η ιδιότητα '_rev' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egenskapen '_rev' är tom eller saknas i det angivna dokumentet." } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Proprietatea '_rev' este goală sau lipsă din documentul furnizat." + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คุณสมบัติ '_rev' ว่างหรือหายไปในเอกสารที่ให้มา" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "Берилген документте '_rev' касиети бош же жок." + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sağlanan belgede '_rev' özelliği boş veya eksik." } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "Ta'minlangan hujjatda '_rev' xususiyati bo'sh yoki yo'q." + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Тәкъдим ителгән документта '_rev' үзенчәлеге буш яки юк." } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Svojstvo '_rev' je prazno ili nedostaje u dostavljenom dokumentu." + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Властивість '_rev' порожня або відсутня в наданому документі." } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Vlastnosť '_rev' je prázdna alebo chýba v poskytnutom dokumente." + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "'_rev' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Lastnost '_rev' je prazna ali manjka v predloženem dokumentu." + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ta'minlangan hujjatda '_rev' xususiyati bo'sh yoki yo'q." } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Properti '_rev' kosong atau tidak ada dalam dokumen yang diberikan." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thuộc tính '_rev' trống hoặc thiếu trong tài liệu được cung cấp." } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang '_rev' property ay walang laman o nawawala sa ibinigay na dokumento." + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "提供的文档中 '_rev' 属性为空或缺失。" } } } }, - "UNAUTHORIZED_ERROR": { - "comment": "Unauthorized access message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Authentication failed due to an incorrect username or password." + "UNAUTHORIZED_ERROR" : { + "comment" : "Unauthorized access message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل المصادقة بسبب اسم مستخدم أو كلمة مرور غير صحيحة." } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Ошибка аутентификации из-за неправильного имени пользователя или пароля." + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дөрөҫ булмаған ҡулланыусы исеме йәки серһүҙ сәбәпле аутентификация уңышһыҙ булды." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "L'authentification a échoué en raison d'un nom d'utilisateur ou d'un mot de passe incorrect." + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Аўтэнтыфікацыя не ўдалася з-за няправільнага імя карыстальніка або пароля." } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Autenticazione fallita a causa di un nome utente o una password non corretti." + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "Удостоверяването не бе успешно поради неправилно потребителско име или парола." } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Authentifizierung aufgrund eines falschen Benutzernamens oder Passworts fehlgeschlagen." + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ověření selhalo kvůli nesprávnému uživatelskému jménu nebo heslu." } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La autenticación falló debido a un nombre de usuario o contraseña incorrectos." + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godkendelse mislykkedes på grund af et forkert brugernavn eller adgangskode." } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "由于用户名或密码不正确,认证失败。" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authentifizierung aufgrund eines falschen Benutzernamens oder Passworts fehlgeschlagen." } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل المصادقة بسبب اسم مستخدم أو كلمة مرور غير صحيحة." + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Η πιστοποίηση απέτυχε λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης." } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "ユーザー名またはパスワードが間違っているため、認証に失敗しました。" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authentication failed due to an incorrect username or password." } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La autenticación falló debido a un nombre de usuario o contraseña incorrectos." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "잘못된 사용자 이름 또는 비밀번호로 인해 인증에 실패했습니다." + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tunnistautuminen epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A autenticação falhou devido a um nome de usuário ou senha incorretos." + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nabigo ang authentication dahil sa maling username o password." } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Ověření selhalo kvůli nesprávnému uživatelskému jménu nebo heslu." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'authentification a échoué en raison d'un nom d'utilisateur ou d'un mot de passe incorrect." } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "गलत उपयोगकर्ता नाम या पासवर्ड के कारण प्रमाणीकरण विफल हुआ।" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Аўтэнтыфікацыя не ўдалася з-за няправільнага імя карыстальніка або пароля." + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentifikacija nije uspjela zbog netočnog korisničkog imena ili lozinke." } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Помилка аутентифікації через неправильне ім'я користувача або пароль." + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentikasi gagal karena nama pengguna atau kata sandi salah." } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "Қате пайдаланушы аты немесе құпия сөз себебінен аутентификация сәтсіз аяқталды." + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autenticazione fallita a causa di un nome utente o una password non corretti." } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "Дөрес булмаган кулланучы исеме яки серсүз сәбәпле аутентификация уңышсыз булды." + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ユーザー名またはパスワードが間違っているため、認証に失敗しました。" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "Дөрөҫ булмаған ҡулланыусы исеме йәки серһүҙ сәбәпле аутентификация уңышһыҙ булды." + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Қате пайдаланушы аты немесе құпия сөз себебінен аутентификация сәтсіз аяқталды." } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "Аутентификација није успела због нетачног корисничког имена или лозинке." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "잘못된 사용자 이름 또는 비밀번호로 인해 인증에 실패했습니다." } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Autentisering misslyckades på grund av ett felaktigt användarnamn eller lösenord." + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "Туура эмес колдонуучу аты же сырсөз себебинен аутентификация ийгиликсиз болду." } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "การตรวจสอบสิทธิ์ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentisering mislyktes på grunn av feil brukernavn eller passord." } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "Tunnistautuminen epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "Autentisering mislyktes på grunn av feil brukernavn eller passord." + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Godkendelse mislykkedes på grund af et forkert brugernavn eller adgangskode." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uwierzytelnienie nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła." } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Uwierzytelnienie nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła." + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A autenticação falhou devido a um nome de usuário ou senha incorretos." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Xác thực thất bại do tên người dùng hoặc mật khẩu không chính xác." + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentificarea a eșuat din cauza unui nume de utilizator sau parolă incorectă." } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "गलत उपयोगकर्ता नाम या पासवर्ड के कारण प्रमाणीकरण विफल हुआ।" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ошибка аутентификации из-за неправильного имени пользователя или пароля." } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "غلط صارف نام یا پاس ورڈ کی وجہ سے تصدیق ناکام ہو گئی۔" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overenie zlyhalo kvôli nesprávnemu používateľskému menu alebo heslu." } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preverjanje pristnosti ni uspelo zaradi napačnega uporabniškega imena ali gesla." } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "Удостоверяването не бе успешно поради неправилно потребителско име или парола." + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Аутентификација није успела због нетачног корисничког имена или лозинке." } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Η πιστοποίηση απέτυχε λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης." + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentisering misslyckades på grund av ett felaktigt användarnamn eller lösenord." } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Autentificarea a eșuat din cauza unui nume de utilizator sau parolă incorectă." + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "การตรวจสอบสิทธิ์ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "Туура эмес колдонуучу аты же сырсөз себебинен аутентификация ийгиликсиз болду." + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "Noto'g'ri foydalanuvchi nomi yoki parol tufayli autentifikatsiya muvaffaqiyatsiz tugadi." + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дөрес булмаган кулланучы исеме яки серсүз сәбәпле аутентификация уңышсыз булды." } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Autentifikacija nije uspjela zbog netočnog korisničkog imena ili lozinke." + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Помилка аутентифікації через неправильне ім'я користувача або пароль." } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Overenie zlyhalo kvôli nesprávnemu používateľskému menu alebo heslu." + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "غلط صارف نام یا پاس ورڈ کی وجہ سے تصدیق ناکام ہو گئی۔" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Preverjanje pristnosti ni uspelo zaradi napačnega uporabniškega imena ali gesla." + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "Noto'g'ri foydalanuvchi nomi yoki parol tufayli autentifikatsiya muvaffaqiyatsiz tugadi." } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Autentikasi gagal karena nama pengguna atau kata sandi salah." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xác thực thất bại do tên người dùng hoặc mật khẩu không chính xác." } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Nabigo ang authentication dahil sa maling username o password." + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "由于用户名或密码不正确,认证失败。" } } } }, - "UNKNOWN_RESPONSE_ERROR": { - "comment": "Unknown response message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The response from CouchDB was unrecognized or invalid." + "UNKNOWN_RESPONSE_ERROR" : { + "comment" : "Unknown response message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "الاستجابة من CouchDB غير معروفة أو غير صالحة." } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Ответ от CouchDB не распознан или недействителен." + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB яуабы танылманы йәки дөрөҫ түгел." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La réponse de CouchDB n'a pas été reconnue ou est invalide." + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Адказ ад CouchDB не быў распазнаны альбо несапраўдны." } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La risposta da CouchDB non è stata riconosciuta o è invalida." + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "Отговорът от CouchDB беше неразпознат или невалиден." } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Antwort von CouchDB wurde nicht erkannt oder ist ungültig." + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odpověď z CouchDB nebyla rozpoznána nebo je neplatná." } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La respuesta de CouchDB no fue reconocida o no es válida." + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svaret fra CouchDB blev ikke genkendt eller er ugyldigt." } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "来自 CouchDB 的响应无法识别或无效。" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Antwort von CouchDB wurde nicht erkannt oder ist ungültig." } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "الاستجابة من CouchDB غير معروفة أو غير صالحة." + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Η απάντηση από το CouchDB δεν αναγνωρίστηκε ή ήταν άκυρη." } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "CouchDBからの応答が認識できないか無効です。" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The response from CouchDB was unrecognized or invalid." } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "CouchDB'den gelen yanıt tanınmadı veya geçersiz." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La respuesta de CouchDB no fue reconocida o no es válida." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "CouchDB의 응답을 인식할 수 없거나 유효하지 않습니다." + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB:n vastaus oli tunnistamaton tai virheellinen." } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A resposta do CouchDB não foi reconhecida ou é inválida." + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang response mula sa CouchDB ay hindi nakilala o hindi wasto." } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Odpověď z CouchDB nebyla rozpoznána nebo je neplatná." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La réponse de CouchDB n'a pas été reconnue ou est invalide." } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB से प्रतिक्रिया अपरिचित या अमान्य थी।" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Адказ ад CouchDB не быў распазнаны альбо несапраўдны." + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odgovor iz CouchDB-a nije prepoznat ili je nevažeći." } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Відповідь від CouchDB не розпізнана або недійсна." + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tanggapan dari CouchDB tidak dikenali atau tidak valid." } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "CouchDB жауабы танылмады немесе жарамсыз." + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La risposta da CouchDB non è stata riconosciuta o è invalida." } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "CouchDB җавабы танылмады яки дөрес түгел." + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDBからの応答が認識できないか無効です。" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "CouchDB яуабы танылманы йәки дөрөҫ түгел." + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB жауабы танылмады немесе жарамсыз." } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "Одговор од CouchDB није препознат или је неважећи." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB의 응답을 인식할 수 없거나 유효하지 않습니다." } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Svaret från CouchDB var okänt eller ogiltigt." + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB жообу таанылган эмес же жараксыз болгон." } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "การตอบกลับจาก CouchDB ไม่เป็นที่รู้จักหรือไม่ถูกต้อง" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svaret fra CouchDB ble ikke gjenkjent eller var ugyldig." } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "CouchDB:n vastaus oli tunnistamaton tai virheellinen." + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het antwoord van CouchDB was niet herkend of ongeldig." } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "Svaret fra CouchDB ble ikke gjenkjent eller var ugyldig." + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het antwoord van CouchDB was niet herkend of ongeldig." } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Svaret fra CouchDB blev ikke genkendt eller er ugyldigt." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odpowiedź z CouchDB była nierozpoznana lub nieprawidłowa." } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Odpowiedź z CouchDB była nierozpoznana lub nieprawidłowa." + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A resposta do CouchDB não foi reconhecida ou é inválida." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Phản hồi từ CouchDB không được nhận dạng hoặc không hợp lệ." + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Răspunsul de la CouchDB a fost nerecunoscut sau invalid." } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "CouchDB से प्रतिक्रिया अपरिचित या अमान्य थी।" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ответ от CouchDB не распознан или недействителен." } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "CouchDB کا جواب غیر معروف یا غلط تھا۔" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odpoveď z CouchDB nebola rozpoznaná alebo je neplatná." } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odgovor iz CouchDB ni bil prepoznan ali je neveljaven." } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "Отговорът от CouchDB беше неразпознат или невалиден." + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Одговор од CouchDB није препознат или је неважећи." } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Η απάντηση από το CouchDB δεν αναγνωρίστηκε ή ήταν άκυρη." + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Svaret från CouchDB var okänt eller ogiltigt." } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Răspunsul de la CouchDB a fost nerecunoscut sau invalid." + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "การตอบกลับจาก CouchDB ไม่เป็นที่รู้จักหรือไม่ถูกต้อง" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "CouchDB жообу таанылган эмес же жараксыз болгон." + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB'den gelen yanıt tanınmadı veya geçersiz." } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "CouchDB dan javob tanilmagan yoki yaroqsiz edi." + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB җавабы танылмады яки дөрес түгел." } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Odgovor iz CouchDB-a nije prepoznat ili je nevažeći." + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відповідь від CouchDB не розпізнана або недійсна." } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Odpoveď z CouchDB nebola rozpoznaná alebo je neplatná." + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB کا جواب غیر معروف یا غلط تھا۔" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Odgovor iz CouchDB ni bil prepoznan ali je neveljaven." + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "CouchDB dan javob tanilmagan yoki yaroqsiz edi." } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Tanggapan dari CouchDB tidak dikenali atau tidak valid." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Phản hồi từ CouchDB không được nhận dạng hoặc không hợp lệ." } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang response mula sa CouchDB ay hindi nakilala o hindi wasto." + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "来自 CouchDB 的响应无法识别或无效。" } } } }, - "UPDATE_ERROR": { - "comment": "UPDATE request failure message", - "extractionState": "extracted_with_value", - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "The UPDATE request wasn't successful: %@" + "UPDATE_ERROR" : { + "comment" : "UPDATE request failure message", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "فشل طلب UPDATE: %@" } }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "UPDATE-запрос не был выполнен успешно: %@" + "ba" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE һорауы уңышһыҙ булды: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête UPDATE n'a pas abouti : %@" + "be" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запыт UPDATE не быў паспяховым: %@" } }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta UPDATE non è riuscita: %@" + "bg" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE заявката не бе успешна: %@" } }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die UPDATE-Anfrage war nicht erfolgreich: %@" + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požadavek UPDATE nebyl úspěšný: %@" } }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud UPDATE no fue exitosa: %@" + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE-anmodningen var ikke succesfuld: %@" } }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "UPDATE 请求未成功:%@" + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die UPDATE-Anfrage war nicht erfolgreich: %@" } }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل طلب UPDATE: %@" + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Το αίτημα UPDATE δεν ήταν επιτυχές: %@" } }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "UPDATEリクエストが失敗しました:%@" + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "The UPDATE request wasn't successful: %@" } }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "UPDATE isteği başarısız oldu: %@" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "La solicitud UPDATE no fue exitosa: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "UPDATE 요청이 성공하지 못했습니다: %@" + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE-pyyntö epäonnistui: %@" } }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição UPDATE não foi bem-sucedida: %@" + "fil" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ang UPDATE request ay hindi matagumpay: %@" } }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek UPDATE nebyl úspěšný: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La requête UPDATE n'a pas abouti : %@" } }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het UPDATE-verzoek was niet succesvol: %@" + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE अनुरोध सफल नहीं था: %@" } }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт UPDATE не быў паспяховым: %@" + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE zahtjev nije uspio: %@" } }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит UPDATE не був успішним: %@" + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permintaan UPDATE tidak berhasil: %@" } }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "UPDATE сұрауы сәтсіз аяқталды: %@" + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "La richiesta UPDATE non è riuscita: %@" } }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "UPDATE үтенече уңышсыз булды: %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATEリクエストが失敗しました:%@" } }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "UPDATE һорауы уңышһыҙ булды: %@" + "kk" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE сұрауы сәтсіз аяқталды: %@" } }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "UPDATE захтев није успео: %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE 요청이 성공하지 못했습니다: %@" } }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "UPDATE-begäran lyckades inte: %@" + "ky" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE сурамы ийгиликсиз болду: %@" } }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอ UPDATE ไม่สำเร็จ: %@" + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE-forespørselen var ikke vellykket: %@" } }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "UPDATE-pyyntö epäonnistui: %@" + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het UPDATE-verzoek was niet succesvol: %@" } }, - "no": { - "stringUnit": { - "state": "translated", - "value": "UPDATE-forespørselen var ikke vellykket: %@" + "nl-BE" : { + "stringUnit" : { + "state" : "translated", + "value" : "Het UPDATE-verzoek was niet succesvol: %@" } }, - "da": { - "stringUnit": { - "state": "translated", - "value": "UPDATE-anmodningen var ikke succesfuld: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Żądanie UPDATE nie powiodło się: %@" } }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie UPDATE nie powiodło się: %@" + "pt" : { + "stringUnit" : { + "state" : "translated", + "value" : "A requisição UPDATE não foi bem-sucedida: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu UPDATE không thành công: %@" + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cererea UPDATE nu a reușit: %@" } }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "UPDATE अनुरोध सफल नहीं था: %@" + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE-запрос не был выполнен успешно: %@" } }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "UPDATE درخواست کامیاب نہیں ہوئی: %@" + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Požiadavka UPDATE nebola úspešná: %@" } }, - "nl-be": { - "stringUnit": { - "state": "translated", - "value": "Het UPDATE-verzoek was niet succesvol: %@" + "sl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zahteva UPDATE ni uspela: %@" } }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "UPDATE заявката не бе успешна: %@" + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE захтев није успео: %@" } }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα UPDATE δεν ήταν επιτυχές: %@" + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE-begäran lyckades inte: %@" } }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea UPDATE nu a reușit: %@" + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "คำขอ UPDATE ไม่สำเร็จ: %@" } }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "UPDATE сурамы ийгиликсиз болду: %@" + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE isteği başarısız oldu: %@" } }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "UPDATE so'rovi muvaffaqiyatsiz yakunlandi: %@" + "tt" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE үтенече уңышсыз булды: %@" } }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "UPDATE zahtjev nije uspio: %@" + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Запит UPDATE не був успішним: %@" } }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka UPDATE nebola úspešná: %@" + "ur" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE درخواست کامیاب نہیں ہوئی: %@" } }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva UPDATE ni uspela: %@" + "uz" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE so'rovi muvaffaqiyatsiz yakunlandi: %@" } }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan UPDATE tidak berhasil: %@" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu UPDATE không thành công: %@" } }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Ang UPDATE request ay hindi matagumpay: %@" + "zh" : { + "stringUnit" : { + "state" : "translated", + "value" : "UPDATE 请求未成功:%@" } } } } }, - "version": "1.0" + "version" : "1.0" } \ No newline at end of file From 1238adf1d5558e5b2eecb774fd333842b3b231c3 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 9 Apr 2025 01:42:55 +0700 Subject: [PATCH 129/202] fixes for Linux --- .../Models/CouchDBClientError.swift | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 8c5e5b6..5d3c14f 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -58,6 +58,7 @@ extension CouchDBClientError: LocalizedError { /// A textual description of the error, tailored for user-facing contexts. /// The message provides specific details about the error type and underlying cause. public var errorDescription: String? { + #if os(macOS) if #available(macOS 12, *) { switch self { case .idMissing: @@ -122,28 +123,35 @@ extension CouchDBClientError: LocalizedError { ) } } else { - switch self { - case .idMissing: - return NSLocalizedString("ID_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The 'id' property is empty or missing in the provided document.", comment: "Error description for missing document ID") - case .revMissing: - return NSLocalizedString("REV_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The '_rev' property is empty or missing in the provided document.", comment: "Error description for missing revision field") - case .getError(let error): - return NSLocalizedString("GET_ERROR", tableName: nil, bundle: Bundle.module, value: "The GET request wasn't successful: \(error.localizedDescription)", comment: "GET request failure message") - case .insertError(let error): - return NSLocalizedString("INSERT_ERROR", tableName: nil, bundle: Bundle.module, value: "The INSERT request wasn't successful: \(error.localizedDescription)", comment: "INSERT request failure message") - case .updateError(let error): - return NSLocalizedString("UPDATE_ERROR", tableName: nil, bundle: Bundle.module, value: "The UPDATE request wasn't successful: \(error.localizedDescription)", comment: "UPDATE request failure message") - case .deleteError(let error): - return NSLocalizedString("DELETE_ERROR", tableName: nil, bundle: Bundle.module, value: "The DELETE request wasn't successful: \(error.localizedDescription)", comment: "DELETE request failure message") - case .findError(let error): - return NSLocalizedString("FIND_ERROR", tableName: nil, bundle: Bundle.module, value: "The FIND request wasn't successful: \(error.localizedDescription)", comment: "FIND request failure message") - case .unknownResponse: - return NSLocalizedString("UNKNOWN_RESPONSE_ERROR", tableName: nil, bundle: Bundle.module, value: "The response from CouchDB was unrecognized or invalid.", comment: "Unknown response message") - case .unauthorized: - return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") - case .noData: - return NSLocalizedString("NO_DATA_ERROR", tableName: nil, bundle: Bundle.module, value: "The response body is missing the expected data.", comment: "No data error message") - } + return oldErrorDescription + } + #else + return oldErrorDescription + #endif + } + + private var oldErrorDescription: String? { + switch self { + case .idMissing: + return NSLocalizedString("ID_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The 'id' property is empty or missing in the provided document.", comment: "Error description for missing document ID") + case .revMissing: + return NSLocalizedString("REV_MISSING_ERROR", tableName: nil, bundle: Bundle.module, value: "The '_rev' property is empty or missing in the provided document.", comment: "Error description for missing revision field") + case .getError(let error): + return NSLocalizedString("GET_ERROR", tableName: nil, bundle: Bundle.module, value: "The GET request wasn't successful: \(error.localizedDescription)", comment: "GET request failure message") + case .insertError(let error): + return NSLocalizedString("INSERT_ERROR", tableName: nil, bundle: Bundle.module, value: "The INSERT request wasn't successful: \(error.localizedDescription)", comment: "INSERT request failure message") + case .updateError(let error): + return NSLocalizedString("UPDATE_ERROR", tableName: nil, bundle: Bundle.module, value: "The UPDATE request wasn't successful: \(error.localizedDescription)", comment: "UPDATE request failure message") + case .deleteError(let error): + return NSLocalizedString("DELETE_ERROR", tableName: nil, bundle: Bundle.module, value: "The DELETE request wasn't successful: \(error.localizedDescription)", comment: "DELETE request failure message") + case .findError(let error): + return NSLocalizedString("FIND_ERROR", tableName: nil, bundle: Bundle.module, value: "The FIND request wasn't successful: \(error.localizedDescription)", comment: "FIND request failure message") + case .unknownResponse: + return NSLocalizedString("UNKNOWN_RESPONSE_ERROR", tableName: nil, bundle: Bundle.module, value: "The response from CouchDB was unrecognized or invalid.", comment: "Unknown response message") + case .unauthorized: + return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") + case .noData: + return NSLocalizedString("NO_DATA_ERROR", tableName: nil, bundle: Bundle.module, value: "The response body is missing the expected data.", comment: "No data error message") } } } From 057688df71808bd1d39c9acff337af78a7207afd Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 15 Apr 2025 23:36:41 +0700 Subject: [PATCH 130/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5a5abd7..6161753 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1295,7 +1295,7 @@ internal extension CouchDBClient { /// Get authorization cookie in didn't yet. This cookie will be added automatically to requests that require authorization. /// API reference: https://docs.couchdb.org/en/stable/api/server/authn.html#session - /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. New will be created if nil value provided. + /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. NIO's shared will be used if nil value provided. /// - Returns: Authorization response. @discardableResult func authIfNeed(eventLoopGroup: EventLoopGroup? = nil) async throws -> CreateSessionResponse? { From ad95b43a3713039a3d8786ed524630434d893213 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 15 Apr 2025 23:54:39 +0700 Subject: [PATCH 131/202] create HTTPClient if not provided in init --- Sources/CouchDBClient/CouchDBClient.swift | 90 ++++++++--------------- 1 file changed, 29 insertions(+), 61 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 6161753..560ce2c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -94,6 +94,8 @@ public actor CouchDBClient { private let userPassword: String /// Authorization response from CouchDB. private var authData: CreateSessionResponse? + /// HTTP client + internal let httpClient: HTTPClient? // MARK: - Initializer @@ -135,13 +137,14 @@ public actor CouchDBClient { /// ``` /// /// - Note: It's important to ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` before attempting to connect. - public init(config: CouchDBClient.Config) { + public init(config: CouchDBClient.Config, httpClient: HTTPClient? = nil) { self.couchProtocol = config.couchProtocol self.couchHost = config.couchHost self.couchPort = config.couchPort self.userName = config.userName self.userPassword = config.userPassword self.requestsTimeout = config.requestsTimeout + self.httpClient = httpClient } // MARK: - Public methods @@ -177,12 +180,7 @@ public actor CouchDBClient { public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -245,12 +243,7 @@ public actor CouchDBClient { public func dbExists(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Bool { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -305,12 +298,7 @@ public actor CouchDBClient { @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -385,12 +373,7 @@ public actor CouchDBClient { @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -516,12 +499,7 @@ public actor CouchDBClient { public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -743,12 +721,7 @@ public actor CouchDBClient { public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -853,12 +826,7 @@ public actor CouchDBClient { public func update(dbName: String, uri: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1038,12 +1006,7 @@ public actor CouchDBClient { public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1191,12 +1154,7 @@ public actor CouchDBClient { /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1292,6 +1250,21 @@ internal extension CouchDBClient { } return components.url?.absoluteString ?? "" } + + /// Create an HTTPClient instance if not provided during init method. + /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. NIO's shared will be used if nil value provided. + /// - Returns: HTTP client. + func createHTTPClientIfNeed(eventLoopGroup: EventLoopGroup? = nil) -> HTTPClient { + if let httpClient { + return httpClient + } + + if let eventLoopGroup = eventLoopGroup { + return HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + return HTTPClient.shared + } + } /// Get authorization cookie in didn't yet. This cookie will be added automatically to requests that require authorization. /// API reference: https://docs.couchdb.org/en/stable/api/server/authn.html#session @@ -1304,12 +1277,7 @@ internal extension CouchDBClient { return authData } - let httpClient: HTTPClient - if let eventLoopGroup = eventLoopGroup { - httpClient = HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - httpClient = HTTPClient.shared - } + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { From 6b8645572f104f7fb238af886848b67d43783dba Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 15 Apr 2025 23:55:23 +0700 Subject: [PATCH 132/202] new test added --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 0895545..808195f 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -337,6 +337,16 @@ final class CouchDBClientTests: XCTestCase { } } + func test10_provide_HTTPClient() async throws { + let client = CouchDBClient(config: config, httpClient: HTTPClient.shared) + + let httpClient = await client.httpClient + XCTAssertNotNil(httpClient) + + let httpClient2 = await client.createHTTPClientIfNeed() + XCTAssertTrue(httpClient === httpClient2) + } + func test99_deleteDB() async throws { do { try await couchDBClient.deleteDB(testsDB) From 6a37d28ac78b3cac7e8569587b320d202309fb78 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 00:03:57 +0700 Subject: [PATCH 133/202] use FoundationEssentials if possible --- Sources/CouchDBClient/CouchDBClient.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 560ce2c..5d007fe 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -5,7 +5,12 @@ // Created by Sergey Armodin on 06/03/2019. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif + import NIO import NIOHTTP1 import NIOFoundationCompat From 402e3b481bfdd283782138e8c8a78cca7d2850ee Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 00:26:34 +0700 Subject: [PATCH 134/202] tests updated --- .../CouchDBClientTests.swift | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 808195f..40de577 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -28,6 +28,8 @@ final class CouchDBClientTests: XCTestCase { lazy var couchDBClient = CouchDBClient(config: config) + let httpClient = HTTPClient() + override func setUp() async throws { try await super.setUp() } @@ -338,13 +340,27 @@ final class CouchDBClientTests: XCTestCase { } func test10_provide_HTTPClient() async throws { - let client = CouchDBClient(config: config, httpClient: HTTPClient.shared) + let couchDBClient = CouchDBClient(config: config, httpClient: self.httpClient) + + let httpClientProvided = await couchDBClient.httpClient + XCTAssertNotNil(httpClientProvided) - let httpClient = await client.httpClient - XCTAssertNotNil(httpClient) + let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() + XCTAssertTrue(httpClientProvided === httpClientCreatedIfNeed) + XCTAssertTrue(httpClientProvided === self.httpClient) + } - let httpClient2 = await client.createHTTPClientIfNeed() - XCTAssertTrue(httpClient === httpClient2) + func test11_shutdown() async throws { + let client = CouchDBClient( + config: config, + httpClient: HTTPClient() + ) + + do { + try await client.shutdown() + } catch { + XCTFail(error.localizedDescription) + } } func test99_deleteDB() async throws { From a1d1fa0121aad84d000ffe71a4349bd64e94b0b4 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 00:27:56 +0700 Subject: [PATCH 135/202] dependencies updated --- Package.resolved | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Package.resolved b/Package.resolved index 3129e5d..6fe2f30 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "fc96995b948e91f8b447c43c9954f2be85cb048b6bec565f15ba239879e82cf2", + "originHash" : "33bea07c321ec8b33e40322443f2bb300fdedd5b8a4151cb16be6ccbe6dde66a", "pins" : [ { "identity" : "async-http-client", @@ -67,10 +67,10 @@ { "identity" : "swift-http-types", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-http-types", + "location" : "https://github.com/apple/swift-http-types.git", "state" : { - "revision" : "ef18d829e8b92d731ad27bb81583edd2094d1ce3", - "version" : "1.3.1" + "revision" : "a0a57e949a8903563aba4615869310c0ebf14c03", + "version" : "1.4.0" } }, { From a2ecb8c5dc328739a51b334c81d53821b4de93fb Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 00:29:51 +0700 Subject: [PATCH 136/202] added shutdown method --- Sources/CouchDBClient/CouchDBClient.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5d007fe..a33c749 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -152,6 +152,17 @@ public actor CouchDBClient { self.httpClient = httpClient } + /// Shuts down the HTTP client used by the CouchDB client. + /// + /// This asynchronous function ensures that the `HTTPClient` instance is properly shut down, + /// releasing any resources it holds. It is important to call this method when the `CouchDBClient` + /// is no longer needed to avoid resource leaks. + /// + /// - Throws: An error if the shutdown process fails. + public func shutdown() async throws { + try await httpClient?.shutdown() + } + // MARK: - Public methods /// Retrieves a list of all database names from the CouchDB server. @@ -365,7 +376,7 @@ public actor CouchDBClient { /// 4. Sends a `DELETE` request to the CouchDB server to delete the database. /// 5. Processes the server's response, throwing errors for unauthorized access or missing data. /// 6. Decodes the response body into an `UpdateDBResponse` object if successful. - /// 7. If decoding fails, attempts to decode the response into a `CouchDBError` object and throws it as an `.deleteError`. + /// 7. If decoding fails, attempts to decode the response into a `CouchDBError` object and throws it as `.deleteError`. /// /// ### Example Usage: /// ```swift From 04d2ee00ba02fb1a9393db1cd3815ea57fdcaa08 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 00:37:00 +0700 Subject: [PATCH 137/202] formatting --- Sources/CouchDBClient/CouchDBClient.swift | 72 +++++++++---------- .../CouchDBClientTests.swift | 48 ++++++------- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index a33c749..8d9aa85 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -99,8 +99,8 @@ public actor CouchDBClient { private let userPassword: String /// Authorization response from CouchDB. private var authData: CreateSessionResponse? - /// HTTP client - internal let httpClient: HTTPClient? + /// HTTP client + internal let httpClient: HTTPClient? // MARK: - Initializer @@ -149,19 +149,19 @@ public actor CouchDBClient { self.userName = config.userName self.userPassword = config.userPassword self.requestsTimeout = config.requestsTimeout - self.httpClient = httpClient + self.httpClient = httpClient } /// Shuts down the HTTP client used by the CouchDB client. - /// - /// This asynchronous function ensures that the `HTTPClient` instance is properly shut down, - /// releasing any resources it holds. It is important to call this method when the `CouchDBClient` - /// is no longer needed to avoid resource leaks. - /// - /// - Throws: An error if the shutdown process fails. - public func shutdown() async throws { - try await httpClient?.shutdown() - } + /// + /// This asynchronous function ensures that the `HTTPClient` instance is properly shut down, + /// releasing any resources it holds. It is important to call this method when the `CouchDBClient` + /// is no longer needed to avoid resource leaks. + /// + /// - Throws: An error if the shutdown process fails. + public func shutdown() async throws { + try await httpClient?.shutdown() + } // MARK: - Public methods @@ -196,7 +196,7 @@ public actor CouchDBClient { public func getAllDBs(eventLoopGroup: EventLoopGroup? = nil) async throws -> [String] { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -259,7 +259,7 @@ public actor CouchDBClient { public func dbExists(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Bool { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -314,7 +314,7 @@ public actor CouchDBClient { @discardableResult public func createDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -389,7 +389,7 @@ public actor CouchDBClient { @discardableResult public func deleteDB(_ dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> UpdateDBResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -515,7 +515,7 @@ public actor CouchDBClient { public func get(fromDB dbName: String, uri: String, queryItems: [URLQueryItem]? = nil, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -737,7 +737,7 @@ public actor CouchDBClient { public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -842,7 +842,7 @@ public actor CouchDBClient { public func update(dbName: String, uri: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1022,7 +1022,7 @@ public actor CouchDBClient { public func insert(dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1170,7 +1170,7 @@ public actor CouchDBClient { /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { - let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { if eventLoopGroup != nil { @@ -1266,21 +1266,21 @@ internal extension CouchDBClient { } return components.url?.absoluteString ?? "" } - - /// Create an HTTPClient instance if not provided during init method. - /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. NIO's shared will be used if nil value provided. - /// - Returns: HTTP client. - func createHTTPClientIfNeed(eventLoopGroup: EventLoopGroup? = nil) -> HTTPClient { - if let httpClient { - return httpClient - } - - if let eventLoopGroup = eventLoopGroup { - return HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) - } else { - return HTTPClient.shared - } - } + + /// Create an HTTPClient instance if not provided during init method. + /// - Parameter eventLoopGroup: NIO's EventLoopGroup object. NIO's shared will be used if nil value provided. + /// - Returns: HTTP client. + func createHTTPClientIfNeed(eventLoopGroup: EventLoopGroup? = nil) -> HTTPClient { + if let httpClient { + return httpClient + } + + if let eventLoopGroup = eventLoopGroup { + return HTTPClient(eventLoopGroupProvider: .shared(eventLoopGroup)) + } else { + return HTTPClient.shared + } + } /// Get authorization cookie in didn't yet. This cookie will be added automatically to requests that require authorization. /// API reference: https://docs.couchdb.org/en/stable/api/server/authn.html#session diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 40de577..d9a3c7c 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -28,7 +28,7 @@ final class CouchDBClientTests: XCTestCase { lazy var couchDBClient = CouchDBClient(config: config) - let httpClient = HTTPClient() + let httpClient = HTTPClient() override func setUp() async throws { try await super.setUp() @@ -339,29 +339,29 @@ final class CouchDBClientTests: XCTestCase { } } - func test10_provide_HTTPClient() async throws { - let couchDBClient = CouchDBClient(config: config, httpClient: self.httpClient) - - let httpClientProvided = await couchDBClient.httpClient - XCTAssertNotNil(httpClientProvided) - - let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() - XCTAssertTrue(httpClientProvided === httpClientCreatedIfNeed) - XCTAssertTrue(httpClientProvided === self.httpClient) - } - - func test11_shutdown() async throws { - let client = CouchDBClient( - config: config, - httpClient: HTTPClient() - ) - - do { - try await client.shutdown() - } catch { - XCTFail(error.localizedDescription) - } - } + func test10_provide_HTTPClient() async throws { + let couchDBClient = CouchDBClient(config: config, httpClient: self.httpClient) + + let httpClientProvided = await couchDBClient.httpClient + XCTAssertNotNil(httpClientProvided) + + let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() + XCTAssertTrue(httpClientProvided === httpClientCreatedIfNeed) + XCTAssertTrue(httpClientProvided === self.httpClient) + } + + func test11_shutdown() async throws { + let client = CouchDBClient( + config: config, + httpClient: HTTPClient() + ) + + do { + try await client.shutdown() + } catch { + XCTFail(error.localizedDescription) + } + } func test99_deleteDB() async throws { do { From 82671a670bd34488863e791fa25584942a9792f9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:21:07 +0700 Subject: [PATCH 138/202] added tutorial for Hummingbird --- .../Tutorials/Hummingbird/Hummingbird-1.swift | 54 +++++++++++++ .../Tutorials/Hummingbird/Hummingbird-2.swift | 56 ++++++++++++++ .../Tutorials/Hummingbird/Hummingbird-3.swift | 70 +++++++++++++++++ .../Tutorials/Hummingbird/Hummingbird-4.swift | 72 +++++++++++++++++ .../Tutorials/Hummingbird/Hummingbird-5.swift | 20 +++++ .../Tutorials/Hummingbird/Hummingbird-6.swift | 72 +++++++++++++++++ .../Tutorials/Hummingbird/Hummingbird-7.swift | 77 +++++++++++++++++++ .../Hummingbird/Hummingbird-package-1.swift | 35 +++++++++ .../Hummingbird/Hummingbird-package-2.swift | 37 +++++++++ .../Hummingbird/Hummingbird.tutorial | 75 ++++++++++++++++++ .../Tutorial Table of Contents.tutorial | 1 + .../Tutorials/vapor/VaporTutorial.tutorial | 2 +- 12 files changed, 570 insertions(+), 1 deletion(-) create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-2.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-3.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-4.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-5.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-6.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-7.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-1.swift new file mode 100644 index 0000000..e5f2444 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-1.swift @@ -0,0 +1,54 @@ +import Hummingbird +import Logging + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let router = buildRouter() + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter() -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-2.swift new file mode 100644 index 0000000..e6c0c30 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-2.swift @@ -0,0 +1,56 @@ +import Hummingbird +import Logging +import ServiceLifecycle +import CouchDBClient + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let router = buildRouter() + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter() -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-3.swift new file mode 100644 index 0000000..4e04bce --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-3.swift @@ -0,0 +1,70 @@ +import Hummingbird +import Logging +import ServiceLifecycle +import CouchDBClient + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +public struct CouchDBService: Service { + let client: CouchDBClient + + public init(client: CouchDBClient) { + self.client = client + } + + public func run() async throws { + _ = try await client.dbExists("_users") + try? await gracefulShutdown() + try await client.shutdown() + } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let router = buildRouter() + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter() -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-4.swift new file mode 100644 index 0000000..8e94f5a --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-4.swift @@ -0,0 +1,72 @@ +import Hummingbird +import Logging +import ServiceLifecycle +import CouchDBClient + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +public struct CouchDBService: Service { + let client: CouchDBClient + + public init(client: CouchDBClient) { + self.client = client + } + + public func run() async throws { + _ = try await client.dbExists("_users") + try? await gracefulShutdown() + try await client.shutdown() + } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let couchDBClient = CouchDBClient(config: .init(userName: "admin", userPassword: "")) + let couchDBService = CouchDBService(client: couchDBClient) + let router = buildRouter() + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [couchDBService], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter() -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-5.swift new file mode 100644 index 0000000..54d4f24 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-5.swift @@ -0,0 +1,20 @@ +import Hummingbird +import CouchDBClient + +/// Controller for database-related routes +struct DatabaseController { + let couchDBClient: CouchDBClient + + /// Add routes to the router + func addRoutes(to router: Router) { + router.get("databases") { request, context in + do { + let databases = try await couchDBClient.getAllDBs() + return databases + } catch { + context.logger.error("Failed to fetch databases: \(error)") + throw HTTPError(.internalServerError, message: "Failed to fetch databases") + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-6.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-6.swift new file mode 100644 index 0000000..8e94f5a --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-6.swift @@ -0,0 +1,72 @@ +import Hummingbird +import Logging +import ServiceLifecycle +import CouchDBClient + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +public struct CouchDBService: Service { + let client: CouchDBClient + + public init(client: CouchDBClient) { + self.client = client + } + + public func run() async throws { + _ = try await client.dbExists("_users") + try? await gracefulShutdown() + try await client.shutdown() + } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let couchDBClient = CouchDBClient(config: .init(userName: "admin", userPassword: "")) + let couchDBService = CouchDBService(client: couchDBClient) + let router = buildRouter() + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [couchDBService], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter() -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-7.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-7.swift new file mode 100644 index 0000000..fc9eb28 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-7.swift @@ -0,0 +1,77 @@ +import Hummingbird +import Logging +import ServiceLifecycle +import CouchDBClient + +/// Application arguments protocol. We use a protocol so we can call +/// `buildApplication` inside Tests as well as in the App executable. +/// Any variables added here also have to be added to `App` in App.swift and +/// `TestArguments` in AppTest.swift +public protocol AppArguments { + var hostname: String { get } + var port: Int { get } + var logLevel: Logger.Level? { get } +} + +public struct CouchDBService: Service { + let client: CouchDBClient + + public init(client: CouchDBClient) { + self.client = client + } + + public func run() async throws { + _ = try await client.dbExists("_users") + try? await gracefulShutdown() + try await client.shutdown() + } +} + +/// Build application +/// - Parameter arguments: application arguments +public func buildApplication(_ arguments: some AppArguments) async throws -> some ApplicationProtocol { + let environment = Environment() + let logger = { + var logger = Logger(label: "HBTest") + logger.logLevel = + arguments.logLevel ?? environment.get("LOG_LEVEL").flatMap { Logger.Level(rawValue: $0) } ?? .info + return logger + }() + let couchDBClient = CouchDBClient(config: .init(userName: "admin", userPassword: "")) + let couchDBService = CouchDBService(client: couchDBClient) + let router = buildRouter(couchDBClient: couchDBClient) + + let app = Application( + router: router, + configuration: .init( + address: .hostname(arguments.hostname, port: arguments.port), + serverName: "HBTest" + ), + services: [couchDBService], + logger: logger + ) + return app +} + +// Request context used by application +typealias AppRequestContext = BasicRequestContext + +/// Build router +func buildRouter(couchDBClient: CouchDBClient) -> Router { + let router = Router(context: AppRequestContext.self) + // Add middleware + router.addMiddleware { + // logging middleware + LogRequestsMiddleware(.info) + } + // Add default endpoint + router.get("/") { _, _ in + return "Hello!" + } + + // Add database routes + let databaseController = DatabaseController(couchDBClient: couchDBClient) + databaseController.addRoutes(to: router) + + return router +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-1.swift new file mode 100644 index 0000000..5f39cd6 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-1.swift @@ -0,0 +1,35 @@ +// swift-tools-version: 6.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "HummingbirdTest", + platforms: [ + .macOS(.v14) + ], + products: [ + // Products define the executables and libraries a package produces, making them visible to other packages. + .executable( + name: "HummingbirdTest", + targets: ["HummingbirdTest"]) + ], + dependencies: [ + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), + .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0") + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .executableTarget( + name: "HummingbirdTest", + dependencies: [ + .product(name: "ArgumentParser", package: "swift-argument-parser"), + .product(name: "Hummingbird", package: "hummingbird"), .product(name: "Hummingbird", package: "hummingbird") + ]), + .testTarget( + name: "HummingbirdTestTests", + dependencies: ["HummingbirdTest"] + ) + ] +) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift new file mode 100644 index 0000000..0facb44 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift @@ -0,0 +1,37 @@ +// swift-tools-version: 6.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "HummingbirdTest", + platforms: [ + .macOS(.v14) + ], + products: [ + // Products define the executables and libraries a package produces, making them visible to other packages. + .executable( + name: "HummingbirdTest", + targets: ["HummingbirdTest"]) + ], + dependencies: [ + .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), + .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0"), + .package(url: "https://github.com/makoni/couchdb-vapor", from: "2.0.0") + ], + targets: [ + // Targets are the basic building blocks of a package, defining a module or a test suite. + // Targets can depend on other targets in this package and products from dependencies. + .executableTarget( + name: "HummingbirdTest", + dependencies: [ + .product(name: "ArgumentParser", package: "swift-argument-parser"), + .product(name: "Hummingbird", package: "hummingbird"), .product(name: "Hummingbird", package: "hummingbird"), + .product(name: "CouchDBClient", package: "couchdb-vapor") + ]), + .testTarget( + name: "HummingbirdTestTests", + dependencies: ["HummingbirdTest"] + ) + ] +) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial new file mode 100644 index 0000000..d566d7f --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial @@ -0,0 +1,75 @@ +@Tutorial(time: 15) { + @Intro(title: "Using with Hummingbird in a server-side app") { + Use CouchDBClient for developing server-side apps built with Hummingbird. + + @Image(source: curlybraces.square.fill.svg, alt: "Application icon") + } + + @Section(title: "Use CouchDBClient with Hummingbird") { + @ContentAndMedia { + Hummingbird is a lightweight, flexible modern web application framework that runs on top of a SwiftNIO based server implementation. It is designed to require the minimum number of dependencies. `CouchDBClient` is compatible with SwiftNIO and can be used for server-side development. + + @Image(source: vapor.svg, alt: "Application icon") + } + + @Steps { + @Step { + Open the `Package.swift` file. + + @Code(name: "Package.swift", file: Hummingbird-package-1.swift) + } + + @Step { + Add `CouchDBClient` as a Swift Package dependency. + + @Code(name: "Package.swift", file: Hummingbird-package-2.swift) + } + + @Step { + Open `Application+build.swift` in your project. + + @Code(name: "Application+build.swift", file: Hummingbird-1.swift) + } + + @Step { + Import `CouchDBClient` and `ServiceLifecycle`. + + @Code(name: "Application+build.swift", file: Hummingbird-2.swift) + } + + @Step { + Create a new service for CouchDB. + + @Code(name: "Application+build.swift", file: Hummingbird-3.swift) + } + + @Step { + Create `CouchDBService` and add it to the services list. + + @Code(name: "Application+build.swift", file: Hummingbird-4.swift) + } + + @Step { + Create `DatabaseController` as an example controller. + + @Code(name: "DatabaseController.swift", file: Hummingbird-5.swift) + } + + @Step { + Go back to `Application+build.swift`. + + @Code(name: "Application+build.swift", file: Hummingbird-6.swift) + } + + @Step { + Add `DatabaseController` routes to the app router. + + @Code(name: "Application+build.swift", file: Hummingbird-7.swift) + } + + @Step { + Done. Run the project and call try to run `curl http://127.0.0.1:8080/databases` in Terminal + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index 23ef9f9..7ac8394 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -13,6 +13,7 @@ @TutorialReference(tutorial: "doc:macOSTutorial") @TutorialReference(tutorial: "doc:SwiftUITutorial") @TutorialReference(tutorial: "doc:VaporTutorial") + @TutorialReference(tutorial: "doc:Hummingbird") } @Chapter(name: "Errors handling") { diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index 015bac1..d8a879e 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -1,5 +1,5 @@ @Tutorial(time: 15) { - @Intro(title: "Using with Vapor in server-side app") { + @Intro(title: "Using with Vapor in a server-side app") { Use CouchDBClient for developing server-side apps built with Vapor. @Image(source: curlybraces.square.fill.svg, alt: "Application icon") From 7d6fafa522d9a0043d92417a7c3e7d40a25dbc0d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:24:44 +0700 Subject: [PATCH 139/202] tutorials --- .../Tutorial Table of Contents.tutorial | 30 ++--- .../Tutorials/vapor/VaporTutorial.tutorial | 124 +++++++++--------- 2 files changed, 77 insertions(+), 77 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index 7ac8394..f97e13d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -1,26 +1,26 @@ @Tutorials(name: "CouchDBClient") { - @Intro(title: "Getting started") { - Check tutorials for using the lib in a macOS app or with Vapor for server-side development. + @Intro(title: "Getting Started") { + Explore tutorials for using the library in a macOS app or in a Server-Side Swift project. @Image(source: logo.svg, alt: "CouchDBClient logo") } - @Chapter(name: "Getting started") { - Learn how to use CouchDBClient. + @Chapter(name: "Getting Started") { + Learn how to use CouchDBClient effectively. - @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient logo") + @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient illustration") @TutorialReference(tutorial: "doc:macOSTutorial") - @TutorialReference(tutorial: "doc:SwiftUITutorial") - @TutorialReference(tutorial: "doc:VaporTutorial") + @TutorialReference(tutorial: "doc:SwiftUITutorial") + @TutorialReference(tutorial: "doc:VaporTutorial") @TutorialReference(tutorial: "doc:Hummingbird") } - - @Chapter(name: "Errors handling") { - Examples of handling CouchDBClient errors and errors from CouchDB. - - @Image(source: errors.svg, alt: "CouchDBClient logo") - - @TutorialReference(tutorial: "doc:ErrorsHandlingTutorial") - } + + @Chapter(name: "Error Handling") { + Discover examples of handling errors from CouchDBClient and CouchDB itself. + + @Image(source: errors.svg, alt: "Error handling illustration") + + @TutorialReference(tutorial: "doc:ErrorsHandlingTutorial") + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial index d8a879e..473dbe1 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial.tutorial @@ -1,65 +1,65 @@ @Tutorial(time: 15) { - @Intro(title: "Using with Vapor in a server-side app") { - Use CouchDBClient for developing server-side apps built with Vapor. - - @Image(source: curlybraces.square.fill.svg, alt: "Application icon") - } - - @Section(title: "Use CouchDBClient with Vapor") { - @ContentAndMedia { - Vapor is built on top of Apple's [SwiftNIO](https://github.com/apple/swift-nio). `CouchDBClient` is compatible with SwiftNIO and can be used for server-side development. - - @Image(source: vapor.svg, alt: "Application icon") - } - - @Steps { - @Step { - Open the `Package.swift` file. - - @Code(name: "Package.swift", file: VaporTutorial-package-1.swift) - } + @Intro(title: "Using CouchDBClient with Vapor in a Server-Side App") { + Learn how to use CouchDBClient for developing server-side apps built with Vapor. + + @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient and Vapor integration illustration") + } + + @Section(title: "Integrating CouchDBClient with Vapor") { + @ContentAndMedia { + Vapor is built on top of Apple's [SwiftNIO](https://github.com/apple/swift-nio). `CouchDBClient` is fully compatible with SwiftNIO and can be seamlessly used for server-side development. + + @Image(source: vapor.svg, alt: "Vapor framework logo") + } + + @Steps { + @Step { + Open the `Package.swift` file in your Vapor project. + + @Code(name: "Package.swift", file: VaporTutorial-package-1.swift) + } - @Step { - Add `CouchDBClient` as a Swift Package dependency. - - @Code(name: "Package.swift", file: VaporTutorial-package-2.swift) - } - - @Step { - Open `routes.swift` in your Vapor project. - - @Code(name: "routes.swift", file: VaporTutorial-1.swift) - } - - @Step { - Import `CouchDBClient` and create a client instance. - - @Code(name: "routes.swift", file: VaporTutorial-2.swift) - } - - @Step { - Define your data model for CouchDB documents. `RowsResponse` model from the `CouchDBClient` library will be used to parse CouchDB responses. - - @Code(name: "routes.swift", file: VaporTutorial-3.swift) - } - - @Step { - Get your document from a database. That example is using `CouchDB View` to find the document by the url field. Its map function needs a `key` param which is `appUrl` in our case. - - @Code(name: "routes.swift", file: VaporTutorial-4.swift) - } - - @Step { - Parse the response into our data model. - - @Code(name: "routes.swift", file: VaporTutorial-5.swift) - } - - @Step { - Finally pass the data to Leaf for template rendering. - - @Code(name: "routes.swift", file: VaporTutorial-6.swift) - } - } - } + @Step { + Add `CouchDBClient` as a Swift Package dependency. + + @Code(name: "Package.swift", file: VaporTutorial-package-2.swift) + } + + @Step { + Open the `routes.swift` file in your Vapor project. + + @Code(name: "routes.swift", file: VaporTutorial-1.swift) + } + + @Step { + Import `CouchDBClient` and create a client instance. + + @Code(name: "routes.swift", file: VaporTutorial-2.swift) + } + + @Step { + Define your data model for CouchDB documents. Use the `RowsResponse` model from the `CouchDBClient` library to parse CouchDB responses. + + @Code(name: "routes.swift", file: VaporTutorial-3.swift) + } + + @Step { + Retrieve a document from a database. This example uses a `CouchDB View` to find the document by the `url` field. The map function requires a `key` parameter, which is `appUrl` in this case. + + @Code(name: "routes.swift", file: VaporTutorial-4.swift) + } + + @Step { + Parse the response into your data model. + + @Code(name: "routes.swift", file: VaporTutorial-5.swift) + } + + @Step { + Finally, pass the data to Leaf for template rendering. + + @Code(name: "routes.swift", file: VaporTutorial-6.swift) + } + } + } } From 7189fa6e213e9ee10ab26d8c547aad00cf77b130 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:26:59 +0700 Subject: [PATCH 140/202] tutorial --- .../SwiftUI/SwiftUITutorial.tutorial | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial index 8bae6b0..5531c03 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/SwiftUI/SwiftUITutorial.tutorial @@ -1,65 +1,65 @@ @Tutorial(time: 10) { - @Intro(title: "Using with a SwiftUI app") { - A SwiftUI app example + @Intro(title: "Using CouchDBClient with a SwiftUI App") { + Learn how to integrate CouchDBClient into a SwiftUI app for seamless database interactions. - @Image(source: curlybraces.square.fill.svg, alt: "Application icon") + @Image(source: curlybraces.square.fill.svg, alt: "SwiftUI app integration illustration") } @Section(title: "Initialization") { @ContentAndMedia { - Adding CouchDBClient to your project. + Add CouchDBClient to your project and set up the necessary configurations. - @Image(source: swift.svg, alt: "Swift icon") + @Image(source: swift.svg, alt: "Swift logo") } @Steps { @Step { - Open the "Package Dependencies" tab in Xcode. + Open the "Package Dependencies" tab in Xcode. - @Image(source: swiftui-example-1.png, alt: "Xcode") + @Image(source: swiftui-example-1.png, alt: "Xcode Package Dependencies tab") + } + + @Step { + Add `CouchDBClient` as a Swift Package dependency. + + @Image(source: swiftui-example-2.png, alt: "Adding CouchDBClient as a Swift Package dependency") + } + + @Step { + Open your SwiftUI View file. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-1.swift) + } + + @Step { + Import `CouchDBClient` into your View file. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-2.swift) + } + + @Step { + Create a `CouchDBClient` object, define connection settings, and specify the database name. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-3.swift) + } + + @Step { + Define a model for your CouchDB document. Ensure it conforms to the `CouchDBRepresentable` and `Identifiable` protocols. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-4.swift) + } + + @Step { + Add a data source for your SwiftUI View. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-5.swift) + } + + @Step { + Fetch data from CouchDB and display it in the UI. + + @Code(name: "ContentView.swift", file: SwiftUITutorial-6.swift) } - - @Step { - Add `CouchDBClient` as a Swift Package dependency. - - @Image(source: swiftui-example-2.png, alt: "Add CouchDBClient as a Swift Package dependency.") - } - - @Step { - Open your View file. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-1.swift) - } - - @Step { - Import `CouchDBClient`. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-2.swift) - } - - @Step { - Create a CouchDBClient object, define connection settings and database name. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-3.swift) - } - - @Step { - Define a model for your CouchDB document. It should conform to the `CouchDBRepresentable` and `Identifiable` protocols. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-4.swift) - } - - @Step { - Add a data source for your View. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-5.swift) - } - - @Step { - Add getting the data and displaying it in the UI. - - @Code(name: "ContentView.swift", file: SwiftUITutorial-6.swift) - } } } } From a15d31d3beebf8faea233e8cb7e6b0c14c11f992 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:48:42 +0700 Subject: [PATCH 141/202] tutorials --- .../ErrorsHandlingTutorial.tutorial | 78 ++++----- .../Hummingbird/Hummingbird.tutorial | 23 +-- .../Tutorials/macOS/macOSTutorial.tutorial | 150 +++++++++--------- 3 files changed, 126 insertions(+), 125 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial index c465180..9f19e09 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/ErrorsHandling/ErrorsHandlingTutorial.tutorial @@ -1,41 +1,41 @@ @Tutorial(time: 3) { - @Intro(title: "Handling CouchDB errors") { - Use CouchDBClient in a macOS app - - @Image(source: errors.svg, alt: "Application icon") - } - - @Section(title: "Catching errors") { - @ContentAndMedia { - Use CouchDBClient in a macOS app - - @Image(source: errors.svg, alt: "Error icon") - } - - @Steps { - @Step { - `CouchDBClient` has an Error enum `CouchDBClientError`. Some enum values have nested errors of `CouchDBError` type that represent error messages from CouchDB. - - @Code(name: "main.swift", file: ErrorsHandlingTutorial-1.swift) - } - - @Step { - You can wrap your code in a do-catch block to catch a CouchDB error during insert operation. - - @Code(name: "main.swift", file: ErrorsHandlingTutorial-2.swift) - } - - @Step { - Same for updates to find out what's wrong. - - @Code(name: "main.swift", file: ErrorsHandlingTutorial-3.swift) - } - - @Step { - And same for a get operation. CouchDB will return an error message if the username or password is incorrect for example. - - @Code(name: "main.swift", file: ErrorsHandlingTutorial-4.swift) - } - } - } + @Intro(title: "Handling CouchDB Errors") { + Learn how to handle errors effectively when using `CouchDBClient` in your applications. + + @Image(source: errors.svg, alt: "Error handling illustration") + } + + @Section(title: "Catching Errors") { + @ContentAndMedia { + `CouchDBClient` provides robust error handling mechanisms to help you debug and resolve issues efficiently. + + @Image(source: errors.svg, alt: "Error icon") + } + + @Steps { + @Step { + The `CouchDBClient` library includes an error enum called `CouchDBClientError`. Some of its cases contain nested errors of type `CouchDBError`, which represent error messages returned by CouchDB. + + @Code(name: "main.swift", file: ErrorsHandlingTutorial-1.swift) + } + + @Step { + Wrap your code in a `do-catch` block to handle errors during an insert operation. This allows you to catch and process any errors that occur. + + @Code(name: "main.swift", file: ErrorsHandlingTutorial-2.swift) + } + + @Step { + Similarly, use a `do-catch` block for update operations to identify and resolve issues. + + @Code(name: "main.swift", file: ErrorsHandlingTutorial-3.swift) + } + + @Step { + You can also handle errors during a `get` operation. For example, CouchDB will return an error message if the username or password is incorrect. + + @Code(name: "main.swift", file: ErrorsHandlingTutorial-4.swift) + } + } + } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial index d566d7f..c2ba6c7 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird.tutorial @@ -1,20 +1,20 @@ @Tutorial(time: 15) { - @Intro(title: "Using with Hummingbird in a server-side app") { - Use CouchDBClient for developing server-side apps built with Hummingbird. + @Intro(title: "Using CouchDBClient with Hummingbird in a Server-Side App") { + Learn how to use `CouchDBClient` for developing server-side apps built with Hummingbird. - @Image(source: curlybraces.square.fill.svg, alt: "Application icon") + @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient and Hummingbird integration illustration") } - @Section(title: "Use CouchDBClient with Hummingbird") { + @Section(title: "Integrating CouchDBClient with Hummingbird") { @ContentAndMedia { - Hummingbird is a lightweight, flexible modern web application framework that runs on top of a SwiftNIO based server implementation. It is designed to require the minimum number of dependencies. `CouchDBClient` is compatible with SwiftNIO and can be used for server-side development. + Hummingbird is a lightweight, flexible, modern web application framework that runs on top of a SwiftNIO-based server implementation. It is designed to require the minimum number of dependencies. `CouchDBClient` is fully compatible with SwiftNIO and can be seamlessly used for server-side development. - @Image(source: vapor.svg, alt: "Application icon") + @Image(source: vapor.svg, alt: "Hummingbird framework logo") } @Steps { @Step { - Open the `Package.swift` file. + Open the `Package.swift` file in your project. @Code(name: "Package.swift", file: Hummingbird-package-1.swift) } @@ -26,7 +26,7 @@ } @Step { - Open `Application+build.swift` in your project. + Open the `Application+build.swift` file in your project. @Code(name: "Application+build.swift", file: Hummingbird-1.swift) } @@ -44,13 +44,13 @@ } @Step { - Create `CouchDBService` and add it to the services list. + Create a `CouchDBService` and add it to the services list. @Code(name: "Application+build.swift", file: Hummingbird-4.swift) } @Step { - Create `DatabaseController` as an example controller. + Create a `DatabaseController` as an example controller. @Code(name: "DatabaseController.swift", file: Hummingbird-5.swift) } @@ -68,7 +68,8 @@ } @Step { - Done. Run the project and call try to run `curl http://127.0.0.1:8080/databases` in Terminal + Done! Run the project and test it by running the following command in the Terminal: + `curl http://127.0.0.1:8080/databases` } } } diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial index 4235591..eecfa4c 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/macOS/macOSTutorial.tutorial @@ -1,77 +1,77 @@ @Tutorial(time: 10) { - @Intro(title: "macOS app example") { - Learn how to use `CouchDBClient` in a macOS app - - @Image(source: curlybraces.square.fill.svg, alt: "Application icon") - } - - @Section(title: "Initialization") { - @ContentAndMedia { - Adding CouchDBClient to your project. - - @Image(source: macbook.svg, alt: "Application icon") - } - - @Steps { - @Step { - Add `CouchDBClient` as a Swift Package dependency. - - @Image(source: macOSTutorial-1.png, alt: "Add CouchDBClient as a Swift Package dependency.") - } - - @Step { - Here's an example app. - - @Code(name: "main.swift", file: macOSTutorial-1.swift) - } - - @Step { - Import `CouchDBClient`. - - @Code(name: "main.swift", file: macOSTutorial-2.swift) - } - - @Step { - Create a CouchDBClient object, define connection settings and database name. - - @Code(name: "main.swift", file: macOSTutorial-3.swift) - } - - @Step { - Define a model for your CouchDB document. It should conform to the `CouchDBRepresentable` protocol. - - @Code(name: "main.swift", file: macOSTutorial-4.swift) - } - - @Step { - Insert a document into your database. After inserting CouchDBClient will update `_id` and `_rev` values of your document with the values from CouchDB. - - @Code(name: "main.swift", file: macOSTutorial-5.swift) - } - - @Step { - Here's an example of updating the document. CouchDBClient will also update the `_rev` value of your document with the value from CouchDB after saving. - - @Code(name: "main.swift", file: macOSTutorial-6.swift) - } - - @Step { - Getting a document by its `_id` from a database with that method will parse JSON into your model if you provide it as a generic type. - - @Code(name: "main.swift", file: macOSTutorial-7.swift) - } - - @Step { - Deleting a document from a database is also easy. - - @Code(name: "main.swift", file: macOSTutorial-8.swift) - } - - @Step { - More examples can be found in CouchDBClientTests.swift in the lib sources. - - @Image(source: macOSTutorial-2.png, alt: "Add CouchDBClient as a Swift Package dependency.") - } - } - } + @Intro(title: "Using CouchDBClient in a macOS App") { + Learn how to use `CouchDBClient` in a macOS app for seamless database interactions. + + @Image(source: curlybraces.square.fill.svg, alt: "CouchDBClient macOS app integration illustration") + } + + @Section(title: "Initialization") { + @ContentAndMedia { + Add `CouchDBClient` to your project and set up the necessary configurations. + + @Image(source: macbook.svg, alt: "MacBook illustration") + } + + @Steps { + @Step { + Add `CouchDBClient` as a Swift Package dependency. + + @Image(source: macOSTutorial-1.png, alt: "Adding CouchDBClient as a Swift Package dependency") + } + + @Step { + Open the example app file. + + @Code(name: "main.swift", file: macOSTutorial-1.swift) + } + + @Step { + Import `CouchDBClient` into your app. + + @Code(name: "main.swift", file: macOSTutorial-2.swift) + } + + @Step { + Create a `CouchDBClient` object, define connection settings, and specify the database name. + + @Code(name: "main.swift", file: macOSTutorial-3.swift) + } + + @Step { + Define a model for your CouchDB document. Ensure it conforms to the `CouchDBRepresentable` protocol. + + @Code(name: "main.swift", file: macOSTutorial-4.swift) + } + + @Step { + Insert a document into your database. After insertion, `CouchDBClient` will update the `_id` and `_rev` values of your document with the values from CouchDB. + + @Code(name: "main.swift", file: macOSTutorial-5.swift) + } + + @Step { + Update a document in the database. `CouchDBClient` will also update the `_rev` value of your document after saving. + + @Code(name: "main.swift", file: macOSTutorial-6.swift) + } + + @Step { + Retrieve a document by its `_id` from the database. This method will parse the JSON response into your model if you provide it as a generic type. + + @Code(name: "main.swift", file: macOSTutorial-7.swift) + } + + @Step { + Delete a document from the database with ease. + + @Code(name: "main.swift", file: macOSTutorial-8.swift) + } + + @Step { + Explore more examples in `CouchDBClientTests.swift` located in the library sources. + + @Image(source: macOSTutorial-2.png, alt: "CouchDBClient test examples") + } + } + } } From a174fd69d512c3a23cd15e141240c1480346eb50 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:50:10 +0700 Subject: [PATCH 142/202] docs --- .../CouchDBClient.docc/Extensions/Client.md | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md index 99bc733..85cc79f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/Extensions/Client.md @@ -1,33 +1,34 @@ # ``CouchDBClient/CouchDBClient`` -CouchDB client. +A powerful and flexible CouchDB client for Swift, designed to simplify database interactions using Swift Concurrency. ## Overview -A CouchDB client class with methods using Swift Concurrency. +`CouchDBClient` provides a robust set of tools for interacting with CouchDB databases. It supports common database operations such as creating, deleting, and querying databases and documents. Built with Swift Concurrency, it ensures efficient and modern asynchronous programming. + +This client is fully compatible with SwiftNIO, making it ideal for both server-side and client-side Swift applications. ## Topics -### Initializer -- ``init(config:)`` - -### Methods for databases -- ``getAllDBs(eventLoopGroup:)`` -- ``createDB(_:eventLoopGroup:)`` -- ``deleteDB(_:eventLoopGroup:)`` -- ``dbExists(_:eventLoopGroup:)`` - -### Requests to a database -- ``createDB(_:eventLoopGroup:)`` -- ``deleteDB(_:eventLoopGroup:)`` -- ``dbExists(_:eventLoopGroup:)`` -- ``get(fromDB:uri:queryItems:eventLoopGroup:)`` -- ``get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` -- ``insert(dbName:body:eventLoopGroup:)`` -- ``insert(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` -- ``update(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` -- ``update(dbName:uri:body:eventLoopGroup:)`` -- ``find(inDB:body:eventLoopGroup:)`` -- ``find(inDB:selector:dateDecodingStrategy:eventLoopGroup:)`` -- ``delete(fromDb:doc:eventLoopGroup:)`` -- ``delete(fromDb:uri:rev:eventLoopGroup:)`` +### Initialization +- ``init(config:httpClient:)`` + +### Database Management +- ``getAllDBs(eventLoopGroup:)`` +- ``createDB(_:eventLoopGroup:)`` +- ``deleteDB(_:eventLoopGroup:)`` +- ``dbExists(_:eventLoopGroup:)`` + +### Document Operations +- ``insert(dbName:body:eventLoopGroup:)`` +- ``insert(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` +- ``update(dbName:doc:dateEncodingStrategy:eventLoopGroup:)`` +- ``update(dbName:uri:body:eventLoopGroup:)`` +- ``delete(fromDb:doc:eventLoopGroup:)`` +- ``delete(fromDb:uri:rev:eventLoopGroup:)`` + +### Querying and Fetching +- ``get(fromDB:uri:queryItems:eventLoopGroup:)`` +- ``get(fromDB:uri:queryItems:dateDecodingStrategy:eventLoopGroup:)`` +- ``find(inDB:body:eventLoopGroup:)`` +- ``find(inDB:selector:dateDecodingStrategy:eventLoopGroup:)`` From 74e451e6d9d63c5228bc17db4c505cb8c0857c93 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 01:54:51 +0700 Subject: [PATCH 143/202] renamed couchdb-vapor to couchdb-swift --- Package.swift | 2 +- README.md | 14 +++--- .../CouchDBClient.docc/CouchDBClient.md | 44 +++++++++++++------ .../Hummingbird/Hummingbird-package-2.swift | 4 +- .../vapor/VaporTutorial-package-2.swift | 4 +- Sources/CouchDBClient/CouchDBClient.swift | 2 +- .../Models/CouchDBClientError.swift | 2 +- .../Models/CouchUpdateResponse.swift | 2 +- 8 files changed, 45 insertions(+), 29 deletions(-) diff --git a/Package.swift b/Package.swift index 65a8133..77b684c 100644 --- a/Package.swift +++ b/Package.swift @@ -4,7 +4,7 @@ import PackageDescription let package = Package( - name: "couchdb-vapor", + name: "couchdb-swift", defaultLocalization: "en", platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6)], products: [ diff --git a/README.md b/README.md index 4045427..78bc208 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ # CouchDB Client for Swift

- +

-[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-vapor%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/makoni/couchdb-vapor) -[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-vapor%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/makoni/couchdb-vapor) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-swift%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/makoni/couchdb-swift) +[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-swift%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/makoni/couchdb-swift) [![Vapor 4](https://img.shields.io/badge/vapor-4-blue.svg?style=flat)](https://vapor.codes) -[![Build on macOS](https://github.com/makoni/couchdb-vapor/actions/workflows/build-macos.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-vapor/actions/workflows/build-macos.yml) -[![Build on Ubuntu](https://github.com/makoni/couchdb-vapor/actions/workflows/build-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-vapor/actions/workflows/build-ubuntu.yml) -[![Test on Ubuntu](https://github.com/makoni/couchdb-vapor/actions/workflows/test-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-vapor/actions/workflows/test-ubuntu.yml) +[![Build on macOS](https://github.com/makoni/couchdb-swift/actions/workflows/build-macos.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/build-macos.yml) +[![Build on Ubuntu](https://github.com/makoni/couchdb-swift/actions/workflows/build-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/build-ubuntu.yml) +[![Test on Ubuntu](https://github.com/makoni/couchdb-swift/actions/workflows/test-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/test-ubuntu.yml) @@ -41,7 +41,7 @@ Add the following to the `dependencies` section of your `Package.swift`: ```swift dependencies: [ - .package(url: "https://github.com/makoni/couchdb-vapor.git", from: "1.6.0"), + .package(url: "https://github.com/makoni/couchdb-swift.git", from: "1.6.0"), ] --- diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index b5bc23f..9613778 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -1,25 +1,41 @@ # ``CouchDBClient`` -A simple CouchDB client written in Swift. +A lightweight and powerful CouchDB client written in Swift. ## Overview -Source code is available on [GitHub](https://github.com/makoni/couchdb-vapor). +The source code is available on [GitHub](https://github.com/makoni/couchdb-swift). -CouchDBClient allows you to make simple requests to CouchDB. It's using Swift Concurrency (async/await) and supports Linux, iOS 13+, iPadOS 13+, tvOS 13+, watchOS 6+, visionOS 1.0+ and macOS 10.15+. +`CouchDBClient` simplifies interactions with CouchDB by providing an easy-to-use API built with Swift Concurrency (`async/await`). It supports a wide range of platforms, including: -It's using [AsyncHTTPClient](https://github.com/swift-server/async-http-client) which makes it easy to use CouchDBClient for server-side development with Vapor 4. But it's easy to use it with any iOS or macOS app. Check the Essentials section for examples. +- **Linux** +- **iOS 13+** +- **iPadOS 13+** +- **tvOS 13+** +- **watchOS 6+** +- **visionOS 1.0+** +- **macOS 10.15+** -Currently CouchDBClient supports: -- Check if DB exists. -- Create DB. -- Delete DB. -- Get databases list. -- Get a document by id or documents using a view. -- Insert/update documents. -- Find documents by selector. -- Delete documents. -- CouchDB authorization. +Built on top of [AsyncHTTPClient](https://github.com/swift-server/async-http-client), `CouchDBClient` is ideal for server-side development with Vapor and Hummingbird but is equally suitable for iOS and macOS applications. Check the **Essentials** section for usage examples. + +### Features + +`CouchDBClient` currently supports the following operations: + +- **Database Management**: + - Check if a database exists. + - Create a database. + - Delete a database. + - Retrieve a list of all databases. + +- **Document Operations**: + - Get a document by ID or retrieve documents using a view. + - Insert or update documents. + - Find documents using a selector. + - Delete documents. + +- **Authorization**: + - Authenticate with CouchDB. ## Topics diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift index 0facb44..68b6bce 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Hummingbird/Hummingbird-package-2.swift @@ -17,7 +17,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/hummingbird-project/hummingbird.git", from: "2.0.0"), .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0"), - .package(url: "https://github.com/makoni/couchdb-vapor", from: "2.0.0") + .package(url: "https://github.com/makoni/couchdb-swift", from: "2.0.0") ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. @@ -27,7 +27,7 @@ let package = Package( dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser"), .product(name: "Hummingbird", package: "hummingbird"), .product(name: "Hummingbird", package: "hummingbird"), - .product(name: "CouchDBClient", package: "couchdb-vapor") + .product(name: "CouchDBClient", package: "couchdb-swift") ]), .testTarget( name: "HummingbirdTestTests", diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift index bfe1079..a4bb5fb 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/vapor/VaporTutorial-package-2.swift @@ -10,7 +10,7 @@ let package = Package( // 💧 A server-side Swift web framework. .package(url: "https://github.com/vapor/vapor", from: "4.0.0"), .package(url: "https://github.com/vapor/leaf", from: "4.0.0"), - .package(url: "https://github.com/makoni/couchdb-vapor", from: "2.0.0") + .package(url: "https://github.com/makoni/couchdb-swift", from: "2.0.0") ], targets: [ .target( @@ -18,7 +18,7 @@ let package = Package( dependencies: [ .product(name: "Leaf", package: "leaf"), .product(name: "Vapor", package: "vapor"), - .product(name: "CouchDBClient", package: "couchdb-vapor") + .product(name: "CouchDBClient", package: "couchdb-swift") ] ), .executableTarget(name: "Run", dependencies: [.target(name: "App")]), diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 8d9aa85..a3c67c4 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1,6 +1,6 @@ // // couchdb_vapor.swift -// couchdb-vapor +// couchdb-swift // // Created by Sergey Armodin on 06/03/2019. // diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 5d3c14f..f5e724f 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -1,6 +1,6 @@ // // CouchDBClientError.swift -// couchdb-vapor +// couchdb-swift // // Created by Sergei Armodin on 05.04.2025. // diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index 59d6beb..18ba97c 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -1,6 +1,6 @@ // // CouchUpdateResponse.swift -// couchdb-vapor +// couchdb-swift // // Created by Sergey Armodin on 06/03/2019. // From 02061503d48ac0bd8ab079364bd72efc54954d42 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 02:00:54 +0700 Subject: [PATCH 144/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 53 ++++++++++++----------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index a3c67c4..64a1587 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -105,43 +105,46 @@ public actor CouchDBClient { // MARK: - Initializer /// Initializes a new instance of the CouchDB client using the provided configuration. - /// This initializer sets up the client with connection parameters and handles the user password securely, - /// supporting environment variable fallback for sensitive data. /// - /// This initializer sets up the client with default values for connecting to a CouchDB server. It allows for optional customization of the connection parameters such as protocol, host and port. + /// This initializer sets up the client with connection parameters and securely handles the user password, + /// supporting environment variable fallback for sensitive data. It allows for optional customization of the + /// connection parameters such as protocol, host, and port. /// /// - Parameters: - /// - config: A `CouchDBClient.Config` instance containing the configuration details. + /// - config: A `CouchDBClient.Config` instance containing the configuration details, including protocol, host, port, username, and password. + /// - httpClient: An optional `HTTPClient` instance. If not provided, a shared instance will be used. /// - /// Example usage: - /// ```swift - /// // Create a cofig: - /// let config = CouchDBClient.Config( + /// ### Example Usage: + /// ```swift + /// // Create a configuration: + /// let config = CouchDBClient.Config( /// couchProtocol: .http, /// couchHost: "127.0.0.1", /// couchPort: 5984, /// userName: "user", /// userPassword: "myPassword", /// requestsTimeout: 30 - /// ) - /// - /// // Create a client istance: - /// let couchDBClient = CouchDBClient(config: config) - /// ``` - /// If you don't want to have your password in the code you can pass `COUCHDB_PASS` param in your command line. - /// For example you can run your Server Side Swift project: - /// ```bash - /// COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run - /// ``` - /// Just use config without `userPassword` param: - /// ```swift - /// let config = CouchDBClient.Config( + /// ) + /// + /// // Create a client instance: + /// let couchDBClient = CouchDBClient(config: config) + /// ``` + /// + /// If you prefer not to include your password in the code, you can pass the `COUCHDB_PASS` environment variable + /// in your command line. For example: + /// ```bash + /// COUCHDB_PASS=myPassword /path/.build/x86_64-unknown-linux-gnu/release/Run + /// ``` + /// In this case, you can omit the `userPassword` parameter in the configuration: + /// ```swift + /// let config = CouchDBClient.Config( /// userName: "user" - /// ) - /// let couchDBClient = CouchDBClient(config: config) - /// ``` + /// ) + /// let couchDBClient = CouchDBClient(config: config) + /// ``` /// - /// - Note: It's important to ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` before attempting to connect. + /// - Note: Ensure that the CouchDB server is running and accessible at the specified `couchHost` and `couchPort` + /// before attempting to connect. public init(config: CouchDBClient.Config, httpClient: HTTPClient? = nil) { self.couchProtocol = config.couchProtocol self.couchHost = config.couchHost From 560975d2533b4eb2aaf6324e2e29cefa4ecd9da6 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 02:11:46 +0700 Subject: [PATCH 145/202] try to use FoundationEssentials everywhere and Dispatch --- Sources/CouchDBClient/CouchDBClient.swift | 1 + Sources/CouchDBClient/Models/CouchDBClientError.swift | 4 ++++ Sources/CouchDBClient/Models/CouchDBError.swift | 4 ++++ Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 4 ++++ Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 4 ++++ Sources/CouchDBClient/Models/CouchUpdateResponse.swift | 4 ++++ Sources/CouchDBClient/Models/CreateSessionResponse.swift | 4 ++++ Sources/CouchDBClient/Models/RowsResponse.swift | 4 ++++ Sources/CouchDBClient/Models/UpdateDBResponse.swift | 4 ++++ 9 files changed, 33 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 64a1587..191254c 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -7,6 +7,7 @@ #if canImport(FoundationEssentials) import FoundationEssentials +import Dispatch #else import Foundation #endif diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index f5e724f..1eec658 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -5,7 +5,11 @@ // Created by Sergei Armodin on 05.04.2025. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// An enumeration representing the various errors that can occur when interacting with CouchDB through a client. /// This enum conforms to both `Error` and `Sendable`, making it suitable for error handling and thread-safe operations. diff --git a/Sources/CouchDBClient/Models/CouchDBError.swift b/Sources/CouchDBClient/Models/CouchDBError.swift index 420311b..70104c9 100644 --- a/Sources/CouchDBClient/Models/CouchDBError.swift +++ b/Sources/CouchDBClient/Models/CouchDBError.swift @@ -5,7 +5,11 @@ // Created by Sergey Armodin on 01.09.2022. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A model that represents errors that CouchDB might return. /// This structure conforms to `Error`, `Codable`, and `Sendable` protocols for flexibility, diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index 6406949..f9831db 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -5,7 +5,11 @@ // Created by Gregorio Gevartosky Torrezan on 2023-11-15. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A model that represents the response from a CouchDB `_find` query. /// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 7c9c5a2..6dd7c3c 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -5,7 +5,11 @@ // Created by Sergey Armodin on 30.08.2022. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A protocol representing an object that can be stored in a CouchDB database. /// Conforming types must support Codable and Sendable for serialization and thread safety. diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index 18ba97c..9e85599 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -5,7 +5,11 @@ // Created by Sergey Armodin on 06/03/2019. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A model for the response returned by CouchDB after performing insert, update, or delete operations. /// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index c6a8ee5..7e035bb 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -5,7 +5,11 @@ // Created by Sergey Armodin on 15.05.2020. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A response model for a create session request. /// This structure represents the data returned by the server upon a session creation request diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index f962699..8253a47 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -5,7 +5,11 @@ // Created by Sergei Armodin on 07.04.2024. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A response model for CouchDB query results organized in rows. /// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. diff --git a/Sources/CouchDBClient/Models/UpdateDBResponse.swift b/Sources/CouchDBClient/Models/UpdateDBResponse.swift index ac8297a..f9eca51 100644 --- a/Sources/CouchDBClient/Models/UpdateDBResponse.swift +++ b/Sources/CouchDBClient/Models/UpdateDBResponse.swift @@ -5,7 +5,11 @@ // Created by Sergei Armodin on 26.12.2022. // +#if canImport(FoundationEssentials) +import FoundationEssentials +#else import Foundation +#endif /// A response model for database creation and deletion requests in CouchDB. /// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. From ab5cbcd29769e3d016a3cd45e7caae017fa2fd2b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 16 Apr 2025 12:55:22 +0700 Subject: [PATCH 146/202] =?UTF-8?q?removed=20FoundationEssentials=20usage,?= =?UTF-8?q?=20can=E2=80=99t=20use=20Bundle=20with=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/CouchDBClient/CouchDBClient.swift | 5 ----- Sources/CouchDBClient/Models/CouchDBClientError.swift | 4 ---- Sources/CouchDBClient/Models/CouchDBError.swift | 4 ---- Sources/CouchDBClient/Models/CouchDBFindResponse.swift | 4 ---- Sources/CouchDBClient/Models/CouchDBRepresentable.swift | 4 ---- Sources/CouchDBClient/Models/CouchUpdateResponse.swift | 4 ---- Sources/CouchDBClient/Models/CreateSessionResponse.swift | 4 ---- Sources/CouchDBClient/Models/RowsResponse.swift | 4 ---- Sources/CouchDBClient/Models/UpdateDBResponse.swift | 4 ---- 9 files changed, 37 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 191254c..fa8c9a1 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -5,12 +5,7 @@ // Created by Sergey Armodin on 06/03/2019. // -#if canImport(FoundationEssentials) -import FoundationEssentials -import Dispatch -#else import Foundation -#endif import NIO import NIOHTTP1 diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 1eec658..f5e724f 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -5,11 +5,7 @@ // Created by Sergei Armodin on 05.04.2025. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// An enumeration representing the various errors that can occur when interacting with CouchDB through a client. /// This enum conforms to both `Error` and `Sendable`, making it suitable for error handling and thread-safe operations. diff --git a/Sources/CouchDBClient/Models/CouchDBError.swift b/Sources/CouchDBClient/Models/CouchDBError.swift index 70104c9..420311b 100644 --- a/Sources/CouchDBClient/Models/CouchDBError.swift +++ b/Sources/CouchDBClient/Models/CouchDBError.swift @@ -5,11 +5,7 @@ // Created by Sergey Armodin on 01.09.2022. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A model that represents errors that CouchDB might return. /// This structure conforms to `Error`, `Codable`, and `Sendable` protocols for flexibility, diff --git a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift index f9831db..6406949 100644 --- a/Sources/CouchDBClient/Models/CouchDBFindResponse.swift +++ b/Sources/CouchDBClient/Models/CouchDBFindResponse.swift @@ -5,11 +5,7 @@ // Created by Gregorio Gevartosky Torrezan on 2023-11-15. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A model that represents the response from a CouchDB `_find` query. /// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. diff --git a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift index 6dd7c3c..7c9c5a2 100644 --- a/Sources/CouchDBClient/Models/CouchDBRepresentable.swift +++ b/Sources/CouchDBClient/Models/CouchDBRepresentable.swift @@ -5,11 +5,7 @@ // Created by Sergey Armodin on 30.08.2022. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A protocol representing an object that can be stored in a CouchDB database. /// Conforming types must support Codable and Sendable for serialization and thread safety. diff --git a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift index 9e85599..18ba97c 100644 --- a/Sources/CouchDBClient/Models/CouchUpdateResponse.swift +++ b/Sources/CouchDBClient/Models/CouchUpdateResponse.swift @@ -5,11 +5,7 @@ // Created by Sergey Armodin on 06/03/2019. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A model for the response returned by CouchDB after performing insert, update, or delete operations. /// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. diff --git a/Sources/CouchDBClient/Models/CreateSessionResponse.swift b/Sources/CouchDBClient/Models/CreateSessionResponse.swift index 7e035bb..c6a8ee5 100644 --- a/Sources/CouchDBClient/Models/CreateSessionResponse.swift +++ b/Sources/CouchDBClient/Models/CreateSessionResponse.swift @@ -5,11 +5,7 @@ // Created by Sergey Armodin on 15.05.2020. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A response model for a create session request. /// This structure represents the data returned by the server upon a session creation request diff --git a/Sources/CouchDBClient/Models/RowsResponse.swift b/Sources/CouchDBClient/Models/RowsResponse.swift index 8253a47..f962699 100644 --- a/Sources/CouchDBClient/Models/RowsResponse.swift +++ b/Sources/CouchDBClient/Models/RowsResponse.swift @@ -5,11 +5,7 @@ // Created by Sergei Armodin on 07.04.2024. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A response model for CouchDB query results organized in rows. /// This structure is generic, allowing it to represent documents of any type conforming to `CouchDBRepresentable`. diff --git a/Sources/CouchDBClient/Models/UpdateDBResponse.swift b/Sources/CouchDBClient/Models/UpdateDBResponse.swift index f9eca51..ac8297a 100644 --- a/Sources/CouchDBClient/Models/UpdateDBResponse.swift +++ b/Sources/CouchDBClient/Models/UpdateDBResponse.swift @@ -5,11 +5,7 @@ // Created by Sergei Armodin on 26.12.2022. // -#if canImport(FoundationEssentials) -import FoundationEssentials -#else import Foundation -#endif /// A response model for database creation and deletion requests in CouchDB. /// This structure conforms to `Codable` and `Sendable` for serialization and thread safety. From 26bb776fe3efc71c46c83d65c2341e5ce8a8c8c2 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Fri, 16 May 2025 20:13:47 +0700 Subject: [PATCH 147/202] dependencies updated --- Package.resolved | 75 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/Package.resolved b/Package.resolved index 6fe2f30..e71157e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,13 +1,13 @@ { - "originHash" : "33bea07c321ec8b33e40322443f2bb300fdedd5b8a4151cb16be6ccbe6dde66a", + "originHash" : "bc18c3532e39cfd8ad6e63b38c5f55a73cd408071aa1d72f9cc7d3f81da11d2c", "pins" : [ { "identity" : "async-http-client", "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "333f51104b75d1a5b94cb3b99e4c58a3b442c9f7", - "version" : "1.25.2" + "revision" : "3b265e6a00fc5c3fdb8f91f773e506990c704337", + "version" : "1.26.0" } }, { @@ -19,6 +19,24 @@ "version" : "1.2.1" } }, + { + "identity" : "swift-asn1", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-asn1.git", + "state" : { + "revision" : "a54383ada6cecde007d374f58f864e29370ba5c3", + "version" : "1.3.2" + } + }, + { + "identity" : "swift-async-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-async-algorithms.git", + "state" : { + "revision" : "042e1c4d9d19748c9c228f8d4ebc97bb1e339b0b", + "version" : "1.0.4" + } + }, { "identity" : "swift-atomics", "kind" : "remoteSourceControl", @@ -28,6 +46,15 @@ "version" : "1.2.0" } }, + { + "identity" : "swift-certificates", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-certificates.git", + "state" : { + "revision" : "999fd70c7803da89f3904d635a6815a2a7cd7585", + "version" : "1.10.0" + } + }, { "identity" : "swift-collections", "kind" : "remoteSourceControl", @@ -37,6 +64,15 @@ "version" : "1.1.4" } }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "e8d6eba1fef23ae5b359c46b03f7d94be2f41fed", + "version" : "3.12.3" + } + }, { "identity" : "swift-docc-plugin", "kind" : "remoteSourceControl", @@ -60,8 +96,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-structured-headers.git", "state" : { - "revision" : "8e769facea6b7d46ea60e5e93635a384fd573480", - "version" : "1.2.1" + "revision" : "db6eea3692638a65e2124990155cd220c2915903", + "version" : "1.3.0" } }, { @@ -87,8 +123,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "c51907a839e63ebf0ba2076bba73dd96436bd1b9", - "version" : "2.81.0" + "revision" : "34d486b01cd891297ac615e40d5999536a1e138d", + "version" : "2.83.0" } }, { @@ -96,8 +132,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "00f3f72d2f9942d0e2dc96057ab50a37ced150d4", - "version" : "1.25.0" + "revision" : "949cf2d3c895e3a576b0f5c5f902848ba17acbb9", + "version" : "1.27.0" } }, { @@ -105,8 +141,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "170f4ca06b6a9c57b811293cebcb96e81b661310", - "version" : "1.35.0" + "revision" : "4281466512f63d1bd530e33f4aa6993ee7864be0", + "version" : "1.36.0" } }, { @@ -114,8 +150,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "0cc3528ff48129d64ab9cab0b1cd621634edfc6b", - "version" : "2.29.3" + "revision" : "4b38f35946d00d8f6176fe58f96d83aba64b36c7", + "version" : "2.31.0" } }, { @@ -123,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "3c394067c08d1225ba8442e9cffb520ded417b64", - "version" : "1.23.1" + "revision" : "cd1e89816d345d2523b11c55654570acd5cd4c56", + "version" : "1.24.0" } }, { @@ -136,6 +172,15 @@ "version" : "1.0.3" } }, + { + "identity" : "swift-service-lifecycle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swift-server/swift-service-lifecycle.git", + "state" : { + "revision" : "e7187309187695115033536e8fc9b2eb87fd956d", + "version" : "2.8.0" + } + }, { "identity" : "swift-system", "kind" : "remoteSourceControl", From 0ca93c8aaa32371ba35aa42398260c4420a8db39 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 17 Jun 2025 15:22:37 +0700 Subject: [PATCH 148/202] dependencies --- Package.resolved | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Package.resolved b/Package.resolved index e71157e..73f33ab 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "3b265e6a00fc5c3fdb8f91f773e506990c704337", - "version" : "1.26.0" + "revision" : "60235983163d040f343a489f7e2e77c1918a8bd9", + "version" : "1.26.1" } }, { @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-atomics.git", "state" : { - "revision" : "cd142fd2f64be2100422d658e7411e39489da985", - "version" : "1.2.0" + "revision" : "b601256eab081c0f92f059e12818ac1d4f178ff7", + "version" : "1.3.0" } }, { @@ -60,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "671108c96644956dddcd89dd59c203dcdb36cec7", - "version" : "1.1.4" + "revision" : "c1805596154bb3a265fd91b8ac0c4433b4348fb0", + "version" : "1.2.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swiftlang/swift-docc-plugin.git", "state" : { - "revision" : "85e4bb4e1cd62cec64a4b8e769dcefdf0c5b9d64", - "version" : "1.4.3" + "revision" : "d1691545d53581400b1de9b0472d45eb25c19fed", + "version" : "1.4.4" } }, { @@ -132,8 +132,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "949cf2d3c895e3a576b0f5c5f902848ba17acbb9", - "version" : "1.27.0" + "revision" : "145db1962f4f33a4ea07a32e751d5217602eea29", + "version" : "1.28.0" } }, { @@ -150,8 +150,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "4b38f35946d00d8f6176fe58f96d83aba64b36c7", - "version" : "2.31.0" + "revision" : "36b48956eb6c0569215dc15a587b491d2bb36122", + "version" : "2.32.0" } }, { @@ -186,8 +186,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "a34201439c74b53f0fd71ef11741af7e7caf01e1", - "version" : "1.4.2" + "revision" : "61e4ca4b81b9e09e2ec863b00c340eb13497dac6", + "version" : "1.5.0" } } ], From 38e06e749a64b08a722e42c8aa1e40d5e855c942 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 21:44:03 +0700 Subject: [PATCH 149/202] dependencies updated --- Package.resolved | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Package.resolved b/Package.resolved index 73f33ab..e2acec1 100644 --- a/Package.resolved +++ b/Package.resolved @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-asn1.git", "state" : { - "revision" : "a54383ada6cecde007d374f58f864e29370ba5c3", - "version" : "1.3.2" + "revision" : "f70225981241859eb4aa1a18a75531d26637c8cc", + "version" : "1.4.0" } }, { @@ -78,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swiftlang/swift-docc-plugin.git", "state" : { - "revision" : "d1691545d53581400b1de9b0472d45eb25c19fed", - "version" : "1.4.4" + "revision" : "3e4f133a77e644a5812911a0513aeb7288b07d06", + "version" : "1.4.5" } }, { @@ -123,8 +123,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "34d486b01cd891297ac615e40d5999536a1e138d", - "version" : "2.83.0" + "revision" : "ad6b5f17270a7008f60d35ec5378e6144a575162", + "version" : "2.84.0" } }, { @@ -141,8 +141,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "4281466512f63d1bd530e33f4aa6993ee7864be0", - "version" : "1.36.0" + "revision" : "5ca52e2f076c6a24451175f575f390569381d6a1", + "version" : "1.37.0" } }, { @@ -159,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "cd1e89816d345d2523b11c55654570acd5cd4c56", - "version" : "1.24.0" + "revision" : "decfd235996bc163b44e10b8a24997a3d2104b90", + "version" : "1.25.0" } }, { From b4738a525b648c9197861a5abf1ef265a5099cea Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 22:37:32 +0700 Subject: [PATCH 150/202] added new conflictError error --- .../CouchDBClient/Models/CouchDBClientError.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index f5e724f..253dd08 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -49,6 +49,10 @@ public enum CouchDBClientError: Error, Sendable { /// The response body is missing required data. /// This error indicates that the server response lacked the expected content. case noData + + /// The `CONFLICT` request was unsuccessful due to a document update conflict. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the conflict. + case conflictError(error: CouchDBError) } /// Extends the `CouchDBClientError` enumeration to provide localized error descriptions. @@ -121,6 +125,12 @@ extension CouchDBClientError: LocalizedError { defaultValue: "The response body is missing the expected data.", bundle: Bundle.module ) + case .conflictError(let error): + return String( + localized: "CONFLICT_ERROR", + defaultValue: "The request failed due to a document update conflict: \(error.localizedDescription)", + bundle: Bundle.module + ) } } else { return oldErrorDescription @@ -152,6 +162,8 @@ extension CouchDBClientError: LocalizedError { return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") case .noData: return NSLocalizedString("NO_DATA_ERROR", tableName: nil, bundle: Bundle.module, value: "The response body is missing the expected data.", comment: "No data error message") + case .conflictError(let error): + return NSLocalizedString("CONFLICT_ERROR", tableName: nil, bundle: Bundle.module, value: "The request failed due to a document update conflict: \(error.localizedDescription)", comment: "Conflict error message") } } } From c61f099432510000f873960ec195d13a36962344 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 22:37:47 +0700 Subject: [PATCH 151/202] handle conflict error in Update method --- Sources/CouchDBClient/CouchDBClient.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index fa8c9a1..b65abf0 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -873,6 +873,13 @@ public actor CouchDBClient { let decoder = JSONDecoder() + if response.status == .conflict { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.conflictError(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } + do { let decodedResponse = try decoder.decode(CouchUpdateResponse.self, from: data) return decodedResponse From 339d0a139afea6f855f19006b94088d2c069fad5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 22:48:54 +0700 Subject: [PATCH 152/202] Added missing authorization for delete document request --- Sources/CouchDBClient/CouchDBClient.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index b65abf0..7b383dc 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1176,6 +1176,8 @@ public actor CouchDBClient { /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) defer { From 86e2acf058edc9e7f5532b96d9a1faaeaed9cef0 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 22:52:31 +0700 Subject: [PATCH 153/202] tabs --- Sources/CouchDBClient/CouchDBClient.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 7b383dc..20cff95 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -873,12 +873,12 @@ public actor CouchDBClient { let decoder = JSONDecoder() - if response.status == .conflict { - if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.conflictError(error: couchdbError) - } - throw CouchDBClientError.unknownResponse - } + if response.status == .conflict { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.conflictError(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } do { let decodedResponse = try decoder.decode(CouchUpdateResponse.self, from: data) @@ -1176,7 +1176,7 @@ public actor CouchDBClient { /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially for authentication issues or unexpected server responses. public func delete(fromDb dbName: String, uri: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { - try await authIfNeed(eventLoopGroup: eventLoopGroup) + try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) From d2d890a32bd57ebfe1521aa2cf69df4d52af71cd Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:05:33 +0700 Subject: [PATCH 154/202] tabs --- .../Models/CouchDBClientError.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 253dd08..b51313c 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -125,12 +125,12 @@ extension CouchDBClientError: LocalizedError { defaultValue: "The response body is missing the expected data.", bundle: Bundle.module ) - case .conflictError(let error): - return String( - localized: "CONFLICT_ERROR", - defaultValue: "The request failed due to a document update conflict: \(error.localizedDescription)", - bundle: Bundle.module - ) + case .conflictError(let error): + return String( + localized: "CONFLICT_ERROR", + defaultValue: "The request failed due to a document update conflict: \(error.localizedDescription)", + bundle: Bundle.module + ) } } else { return oldErrorDescription @@ -162,8 +162,8 @@ extension CouchDBClientError: LocalizedError { return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") case .noData: return NSLocalizedString("NO_DATA_ERROR", tableName: nil, bundle: Bundle.module, value: "The response body is missing the expected data.", comment: "No data error message") - case .conflictError(let error): - return NSLocalizedString("CONFLICT_ERROR", tableName: nil, bundle: Bundle.module, value: "The request failed due to a document update conflict: \(error.localizedDescription)", comment: "Conflict error message") + case .conflictError(let error): + return NSLocalizedString("CONFLICT_ERROR", tableName: nil, bundle: Bundle.module, value: "The request failed due to a document update conflict: \(error.localizedDescription)", comment: "Conflict error message") } } } From 2630d5bd2fd6309272ddd3782bbbd1c4bd9bf0fb Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:06:30 +0700 Subject: [PATCH 155/202] added handling of not found error in update method --- Sources/CouchDBClient/CouchDBClient.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 20cff95..5a72442 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -880,6 +880,13 @@ public actor CouchDBClient { throw CouchDBClientError.unknownResponse } + if response.status == .notFound { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.deleteError(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } + do { let decodedResponse = try decoder.decode(CouchUpdateResponse.self, from: data) return decodedResponse From 73e70b489f53a6832ffbd092b86f340d80b777a8 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:06:59 +0700 Subject: [PATCH 156/202] added handling of not found error in delete method --- Sources/CouchDBClient/CouchDBClient.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 5a72442..efec39d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1219,7 +1219,16 @@ public actor CouchDBClient { return CouchUpdateResponse(ok: false, id: "", rev: "") } - return try JSONDecoder().decode(CouchUpdateResponse.self, from: data) + let decoder = JSONDecoder() + + if response.status == .notFound { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.deleteError(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } + + return try decoder.decode(CouchUpdateResponse.self, from: data) } /// Deletes a document conforming to `CouchDBRepresentable` from a specified database on the CouchDB server. From abd40fdf046d2a480ae8074070fc35d03adbe4e4 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:07:47 +0700 Subject: [PATCH 157/202] added more tests --- .../CouchDBClientTests.swift | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index d9a3c7c..2ee9c45 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -56,6 +56,16 @@ final class CouchDBClientTests: XCTestCase { } } + func test02_DBDoesNotExist() async throws { + let nonExistentDB = "db_should_not_exist" + do { + let exists = try await couchDBClient.dbExists(nonExistentDB) + XCTAssertFalse(exists) + } catch { + XCTFail(error.localizedDescription) + } + } + func test03_GetAllDbs() async throws { do { let dbs = try await couchDBClient.getAllDBs() @@ -363,6 +373,152 @@ final class CouchDBClientTests: XCTestCase { } } + func test12_createDB_conflict() async throws { + // Try to create a DB that already exists, should throw insertError + do { + _ = try await couchDBClient.createDB(testsDB) + XCTFail("Expected conflict error not thrown") + } catch CouchDBClientError.insertError(let error) { + XCTAssertTrue(error.error == "file_exists" || error.error == "conflict") + } catch { + XCTFail(error.localizedDescription) + } + } + + func test13_deleteDB_not_found() async throws { + let nonExistentDB = "db_should_not_exist" + do { + _ = try await couchDBClient.deleteDB(nonExistentDB) + XCTFail("Expected deleteError not thrown") + } catch CouchDBClientError.deleteError(let error) { + XCTAssertTrue(error.error == "not_found") + } catch { + XCTFail(error.localizedDescription) + } + } + + func test14_get_document_not_found() async throws { + do { + let response = try await couchDBClient.get(fromDB: testsDB, uri: "nonexistent_doc_id") + XCTAssertEqual(response.status, .notFound) + } catch { + XCTFail(error.localizedDescription) + } + } + + func test15_update_document_conflict() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + var insertedDoc: ExpectedDoc! + do { + insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + XCTFail("Expected conflictError not thrown") + } catch CouchDBClientError.conflictError(error: let error) { + XCTAssertTrue(error.error == "conflict") + } catch { + XCTFail(error.localizedDescription) + } + + do { + try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) + } catch { + XCTFail("Could not cleanup inserted document: \(error.localizedDescription)") + } + } + + func test16_delete_document_not_found() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + do { + _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) + XCTFail("Expected deleteError not thrown") + } catch CouchDBClientError.deleteError(let error) { + XCTAssertTrue(error.error == "not_found") + } catch { + XCTFail(error.localizedDescription) + } + } + + func test17_getAllDBs_with_eventLoopGroup() async throws { + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + do { + let dbs = try await couchDBClient.getAllDBs(eventLoopGroup: group) + XCTAssertTrue(dbs.contains(testsDB)) + } catch { + XCTFail(error.localizedDescription) + } + + try await group.shutdownGracefully() + } + + func test18_dbExists_with_eventLoopGroup() async throws { + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + do { + let exists = try await couchDBClient.dbExists(testsDB, eventLoopGroup: group) + XCTAssertTrue(exists) + } catch { + XCTFail(error.localizedDescription) + } + + try await group.shutdownGracefully() + } + + func test19_createDB_with_eventLoopGroup() async throws { + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + let tempDB = "tempdb_for_eventloop" + defer { + + } + do { + _ = try await couchDBClient.createDB(tempDB, eventLoopGroup: group) + let exists = try await couchDBClient.dbExists(tempDB) + XCTAssertTrue(exists) + } catch { + XCTFail(error.localizedDescription) + } + + try await couchDBClient.deleteDB(tempDB) + try await group.shutdownGracefully() + } + + func test20_deleteDB_with_eventLoopGroup() async throws { + let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + let tempDB = "tempdb_for_eventloop_delete" + do { + _ = try await couchDBClient.createDB(tempDB) + _ = try await couchDBClient.deleteDB(tempDB, eventLoopGroup: group) + let exists = try await couchDBClient.dbExists(tempDB) + XCTAssertFalse(exists) + } catch { + XCTFail(error.localizedDescription) + } + + try await group.shutdownGracefully() + } + + func test21_find_with_custom_date_decoding_strategy() async throws { + let testDoc = ExpectedDoc(name: "DateTest") + let insertEncodedData = try JSONEncoder().encode(testDoc) + let insertResponse = try await couchDBClient.insert( + dbName: testsDB, + body: .bytes(ByteBuffer(data: insertEncodedData)) + ) + + let selector = ["selector": ["name": "DateTest"]] + let docs: [ExpectedDoc] = try await couchDBClient.find( + inDB: testsDB, + selector: selector, + dateDecodingStrategy: .iso8601 + ) + + XCTAssertTrue(docs.contains(where: { $0._id == insertResponse.id })) + + _ = try await couchDBClient.delete( + fromDb: testsDB, + uri: insertResponse.id, + rev: insertResponse.rev + ) + } + func test99_deleteDB() async throws { do { try await couchDBClient.deleteDB(testsDB) From c5c00923304e1fe4360c2b1ffe5783af9dec6770 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:10:47 +0700 Subject: [PATCH 158/202] translations for CONFLICT_ERROR --- Sources/CouchDBClient/Localizable.xcstrings | 256 +++++++++++++++++++- 1 file changed, 251 insertions(+), 5 deletions(-) diff --git a/Sources/CouchDBClient/Localizable.xcstrings b/Sources/CouchDBClient/Localizable.xcstrings index f5296e5..99f61fd 100644 --- a/Sources/CouchDBClient/Localizable.xcstrings +++ b/Sources/CouchDBClient/Localizable.xcstrings @@ -1,6 +1,252 @@ { "sourceLanguage" : "en", "strings" : { + "CONFLICT_ERROR" : { + "comment" : "Conflict error message", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The request failed due to a document update conflict: %@" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل الطلب بسبب تعارض في تحديث المستند: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Һорау документты яңыртыуҙа ҡаршылыҡ арҡаһында уңышһыҙлыҡҡа осраны: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт не ўдалося з-за канфлікту абнаўлення дакумента: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Заявката не бе успешна поради конфликт при обновяване на документа: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek selhal kvůli konfliktu při aktualizaci dokumentu: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Anmodningen mislykkedes på grund af en opdateringskonflikt i dokumentet: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Anfrage ist aufgrund eines Dokumenten-Konflikts fehlgeschlagen: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα απέτυχε λόγω σύγκρουσης ενημέρωσης εγγράφου: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud falló debido a un conflicto de actualización del documento: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Pyyntö epäonnistui dokumentin päivitysristiriidan vuoksi: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Nabigo ang request dahil sa conflict sa pag-update ng dokumento: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête a échoué en raison d'un conflit de mise à jour du document : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "दस्तावेज़ अपडेट संघर्ष के कारण अनुरोध विफल रहा: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Zahtjev nije uspio zbog sukoba pri ažuriranju dokumenta: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan gagal karena konflik pembaruan dokumen: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta non è riuscita a causa di un conflitto di aggiornamento del documento: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの更新競合によりリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Сұрау құжатты жаңарту қақтығысына байланысты сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 업데이트 충돌로 인해 요청이 실패했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Сурам документти жаңыртуудагы карама-каршылыкка байланыштуу ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Forespørselen mislyktes på grunn av en dokumentoppdateringskonflikt: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie nie powiodło się z powodu konfliktu podczas aktualizacji dokumentu: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição falhou devido a um conflito de atualização do documento: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea a eșuat din cauza unui conflict de actualizare a documentului: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Запрос не выполнен из-за конфликта обновления документа: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka zlyhala kvôli konfliktu pri aktualizácii dokumentu: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva ni uspela zaradi konflikta pri posodobitvi dokumenta: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Захтев није успео због конфликта при ажурирању документа: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Begäran misslyckades på grund av en dokumentuppdateringskonflikt: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอล้มเหลวเนื่องจากข้อขัดแย้งในการอัปเดตเอกสาร: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "İstek, belge güncelleme çakışması nedeniyle başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Сорау документ яңарту конфликт аркасында уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит не виконано через конфлікт оновлення документа: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "دستاویز کی اپ ڈیٹ کے تنازع کی وجہ سے درخواست ناکام ہوگئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "So'rov hujjatni yangilashdagi ziddiyat sababli muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu thất bại do xung đột cập nhật tài liệu: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求因文档更新冲突失败:%@" + } + } + } + }, "DELETE_ERROR" : { "comment" : "DELETE request failure message", "localizations" : { @@ -874,13 +1120,13 @@ "nl" : { "stringUnit" : { "state" : "translated", - "value" : "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + "value" : "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." } }, "nl-BE" : { "stringUnit" : { "state" : "translated", - "value" : "De 'id'-eigenschap is leeg of ontbreekt in het opgegeven document." + "value" : "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." } }, "pl" : { @@ -1609,13 +1855,13 @@ "nl" : { "stringUnit" : { "state" : "translated", - "value" : "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + "value" : "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." } }, "nl-BE" : { "stringUnit" : { "state" : "translated", - "value" : "De '_rev'-eigenschap is leeg of ontbreekt in het opgegeven document." + "value" : "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." } }, "pl" : { @@ -1922,7 +2168,7 @@ "state" : "translated", "value" : "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." } - }, + }, "tt" : { "stringUnit" : { "state" : "translated", From dc7831f237affdbc7aa6fea5de6595afc5349606 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:13:44 +0700 Subject: [PATCH 159/202] fixed date format --- Sources/CouchDBClient/CouchDBClient.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index efec39d..023f922 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1353,7 +1353,7 @@ internal extension CouchDBClient { if let httpCookie = HTTPClient.Cookie(header: cookie, defaultDomain: self.couchHost) { if httpCookie.expires == nil { let formatter = DateFormatter() - formatter.dateFormat = "E, dd-MMM-yyy HH:mm:ss z" + formatter.dateFormat = "E, dd-MMM-yyyy HH:mm:ss z" let expiresString = cookie.split(separator: ";") .map({ $0.trimmingCharacters(in: .whitespaces) }) From 9da8b5ca099f86caf1855d1cd63d2fac348d8df5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:18:46 +0700 Subject: [PATCH 160/202] Percent-encode username and password --- Sources/CouchDBClient/CouchDBClient.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 023f922..6723bde 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1332,7 +1332,9 @@ internal extension CouchDBClient { var request = HTTPClientRequest(url: url) request.method = .POST request.headers.add(name: "Content-Type", value: "application/x-www-form-urlencoded") - let dataString = "name=\(userName)&password=\(userPassword)" + let encodedUserName = userName.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" + let encodedPassword = userPassword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" + let dataString = "name=\(encodedUserName)&password=\(encodedPassword)" request.body = .bytes(ByteBuffer(string: dataString)) let response = From d403c4e850d3b6aea2457d01d5986523a7f0aed6 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:23:37 +0700 Subject: [PATCH 161/202] updated config --- .github/workflows/build-macos.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index ec1f0df..a4131ab 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -10,13 +10,13 @@ on: branches: [ "master" ] jobs: - macOS: - name: Build on macOS - runs-on: macOS-15 - steps: - - name: Print Swift version - run: swift --version - - name: Checkout - uses: actions/checkout@master - - name: Swift build - run: swift build -c release + macOS: + name: Build on macOS + runs-on: macOS-15 + steps: + - name: Print Swift version + run: swift --version + - name: Checkout + uses: actions/checkout@master + - name: Swift build + run: swift build -c release From fbde8c8bfc89ce29d89a1c1512534c36a7283d11 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 6 Jul 2025 23:32:01 +0700 Subject: [PATCH 162/202] updated actions configs --- .github/workflows/build-macos.yml | 3 -- .github/workflows/build-ubuntu.yml | 8 ++--- .github/workflows/test-ubuntu.yml | 56 +++++++++++++++--------------- 3 files changed, 32 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index a4131ab..9c924d6 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -1,6 +1,3 @@ -# This workflow will build a Swift project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift - name: Build on macOS on: diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index f5c1280..a7e47e4 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -8,16 +8,16 @@ on: jobs: ubuntu_build: - name: Build on Ubuntu with Swift ${{matrix.swift}} + name: Build on Ubuntu with Swift ${{ matrix.swift }} strategy: matrix: - swift: ["6.0", "6.0.3"] + swift: ["6.0", "6.0.3", "6.1"] runs-on: ubuntu-latest container: - image: swift:${{matrix.swift}} + image: swift:${{ matrix.swift }} steps: - name: Checkout - uses: actions/checkout@master + uses: actions/checkout@v4 - name: Swift version run: swift --version diff --git a/.github/workflows/test-ubuntu.yml b/.github/workflows/test-ubuntu.yml index cd52b3f..de369b4 100644 --- a/.github/workflows/test-ubuntu.yml +++ b/.github/workflows/test-ubuntu.yml @@ -7,31 +7,31 @@ on: branches: [ "master" ] jobs: - ubuntu-test: - name: Run tests on Ubuntu with CouchDB ${{ matrix.couchdb }} - strategy: - fail-fast: false - matrix: - couchdb: [latest, "3.4", "3.3", "3.2"] - runs-on: ubuntu-latest - services: - swift: - image: swift:latest - steps: - - name: Start CouchDB - uses: iamssen/couchdb-github-action@master - with: - couchdb-version: ${{ matrix.couchdb }} - - name: Checkout - uses: actions/checkout@master - - name: Swift version - run: | - swift --version - - name: Test endpoint - run: | - curl -sS -f http://127.0.0.1:5984/ - - name: Test authorization - run: | - curl -X POST -H "Content-Type: application/json; charset=utf-8" -d '{"name": "admin", "password": "password"}' http://127.0.0.1:5984/_session - - name: Swift test - run: COUCHDB_PASS=password swift test + ubuntu-test: + name: Run tests on Ubuntu with CouchDB ${{ matrix.couchdb }} + strategy: + fail-fast: false + matrix: + couchdb: [latest, "3.4", "3.3", "3.2"] + runs-on: ubuntu-latest + services: + swift: + image: swift:latest + steps: + - name: Start CouchDB + uses: iamssen/couchdb-github-action@master + with: + couchdb-version: ${{ matrix.couchdb }} + - name: Checkout + uses: actions/checkout@master + - name: Swift version + run: | + swift --version + - name: Test endpoint + run: | + curl -sS -f http://127.0.0.1:5984/ + - name: Test authorization + run: | + curl -X POST -H "Content-Type: application/json; charset=utf-8" -d '{"name": "admin", "password": "password"}' http://127.0.0.1:5984/_session + - name: Swift test + run: COUCHDB_PASS=password swift test From b9e6ff2d13fd214c73f46edfea3a332a46861f2a Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 8 Jul 2025 22:48:16 +0700 Subject: [PATCH 163/202] notFound error added --- .../CouchDBClient/Models/CouchDBClientError.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index b51313c..6d3e086 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -42,6 +42,10 @@ public enum CouchDBClientError: Error, Sendable { /// This error indicates that the response was not in the expected format. case unknownResponse + /// The requested resource was not found in CouchDB. + /// This error indicates that the document or resource does not exist. + case notFound(error: CouchDBError) + /// Authentication failed due to incorrect username or password. /// This error suggests that the provided credentials were invalid. case unauthorized @@ -113,6 +117,12 @@ extension CouchDBClientError: LocalizedError { defaultValue: "The response from CouchDB was unrecognized or invalid.", bundle: Bundle.module ) + case .notFound: + return String( + localized: "NOT_FOUND_ERROR", + defaultValue: "The requested resource was not found in CouchDB.", + bundle: Bundle.module + ) case .unauthorized: return String( localized: "UNAUTHORIZED_ERROR", @@ -158,6 +168,8 @@ extension CouchDBClientError: LocalizedError { return NSLocalizedString("FIND_ERROR", tableName: nil, bundle: Bundle.module, value: "The FIND request wasn't successful: \(error.localizedDescription)", comment: "FIND request failure message") case .unknownResponse: return NSLocalizedString("UNKNOWN_RESPONSE_ERROR", tableName: nil, bundle: Bundle.module, value: "The response from CouchDB was unrecognized or invalid.", comment: "Unknown response message") + case .notFound: + return NSLocalizedString("NOT_FOUND_ERROR", tableName: nil, bundle: Bundle.module, value: "The requested resource was not found in CouchDB.", comment: "Not found error message") case .unauthorized: return NSLocalizedString("UNAUTHORIZED_ERROR", tableName: nil, bundle: Bundle.module, value: "Authentication failed due to an incorrect username or password.", comment: "Unauthorized access message") case .noData: From 34aaf8b39c2e45710a5aa767c8c310ac97192425 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 8 Jul 2025 22:58:55 +0700 Subject: [PATCH 164/202] Throw .notFound error for get requests --- Sources/CouchDBClient/CouchDBClient.swift | 13 ++++++++++ .../CouchDBClientTests.swift | 25 ++++++++++++++----- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 6723bde..3b1968a 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -537,6 +537,19 @@ public actor CouchDBClient { let body = response.body let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + if response.status == .notFound { + var bytes = try await body.collect(upTo: expectedBytes) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.notFound(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } + response.body = .bytes( try await body.collect(upTo: expectedBytes) ) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 2ee9c45..a9ac55b 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -398,12 +398,25 @@ final class CouchDBClientTests: XCTestCase { } func test14_get_document_not_found() async throws { - do { - let response = try await couchDBClient.get(fromDB: testsDB, uri: "nonexistent_doc_id") - XCTAssertEqual(response.status, .notFound) - } catch { - XCTFail(error.localizedDescription) - } + do { + let _: ExpectedDoc = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") + } catch CouchDBClientError.notFound(_) { + // all good + } catch { + XCTFail(error.localizedDescription) + return + } + + do { + _ = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") + } catch CouchDBClientError.notFound(_) { + return + } catch { + XCTFail(error.localizedDescription) + return + } + + XCTFail("Expected not found error") } func test15_update_document_conflict() async throws { From 94715036c772aeacb76c6ee8ea759c907d896324 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Tue, 8 Jul 2025 23:06:29 +0700 Subject: [PATCH 165/202] translations --- Sources/CouchDBClient/Localizable.xcstrings | 5642 +++++++++-------- .../Models/CouchDBClientError.swift | 2 +- 2 files changed, 2945 insertions(+), 2699 deletions(-) diff --git a/Sources/CouchDBClient/Localizable.xcstrings b/Sources/CouchDBClient/Localizable.xcstrings index 99f61fd..a8acf77 100644 --- a/Sources/CouchDBClient/Localizable.xcstrings +++ b/Sources/CouchDBClient/Localizable.xcstrings @@ -1,2702 +1,2948 @@ { - "sourceLanguage" : "en", - "strings" : { - "CONFLICT_ERROR" : { - "comment" : "Conflict error message", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "The request failed due to a document update conflict: %@" - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "فشل الطلب بسبب تعارض في تحديث المستند: %@" - } - }, - "ba": { - "stringUnit": { - "state": "translated", - "value": "Һорау документты яңыртыуҙа ҡаршылыҡ арҡаһында уңышһыҙлыҡҡа осраны: %@" - } - }, - "be": { - "stringUnit": { - "state": "translated", - "value": "Запыт не ўдалося з-за канфлікту абнаўлення дакумента: %@" - } - }, - "bg": { - "stringUnit": { - "state": "translated", - "value": "Заявката не бе успешна поради конфликт при обновяване на документа: %@" - } - }, - "cs": { - "stringUnit": { - "state": "translated", - "value": "Požadavek selhal kvůli konfliktu při aktualizaci dokumentu: %@" - } - }, - "da": { - "stringUnit": { - "state": "translated", - "value": "Anmodningen mislykkedes på grund af en opdateringskonflikt i dokumentet: %@" - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Die Anfrage ist aufgrund eines Dokumenten-Konflikts fehlgeschlagen: %@" - } - }, - "el": { - "stringUnit": { - "state": "translated", - "value": "Το αίτημα απέτυχε λόγω σύγκρουσης ενημέρωσης εγγράφου: %@" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "La solicitud falló debido a un conflicto de actualización del documento: %@" - } - }, - "fi": { - "stringUnit": { - "state": "translated", - "value": "Pyyntö epäonnistui dokumentin päivitysristiriidan vuoksi: %@" - } - }, - "fil": { - "stringUnit": { - "state": "translated", - "value": "Nabigo ang request dahil sa conflict sa pag-update ng dokumento: %@" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "La requête a échoué en raison d'un conflit de mise à jour du document : %@" - } - }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "दस्तावेज़ अपडेट संघर्ष के कारण अनुरोध विफल रहा: %@" - } - }, - "hr": { - "stringUnit": { - "state": "translated", - "value": "Zahtjev nije uspio zbog sukoba pri ažuriranju dokumenta: %@" - } - }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Permintaan gagal karena konflik pembaruan dokumen: %@" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "La richiesta non è riuscita a causa di un conflitto di aggiornamento del documento: %@" - } - }, - "ja": { - "stringUnit": { - "state": "translated", - "value": "ドキュメントの更新競合によりリクエストが失敗しました:%@" - } - }, - "kk": { - "stringUnit": { - "state": "translated", - "value": "Сұрау құжатты жаңарту қақтығысына байланысты сәтсіз аяқталды: %@" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "문서 업데이트 충돌로 인해 요청이 실패했습니다: %@" - } - }, - "ky": { - "stringUnit": { - "state": "translated", - "value": "Сурам документти жаңыртуудагы карама-каршылыкка байланыштуу ийгиликсиз болду: %@" - } - }, - "nb": { - "stringUnit": { - "state": "translated", - "value": "Forespørselen mislyktes på grunn av en dokumentoppdateringskonflikt: %@" - } - }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" - } - }, - "nl-BE": { - "stringUnit": { - "state": "translated", - "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Żądanie nie powiodło się z powodu konfliktu podczas aktualizacji dokumentu: %@" - } - }, - "pt": { - "stringUnit": { - "state": "translated", - "value": "A requisição falhou devido a um conflito de atualização do documento: %@" - } - }, - "ro": { - "stringUnit": { - "state": "translated", - "value": "Cererea a eșuat din cauza unui conflict de actualizare a documentului: %@" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Запрос не выполнен из-за конфликта обновления документа: %@" - } - }, - "sk": { - "stringUnit": { - "state": "translated", - "value": "Požiadavka zlyhala kvôli konfliktu pri aktualizácii dokumentu: %@" - } - }, - "sl": { - "stringUnit": { - "state": "translated", - "value": "Zahteva ni uspela zaradi konflikta pri posodobitvi dokumenta: %@" - } - }, - "sr": { - "stringUnit": { - "state": "translated", - "value": "Захтев није успео због конфликта при ажурирању документа: %@" - } - }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Begäran misslyckades på grund av en dokumentuppdateringskonflikt: %@" - } - }, - "th": { - "stringUnit": { - "state": "translated", - "value": "คำขอล้มเหลวเนื่องจากข้อขัดแย้งในการอัปเดตเอกสาร: %@" - } - }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "İstek, belge güncelleme çakışması nedeniyle başarısız oldu: %@" - } - }, - "tt": { - "stringUnit": { - "state": "translated", - "value": "Сорау документ яңарту конфликт аркасында уңышсыз булды: %@" - } - }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Запит не виконано через конфлікт оновлення документа: %@" - } - }, - "ur": { - "stringUnit": { - "state": "translated", - "value": "دستاویز کی اپ ڈیٹ کے تنازع کی وجہ سے درخواست ناکام ہوگئی: %@" - } - }, - "uz": { - "stringUnit": { - "state": "translated", - "value": "So'rov hujjatni yangilashdagi ziddiyat sababli muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Yêu cầu thất bại do xung đột cập nhật tài liệu: %@" - } - }, - "zh": { - "stringUnit": { - "state": "translated", - "value": "请求因文档更新冲突失败:%@" - } - } - } - }, - "DELETE_ERROR" : { - "comment" : "DELETE request failure message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل طلب DELETE: %@" - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE һорауы уңышһыҙ булды: %@" - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запыт DELETE не быў паспяховым: %@" - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE заявката не бе успешна: %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požadavek DELETE nebyl úspěšný: %@" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE-anmodningen var ikke succesfuld: %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die DELETE-Anfrage war nicht erfolgreich: %@" - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το αίτημα DELETE δεν ήταν επιτυχές: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The DELETE request wasn't successful: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La solicitud DELETE no fue exitosa: %@" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE-pyyntö epäonnistui: %@" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang DELETE request ay hindi matagumpay: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La requête DELETE n'a pas abouti : %@" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE अनुरोध सफल नहीं था: %@" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE zahtjev nije uspio: %@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permintaan DELETE tidak berhasil: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La richiesta DELETE non è riuscita: %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETEリクエストが失敗しました:%@" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE сұрауы сәтсіз аяқталды: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE 요청이 성공하지 못했습니다: %@" - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE сурамы ийгиликсиз болду: %@" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE-forespørselen var ikke vellykket: %@" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het DELETE-verzoek was niet succesvol: %@" - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het DELETE-verzoek was niet succesvol: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie DELETE nie powiodło się: %@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A requisição DELETE não foi bem-sucedida: %@" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cererea DELETE nu a reușit: %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE-запрос не был выполнен успешно: %@" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požiadavka DELETE nebola úspešná: %@" - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zahteva DELETE ni uspela: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE захтев није успео: %@" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE-begäran lyckades inte: %@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำขอ DELETE ไม่สำเร็จ: %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE isteği başarısız oldu: %@" - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE үтенече уңышсыз булды: %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запит DELETE не був успішним: %@" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE درخواست کامیاب نہیں ہوئی: %@" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE so'rovi muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu DELETE không thành công: %@" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "DELETE 请求未成功:%@" - } - } - } - }, - "FIND_ERROR" : { - "comment" : "FIND request failure message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل طلب FIND: %@" - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND һорауы уңышһыҙ булды: %@" - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запыт FIND не быў паспяховым: %@" - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND заявката не бе успешна: %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požadavek FIND nebyl úspěšný: %@" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND-anmodningen var ikke succesfuld: %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die FIND-Anfrage war nicht erfolgreich: %@" - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το αίτημα FIND δεν ήταν επιτυχές: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The FIND request wasn't successful: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La solicitud FIND no fue exitosa: %@" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND-pyyntö epäonnistui: %@" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang FIND request ay hindi matagumpay: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La requête FIND n'a pas abouti : %@" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND अनुरोध सफल नहीं था: %@" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND zahtjev nije uspio: %@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permintaan FIND tidak berhasil: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La richiesta FIND non è riuscita: %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "FINDリクエストが失敗しました:%@" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND сұрауы сәтсіз аяқталды: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND 요청이 성공하지 못했습니다: %@" - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND сурамы ийгиликсиз болду: %@" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND-forespørselen var ikke vellykket: %@" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het FIND-verzoek was niet succesvol: %@" - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het FIND-verzoek was niet succesvol: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie FIND nie powiodło się: %@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A requisição FIND não foi bem-sucedida: %@" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cererea FIND nu a reușit: %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND-запрос не был выполнен успешно: %@" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požiadavka FIND nebola úspešná: %@" - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zahteva FIND ni uspela: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND захтев није успео: %@" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND-begäran lyckades inte: %@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำขอ FIND ไม่สำเร็จ: %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND isteği başarısız oldu: %@" - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND үтенече уңышсыз булды: %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запит FIND не був успішним: %@" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND درخواست کامیاب نہیں ہوئی: %@" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND so'rovi muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu FIND không thành công: %@" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "FIND 请求未成功:%@" - } - } - } - }, - "GET_ERROR" : { - "comment" : "GET request failure message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل طلب GET: %@" - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET һорауы уңышһыҙ булды: %@" - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запыт GET не быў паспяховым: %@" - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET заявката не бе успешна: %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požadavek GET nebyl úspěšný: %@" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET-anmodningen var ikke succesfuld: %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die GET-Anfrage war nicht erfolgreich: %@" - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το αίτημα GET δεν ήταν επιτυχές: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The GET request wasn't successful: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La solicitud GET no fue exitosa: %@" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET-pyyntö epäonnistui: %@" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang GET request ay hindi matagumpay: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La requête GET n'a pas abouti : %@" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET अनुरोध सफल नहीं था: %@" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET zahtjev nije uspio: %@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permintaan GET tidak berhasil: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La richiesta GET non è riuscita: %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "GETリクエストが失敗しました:%@" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET сұрауы сәтсіз аяқталды: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET 요청이 성공하지 못했습니다: %@" - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET сурамы ийгиликсиз болду: %@" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET-forespørselen var ikke vellykket: %@" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het GET-verzoek was niet succesvol: %@" - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het GET-verzoek was niet succesvol: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie GET nie powiodło się: %@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A requisição GET não foi bem-sucedida: %@" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cererea GET nu a reușit: %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET-запрос не был выполнен успешно: %@" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požiadavka GET nebola úspešná: %@" - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zahteva GET ni uspela: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET захтев није успео: %@" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET-begäran lyckades inte: %@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำขอ GET ไม่สำเร็จ: %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET isteği başarısız oldu: %@" - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET үтенече уңышсыз булды: %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запит GET не був успішним: %@" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET درخواست کامیاب نہیں ہوئی: %@" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET so'rovi muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu GET không thành công: %@" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "GET 请求未成功:%@" - } - } - } - }, - "ID_MISSING_ERROR" : { - "comment" : "Error description for missing document ID", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "خاصية 'id' فارغة أو مفقودة في المستند المقدم." - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тәҡдим ителгән документта 'id' ҡасиәте буш йәки юҡ." - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Уласцівасць 'id' пустая або адсутнічае ў прадастаўленым дакуменце." - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "Свойството 'id' е празно или липсва в предоставения документ." - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vlastnost 'id' je prázdná nebo chybí v poskytnutém dokumentu." - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "'id'-egenskaben er tom eller mangler i det leverede dokument." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die 'id'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Η ιδιότητα 'id' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The 'id' property is empty or missing in the provided document." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propiedad 'id' está vacía o falta en el documento proporcionado." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "'id'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang 'id' property ay walang laman o nawawala sa ibinigay na dokumento." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propriété 'id' est vide ou manquante dans le document fourni." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "'id' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svojstvo 'id' je prazno ili nedostaje u dostavljenom dokumentu." - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Properti 'id' kosong atau tidak ada dalam dokumen yang diberikan." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La proprietà 'id' è vuota o mancante nel documento fornito." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "提供されたドキュメントに 'id' プロパティが空またはありません。" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ұсынылған құжатта 'id' қасиеті бос немесе жоқ." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공된 문서에서 'id' 속성이 비어 있거나 없습니다." - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "Берилген документте 'id' касиети бош же жок." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "'id'-egenskapen er tom eller mangler i det oppgitte dokumentet." - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Właściwość 'id' jest pusta lub brakuje jej w dostarczonym dokumencie." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A propriedade 'id' está vazia ou ausente no documento fornecido." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietatea 'id' este goală sau lipsă din documentul furnizat." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Свойство 'id' отсутствует или пусто в предоставленном документе." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vlastnosť 'id' je prázdna alebo chýba v poskytnutom dokumente." - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lastnost 'id' je prazna ali manjka v predloženem dokumentu." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Својство 'id' је празно или недостаје у датом документу." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Egenskapen 'id' är tom eller saknas i det angivna dokumentet." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คุณสมบัติ 'id' ว่างหรือหายไปในเอกสารที่ให้มา" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sağlanan belgede 'id' özelliği boş veya eksik." - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тәкъдим ителгән документта 'id' үзенчәлеге буш яки юк." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Властивість 'id' порожня або відсутня в наданому документі." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "'id' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ta'minlangan hujjatda 'id' xususiyati bo'sh yoki yo'q." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thuộc tính 'id' trống hoặc thiếu trong tài liệu được cung cấp." - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "提供的文档中 'id' 属性为空或缺失。" - } + "sourceLanguage": "en", + "strings": { + "CONFLICT_ERROR": { + "comment": "Conflict error message", + "extractionState": "extracted_with_value", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل الطلب بسبب تعارض في تحديث المستند: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Һорау документты яңыртыуҙа ҡаршылыҡ арҡаһында уңышһыҙлыҡҡа осраны: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт не ўдалося з-за канфлікту абнаўлення дакумента: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Заявката не бе успешна поради конфликт при обновяване на документа: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek selhal kvůli konfliktu při aktualizaci dokumentu: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Anmodningen mislykkedes på grund af en opdateringskonflikt i dokumentet: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Anfrage ist aufgrund eines Dokumenten-Konflikts fehlgeschlagen: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα απέτυχε λόγω σύγκρουσης ενημέρωσης εγγράφου: %@" + } + }, + "en": { + "stringUnit": { + "state": "new", + "value": "The request failed due to a document update conflict: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud falló debido a un conflicto de actualización del documento: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Pyyntö epäonnistui dokumentin päivitysristiriidan vuoksi: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Nabigo ang request dahil sa conflict sa pag-update ng dokumento: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête a échoué en raison d'un conflit de mise à jour du document : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "दस्तावेज़ अपडेट संघर्ष के कारण अनुरोध विफल रहा: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Zahtjev nije uspio zbog sukoba pri ažuriranju dokumenta: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan gagal karena konflik pembaruan dokumen: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta non è riuscita a causa di un conflitto di aggiornamento del documento: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの更新競合によりリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Сұрау құжатты жаңарту қақтығысына байланысты сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 업데이트 충돌로 인해 요청이 실패했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Сурам документти жаңыртуудагы карама-каршылыкка байланыштуу ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Forespørselen mislyktes på grunn av en dokumentoppdateringskonflikt: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het verzoek is mislukt vanwege een conflict bij het bijwerken van het document: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie nie powiodło się z powodu konfliktu podczas aktualizacji dokumentu: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição falhou devido a um conflito de atualização do documento: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea a eșuat din cauza unui conflict de actualizare a documentului: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Запрос не выполнен из-за конфликта обновления документа: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka zlyhala kvôli konfliktu pri aktualizácii dokumentu: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva ni uspela zaradi konflikta pri posodobitvi dokumenta: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Захтев није успео због конфликта при ажурирању документа: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Begäran misslyckades på grund av en dokumentuppdateringskonflikt: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอล้มเหลวเนื่องจากข้อขัดแย้งในการอัปเดตเอกสาร: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "İstek, belge güncelleme çakışması nedeniyle başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Сорау документ яңарту конфликт аркасында уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит не виконано через конфлікт оновлення документа: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "دستاویز کی اپ ڈیٹ کے تنازع کی وجہ سے درخواست ناکام ہوگئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "So'rov hujjatni yangilashdagi ziddiyat sababli muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu thất bại do xung đột cập nhật tài liệu: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求因文档更新冲突失败:%@" + } + } + } + }, + "DELETE_ERROR": { + "comment": "DELETE request failure message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب DELETE: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "DELETE һорауы уңышһыҙ булды: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт DELETE не быў паспяховым: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "DELETE заявката не бе успешна: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek DELETE nebyl úspěšný: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "DELETE-anmodningen var ikke succesfuld: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die DELETE-Anfrage war nicht erfolgreich: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα DELETE δεν ήταν επιτυχές: %@" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The DELETE request wasn't successful: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud DELETE no fue exitosa: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "DELETE-pyyntö epäonnistui: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang DELETE request ay hindi matagumpay: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête DELETE n'a pas abouti : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "DELETE अनुरोध सफल नहीं था: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "DELETE zahtjev nije uspio: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan DELETE tidak berhasil: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta DELETE non è riuscita: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "DELETEリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "DELETE сұрауы сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "DELETE 요청이 성공하지 못했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "DELETE сурамы ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "DELETE-forespørselen var ikke vellykket: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het DELETE-verzoek was niet succesvol: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het DELETE-verzoek was niet succesvol: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie DELETE nie powiodło się: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição DELETE não foi bem-sucedida: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea DELETE nu a reușit: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "DELETE-запрос не был выполнен успешно: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka DELETE nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva DELETE ni uspela: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "DELETE захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "DELETE-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ DELETE ไม่สำเร็จ: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "DELETE isteği başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "DELETE үтенече уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит DELETE не був успішним: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "DELETE درخواست کامیاب نہیں ہوئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "DELETE so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu DELETE không thành công: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "DELETE 请求未成功:%@" + } + } + } + }, + "FIND_ERROR": { + "comment": "FIND request failure message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب FIND: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "FIND һорауы уңышһыҙ булды: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт FIND не быў паспяховым: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "FIND заявката не бе успешна: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek FIND nebyl úspěšný: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "FIND-anmodningen var ikke succesfuld: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die FIND-Anfrage war nicht erfolgreich: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα FIND δεν ήταν επιτυχές: %@" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The FIND request wasn't successful: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud FIND no fue exitosa: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "FIND-pyyntö epäonnistui: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang FIND request ay hindi matagumpay: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête FIND n'a pas abouti : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "FIND अनुरोध सफल नहीं था: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "FIND zahtjev nije uspio: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan FIND tidak berhasil: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta FIND non è riuscita: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "FINDリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "FIND сұрауы сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "FIND 요청이 성공하지 못했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "FIND сурамы ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "FIND-forespørselen var ikke vellykket: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het FIND-verzoek was niet succesvol: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het FIND-verzoek was niet succesvol: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie FIND nie powiodło się: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição FIND não foi bem-sucedida: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea FIND nu a reușit: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "FIND-запрос не был выполнен успешно: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka FIND nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva FIND ni uspela: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "FIND захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "FIND-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ FIND ไม่สำเร็จ: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "FIND isteği başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "FIND үтенече уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит FIND не був успішним: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "FIND درخواست کامیاب نہیں ہوئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "FIND so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu FIND không thành công: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "FIND 请求未成功:%@" + } + } + } + }, + "GET_ERROR": { + "comment": "GET request failure message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب GET: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "GET һорауы уңышһыҙ булды: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт GET не быў паспяховым: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "GET заявката не бе успешна: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek GET nebyl úspěšný: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "GET-anmodningen var ikke succesfuld: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die GET-Anfrage war nicht erfolgreich: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα GET δεν ήταν επιτυχές: %@" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The GET request wasn't successful: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud GET no fue exitosa: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "GET-pyyntö epäonnistui: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang GET request ay hindi matagumpay: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête GET n'a pas abouti : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "GET अनुरोध सफल नहीं था: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "GET zahtjev nije uspio: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan GET tidak berhasil: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta GET non è riuscita: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "GETリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "GET сұрауы сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "GET 요청이 성공하지 못했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "GET сурамы ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "GET-forespørselen var ikke vellykket: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het GET-verzoek was niet succesvol: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het GET-verzoek was niet succesvol: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie GET nie powiodło się: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição GET não foi bem-sucedida: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea GET nu a reușit: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "GET-запрос не был выполнен успешно: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka GET nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva GET ni uspela: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "GET захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "GET-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ GET ไม่สำเร็จ: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "GET isteği başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "GET үтенече уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит GET не був успішним: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "GET درخواست کامیاب نہیں ہوئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "GET so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu GET không thành công: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "GET 请求未成功:%@" + } + } + } + }, + "ID_MISSING_ERROR": { + "comment": "Error description for missing document ID", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "خاصية 'id' فارغة أو مفقودة في المستند المقدم." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Тәҡдим ителгән документта 'id' ҡасиәте буш йәки юҡ." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Уласцівасць 'id' пустая або адсутнічае ў прадастаўленым дакуменце." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Свойството 'id' е празно или липсва в предоставения документ." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Vlastnost 'id' je prázdná nebo chybí v poskytnutém dokumentu." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "'id'-egenskaben er tom eller mangler i det leverede dokument." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die 'id'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η ιδιότητα 'id' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The 'id' property is empty or missing in the provided document." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad 'id' está vacía o falta en el documento proporcionado." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "'id'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang 'id' property ay walang laman o nawawala sa ibinigay na dokumento." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété 'id' est vide ou manquante dans le document fourni." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "'id' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Svojstvo 'id' je prazno ili nedostaje u dostavljenom dokumentu." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Properti 'id' kosong atau tidak ada dalam dokumen yang diberikan." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La proprietà 'id' è vuota o mancante nel documento fornito." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "提供されたドキュメントに 'id' プロパティが空またはありません。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Ұсынылған құжатта 'id' қасиеті бос немесе жоқ." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공된 문서에서 'id' 속성이 비어 있거나 없습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Берилген документте 'id' касиети бош же жок." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "'id'-egenskapen er tom eller mangler i det oppgitte dokumentet." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "De 'id'-eigenschap is leeg или ontbreekt in het opgegeven document." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Właściwość 'id' jest pusta lub brakuje jej w dostarczonym dokumencie." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade 'id' está vazia ou ausente no documento fornecido." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Proprietatea 'id' este goală sau lipsă din documentul furnizat." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Свойство 'id' отсутствует или пусто в предоставленном документе." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Vlastnosť 'id' je prázdna alebo chýba v poskytnutom dokumente." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Lastnost 'id' je prazna ali manjka v predloženem dokumentu." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Својство 'id' је празно или недостаје у датом документу." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Egenskapen 'id' är tom eller saknas i det angivna dokumentet." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คุณสมบัติ 'id' ว่างหรือหายไปในเอกสารที่ให้มา" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Sağlanan belgede 'id' özelliği boş veya eksik." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Тәкъдим ителгән документта 'id' үзенчәлеге буш яки юк." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Властивість 'id' порожня або відсутня в наданому документі." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "'id' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Ta'minlangan hujjatda 'id' xususiyati bo'sh yoki yo'q." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thuộc tính 'id' trống hoặc thiếu trong tài liệu được cung cấp." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "提供的文档中 'id' 属性为空或缺失。" + } + } + } + }, + "INSERT_ERROR": { + "comment": "INSERT request failure message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب INSERT: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "INSERT һорауы уңышһыҙ булды: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт INSERT не быў паспяховым: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "INSERT заявката не бе успешна: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek INSERT nebyl úspěšný: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "INSERT-anmodningen var ikke succesfuld: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die INSERT-Anfrage war nicht erfolgreich: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα INSERT δεν ήταν επιτυχές: %@" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The INSERT request wasn't successful: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud INSERT no fue exitosa: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "INSERT-pyyntö epäonnistui: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang INSERT request ay hindi matagumpay: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête INSERT n'a pas abouti : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "INSERT अनुरोध सफल नहीं था: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "INSERT zahtjev nije uspio: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan INSERT tidak berhasil: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta INSERT non è riuscita: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "INSERTリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "INSERT сұрауы сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "INSERT 요청이 성공하지 못했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "INSERT сурамы ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "INSERT-forespørselen var ikke vellykket: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het INSERT-verzoek was niet succesvol: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het INSERT-verzoek was niet succesvol: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie INSERT nie powiodło się: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição INSERT não foi bem-sucedida: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea INSERT nu a reușit: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "INSERT-запрос не был выполнен успешно: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka INSERT nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva INSERT ni uspela: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "INSERT захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "INSERT-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ INSERT ไม่สำเร็จ: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "INSERT isteği başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "INSERT үтенече уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит INSERT не був успішним: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "INSERT درخواست کامیاب نہیں ہوئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "INSERT so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu INSERT không thành công: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "INSERT 请求未成功:%@" + } + } + } + }, + "NO_DATA_ERROR": { + "comment": "No data error message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "هيئة الاستجابة تفتقد البيانات المتوقعة." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Яуап һүлеһендә көтелгән мәғлүмәт юҡ." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "У адказе адсутнічаюць чаканыя дадзеныя." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "В тялото на отговора липсват очакваните данни." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "V těle odpovědi chybí očekávaná data." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Responskroppen mangler de forventede data." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Antwortkörper enthält nicht die erwarteten Daten." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το σώμα της απάντησης δεν περιέχει τα αναμενόμενα δεδομένα." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The response body is missing the expected data." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El cuerpo de la respuesta no contiene los datos esperados." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Vastauksen runko ei sisällä odotettuja tietoja." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang response body ay kulang sa inaasahang data." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le corps de la réponse ne contient pas les données attendues." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "प्रतिक्रिया में अपेक्षित डेटा गायब है।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Tijelo odgovora ne sadrži očekivane podatke." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Badan respons tidak memiliki data yang diharapkan." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il corpo della risposta non contiene i dati previsti." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "レスポンスボディに期待されるデータがありません。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Жауап денесінде күтілген деректер жоқ." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "응답 본문에 예상된 데이터가 없습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Жооптун денесинде күтүлгөн маалыматтар жок." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Responsen mangler de forventede dataene." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De respons bevat niet de verwachte gegevens." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "De respons bevat niet de verwachte gegevens." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "W treści odpowiedzi brakuje oczekiwanych danych." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O corpo da resposta está sem os dados esperados." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Corpul răspunsului nu conține datele așteptate." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "В теле ответа отсутствуют ожидаемые данные." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "V tele odpovede chýbajú očakávané dáta." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Vsebina odgovora ne vsebuje pričakovanih podatkov." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "У телу одговора недостају очекивани подаци." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Svarskroppen saknar den förväntade datan." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เนื้อหาการตอบกลับขาดข้อมูลที่คาดหวัง" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yanıt gövdesinde beklenen veri eksik." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Җавап җисемендә көтелгән мәгълүматлар юк." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "У відповіді відсутні очікувані дані." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "جواب میں توقع کے مطابق ڈیٹا موجود نہیں ہے۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Javob tarkibida kutilgan ma'lumotlar yo'q." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Phản hồi thiếu dữ liệu mong đợi." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "响应正文中缺少预期的数据。" + } + } + } + }, + "NOT_FOUND_ERROR": { + "comment": "Not found error message", + "extractionState": "extracted_with_value", + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "The requested resource was not found in CouchDB." + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المورد المطلوب غير موجود في CouchDB." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "CouchDB-ҙа һоралған ресурс табылманы." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запытаны рэсурс не знойдзены ў CouchDB." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Заявените ресурс не е намерен в CouchDB." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadovaný prostředek nebyl v CouchDB nalezen." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Den anmodede ressource blev ikke fundet i CouchDB." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die angeforderte Ressource wurde in CouchDB nicht gefunden." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Ο ζητούμενος πόρος δεν βρέθηκε στο CouchDB." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El recurso solicitado no se encontró en CouchDB." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Pyydettyä resurssia ei löytynyt CouchDB:stä." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang hiniling na resource ay hindi natagpuan sa CouchDB." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La ressource demandée est introuvable dans CouchDB." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "CouchDB में अनुरोधित संसाधन नहीं मिला।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Traženi resurs nije pronađen u CouchDB-u." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sumber daya yang diminta tidak ditemukan di CouchDB." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La risorsa richiesta non è stata trovata in CouchDB." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "要求されたリソースはCouchDBに見つかりませんでした。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Сұралған ресурс CouchDB-де табылмады." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "요청한 리소스를 CouchDB에서 찾을 수 없습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Суралган ресурс CouchDB'де табылган жок." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Den forespurte ressursen ble ikke funnet i CouchDB." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De opgevraagde resource is niet gevonden in CouchDB." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "De opgevraagde resource is niet gevonden in CouchDB." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądany zasób nie został znaleziony w CouchDB." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O recurso solicitado não foi encontrado no CouchDB." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Resursa solicitată nu a fost găsită în CouchDB." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Запрошенный ресурс не найден в CouchDB." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požadovaný zdroj sa v CouchDB nenašiel." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahtevani vir ni bil najden v CouchDB." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Тражени ресурс није пронађен у CouchDB-у." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Den begärda resursen hittades inte i CouchDB." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่พบ resource ที่ร้องขอใน CouchDB" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "İstenen kaynak CouchDB'de bulunamadı." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Соралган ресурс CouchDB-да табылмады." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запитуваний ресурс не знайдено в CouchDB." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "CouchDB میں مطلوبہ وسیلہ نہیں ملا۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "So'ralgan resurs CouchDBda topilmadi." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không tìm thấy tài nguyên được yêu cầu trong CouchDB." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在 CouchDB 中找不到请求的资源。" + } + } + } + }, + "REV_MISSING_ERROR": { + "comment": "Error description for missing revision field", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "خاصية '_rev' فارغة أو مفقودة في المستند المقدم." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Тәҡдим ителгән документта '_rev' ҡасиәте буш йәки юҡ." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Уласцівасць '_rev' пустая або адсутнічае ў прадастаўленым дакуменце." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Свойството '_rev' е празно или липсва в предоставения документ." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Vlastnost '_rev' je prázdná nebo chybí v poskytnutém dokumentu." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-egenskaben er tom eller mangler i det leverede dokument." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die '_rev'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η ιδιότητα '_rev' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The '_rev' property is empty or missing in the provided document." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad '_rev' está vacía o falta en el documento proporcionado." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang '_rev' property ay walang laman o nawawala sa ibinigay na dokumento." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété '_rev' est vide ou manquante dans le document fourni." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "'_rev' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Svojstvo '_rev' je prazno ili nedostaje u dostavljenom dokumentu." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Properti '_rev' kosong atau tidak ada dalam dokumen yang diberikan." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La proprietà '_rev' è vuota o mancante nel documento fornito." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "提供されたドキュメントに '_rev' プロパティが空またはありません。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Ұсынылған құжатта '_rev' қасиеті бос немесе жоқ." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공된 문서에서 '_rev' 속성이 비어 있거나 없습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Берилген документте '_rev' касиети бош же жок." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "'_rev'-egenskapen er tom eller mangler i det oppgitte dokumentet." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Właściwość '_rev' jest pusta lub brakuje jej w dostarczonym dokumencie." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade '_rev' está vazia ou ausente no documento fornecido." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Proprietatea '_rev' este goală sau lipsă din documentul furnizat." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Свойство '_rev' отсутствует или пусто в предоставленном документе." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Vlastnosť '_rev' je prázdna alebo chýba v poskytnutom dokumente." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Lastnost '_rev' je prazna ali manjka v predloženem dokumentu." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Својство '_rev' је празно или недостаје у датом документу." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Egenskapen '_rev' är tom eller saknas i det angivna dokumentet." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คุณสมบัติ '_rev' ว่างหรือหายไปในเอกสารที่ให้มา" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Sağlanan belgede '_rev' özelliği boş veya eksik." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Тәкъдим ителгән документта '_rev' үзенчәлеге буш яки юк." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Властивість '_rev' порожня або відсутня в наданому документі." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "'_rev' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Ta'minlangan hujjatda '_rev' xususiyati bo'sh yoki yo'q." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thuộc tính '_rev' trống hoặc thiếu trong tài liệu được cung cấp." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "提供的文档中 '_rev' 属性为空或缺失。" + } + } + } + }, + "UNAUTHORIZED_ERROR": { + "comment": "Unauthorized access message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل المصادقة بسبب اسم مستخدم أو كلمة مرور غير صحيحة." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "Дөрөҫ булмаған ҡулланыусы исеме йәки серһүҙ сәбәпле аутентификация уңышһыҙ булды." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Аўтэнтыфікацыя не ўдалася з-за няправільнага імя карыстальніка або пароля." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Удостоверяването не бе успешно поради неправилно потребителско име или парола." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Ověření selhalo kvůli nesprávnému uživatelskému jménu nebo heslu." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Godkendelse mislykkedes på grund af et forkert brugernavn eller adgangskode." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Authentifizierung aufgrund eines falschen Benutzernamens oder Passworts fehlgeschlagen." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η πιστοποίηση απέτυχε λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication failed due to an incorrect username or password." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La autenticación falló debido a un nombre de usuario o contraseña incorrectos." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "Tunnistautuminen epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Nabigo ang authentication dahil sa maling username o password." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'authentification a échoué en raison d'un nom d'utilisateur ou d'un mot de passe incorrect." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "गलत उपयोगकर्ता नाम या पासवर्ड के कारण प्रमाणीकरण विफल हुआ।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Autentifikacija nije uspjela zbog netočnog korisničkog imena ili lozinke." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Autentikasi gagal karena nama pengguna atau kata sandi salah." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Autenticazione fallita a causa di un nome utente o una password non corretti." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名またはパスワードが間違っているため、認証に失敗しました。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "Қате пайдаланушы аты немесе құпия сөз себебінен аутентификация сәтсіз аяқталды." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 사용자 이름 또는 비밀번호로 인해 인증에 실패했습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "Туура эмес колдонуучу аты же сырсөз себебинен аутентификация ийгиликсиз болду." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Autentisering mislyktes på grunn av feil brukernavn eller passord." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Uwierzytelnienie nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A autenticação falhou devido a um nome de usuário ou senha incorretos." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Autentificarea a eșuat din cauza unui nume de utilizator sau parolă incorectă." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ошибка аутентификации из-за неправильного имени пользователя или пароля." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Overenie zlyhalo kvôli nesprávnemu používateľskému menu alebo heslu." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Preverjanje pristnosti ni uspelo zaradi napačnega uporabniškega imena ali gesla." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Аутентификација није успела због нетачног корисничког имена или лозинке." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Autentisering misslyckades på grund av ett felaktigt användarnamn eller lösenord." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การตรวจสอบสิทธิ์ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "Дөрес булмаган кулланучы исеме яки серсүз сәбәпле аутентификация уңышсыз булды." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Помилка аутентифікації через неправильне ім'я користувача або пароль." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "غلط صارف نام یا پاس ورڈ کی وجہ سے تصدیق ناکام ہو گئی۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "Noto'g'ri foydalanuvchi nomi yoki parol tufayli autentifikatsiya muvaffaqiyatsiz tugadi." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xác thực thất bại do tên người dùng hoặc mật khẩu không chính xác." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "由于用户名或密码不正确,认证失败。" + } + } + } + }, + "UNKNOWN_RESPONSE_ERROR": { + "comment": "Unknown response message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "الاستجابة من CouchDB غير معروفة أو غير صالحة." + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "CouchDB яуабы танылманы йәки дөрөҫ түгел." + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Адказ ад CouchDB не быў распазнаны альбо несапраўдны." + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "Отговорът от CouchDB беше неразпознат или невалиден." + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Odpověď z CouchDB nebyla rozpoznána nebo je neplatná." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Svaret fra CouchDB blev ikke genkendt eller er ugyldigt." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Antwort von CouchDB wurde nicht erkannt oder ist ungültig." + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Η απάντηση από το CouchDB δεν αναγνωρίστηκε ή ήταν άκυρη." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The response from CouchDB was unrecognized or invalid." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La respuesta de CouchDB no fue reconocida o no es válida." + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "CouchDB:n vastaus oli tunnistamaton tai virheellinen." + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang response mula sa CouchDB ay hindi nakilala o hindi wasto." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La réponse de CouchDB n'a pas été reconnue ou est invalide." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "CouchDB से प्रतिक्रिया अपरिचित या अमान्य थी।" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "Odgovor iz CouchDB-a nije prepoznat ili je nevažeći." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tanggapan dari CouchDB tidak dikenali atau tidak valid." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La risposta da CouchDB non è stata riconosciuta o è invalida." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "CouchDBからの応答が認識できないか無効です。" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "CouchDB жауабы танылмады немесе жарамсыз." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "CouchDB의 응답을 인식할 수 없거나 유효하지 않습니다." + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "CouchDB жообу таанылган эмес же жараксыз болгон." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Svaret fra CouchDB ble ikke gjenkjent eller var ugyldig." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het antwoord van CouchDB was niet herkend of ongeldig." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Odpowiedź z CouchDB była nierozpoznana lub nieprawidłowa." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A resposta do CouchDB não foi reconhecida ou é inválida." + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Răspunsul de la CouchDB a fost nerecunoscut sau invalid." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ответ от CouchDB не распознан или недействителен." + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Odpoveď z CouchDB nebola rozpoznaná alebo je neplatná." + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Odgovor iz CouchDB ni bil prepoznan ali je neveljaven." + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "Одговор од CouchDB није препознат или је неважећи." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Svaret från CouchDB var okänt eller ogiltigt." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การตอบกลับจาก CouchDB ไม่เป็นที่รู้จักหรือไม่ถูกต้อง" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "CouchDB'den gelen yanıt tanınmadı veya geçersiz." + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "CouchDB җавабы танылмады яки дөрес түгел." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відповідь від CouchDB не розпізнана або недійсна." + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "CouchDB کا جواب غیر معروف یا غلط تھا۔" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "CouchDB dan javob tanilmagan yoki yaroqsiz edi." + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Phản hồi từ CouchDB không được nhận dạng hoặc không hợp lệ." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "来自 CouchDB 的响应无法识别或无效。" + } + } + } + }, + "UPDATE_ERROR": { + "comment": "UPDATE request failure message", + "localizations": { + "ar": { + "stringUnit": { + "state": "translated", + "value": "فشل طلب UPDATE: %@" + } + }, + "ba": { + "stringUnit": { + "state": "translated", + "value": "UPDATE һорауы уңышһыҙ булды: %@" + } + }, + "be": { + "stringUnit": { + "state": "translated", + "value": "Запыт UPDATE не быў паспяховым: %@" + } + }, + "bg": { + "stringUnit": { + "state": "translated", + "value": "UPDATE заявката не бе успешна: %@" + } + }, + "cs": { + "stringUnit": { + "state": "translated", + "value": "Požadavek UPDATE nebyl úspěšný: %@" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-anmodningen var ikke succesfuld: %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die UPDATE-Anfrage war nicht erfolgreich: %@" + } + }, + "el": { + "stringUnit": { + "state": "translated", + "value": "Το αίτημα UPDATE δεν ήταν επιτυχές: %@" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "The UPDATE request wasn't successful: %@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La solicitud UPDATE no fue exitosa: %@" + } + }, + "fi": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-pyyntö epäonnistui: %@" + } + }, + "fil": { + "stringUnit": { + "state": "translated", + "value": "Ang UPDATE request ay hindi matagumpay: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête UPDATE n'a pas abouti : %@" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "UPDATE अनुरोध सफल नहीं था: %@" + } + }, + "hr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE zahtjev nije uspio: %@" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Permintaan UPDATE tidak berhasil: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La richiesta UPDATE non è riuscita: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "UPDATEリクエストが失敗しました:%@" + } + }, + "kk": { + "stringUnit": { + "state": "translated", + "value": "UPDATE сұрауы сәтсіз аяқталды: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "UPDATE 요청이 성공하지 못했습니다: %@" + } + }, + "ky": { + "stringUnit": { + "state": "translated", + "value": "UPDATE сурамы ийгиликсиз болду: %@" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-forespørselen var ikke vellykket: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het UPDATE-verzoek was niet succesvol: %@" + } + }, + "nl-BE": { + "stringUnit": { + "state": "translated", + "value": "Het UPDATE-verzoek was niet succesvol: %@" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Żądanie UPDATE nie powiodło się: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A requisição UPDATE não foi bem-sucedida: %@" + } + }, + "ro": { + "stringUnit": { + "state": "translated", + "value": "Cererea UPDATE nu a reușit: %@" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-запрос не был выполнен успешно: %@" + } + }, + "sk": { + "stringUnit": { + "state": "translated", + "value": "Požiadavka UPDATE nebola úspešná: %@" + } + }, + "sl": { + "stringUnit": { + "state": "translated", + "value": "Zahteva UPDATE ni uspela: %@" + } + }, + "sr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE захтев није успео: %@" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "UPDATE-begäran lyckades inte: %@" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คำขอ UPDATE ไม่สำเร็จ: %@" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "UPDATE isteği başarısız oldu: %@" + } + }, + "tt": { + "stringUnit": { + "state": "translated", + "value": "UPDATE үтенече уңышсыз булды: %@" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запит UPDATE не був успішним: %@" + } + }, + "ur": { + "stringUnit": { + "state": "translated", + "value": "UPDATE درخواست کامیاب نہیں ہوئی: %@" + } + }, + "uz": { + "stringUnit": { + "state": "translated", + "value": "UPDATE so'rovi muvaffaqiyatsiz yakunlandi: %@" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Yêu cầu UPDATE không thành công: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "UPDATE 请求未成功:%@" + } + } + } } - } }, - "INSERT_ERROR" : { - "comment" : "INSERT request failure message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل طلب INSERT: %@" - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT һорауы уңышһыҙ булды: %@" - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запыт INSERT не быў паспяховым: %@" - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT заявката не бе успешна: %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požadavek INSERT nebyl úspěšný: %@" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT-anmodningen var ikke succesfuld: %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die INSERT-Anfrage war nicht erfolgreich: %@" - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το αίτημα INSERT δεν ήταν επιτυχές: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The INSERT request wasn't successful: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La solicitud INSERT no fue exitosa: %@" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT-pyyntö epäonnistui: %@" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang INSERT request ay hindi matagumpay: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La requête INSERT n'a pas abouti : %@" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT अनुरोध सफल नहीं था: %@" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT zahtjev nije uspio: %@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permintaan INSERT tidak berhasil: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La richiesta INSERT non è riuscita: %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERTリクエストが失敗しました:%@" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT сұрауы сәтсіз аяқталды: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT 요청이 성공하지 못했습니다: %@" - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT сурамы ийгиликсиз болду: %@" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT-forespørselen var ikke vellykket: %@" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het INSERT-verzoek was niet succesvol: %@" - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het INSERT-verzoek was niet succesvol: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie INSERT nie powiodło się: %@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A requisição INSERT não foi bem-sucedida: %@" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cererea INSERT nu a reușit: %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT-запрос не был выполнен успешно: %@" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požiadavka INSERT nebola úspešná: %@" - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zahteva INSERT ni uspela: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT захтев није успео: %@" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT-begäran lyckades inte: %@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำขอ INSERT ไม่สำเร็จ: %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT isteği başarısız oldu: %@" - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT үтенече уңышсыз булды: %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запит INSERT не був успішним: %@" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT درخواست کامیاب نہیں ہوئی: %@" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT so'rovi muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu INSERT không thành công: %@" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "INSERT 请求未成功:%@" - } - } - } - }, - "NO_DATA_ERROR" : { - "comment" : "No data error message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "هيئة الاستجابة تفتقد البيانات المتوقعة." - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "Яуап һүлеһендә көтелгән мәғлүмәт юҡ." - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "У адказе адсутнічаюць чаканыя дадзеныя." - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "В тялото на отговора липсват очакваните данни." - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "V těle odpovědi chybí očekávaná data." - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Responskroppen mangler de forventede data." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Der Antwortkörper enthält nicht die erwarteten Daten." - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το σώμα της απάντησης δεν περιέχει τα αναμενόμενα δεδομένα." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The response body is missing the expected data." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El cuerpo de la respuesta no contiene los datos esperados." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vastauksen runko ei sisällä odotettuja tietoja." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang response body ay kulang sa inaasahang data." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le corps de la réponse ne contient pas les données attendues." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "प्रतिक्रिया में अपेक्षित डेटा गायब है।" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tijelo odgovora ne sadrži očekivane podatke." - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Badan respons tidak memiliki data yang diharapkan." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il corpo della risposta non contiene i dati previsti." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "レスポンスボディに期待されるデータがありません。" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Жауап денесінде күтілген деректер жоқ." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "응답 본문에 예상된 데이터가 없습니다." - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "Жооптун денесинде күтүлгөн маалыматтар жок." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Responsen mangler de forventede dataene." - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "De respons bevat niet de verwachte gegevens." - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "De respons bevat niet de verwachte gegevens." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W treści odpowiedzi brakuje oczekiwanych danych." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O corpo da resposta está sem os dados esperados." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Corpul răspunsului nu conține datele așteptate." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "В теле ответа отсутствуют ожидаемые данные." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "V tele odpovede chýbajú očakávané dáta." - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vsebina odgovora ne vsebuje pričakovanih podatkov." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "У телу одговора недостају очекивани подаци." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svarskroppen saknar den förväntade datan." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "เนื้อหาการตอบกลับขาดข้อมูลที่คาดหวัง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yanıt gövdesinde beklenen veri eksik." - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Җавап җисемендә көтелгән мәгълүматлар юк." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "У відповіді відсутні очікувані дані." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "جواب میں توقع کے مطابق ڈیٹا موجود نہیں ہے۔" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "Javob tarkibida kutilgan ma'lumotlar yo'q." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phản hồi thiếu dữ liệu mong đợi." - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "响应正文中缺少预期的数据。" - } - } - } - }, - "REV_MISSING_ERROR" : { - "comment" : "Error description for missing revision field", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "خاصية '_rev' فارغة أو مفقودة في المستند المقدم." - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тәҡдим ителгән документта '_rev' ҡасиәте буш йәки юҡ." - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Уласцівасць '_rev' пустая або адсутнічае ў прадастаўленым дакуменце." - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "Свойството '_rev' е празно или липсва в предоставения документ." - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vlastnost '_rev' je prázdná nebo chybí v poskytnutém dokumentu." - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "'_rev'-egenskaben er tom eller mangler i det leverede dokument." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die '_rev'-Eigenschaft ist leer oder fehlt im bereitgestellten Dokument." - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Η ιδιότητα '_rev' είναι κενή ή λείπει στο παρεχόμενο έγγραφο." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The '_rev' property is empty or missing in the provided document." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propiedad '_rev' está vacía o falta en el documento proporcionado." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "'_rev'-ominaisuus on tyhjä tai puuttuu annetussa asiakirjassa." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang '_rev' property ay walang laman o nawawala sa ibinigay na dokumento." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propriété '_rev' est vide ou manquante dans le document fourni." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "'_rev' गुण प्रदान किए गए दस्तावेज़ में खाली या गायब है।" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svojstvo '_rev' je prazno ili nedostaje u dostavljenom dokumentu." - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Properti '_rev' kosong atau tidak ada dalam dokumen yang diberikan." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La proprietà '_rev' è vuota o mancante nel documento fornito." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "提供されたドキュメントに '_rev' プロパティが空またはありません。" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ұсынылған құжатта '_rev' қасиеті бос немесе жоқ." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공된 문서에서 '_rev' 속성이 비어 있거나 없습니다." - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "Берилген документте '_rev' касиети бош же жок." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "'_rev'-egenskapen er tom eller mangler i det oppgitte dokumentet." - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "De '_rev'-eigenschap is leeg или ontbreekt in het opgegeven document." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Właściwość '_rev' jest pusta lub brakuje jej w dostarczonym dokumencie." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A propriedade '_rev' está vazia ou ausente no documento fornecido." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietatea '_rev' este goală sau lipsă din documentul furnizat." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Свойство '_rev' отсутствует или пусто в предоставленном документе." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vlastnosť '_rev' je prázdna alebo chýba v poskytnutom dokumente." - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lastnost '_rev' je prazna ali manjka v predloženem dokumentu." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Својство '_rev' је празно или недостаје у датом документу." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Egenskapen '_rev' är tom eller saknas i det angivna dokumentet." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คุณสมบัติ '_rev' ว่างหรือหายไปในเอกสารที่ให้มา" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sağlanan belgede '_rev' özelliği boş veya eksik." - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Тәкъдим ителгән документта '_rev' үзенчәлеге буш яки юк." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Властивість '_rev' порожня або відсутня в наданому документі." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "'_rev' پراپرٹی فراہم کردہ دستاویز میں خالی یا غائب ہے۔" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ta'minlangan hujjatda '_rev' xususiyati bo'sh yoki yo'q." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thuộc tính '_rev' trống hoặc thiếu trong tài liệu được cung cấp." - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "提供的文档中 '_rev' 属性为空或缺失。" - } - } - } - }, - "UNAUTHORIZED_ERROR" : { - "comment" : "Unauthorized access message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل المصادقة بسبب اسم مستخدم أو كلمة مرور غير صحيحة." - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дөрөҫ булмаған ҡулланыусы исеме йәки серһүҙ сәбәпле аутентификация уңышһыҙ булды." - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Аўтэнтыфікацыя не ўдалася з-за няправільнага імя карыстальніка або пароля." - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "Удостоверяването не бе успешно поради неправилно потребителско име или парола." - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ověření selhalo kvůli nesprávnému uživatelskému jménu nebo heslu." - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Godkendelse mislykkedes på grund af et forkert brugernavn eller adgangskode." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authentifizierung aufgrund eines falschen Benutzernamens oder Passworts fehlgeschlagen." - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Η πιστοποίηση απέτυχε λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authentication failed due to an incorrect username or password." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La autenticación falló debido a un nombre de usuario o contraseña incorrectos." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tunnistautuminen epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nabigo ang authentication dahil sa maling username o password." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'authentification a échoué en raison d'un nom d'utilisateur ou d'un mot de passe incorrect." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "गलत उपयोगकर्ता नाम या पासवर्ड के कारण प्रमाणीकरण विफल हुआ।" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autentifikacija nije uspjela zbog netočnog korisničkog imena ili lozinke." - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autentikasi gagal karena nama pengguna atau kata sandi salah." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autenticazione fallita a causa di un nome utente o una password non corretti." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザー名またはパスワードが間違っているため、認証に失敗しました。" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Қате пайдаланушы аты немесе құпия сөз себебінен аутентификация сәтсіз аяқталды." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "잘못된 사용자 이름 또는 비밀번호로 인해 인증에 실패했습니다." - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "Туура эмес колдонуучу аты же сырсөз себебинен аутентификация ийгиликсиз болду." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autentisering mislyktes på grunn av feil brukernavn eller passord." - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authenticatie mislukt vanwege een onjuiste gebruikersnaam of wachtwoord." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uwierzytelnienie nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A autenticação falhou devido a um nome de usuário ou senha incorretos." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autentificarea a eșuat din cauza unui nume de utilizator sau parolă incorectă." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ошибка аутентификации из-за неправильного имени пользователя или пароля." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Overenie zlyhalo kvôli nesprávnemu používateľskému menu alebo heslu." - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preverjanje pristnosti ni uspelo zaradi napačnega uporabniškega imena ali gesla." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Аутентификација није успела због нетачног корисничког имена или лозинке." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autentisering misslyckades på grund av ett felaktigt användarnamn eller lösenord." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "การตรวจสอบสิทธิ์ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yanlış kullanıcı adı veya şifre nedeniyle kimlik doğrulama başarısız oldu." - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дөрес булмаган кулланучы исеме яки серсүз сәбәпле аутентификация уңышсыз булды." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Помилка аутентифікації через неправильне ім'я користувача або пароль." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "غلط صارف نام یا پاس ورڈ کی وجہ سے تصدیق ناکام ہو گئی۔" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noto'g'ri foydalanuvchi nomi yoki parol tufayli autentifikatsiya muvaffaqiyatsiz tugadi." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xác thực thất bại do tên người dùng hoặc mật khẩu không chính xác." - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "由于用户名或密码不正确,认证失败。" - } - } - } - }, - "UNKNOWN_RESPONSE_ERROR" : { - "comment" : "Unknown response message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "الاستجابة من CouchDB غير معروفة أو غير صالحة." - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB яуабы танылманы йәки дөрөҫ түгел." - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Адказ ад CouchDB не быў распазнаны альбо несапраўдны." - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "Отговорът от CouchDB беше неразпознат или невалиден." - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odpověď z CouchDB nebyla rozpoznána nebo je neplatná." - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svaret fra CouchDB blev ikke genkendt eller er ugyldigt." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die Antwort von CouchDB wurde nicht erkannt oder ist ungültig." - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Η απάντηση από το CouchDB δεν αναγνωρίστηκε ή ήταν άκυρη." - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The response from CouchDB was unrecognized or invalid." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La respuesta de CouchDB no fue reconocida o no es válida." - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB:n vastaus oli tunnistamaton tai virheellinen." - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang response mula sa CouchDB ay hindi nakilala o hindi wasto." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La réponse de CouchDB n'a pas été reconnue ou est invalide." - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB से प्रतिक्रिया अपरिचित या अमान्य थी।" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odgovor iz CouchDB-a nije prepoznat ili je nevažeći." - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tanggapan dari CouchDB tidak dikenali atau tidak valid." - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La risposta da CouchDB non è stata riconosciuta o è invalida." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDBからの応答が認識できないか無効です。" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB жауабы танылмады немесе жарамсыз." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB의 응답을 인식할 수 없거나 유효하지 않습니다." - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB жообу таанылган эмес же жараксыз болгон." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svaret fra CouchDB ble ikke gjenkjent eller var ugyldig." - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het antwoord van CouchDB was niet herkend of ongeldig." - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het antwoord van CouchDB was niet herkend of ongeldig." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odpowiedź z CouchDB była nierozpoznana lub nieprawidłowa." - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A resposta do CouchDB não foi reconhecida ou é inválida." - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Răspunsul de la CouchDB a fost nerecunoscut sau invalid." - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ответ от CouchDB не распознан или недействителен." - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odpoveď z CouchDB nebola rozpoznaná alebo je neplatná." - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odgovor iz CouchDB ni bil prepoznan ali je neveljaven." - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одговор од CouchDB није препознат или је неважећи." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Svaret från CouchDB var okänt eller ogiltigt." - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "การตอบกลับจาก CouchDB ไม่เป็นที่รู้จักหรือไม่ถูกต้อง" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB'den gelen yanıt tanınmadı veya geçersiz." - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB җавабы танылмады яки дөрес түгел." - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Відповідь від CouchDB не розпізнана або недійсна." - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB کا جواب غیر معروف یا غلط تھا۔" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "CouchDB dan javob tanilmagan yoki yaroqsiz edi." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phản hồi từ CouchDB không được nhận dạng hoặc không hợp lệ." - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "来自 CouchDB 的响应无法识别或无效。" - } - } - } - }, - "UPDATE_ERROR" : { - "comment" : "UPDATE request failure message", - "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "فشل طلب UPDATE: %@" - } - }, - "ba" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE һорауы уңышһыҙ булды: %@" - } - }, - "be" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запыт UPDATE не быў паспяховым: %@" - } - }, - "bg" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE заявката не бе успешна: %@" - } - }, - "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požadavek UPDATE nebyl úspěšný: %@" - } - }, - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE-anmodningen var ikke succesfuld: %@" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die UPDATE-Anfrage war nicht erfolgreich: %@" - } - }, - "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Το αίτημα UPDATE δεν ήταν επιτυχές: %@" - } - }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "The UPDATE request wasn't successful: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La solicitud UPDATE no fue exitosa: %@" - } - }, - "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE-pyyntö epäonnistui: %@" - } - }, - "fil" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ang UPDATE request ay hindi matagumpay: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La requête UPDATE n'a pas abouti : %@" - } - }, - "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE अनुरोध सफल नहीं था: %@" - } - }, - "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE zahtjev nije uspio: %@" - } - }, - "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permintaan UPDATE tidak berhasil: %@" - } - }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La richiesta UPDATE non è riuscita: %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATEリクエストが失敗しました:%@" - } - }, - "kk" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE сұрауы сәтсіз аяқталды: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE 요청이 성공하지 못했습니다: %@" - } - }, - "ky" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE сурамы ийгиликсиз болду: %@" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE-forespørselen var ikke vellykket: %@" - } - }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het UPDATE-verzoek was niet succesvol: %@" - } - }, - "nl-BE" : { - "stringUnit" : { - "state" : "translated", - "value" : "Het UPDATE-verzoek was niet succesvol: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Żądanie UPDATE nie powiodło się: %@" - } - }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A requisição UPDATE não foi bem-sucedida: %@" - } - }, - "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cererea UPDATE nu a reușit: %@" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE-запрос не был выполнен успешно: %@" - } - }, - "sk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Požiadavka UPDATE nebola úspešná: %@" - } - }, - "sl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zahteva UPDATE ni uspela: %@" - } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE захтев није успео: %@" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE-begäran lyckades inte: %@" - } - }, - "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คำขอ UPDATE ไม่สำเร็จ: %@" - } - }, - "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE isteği başarısız oldu: %@" - } - }, - "tt" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE үтенече уңышсыз булды: %@" - } - }, - "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Запит UPDATE не був успішним: %@" - } - }, - "ur" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE درخواست کامیاب نہیں ہوئی: %@" - } - }, - "uz" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE so'rovi muvaffaqiyatsiz yakunlandi: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu UPDATE không thành công: %@" - } - }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "UPDATE 请求未成功:%@" - } - } - } - } - }, - "version" : "1.0" + "version": "1.0" } \ No newline at end of file diff --git a/Sources/CouchDBClient/Models/CouchDBClientError.swift b/Sources/CouchDBClient/Models/CouchDBClientError.swift index 6d3e086..bcfa408 100644 --- a/Sources/CouchDBClient/Models/CouchDBClientError.swift +++ b/Sources/CouchDBClient/Models/CouchDBClientError.swift @@ -43,7 +43,7 @@ public enum CouchDBClientError: Error, Sendable { case unknownResponse /// The requested resource was not found in CouchDB. - /// This error indicates that the document or resource does not exist. + /// - Parameter error: The `CouchDBError` returned by the server, providing details about the issue. case notFound(error: CouchDBError) /// Authentication failed due to incorrect username or password. From 20c8fa2f9608bfed9fce5c117d6438092037c1e0 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 9 Jul 2025 16:47:18 +0700 Subject: [PATCH 166/202] HTTPClientTests added using Swift Testing --- .../CouchDBClientTests/HTTPClientTests.swift | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Tests/CouchDBClientTests/HTTPClientTests.swift diff --git a/Tests/CouchDBClientTests/HTTPClientTests.swift b/Tests/CouchDBClientTests/HTTPClientTests.swift new file mode 100644 index 0000000..4b5c375 --- /dev/null +++ b/Tests/CouchDBClientTests/HTTPClientTests.swift @@ -0,0 +1,59 @@ +// +// HTTPClientTests.swift +// couchdb-swift +// +// Created by Sergei Armodin on 09.07.2025. +// + +import Foundation +import Testing +import AsyncHTTPClient +@testable import CouchDBClient + + +@Suite("HTTP Client tests") +struct HTTPClientTests { + let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), + requestsTimeout: 30 + ) + + @Test("Test buildUrl method") + func buildUrl() async { + let couchDBClient = CouchDBClient(config: config) + let expectedUrl = "http://127.0.0.1:5984?key=testKey" + let url = await couchDBClient.buildUrl( + path: "", + query: [ + URLQueryItem(name: "key", value: "testKey") + ]) + #expect(url == expectedUrl) + } + + @Test("Provide own HTTPClient") + func provide_HTTPClient() async throws { + let httpClient = HTTPClient() + let couchDBClient = CouchDBClient(config: config, httpClient: httpClient) + + let httpClientProvided = try #require(await couchDBClient.httpClient) + + let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() + #expect(httpClientProvided === httpClientCreatedIfNeed) + #expect(httpClientProvided === httpClient) + + try await httpClient.shutdown() + } + + @Test("HTTPClient shutdown") + func shutdown() async throws { + let client = CouchDBClient( + config: config, + httpClient: HTTPClient() + ) + try await client.shutdown() + } +} From 97f37958f7e225c8df0add1764db574b6697247c Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 9 Jul 2025 17:39:59 +0700 Subject: [PATCH 167/202] migrated to Swift Testing --- .../CouchDBClientTests.swift | 679 +++++++----------- 1 file changed, 268 insertions(+), 411 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index a9ac55b..bbb9a91 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -1,13 +1,32 @@ -import XCTest +import Foundation +import Testing import NIO import AsyncHTTPClient @testable import CouchDBClient -final class CouchDBClientTests: XCTestCase { +fileprivate let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), + requestsTimeout: 30 +) + +fileprivate let httpClient = HTTPClient() + +@Suite(.serialized) +struct CouchDBClientTests { struct ExpectedDoc: CouchDBRepresentable { var name: String - var _id: String = NSUUID().uuidString + var _id: String = { + #if canImport(Foundation) + return Foundation.UUID().uuidString + #else + return "id-" + String(Int.random(in: 0..<1000000)) + #endif + }() var _rev: String? func updateRevision(_ newRevision: String) -> Self { @@ -17,497 +36,338 @@ final class CouchDBClientTests: XCTestCase { let testsDB = "fortests" - let config = CouchDBClient.Config( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? "", - requestsTimeout: 30 - ) - - lazy var couchDBClient = CouchDBClient(config: config) - - let httpClient = HTTPClient() - - override func setUp() async throws { - try await super.setUp() - } - - func test00_CreateDB() async throws { - do { - let exists = try await couchDBClient.dbExists(testsDB) - if exists { - try await couchDBClient.deleteDB(testsDB) - } + let couchDBClient = CouchDBClient(config: config) - try await couchDBClient.createDB(testsDB) - } catch { - XCTFail(error.localizedDescription) + @Test("Initial creation of database for testing. Should create or recreate db") + func createDB() async throws { + let exists = try await couchDBClient.dbExists(testsDB) + if exists { + try await couchDBClient.deleteDB(testsDB) } + try await couchDBClient.createDB(testsDB) } - func test01_DBExists() async throws { - do { - let exists = try await couchDBClient.dbExists(testsDB) - XCTAssertTrue(exists) - } catch { - XCTFail(error.localizedDescription) - } + @Test("Test dbExists method. Should return true for existing db") + func DBExists() async throws { + let exists = try await couchDBClient.dbExists(testsDB) + #expect(exists == true) } - func test02_DBDoesNotExist() async throws { + @Test("Test dbExists method. Should return false for non existing db") + func DBDoesNotExist() async throws { let nonExistentDB = "db_should_not_exist" - do { - let exists = try await couchDBClient.dbExists(nonExistentDB) - XCTAssertFalse(exists) - } catch { - XCTFail(error.localizedDescription) - } + let exists = try await couchDBClient.dbExists(nonExistentDB) + #expect(exists == false) } - func test03_GetAllDbs() async throws { - do { - let dbs = try await couchDBClient.getAllDBs() - - XCTAssertNotNil(dbs) - XCTAssertFalse(dbs.isEmpty) - XCTAssertTrue(dbs.contains(testsDB)) - } catch { - XCTFail(error.localizedDescription) - } + @Test("Get all dbs") + func getAllDbs() async throws { + let dbs = try await couchDBClient.getAllDBs() + #expect(!dbs.isEmpty) + #expect(dbs.contains(testsDB)) } - func test04_updateAndDeleteDocMethods() async throws { + @Test("Update and delete document") + func updateAndDeleteDocMethods() async throws { var testDoc = ExpectedDoc(name: "test name") - var expectedInsertId: String = "" - var expectedInsertRev: String = "" - - // insert - do { - testDoc = try await couchDBClient.insert( - dbName: testsDB, - doc: testDoc - ) - } catch CouchDBClientError.insertError(let error) { - XCTFail(error.reason) - return - } catch { - XCTFail(error.localizedDescription) - return - } + testDoc = try await couchDBClient.insert(dbName: testsDB, doc: testDoc) + let expectedInsertId = testDoc._id + let expectedInsertRev = testDoc._rev! - expectedInsertId = testDoc._id - expectedInsertRev = testDoc._rev! - - // get inserted doc - do { - testDoc = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) - } catch CouchDBClientError.getError(let error) { - XCTFail(error.reason) - return - } catch { - XCTFail(error.localizedDescription) - return - } + testDoc = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) - // Test update doc testDoc.name = "test name 3" let expectedName = testDoc.name + testDoc = try await couchDBClient.update(dbName: testsDB, doc: testDoc) + #expect(testDoc._rev != expectedInsertRev) + #expect(testDoc._id == expectedInsertId) - do { - testDoc = try await couchDBClient.update( - dbName: testsDB, - doc: testDoc - ) - } catch CouchDBClientError.updateError(let error) { - XCTFail(error.reason) - return - } catch { - XCTFail(error.localizedDescription) - return - } - - XCTAssertNotEqual(testDoc._rev, expectedInsertRev) - XCTAssertEqual(testDoc._id, expectedInsertId) - - // get updated doc - let getResponse2 = try await couchDBClient.get( - fromDB: testsDB, - uri: expectedInsertId - ) - XCTAssertNotNil(getResponse2.body) - + let getResponse2 = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) let expectedBytes2 = getResponse2.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 var bytes2 = try await getResponse2.body.collect(upTo: expectedBytes2) let data2 = bytes2.readData(length: bytes2.readableBytes) - testDoc = try JSONDecoder().decode( - ExpectedDoc.self, - from: data2! - ) + testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: data2!) + #expect(expectedName == testDoc.name) - XCTAssertEqual(expectedName, testDoc.name) - - // Test delete doc - do { - let response = try await couchDBClient.delete( - fromDb: testsDB, - doc: testDoc - ) - - XCTAssertEqual(response.ok, true) - XCTAssertNotNil(response.id) - XCTAssertNotNil(response.rev) - } catch let error { - XCTFail(error.localizedDescription) - } + let response = try await couchDBClient.delete(fromDb: testsDB, doc: testDoc) + #expect(response.ok == true) + #expect(!response.id.isEmpty) + #expect(!response.rev.isEmpty) } - func test05_InsertGetUpdateDelete() async throws { + @Test("Insert, Get, Update and Delete methods") + func insertGetUpdateDelete() async throws { var testDoc = ExpectedDoc(name: "test name") - var expectedInsertId: String = "" - var expectedInsertRev: String = "" - - // test Insert - do { - let insertEncodeData = try JSONEncoder().encode(testDoc) - let response = try await couchDBClient.insert( - dbName: testsDB, - body: .bytes(ByteBuffer(data: insertEncodeData)) - ) - - XCTAssertEqual(response.ok, true) - XCTAssertFalse(response.id.isEmpty) - XCTAssertFalse(response.rev.isEmpty) - - expectedInsertId = response.id - expectedInsertRev = response.rev - } catch let error { - XCTFail(error.localizedDescription) - } + let insertEncodeData = try JSONEncoder().encode(testDoc) + let response = try await couchDBClient.insert( + dbName: testsDB, + body: HTTPClientRequest.Body.bytes(ByteBuffer(data: insertEncodeData)) + ) + #expect(response.ok == true) + #expect(!response.id.isEmpty) + #expect(!response.rev.isEmpty) + + let expectedInsertId = response.id + let expectedInsertRev = response.rev - // Test Get var expectedName = testDoc.name - do { - let response = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) - XCTAssertNotNil(response.body) - - let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await response.body.collect(upTo: expectedBytes) - let data = bytes.readData(length: bytes.readableBytes) - - testDoc = try JSONDecoder().decode( - ExpectedDoc.self, - from: data! - ) - - XCTAssertEqual(expectedName, testDoc.name) - XCTAssertEqual(testDoc._rev, expectedInsertRev) - XCTAssertEqual(testDoc._id, expectedInsertId) - } catch let error { - XCTFail(error.localizedDescription) - } + let getResponse = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) + let expectedBytes = getResponse.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await getResponse.body.collect(upTo: expectedBytes) + + let data = bytes.readData(length: bytes.readableBytes) + testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: data!) + + #expect(expectedName == testDoc.name) + #expect(testDoc._rev == expectedInsertRev) + #expect(testDoc._id == expectedInsertId) - // Test update with body testDoc.name = "test name 2" expectedName = testDoc.name - do { - let updateEncodedData = try JSONEncoder().encode(testDoc) - let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: updateEncodedData)) - - let updateResponse = try await couchDBClient.update( - dbName: testsDB, - uri: expectedInsertId, - body: body - ) - - XCTAssertFalse(updateResponse.rev.isEmpty) - XCTAssertFalse(updateResponse.id.isEmpty) - XCTAssertNotEqual(updateResponse.rev, expectedInsertRev) - XCTAssertEqual(updateResponse.id, expectedInsertId) - - let getResponse = try await couchDBClient.get( - fromDB: testsDB, - uri: expectedInsertId - ) - XCTAssertNotNil(getResponse.body) - - let expectedBytes = getResponse.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await getResponse.body.collect(upTo: expectedBytes) - let data = bytes.readData(length: bytes.readableBytes) - - testDoc = try JSONDecoder().decode( - ExpectedDoc.self, - from: data! - ) - - XCTAssertEqual(expectedName, testDoc.name) - } catch let error { - XCTFail(error.localizedDescription) - } + let updateEncodedData = try JSONEncoder().encode(testDoc) + let body: HTTPClientRequest.Body = .bytes(ByteBuffer(data: updateEncodedData)) + let updateResponse = try await couchDBClient.update( + dbName: testsDB, + uri: expectedInsertId, + body: body + ) - // Test delete - do { - let response = try await couchDBClient.delete( - fromDb: testsDB, - uri: testDoc._id, - rev: testDoc._rev! - ) + #expect(!updateResponse.rev.isEmpty) + #expect(!updateResponse.id.isEmpty) + #expect(updateResponse.rev != expectedInsertRev) + #expect(updateResponse.id == expectedInsertId) - XCTAssertEqual(response.ok, true) - XCTAssertNotNil(response.id) - XCTAssertNotNil(response.rev) + let getResponse2 = try await couchDBClient.get(fromDB: testsDB, uri: expectedInsertId) + let expectedBytes2 = getResponse2.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes2 = try await getResponse2.body.collect(upTo: expectedBytes2) - } catch let error { - XCTFail(error.localizedDescription) - } - } + let data2 = bytes2.readData(length: bytes2.readableBytes) + testDoc = try JSONDecoder().decode(ExpectedDoc.self, from: data2!) - func test06_BuildUrl() async { - let expectedUrl = "http://127.0.0.1:5984?key=testKey" - let url = await couchDBClient.buildUrl( - path: "", - query: [ - URLQueryItem(name: "key", value: "testKey") - ]) - XCTAssertEqual(url, expectedUrl) - } + #expect(expectedName == testDoc.name) - func test07_Auth() async throws { - let session: CreateSessionResponse? = try await couchDBClient.authIfNeed() - XCTAssertNotNil(session) - XCTAssertEqual(true, session?.ok) - let sessionCookieExpires = await couchDBClient.sessionCookieExpires - XCTAssertNotNil(sessionCookieExpires) + let deleteResponse = try await couchDBClient.delete( + fromDb: testsDB, + uri: testDoc._id, + rev: testDoc._rev! + ) + #expect(deleteResponse.ok == true) + #expect(!deleteResponse.id.isEmpty) + #expect(!deleteResponse.rev.isEmpty) } - func test08_find_with_body() async throws { - do { - let testDoc = ExpectedDoc(name: "Greg") - let insertEncodedData = try JSONEncoder().encode(testDoc) - let insertResponse = try await couchDBClient.insert( - dbName: testsDB, - body: .bytes(ByteBuffer(data: insertEncodedData)) - ) - - let selector = ["selector": ["name": "Greg"]] - let bodyData = try JSONEncoder().encode(selector) - let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: bodyData)) - - let findResponse = try await couchDBClient.find( - inDB: testsDB, - body: requestBody - ) - - let body = findResponse.body - let expectedBytes = findResponse.headers.first(name: "content-length").flatMap(Int.init) - var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) - - guard let data = bytes.readData(length: bytes.readableBytes) else { - throw CouchDBClientError.noData - } - - let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: data) - - XCTAssertTrue(decodedResponse.docs.count > 0) - XCTAssertTrue(decodedResponse.docs.contains(where: { $0._id == insertResponse.id })) - - _ = try await couchDBClient.delete( - fromDb: testsDB, - uri: insertResponse.id, - rev: insertResponse.rev - ) - } catch { - XCTFail(error.localizedDescription) - } + @Test("Authorization works. Should set session cookie") + func authorization() async throws { + let session: CreateSessionResponse = try #require( + try await couchDBClient.authIfNeed() + ) + #expect(session.ok == true) + + _ = try #require( + await couchDBClient.sessionCookieExpires + ) } - func test09_find_with_generics() async throws { - do { - let testDoc = ExpectedDoc(name: "Sam") - let insertEncodedData = try JSONEncoder().encode(testDoc) - let insertResponse = try await couchDBClient.insert( - dbName: testsDB, - body: .bytes(ByteBuffer(data: insertEncodedData)) - ) - - let selector = ["selector": ["name": "Sam"]] - let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) - - XCTAssertTrue(docs.count > 0) - XCTAssertEqual(docs.first!._id, insertResponse.id) - - _ = try await couchDBClient.delete( - fromDb: testsDB, - uri: docs.first!._id, - rev: docs.first!._rev! - ) - } catch { - XCTFail(error.localizedDescription) + @Test("Find request with providing body") + func find_with_body() async throws { + let testDoc = ExpectedDoc(name: "Greg") + let insertEncodedData = try JSONEncoder().encode(testDoc) + + let insertResponse = try await couchDBClient.insert( + dbName: testsDB, + body: HTTPClientRequest.Body.bytes(ByteBuffer(data: insertEncodedData)) + ) + + let selector = ["selector": ["name": "Greg"]] + let bodyData = try JSONEncoder().encode(selector) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: bodyData)) + + let findResponse = try await couchDBClient.find( + inDB: testsDB, + body: requestBody + ) + + let expectedBytes = findResponse.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await findResponse.body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData } - } - func test10_provide_HTTPClient() async throws { - let couchDBClient = CouchDBClient(config: config, httpClient: self.httpClient) + let decodedResponse = try JSONDecoder().decode(CouchDBFindResponse.self, from: data) - let httpClientProvided = await couchDBClient.httpClient - XCTAssertNotNil(httpClientProvided) + #expect(decodedResponse.docs.count > 0) + #expect(decodedResponse.docs.contains(where: { $0._id == insertResponse.id })) - let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() - XCTAssertTrue(httpClientProvided === httpClientCreatedIfNeed) - XCTAssertTrue(httpClientProvided === self.httpClient) + _ = try await couchDBClient.delete( + fromDb: testsDB, + uri: insertResponse.id, + rev: insertResponse.rev + ) } - func test11_shutdown() async throws { - let client = CouchDBClient( - config: config, - httpClient: HTTPClient() + @Test("Find request using generics") + func find_with_generics() async throws { + let testDoc = ExpectedDoc(name: "Sam") + let insertEncodedData = try JSONEncoder().encode(testDoc) + + let insertResponse = try await couchDBClient.insert( + dbName: testsDB, + body: HTTPClientRequest.Body.bytes(ByteBuffer(data: insertEncodedData)) ) - do { - try await client.shutdown() - } catch { - XCTFail(error.localizedDescription) - } + let selector = ["selector": ["name": "Sam"]] + let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) + + #expect(docs.count > 0) + let id = try #require(docs.first?._id) + #expect(id == insertResponse.id) + + _ = try await couchDBClient.delete( + fromDb: testsDB, + uri: docs.first!._id, + rev: docs.first!._rev! + ) } - func test12_createDB_conflict() async throws { - // Try to create a DB that already exists, should throw insertError - do { + @Test("Create DB, handle conflict") + func createDB_conflict() async throws { + let error = await #expect(throws: CouchDBClientError.self) { _ = try await couchDBClient.createDB(testsDB) - XCTFail("Expected conflict error not thrown") - } catch CouchDBClientError.insertError(let error) { - XCTAssertTrue(error.error == "file_exists" || error.error == "conflict") - } catch { - XCTFail(error.localizedDescription) } + + #expect({ + switch error { + case .insertError(let error): + return error.error == "file_exists" || error.error == "conflict" + default: return false + } + }(), "Expected CouchDBClientError.insertError") + } - func test13_deleteDB_not_found() async throws { + @Test("Delete non existing DB. Should throw deleteError") + func delete_non_existing_DB() async throws { let nonExistentDB = "db_should_not_exist" - do { - _ = try await couchDBClient.deleteDB(nonExistentDB) - XCTFail("Expected deleteError not thrown") - } catch CouchDBClientError.deleteError(let error) { - XCTAssertTrue(error.error == "not_found") - } catch { - XCTFail(error.localizedDescription) - } - } - func test14_get_document_not_found() async throws { - do { - let _: ExpectedDoc = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") - } catch CouchDBClientError.notFound(_) { - // all good - } catch { - XCTFail(error.localizedDescription) - return + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.deleteDB(nonExistentDB) } - do { - _ = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") - } catch CouchDBClientError.notFound(_) { - return - } catch { - XCTFail(error.localizedDescription) - return + #expect({ + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") + } + + @Test("Get non existing document. Should throw notFound") + func get_non_existing_document() async throws { + let error = await #expect(throws: CouchDBClientError.self) { + let _: ExpectedDoc = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") } - XCTFail("Expected not found error") + #expect({ + switch error { + case .notFound(_): return true + default: return false + } + }(), "Expected CouchDBClientError.notFound") } - func test15_update_document_conflict() async throws { + @Test("Update document without updating rev. Should throw conflict") + func update_document_conflict() async throws { let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") var insertedDoc: ExpectedDoc! - do { - insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) - XCTFail("Expected conflictError not thrown") - } catch CouchDBClientError.conflictError(error: let error) { - XCTAssertTrue(error.error == "conflict") - } catch { - XCTFail(error.localizedDescription) - } - do { - try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) - } catch { - XCTFail("Could not cleanup inserted document: \(error.localizedDescription)") - } + let error = await #expect(throws: CouchDBClientError.self) { + insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect({ + switch error { + case .conflictError(let error): + return error.error == "conflict" + default: return false + } + }(), "Expected CouchDBClientError.conflictError") + + _ = try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) } - func test16_delete_document_not_found() async throws { + @Test("Delete non existing document. Should throw deleteError") + func delete_non_existing_document() async throws { let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") - do { - _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) - XCTFail("Expected deleteError not thrown") - } catch CouchDBClientError.deleteError(let error) { - XCTAssertTrue(error.error == "not_found") - } catch { - XCTFail(error.localizedDescription) - } + + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) + } + + #expect({ + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") } - func test17_getAllDBs_with_eventLoopGroup() async throws { + @Test("Call getAllDBs providing an EventLoopGroup") + func getAllDBs_with_eventLoopGroup() async throws { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) - do { - let dbs = try await couchDBClient.getAllDBs(eventLoopGroup: group) - XCTAssertTrue(dbs.contains(testsDB)) - } catch { - XCTFail(error.localizedDescription) - } + let dbs = try await couchDBClient.getAllDBs(eventLoopGroup: group) - try await group.shutdownGracefully() + #expect(dbs.contains(testsDB)) + + try await group.shutdownGracefully() } - func test18_dbExists_with_eventLoopGroup() async throws { + @Test("Call dbExists providing an EventLoopGroup") + func dbExists_with_eventLoopGroup() async throws { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) - do { - let exists = try await couchDBClient.dbExists(testsDB, eventLoopGroup: group) - XCTAssertTrue(exists) - } catch { - XCTFail(error.localizedDescription) - } - try await group.shutdownGracefully() + #expect( + try await couchDBClient.dbExists(testsDB, eventLoopGroup: group) + ) + + try await group.shutdownGracefully() } - func test19_createDB_with_eventLoopGroup() async throws { + @Test("Calling createDB providing an EventLoopGroup") + func createDB_with_eventLoopGroup() async throws { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) let tempDB = "tempdb_for_eventloop" - defer { - } - do { - _ = try await couchDBClient.createDB(tempDB, eventLoopGroup: group) - let exists = try await couchDBClient.dbExists(tempDB) - XCTAssertTrue(exists) - } catch { - XCTFail(error.localizedDescription) - } + _ = try await couchDBClient.createDB(tempDB, eventLoopGroup: group) + + #expect( + try await couchDBClient.dbExists(tempDB) + ) - try await couchDBClient.deleteDB(tempDB) + try await couchDBClient.deleteDB(tempDB) try await group.shutdownGracefully() } + @Test("Calling deleteDB providing an EventLoopGroup") func test20_deleteDB_with_eventLoopGroup() async throws { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) let tempDB = "tempdb_for_eventloop_delete" - do { - _ = try await couchDBClient.createDB(tempDB) - _ = try await couchDBClient.deleteDB(tempDB, eventLoopGroup: group) - let exists = try await couchDBClient.dbExists(tempDB) - XCTAssertFalse(exists) - } catch { - XCTFail(error.localizedDescription) - } - try await group.shutdownGracefully() + _ = try await couchDBClient.createDB(tempDB) + _ = try await couchDBClient.deleteDB(tempDB, eventLoopGroup: group) + + #expect( + try await couchDBClient.dbExists(tempDB) == false + ) + + try await group.shutdownGracefully() } + @Test("Calling find with custom date decoding strategy") func test21_find_with_custom_date_decoding_strategy() async throws { let testDoc = ExpectedDoc(name: "DateTest") let insertEncodedData = try JSONEncoder().encode(testDoc) @@ -516,14 +376,14 @@ final class CouchDBClientTests: XCTestCase { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - let selector = ["selector": ["name": "DateTest"]] + let selector = ["selector": ["name": "DateTest"]] let docs: [ExpectedDoc] = try await couchDBClient.find( inDB: testsDB, selector: selector, dateDecodingStrategy: .iso8601 ) - XCTAssertTrue(docs.contains(where: { $0._id == insertResponse.id })) + #expect(docs.contains(where: { $0._id == insertResponse.id })) _ = try await couchDBClient.delete( fromDb: testsDB, @@ -532,11 +392,8 @@ final class CouchDBClientTests: XCTestCase { ) } - func test99_deleteDB() async throws { - do { - try await couchDBClient.deleteDB(testsDB) - } catch { - XCTFail(error.localizedDescription) - } + @Test("Cleanup: Delete Test Database") + func deleteDB() async throws { + try await couchDBClient.deleteDB(testsDB) } } From ee3a8f49f0bf6dc06ba112ba1909687b71da1e7f Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Thu, 10 Jul 2025 00:20:12 +0700 Subject: [PATCH 168/202] tabs --- .../CouchDBClientTests.swift | 139 +++++++++--------- 1 file changed, 72 insertions(+), 67 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index bbb9a91..b4ed3da 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -237,13 +237,14 @@ struct CouchDBClientTests { _ = try await couchDBClient.createDB(testsDB) } - #expect({ - switch error { - case .insertError(let error): - return error.error == "file_exists" || error.error == "conflict" - default: return false - } - }(), "Expected CouchDBClientError.insertError") + #expect( + { + switch error { + case .insertError(let error): + return error.error == "file_exists" || error.error == "conflict" + default: return false + } + }(), "Expected CouchDBClientError.insertError") } @@ -251,31 +252,33 @@ struct CouchDBClientTests { func delete_non_existing_DB() async throws { let nonExistentDB = "db_should_not_exist" - let error = await #expect(throws: CouchDBClientError.self) { - _ = try await couchDBClient.deleteDB(nonExistentDB) - } - - #expect({ - switch error { - case .deleteError(let error): - return error.error == "not_found" - default: return false - } - }(), "Expected CouchDBClientError.deleteError") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.deleteDB(nonExistentDB) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") } @Test("Get non existing document. Should throw notFound") func get_non_existing_document() async throws { - let error = await #expect(throws: CouchDBClientError.self) { - let _: ExpectedDoc = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") - } - - #expect({ - switch error { - case .notFound(_): return true - default: return false - } - }(), "Expected CouchDBClientError.notFound") + let error = await #expect(throws: CouchDBClientError.self) { + let _: ExpectedDoc = try await couchDBClient.get(fromDB: testsDB, uri: "aaaaa") + } + + #expect( + { + switch error { + case .notFound(_): return true + default: return false + } + }(), "Expected CouchDBClientError.notFound") } @Test("Update document without updating rev. Should throw conflict") @@ -283,18 +286,19 @@ struct CouchDBClientTests { let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") var insertedDoc: ExpectedDoc! - let error = await #expect(throws: CouchDBClientError.self) { - insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) - } + let error = await #expect(throws: CouchDBClientError.self) { + insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } - #expect({ - switch error { - case .conflictError(let error): - return error.error == "conflict" - default: return false - } - }(), "Expected CouchDBClientError.conflictError") + #expect( + { + switch error { + case .conflictError(let error): + return error.error == "conflict" + default: return false + } + }(), "Expected CouchDBClientError.conflictError") _ = try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) } @@ -303,17 +307,18 @@ struct CouchDBClientTests { func delete_non_existing_document() async throws { let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") - let error = await #expect(throws: CouchDBClientError.self) { - _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) - } - - #expect({ - switch error { - case .deleteError(let error): - return error.error == "not_found" - default: return false - } - }(), "Expected CouchDBClientError.deleteError") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") } @Test("Call getAllDBs providing an EventLoopGroup") @@ -321,20 +326,20 @@ struct CouchDBClientTests { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) let dbs = try await couchDBClient.getAllDBs(eventLoopGroup: group) - #expect(dbs.contains(testsDB)) + #expect(dbs.contains(testsDB)) - try await group.shutdownGracefully() + try await group.shutdownGracefully() } @Test("Call dbExists providing an EventLoopGroup") func dbExists_with_eventLoopGroup() async throws { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) - #expect( - try await couchDBClient.dbExists(testsDB, eventLoopGroup: group) - ) + #expect( + try await couchDBClient.dbExists(testsDB, eventLoopGroup: group) + ) - try await group.shutdownGracefully() + try await group.shutdownGracefully() } @Test("Calling createDB providing an EventLoopGroup") @@ -342,13 +347,13 @@ struct CouchDBClientTests { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) let tempDB = "tempdb_for_eventloop" - _ = try await couchDBClient.createDB(tempDB, eventLoopGroup: group) + _ = try await couchDBClient.createDB(tempDB, eventLoopGroup: group) - #expect( - try await couchDBClient.dbExists(tempDB) - ) + #expect( + try await couchDBClient.dbExists(tempDB) + ) - try await couchDBClient.deleteDB(tempDB) + try await couchDBClient.deleteDB(tempDB) try await group.shutdownGracefully() } @@ -357,14 +362,14 @@ struct CouchDBClientTests { let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) let tempDB = "tempdb_for_eventloop_delete" - _ = try await couchDBClient.createDB(tempDB) + _ = try await couchDBClient.createDB(tempDB) _ = try await couchDBClient.deleteDB(tempDB, eventLoopGroup: group) #expect( - try await couchDBClient.dbExists(tempDB) == false - ) + try await couchDBClient.dbExists(tempDB) == false + ) - try await group.shutdownGracefully() + try await group.shutdownGracefully() } @Test("Calling find with custom date decoding strategy") @@ -376,14 +381,14 @@ struct CouchDBClientTests { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - let selector = ["selector": ["name": "DateTest"]] + let selector = ["selector": ["name": "DateTest"]] let docs: [ExpectedDoc] = try await couchDBClient.find( inDB: testsDB, selector: selector, dateDecodingStrategy: .iso8601 ) - #expect(docs.contains(where: { $0._id == insertResponse.id })) + #expect(docs.contains(where: { $0._id == insertResponse.id })) _ = try await couchDBClient.delete( fromDb: testsDB, From 1c1f0dfd0685e8994a1600ac7557ea4d2395418d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 26 Jul 2025 23:02:41 +0700 Subject: [PATCH 169/202] Mango Query implementation --- Sources/CouchDBClient/CouchDBClient.swift | 244 +++++++++++++++++- .../Models/MangoExplainResponse.swift | 35 +++ Sources/CouchDBClient/Models/MangoIndex.swift | 78 ++++++ Sources/CouchDBClient/Models/MangoQuery.swift | 125 +++++++++ .../CouchDBClientTests.swift | 10 +- .../CouchDBClientTests/MangoQueryTests.swift | 82 ++++++ 6 files changed, 558 insertions(+), 16 deletions(-) create mode 100644 Sources/CouchDBClient/Models/MangoExplainResponse.swift create mode 100644 Sources/CouchDBClient/Models/MangoIndex.swift create mode 100644 Sources/CouchDBClient/Models/MangoQuery.swift create mode 100644 Tests/CouchDBClientTests/MangoQueryTests.swift diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 3b1968a..1b0f716 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -537,18 +537,18 @@ public actor CouchDBClient { let body = response.body let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 - if response.status == .notFound { - var bytes = try await body.collect(upTo: expectedBytes) - guard let data = bytes.readData(length: bytes.readableBytes) else { - throw CouchDBClientError.noData - } - - let decoder = JSONDecoder() - if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.notFound(error: couchdbError) - } - throw CouchDBClientError.unknownResponse - } + if response.status == .notFound { + var bytes = try await body.collect(upTo: expectedBytes) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.notFound(error: couchdbError) + } + throw CouchDBClientError.unknownResponse + } response.body = .bytes( try await body.collect(upTo: expectedBytes) @@ -671,6 +671,7 @@ public actor CouchDBClient { /// /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially for data decoding issues or query mismatches. + @available(*, deprecated, message: "Use find(inDB:query:) instead") public func find(inDB dbName: String, selector: Codable, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { let encoder = JSONEncoder() let selectorData = try encoder.encode(selector) @@ -704,6 +705,67 @@ public actor CouchDBClient { } } + /// Performs a query to find documents in a database on the CouchDB server that match the given selector. + /// + /// This asynchronous generic function sends a query to the CouchDB server to search for documents in a specific database + /// based on the criteria defined by the selector. The resulting documents are decoded into an array of the specified + /// `CouchDBRepresentable` type. It supports using a custom `EventLoopGroup` for network operations and allows the specification + /// of a custom date decoding strategy. + /// + /// - Parameters: + /// - dbName: The name of the database in which to perform the query. + /// - query: A `MangoQuery` object that defines the criteria for selecting documents. + /// - dateDecodingStrategy: The date decoding strategy to use for decoding dates within the documents. Defaults to `.secondsSince1970`. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// If not provided, the function defaults to using a shared instance of `HTTPClient`. + /// - Returns: An array of documents of type `T`, where `T` conforms to `CouchDBRepresentable`. + /// - Throws: A `CouchDBClientError` if the operation fails, including: `.noData` if the response lacks required data, `.findError` if decoding fails, with the underlying `CouchDBError`. + /// + /// ### Example Usage: + /// ```swift + /// let query = MangoQuery(selector: ["name": .string("Sam")]) + /// let documents: [MyDocumentType] = try await couchDBClient.find( + /// inDB: "myDatabase", + /// query: query + /// ) + /// print(documents) + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for data decoding issues or query mismatches. + public func find(inDB dbName: String, query: MangoQuery, dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .secondsSince1970, eventLoopGroup: EventLoopGroup? = nil) async throws -> [T] { + let encoder = JSONEncoder() + let queryData = try encoder.encode(query) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: queryData)) + + let findResponse = try await find( + inDB: dbName, + body: requestBody, + eventLoopGroup: eventLoopGroup + ) + + let body = findResponse.body + let expectedBytes = findResponse.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = dateDecodingStrategy + + do { + let doc = try decoder.decode(CouchDBFindResponse.self, from: data) + return doc.docs + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.findError(error: couchdbError) + } + throw parsingError + } + } + /// Executes a find query on a specified database on the CouchDB server. /// /// This asynchronous function sends a `POST` request with a custom body to the CouchDB server's `_find` endpoint to perform a query @@ -1280,6 +1342,164 @@ public actor CouchDBClient { return try await delete(fromDb: dbName, uri: doc._id, rev: rev, eventLoopGroup: eventLoopGroup) } + + /// Lists all Mango indexes in a specified database. + /// + /// - Parameters: + /// - dbName: The name of the database. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// - Returns: A `MangoIndexesResponse` containing the list of indexes. + /// - Throws: A `CouchDBClientError` if the operation fails. + public func listIndexes(inDB dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoIndexesResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + + let url = buildUrl(path: "/\(dbName)/_index") + let request = try buildRequest(fromUrl: url, withMethod: .GET) + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + do { + let indexesResponse = try decoder.decode(MangoIndexesResponse.self, from: data) + return indexesResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.getError(error: couchdbError) + } + throw parsingError + } + } + + /// Creates a new Mango index in a specified database. + /// + /// - Parameters: + /// - dbName: The name of the database. + /// - index: The `MangoIndex` to create. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// - Returns: A `CouchUpdateResponse` indicating the result of the operation. + /// - Throws: A `CouchDBClientError` if the operation fails. + public func createIndex(inDB dbName: String, index: MangoIndex, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + + let url = buildUrl(path: "/\(dbName)/_index") + let encoder = JSONEncoder() + let indexData = try encoder.encode(index) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: indexData)) + + var request = try buildRequest(fromUrl: url, withMethod: .POST) + request.body = requestBody + + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + do { + let updateResponse = try decoder.decode(CouchUpdateResponse.self, from: data) + return updateResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.insertError(error: couchdbError) + } + throw parsingError + } + } + + /// Explains a Mango query in a specified database. + /// + /// - Parameters: + /// - dbName: The name of the database. + /// - query: The `MangoQuery` to explain. + /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. + /// - Returns: A `MangoExplainResponse` containing the query execution plan. + /// - Throws: A `CouchDBClientError` if the operation fails. + public func explain(inDB dbName: String, query: MangoQuery, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoExplainResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + + let url = buildUrl(path: "/\(dbName)/_explain") + let encoder = JSONEncoder() + let queryData = try encoder.encode(query) + let requestBody: HTTPClientRequest.Body = .bytes(ByteBuffer(data: queryData)) + + var request = try buildRequest(fromUrl: url, withMethod: .POST) + request.body = requestBody + + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + + let decoder = JSONDecoder() + do { + let explainResponse = try decoder.decode(MangoExplainResponse.self, from: data) + return explainResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { + throw CouchDBClientError.getError(error: couchdbError) + } + throw parsingError + } + } } // MARK: - Private methods diff --git a/Sources/CouchDBClient/Models/MangoExplainResponse.swift b/Sources/CouchDBClient/Models/MangoExplainResponse.swift new file mode 100644 index 0000000..df46235 --- /dev/null +++ b/Sources/CouchDBClient/Models/MangoExplainResponse.swift @@ -0,0 +1,35 @@ +// +// MangoExplainResponse.swift +// +// +// Created by Sergey Armodin on 26.07.2025. +// + +import Foundation + +/// A struct representing the response from a Mango `_explain` request. +public struct MangoExplainResponse: Codable, Sendable { + /// The name of the database. + public let dbname: String + + /// The index that was used for the query. + public let index: MangoIndex + + /// The selector that was used for the query. + public let selector: [String: MangoValue] + + /// The options that were used for the query. + public let opts: [String: MangoValue] + + /// The limit that was used for the query. + public let limit: Int + + /// The number of results to skip. + public let skip: Int + + /// The fields to be returned in the result. + public let fields: [String] + + /// The range that was scanned. + public let range: [String: MangoValue] +} diff --git a/Sources/CouchDBClient/Models/MangoIndex.swift b/Sources/CouchDBClient/Models/MangoIndex.swift new file mode 100644 index 0000000..72fc8e6 --- /dev/null +++ b/Sources/CouchDBClient/Models/MangoIndex.swift @@ -0,0 +1,78 @@ +// +// MangoIndex.swift +// +// +// Created by Sergey Armodin on 26.07.2025. +// + +import Foundation + +/// A struct representing a Mango Index for CouchDB. +public struct MangoIndex: Codable, Sendable { + /// The design document where the index is stored. + public let ddoc: String + + /// The name of the index. + public let name: String + + /// The type of the index (e.g., "json"). + public let type: String + + /// The definition of the index. + public let def: IndexDefinition + + enum CodingKeys: String, CodingKey { + case ddoc + case name + case type + case def + } + + /// Initializes a new Mango Index. + /// - Parameters: + /// - ddoc: The design document for the index. + /// - name: The name of the index. + /// - type: The type of the index. + /// - def: The definition of the index. + public init( + ddoc: String, + name: String, + type: String, + def: IndexDefinition + ) { + self.ddoc = ddoc + self.name = name + self.type = type + self.def = def + } +} + +/// A struct representing the definition of a Mango Index. +public struct IndexDefinition: Codable, Sendable { + /// The fields to be indexed. + public let fields: [[String: String]] + + enum CodingKeys: String, CodingKey { + case fields + } + + /// Initializes a new Index Definition. + /// - Parameter fields: The fields to be indexed. + public init(fields: [[String: String]]) { + self.fields = fields + } +} + +/// A struct representing the response when listing indexes. +public struct MangoIndexesResponse: Codable, Sendable { + /// The total number of indexes. + public let totalRows: Int + + /// The array of indexes. + public let indexes: [MangoIndex] + + enum CodingKeys: String, CodingKey { + case totalRows = "total_rows" + case indexes + } +} diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift new file mode 100644 index 0000000..a85d5c1 --- /dev/null +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -0,0 +1,125 @@ +// +// MangoQuery.swift +// +// +// Created by Sergey Armodin on 26.07.2025. +// + +import Foundation + +/// A struct representing a Mango Query for CouchDB. +/// +/// Use this struct to build complex queries to retrieve documents from a CouchDB database. +/// +/// ### Example Usage: +/// ```swift +/// let query = MangoQuery( +/// selector: [ +/// "type": .string("user"), +/// "age": .dictionary(["$gt": .int(30)]) +/// ], +/// fields: ["name", "email"], +/// sort: [["name": "asc"]], +/// limit: 10, +/// skip: 0 +/// ) +/// ``` +public struct MangoQuery: Codable, Sendable { + /// The selector defines the criteria for selecting documents. + public let selector: [String: MangoValue] + + /// An array of field names to be returned in the result. + public let fields: [String]? + + /// An array of sort definitions. + public let sort: [[String: String]]? + + /// The maximum number of results to return. + public let limit: Int? + + /// The number of results to skip. + public let skip: Int? + + /// The name of the index to use for the query. + public let useIndex: String? + + enum CodingKeys: String, CodingKey { + case selector + case fields + case sort + case limit + case skip + case useIndex = "use_index" + } + + /// Initializes a new Mango Query. + /// - Parameters: + /// - selector: The selector to use for the query. + /// - fields: The fields to return in the result. + /// - sort: The sort order for the results. + /// - limit: The maximum number of results to return. + /// - skip: The number of results to skip. + /// - useIndex: The name of the index to use. + public init( + selector: [String: MangoValue], + fields: [String]? = nil, + sort: [[String: String]]? = nil, + limit: Int? = nil, + skip: Int? = nil, + useIndex: String? = nil + ) { + self.selector = selector + self.fields = fields + self.sort = sort + self.limit = limit + self.skip = skip + self.useIndex = useIndex + } +} + +/// An enum representing the possible values in a Mango query selector. +public enum MangoValue: Codable, Sendable { + case string(String) + case int(Int) + case double(Double) + case bool(Bool) + case array([MangoValue]) + case dictionary([String: MangoValue]) + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .string(let value): + try container.encode(value) + case .int(let value): + try container.encode(value) + case .double(let value): + try container.encode(value) + case .bool(let value): + try container.encode(value) + case .array(let value): + try container.encode(value) + case .dictionary(let value): + try container.encode(value) + } + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let value = try? container.decode(String.self) { + self = .string(value) + } else if let value = try? container.decode(Int.self) { + self = .int(value) + } else if let value = try? container.decode(Double.self) { + self = .double(value) + } else if let value = try? container.decode(Bool.self) { + self = .bool(value) + } else if let value = try? container.decode([MangoValue].self) { + self = .array(value) + } else if let value = try? container.decode([String: MangoValue].self) { + self = .dictionary(value) + } else { + throw DecodingError.typeMismatch(MangoValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoValue type")) + } + } +} diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index b4ed3da..b95e5e9 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -217,8 +217,9 @@ struct CouchDBClientTests { body: HTTPClientRequest.Body.bytes(ByteBuffer(data: insertEncodedData)) ) - let selector = ["selector": ["name": "Sam"]] - let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, selector: selector) + let selector: [String: MangoValue] = ["name": .string("Sam")] + let query = MangoQuery(selector: selector) + let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: testsDB, query: query) #expect(docs.count > 0) let id = try #require(docs.first?._id) @@ -381,10 +382,11 @@ struct CouchDBClientTests { body: .bytes(ByteBuffer(data: insertEncodedData)) ) - let selector = ["selector": ["name": "DateTest"]] + let selector: [String: MangoValue] = ["name": .string("DateTest")] + let query = MangoQuery(selector: selector) let docs: [ExpectedDoc] = try await couchDBClient.find( inDB: testsDB, - selector: selector, + query: query, dateDecodingStrategy: .iso8601 ) diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift new file mode 100644 index 0000000..969b392 --- /dev/null +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -0,0 +1,82 @@ +// +// MangoQueryTests.swift +// +// +// Created by Sergey Armodin on 26.07.2025. +// + +import Testing +@testable import CouchDBClient +import Foundation + +@Suite("Mango Query Tests") +struct MangoQueryTests { + @Test("MangoQuery encoding") + func testMangoQueryEncoding() throws { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) + ], + fields: ["name", "email"], + sort: [["name": "asc"]], + limit: 10, + skip: 0, + useIndex: "my-index" + ) + + let encoder = JSONEncoder() + let data = try encoder.encode(query) + + let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] + + #expect(json != nil) + + let selector = json?["selector"] as? [String: Any] + #expect(selector != nil) + #expect(selector?["type"] as? String == "user") + + let age = selector?["age"] as? [String: Any] + #expect(age != nil) + #expect(age?["$gt"] as? Int == 30) + + let fields = json?["fields"] as? [String] + #expect(fields != nil) + #expect(fields == ["name", "email"]) + + let sort = json?["sort"] as? [[String: String]] + #expect(sort != nil) + #expect(sort?.first?["name"] == "asc") + + #expect(json?["limit"] as? Int == 10) + #expect(json?["skip"] as? Int == 0) + #expect(json?["use_index"] as? String == "my-index") + } + + @Test("MangoIndex encoding") + func testMangoIndexEncoding() throws { + let index = MangoIndex( + ddoc: "my-ddoc", + name: "my-index", + type: "json", + def: IndexDefinition(fields: [["name": "asc"]]) + ) + + let encoder = JSONEncoder() + let data = try encoder.encode(index) + + let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] + + #expect(json != nil) + #expect(json?["ddoc"] as? String == "my-ddoc") + #expect(json?["name"] as? String == "my-index") + #expect(json?["type"] as? String == "json") + + let def = json?["def"] as? [String: Any] + #expect(def != nil) + + let fields = def?["fields"] as? [[String: String]] + #expect(fields != nil) + #expect(fields?.first?["name"] == "asc") + } +} \ No newline at end of file From c60d09c9aa5d274584b51d913ddd0af6b5c709f4 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 26 Jul 2025 23:18:46 +0700 Subject: [PATCH 170/202] more tests --- .../CouchDBClientTests.swift | 67 +++++++++++++++++++ .../CouchDBClientTests/MangoQueryTests.swift | 26 +++++++ 2 files changed, 93 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index b95e5e9..403bf49 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -403,4 +403,71 @@ struct CouchDBClientTests { func deleteDB() async throws { try await couchDBClient.deleteDB(testsDB) } + + @Test("Create DB with invalid name") + func createDB_invalidName() async throws { + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.createDB("INVALID_DB_NAME") + } + + #expect( + { + switch error { + case .insertError(let error): + return error.error == "illegal_database_name" + default: return false + } + }(), "Expected CouchDBClientError.insertError") + } + + @Test("Update non existing document") + func update_non_existing_document() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") + } + + @Test("Delete non existing document with doc") + func delete_non_existing_document_with_doc() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") + } + + @Test("Update document with missing rev") + func update_document_with_missing_rev() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: nil) + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .revMissing: + return true + default: return false + } + }(), "Expected CouchDBClientError.revMissing") + } } diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift index 969b392..77bcdab 100644 --- a/Tests/CouchDBClientTests/MangoQueryTests.swift +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -79,4 +79,30 @@ struct MangoQueryTests { #expect(fields != nil) #expect(fields?.first?["name"] == "asc") } + + @Test("MangoValue decoding") + func testMangoValueDecoding() throws { + let json = """ + { + "stringValue": "hello", + "intValue": 42, + "doubleValue": 3.14, + "boolValue": true, + "arrayValue": [1, "two", true], + "dictionaryValue": { + "nestedString": "world" + } + } + """.data(using: .utf8)! + + let decoder = JSONDecoder() + let dictionary = try decoder.decode([String: MangoValue].self, from: json) + + #expect(dictionary["stringValue"] != nil) + #expect(dictionary["intValue"] != nil) + #expect(dictionary["doubleValue"] != nil) + #expect(dictionary["boolValue"] != nil) + #expect(dictionary["arrayValue"] != nil) + #expect(dictionary["dictionaryValue"] != nil) + } } \ No newline at end of file From 50d36212ab24df3c513f893441c6595b6ded16ce Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sat, 26 Jul 2025 23:28:21 +0700 Subject: [PATCH 171/202] tests updated --- .../CouchDBClientTests.swift | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 403bf49..fdd7d4c 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -399,11 +399,6 @@ struct CouchDBClientTests { ) } - @Test("Cleanup: Delete Test Database") - func deleteDB() async throws { - try await couchDBClient.deleteDB(testsDB) - } - @Test("Create DB with invalid name") func createDB_invalidName() async throws { let error = await #expect(throws: CouchDBClientError.self) { @@ -420,23 +415,6 @@ struct CouchDBClientTests { }(), "Expected CouchDBClientError.insertError") } - @Test("Update non existing document") - func update_non_existing_document() async throws { - let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") - let error = await #expect(throws: CouchDBClientError.self) { - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) - } - - #expect( - { - switch error { - case .deleteError(let error): - return error.error == "not_found" - default: return false - } - }(), "Expected CouchDBClientError.deleteError") - } - @Test("Delete non existing document with doc") func delete_non_existing_document_with_doc() async throws { let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") @@ -470,4 +448,26 @@ struct CouchDBClientTests { } }(), "Expected CouchDBClientError.revMissing") } + + @Test("Cleanup: Delete Test Database") + func deleteDB() async throws { + try await couchDBClient.deleteDB(testsDB) + } + + @Test("Update non existing document") + func update_non_existing_document() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") + } } From 9c20d2c40fe84c26f44f6f3aef42617598fec18b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 00:04:40 +0700 Subject: [PATCH 172/202] wip --- .../CouchDBClientTests.swift | 99 +++++++++++-------- 1 file changed, 57 insertions(+), 42 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index fdd7d4c..fc246c1 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -282,27 +282,27 @@ struct CouchDBClientTests { }(), "Expected CouchDBClientError.notFound") } - @Test("Update document without updating rev. Should throw conflict") - func update_document_conflict() async throws { - let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") - var insertedDoc: ExpectedDoc! - - let error = await #expect(throws: CouchDBClientError.self) { - insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) - } - - #expect( - { - switch error { - case .conflictError(let error): - return error.error == "conflict" - default: return false - } - }(), "Expected CouchDBClientError.conflictError") - - _ = try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) - } +// @Test("Update document without updating rev. Should throw conflict") +// func update_document_conflict() async throws { +// let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") +// var insertedDoc: ExpectedDoc! +// +// let error = await #expect(throws: CouchDBClientError.self) { +// insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) +// _ = try await couchDBClient.update(dbName: testsDB, doc: doc) +// } +// +// #expect( +// { +// switch error { +// case .conflictError(let error): +// return error.error == "conflict" +// default: return false +// } +// }(), "Expected CouchDBClientError.conflictError") +// +// _ = try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) +// } @Test("Delete non existing document. Should throw deleteError") func delete_non_existing_document() async throws { @@ -449,25 +449,40 @@ struct CouchDBClientTests { }(), "Expected CouchDBClientError.revMissing") } - @Test("Cleanup: Delete Test Database") - func deleteDB() async throws { - try await couchDBClient.deleteDB(testsDB) - } - - @Test("Update non existing document") - func update_non_existing_document() async throws { - let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") - let error = await #expect(throws: CouchDBClientError.self) { - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) - } - - #expect( - { - switch error { - case .deleteError(let error): - return error.error == "not_found" - default: return false - } - }(), "Expected CouchDBClientError.deleteError") - } + @Test("List indexes") + func list_indexes() async throws { + let index = MangoIndex( + ddoc: "test-ddoc", + name: "test-index", + type: "json", + def: .init(fields: [["name": "asc"]]) + ) + + _ = try await couchDBClient.createIndex(inDB: testsDB, index: index) + + let indexesResponse = try await couchDBClient.listIndexes(inDB: testsDB) + #expect(indexesResponse.indexes.contains(where: { $0.name == "test-index" })) + } + + @Test("Cleanup: Delete Test Database") + func deleteDB() async throws { + try await couchDBClient.deleteDB(testsDB) + } + + @Test("Update non existing document") + func update_non_existing_document() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") + let error = await #expect(throws: CouchDBClientError.self) { + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .deleteError(let error): + return error.error == "not_found" + default: return false + } + }(), "Expected CouchDBClientError.deleteError") + } } From 9627dfec9bfa2a354eadd4f33ff4fa13cf478d3b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 00:25:15 +0700 Subject: [PATCH 173/202] wip --- Sources/CouchDBClient/CouchDBClient.swift | 6 +- .../Models/MangoExplainResponse.swift | 48 ++--- Sources/CouchDBClient/Models/MangoIndex.swift | 152 ++++++++------ .../CouchDBClientTests.swift | 14 +- .../CouchDBClientTests/MangoQueryTests.swift | 192 +++++++++--------- 5 files changed, 223 insertions(+), 189 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 1b0f716..cc17f16 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1399,7 +1399,7 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. /// - Returns: A `CouchUpdateResponse` indicating the result of the operation. /// - Throws: A `CouchDBClientError` if the operation fails. - public func createIndex(inDB dbName: String, index: MangoIndex, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + public func createIndex(inDB dbName: String, index: MangoIndex, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoCreateIndexResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) @@ -1436,8 +1436,8 @@ public actor CouchDBClient { let decoder = JSONDecoder() do { - let updateResponse = try decoder.decode(CouchUpdateResponse.self, from: data) - return updateResponse + let createIndexResponse = try decoder.decode(MangoCreateIndexResponse.self, from: data) + return createIndexResponse } catch let parsingError { if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { throw CouchDBClientError.insertError(error: couchdbError) diff --git a/Sources/CouchDBClient/Models/MangoExplainResponse.swift b/Sources/CouchDBClient/Models/MangoExplainResponse.swift index df46235..2bf2500 100644 --- a/Sources/CouchDBClient/Models/MangoExplainResponse.swift +++ b/Sources/CouchDBClient/Models/MangoExplainResponse.swift @@ -1,6 +1,6 @@ // // MangoExplainResponse.swift -// +// // // Created by Sergey Armodin on 26.07.2025. // @@ -9,27 +9,27 @@ import Foundation /// A struct representing the response from a Mango `_explain` request. public struct MangoExplainResponse: Codable, Sendable { - /// The name of the database. - public let dbname: String - - /// The index that was used for the query. - public let index: MangoIndex - - /// The selector that was used for the query. - public let selector: [String: MangoValue] - - /// The options that were used for the query. - public let opts: [String: MangoValue] - - /// The limit that was used for the query. - public let limit: Int - - /// The number of results to skip. - public let skip: Int - - /// The fields to be returned in the result. - public let fields: [String] - - /// The range that was scanned. - public let range: [String: MangoValue] + /// The name of the database. + public let dbname: String + + /// The index that was used for the query. + public let index: MangoIndex + + /// The selector that was used for the query. + public let selector: [String: MangoValue] + + /// The options that were used for the query. + public let opts: [String: MangoValue] + + /// The limit that was used for the query. + public let limit: Int + + /// The number of results to skip. + public let skip: Int + + /// The fields to be returned in the result. + public let fields: [String] + + /// The range that was scanned. + public let range: [String: MangoValue] } diff --git a/Sources/CouchDBClient/Models/MangoIndex.swift b/Sources/CouchDBClient/Models/MangoIndex.swift index 72fc8e6..9ebc9e1 100644 --- a/Sources/CouchDBClient/Models/MangoIndex.swift +++ b/Sources/CouchDBClient/Models/MangoIndex.swift @@ -1,6 +1,6 @@ // // MangoIndex.swift -// +// // // Created by Sergey Armodin on 26.07.2025. // @@ -9,70 +9,104 @@ import Foundation /// A struct representing a Mango Index for CouchDB. public struct MangoIndex: Codable, Sendable { - /// The design document where the index is stored. - public let ddoc: String - - /// The name of the index. - public let name: String - - /// The type of the index (e.g., "json"). - public let type: String - - /// The definition of the index. - public let def: IndexDefinition - - enum CodingKeys: String, CodingKey { - case ddoc - case name - case type - case def - } - - /// Initializes a new Mango Index. - /// - Parameters: - /// - ddoc: The design document for the index. - /// - name: The name of the index. - /// - type: The type of the index. - /// - def: The definition of the index. - public init( - ddoc: String, - name: String, - type: String, - def: IndexDefinition - ) { - self.ddoc = ddoc - self.name = name - self.type = type - self.def = def - } + /// The design document where the index is stored. + public let ddoc: String? + + /// The name of the index. + public let name: String + + /// The type of the index (e.g., "json"). + public let type: String + + /// The definition of the index. + public let def: IndexDefinition + + enum CodingKeys: String, CodingKey { + case ddoc + case name + case type + case def + case index + } + + /// Initializes a new Mango Index. + /// - Parameters: + /// - ddoc: The design document for the index. + /// - name: The name of the index. + /// - type: The type of the index. + /// - def: The definition of the index. + public init( + ddoc: String, + name: String, + type: String, + def: IndexDefinition + ) { + self.ddoc = ddoc + self.name = name + self.type = type + self.def = def + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + // CouchDB can return null for ddoc, so decodeIfPresent and allow nil + self.ddoc = try container.decodeIfPresent(String.self, forKey: .ddoc) + self.name = try container.decode(String.self, forKey: .name) + self.type = try container.decode(String.self, forKey: .type) + // For decoding, try 'def' first, then fallback to 'index' + if let def = try? container.decode(IndexDefinition.self, forKey: .def) { + self.def = def + } else { + self.def = try container.decode(IndexDefinition.self, forKey: .index) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(ddoc, forKey: .ddoc) + try container.encode(name, forKey: .name) + try container.encode(type, forKey: .type) + // For encoding, use 'index' key + try container.encode(def, forKey: .index) + } } /// A struct representing the definition of a Mango Index. public struct IndexDefinition: Codable, Sendable { - /// The fields to be indexed. - public let fields: [[String: String]] - - enum CodingKeys: String, CodingKey { - case fields - } - - /// Initializes a new Index Definition. - /// - Parameter fields: The fields to be indexed. - public init(fields: [[String: String]]) { - self.fields = fields - } + /// The fields to be indexed. + public let fields: [[String: String]] + + enum CodingKeys: String, CodingKey { + case fields + } + + /// Initializes a new Index Definition. + /// - Parameter fields: The fields to be indexed. + public init(fields: [[String: String]]) { + self.fields = fields + } } /// A struct representing the response when listing indexes. public struct MangoIndexesResponse: Codable, Sendable { - /// The total number of indexes. - public let totalRows: Int - - /// The array of indexes. - public let indexes: [MangoIndex] - - enum CodingKeys: String, CodingKey { - case totalRows = "total_rows" - case indexes - } + /// The total number of indexes. + public let totalRows: Int + + /// The array of indexes. + public let indexes: [MangoIndex] + + enum CodingKeys: String, CodingKey { + case totalRows = "total_rows" + case indexes + } +} + +/// A struct representing the response from CouchDB when creating a Mango index. +public struct MangoCreateIndexResponse: Codable, Sendable { + /// Indicates whether the operation was successful. + public let result: String // e.g., "created" or "exists" + /// The name of the index. + public let name: String? + /// The design document where the index is stored. + public let id: String? } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index fc246c1..7e76dbd 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -451,13 +451,13 @@ struct CouchDBClientTests { @Test("List indexes") func list_indexes() async throws { - let index = MangoIndex( - ddoc: "test-ddoc", - name: "test-index", - type: "json", - def: .init(fields: [["name": "asc"]]) - ) - + let indexDef = IndexDefinition(fields: [["name": "asc"]]) + let index = MangoIndex( + ddoc: "test-ddoc", + name: "test-index", + type: "json", + def: indexDef + ) _ = try await couchDBClient.createIndex(inDB: testsDB, index: index) let indexesResponse = try await couchDBClient.listIndexes(inDB: testsDB) diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift index 77bcdab..65f354d 100644 --- a/Tests/CouchDBClientTests/MangoQueryTests.swift +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -1,6 +1,6 @@ // // MangoQueryTests.swift -// +// // // Created by Sergey Armodin on 26.07.2025. // @@ -11,98 +11,98 @@ import Foundation @Suite("Mango Query Tests") struct MangoQueryTests { - @Test("MangoQuery encoding") - func testMangoQueryEncoding() throws { - let query = MangoQuery( - selector: [ - "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) - ], - fields: ["name", "email"], - sort: [["name": "asc"]], - limit: 10, - skip: 0, - useIndex: "my-index" - ) - - let encoder = JSONEncoder() - let data = try encoder.encode(query) - - let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] - - #expect(json != nil) - - let selector = json?["selector"] as? [String: Any] - #expect(selector != nil) - #expect(selector?["type"] as? String == "user") - - let age = selector?["age"] as? [String: Any] - #expect(age != nil) - #expect(age?["$gt"] as? Int == 30) - - let fields = json?["fields"] as? [String] - #expect(fields != nil) - #expect(fields == ["name", "email"]) - - let sort = json?["sort"] as? [[String: String]] - #expect(sort != nil) - #expect(sort?.first?["name"] == "asc") - - #expect(json?["limit"] as? Int == 10) - #expect(json?["skip"] as? Int == 0) - #expect(json?["use_index"] as? String == "my-index") - } - - @Test("MangoIndex encoding") - func testMangoIndexEncoding() throws { - let index = MangoIndex( - ddoc: "my-ddoc", - name: "my-index", - type: "json", - def: IndexDefinition(fields: [["name": "asc"]]) - ) - - let encoder = JSONEncoder() - let data = try encoder.encode(index) - - let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] - - #expect(json != nil) - #expect(json?["ddoc"] as? String == "my-ddoc") - #expect(json?["name"] as? String == "my-index") - #expect(json?["type"] as? String == "json") - - let def = json?["def"] as? [String: Any] - #expect(def != nil) - - let fields = def?["fields"] as? [[String: String]] - #expect(fields != nil) - #expect(fields?.first?["name"] == "asc") - } - - @Test("MangoValue decoding") - func testMangoValueDecoding() throws { - let json = """ - { - "stringValue": "hello", - "intValue": 42, - "doubleValue": 3.14, - "boolValue": true, - "arrayValue": [1, "two", true], - "dictionaryValue": { - "nestedString": "world" - } - } - """.data(using: .utf8)! - - let decoder = JSONDecoder() - let dictionary = try decoder.decode([String: MangoValue].self, from: json) - - #expect(dictionary["stringValue"] != nil) - #expect(dictionary["intValue"] != nil) - #expect(dictionary["doubleValue"] != nil) - #expect(dictionary["boolValue"] != nil) - #expect(dictionary["arrayValue"] != nil) - #expect(dictionary["dictionaryValue"] != nil) - } -} \ No newline at end of file + @Test("MangoQuery encoding") + func testMangoQueryEncoding() throws { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) + ], + fields: ["name", "email"], + sort: [["name": "asc"]], + limit: 10, + skip: 0, + useIndex: "my-index" + ) + + let encoder = JSONEncoder() + let data = try encoder.encode(query) + + let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] + + #expect(json != nil) + + let selector = json?["selector"] as? [String: Any] + #expect(selector != nil) + #expect(selector?["type"] as? String == "user") + + let age = selector?["age"] as? [String: Any] + #expect(age != nil) + #expect(age?["$gt"] as? Int == 30) + + let fields = json?["fields"] as? [String] + #expect(fields != nil) + #expect(fields == ["name", "email"]) + + let sort = json?["sort"] as? [[String: String]] + #expect(sort != nil) + #expect(sort?.first?["name"] == "asc") + + #expect(json?["limit"] as? Int == 10) + #expect(json?["skip"] as? Int == 0) + #expect(json?["use_index"] as? String == "my-index") + } + + @Test("MangoIndex encoding") + func testMangoIndexEncoding() throws { + let index = MangoIndex( + ddoc: "my-ddoc", + name: "my-index", + type: "json", + def: IndexDefinition(fields: [["name": "asc"]]) + ) + + let encoder = JSONEncoder() + let data = try encoder.encode(index) + + let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] + + #expect(json != nil) + #expect(json?["ddoc"] as? String == "my-ddoc") + #expect(json?["name"] as? String == "my-index") + #expect(json?["type"] as? String == "json") + + let indexObj = json?["index"] as? [String: Any] + #expect(indexObj != nil) + + let fields = indexObj?["fields"] as? [[String: String]] + #expect(fields != nil) + #expect(fields?.first?["name"] == "asc") + } + + @Test("MangoValue decoding") + func testMangoValueDecoding() throws { + let json = """ + { + "stringValue": "hello", + "intValue": 42, + "doubleValue": 3.14, + "boolValue": true, + "arrayValue": [1, "two", true], + "dictionaryValue": { + "nestedString": "world" + } + } + """.data(using: .utf8)! + + let decoder = JSONDecoder() + let dictionary = try decoder.decode([String: MangoValue].self, from: json) + + #expect(dictionary["stringValue"] != nil) + #expect(dictionary["intValue"] != nil) + #expect(dictionary["doubleValue"] != nil) + #expect(dictionary["boolValue"] != nil) + #expect(dictionary["arrayValue"] != nil) + #expect(dictionary["dictionaryValue"] != nil) + } +} From aea0e4958c3511fe9daabe55297ea1a0356b8a3c Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 00:32:45 +0700 Subject: [PATCH 174/202] tests updated --- .../CouchDBClientTests.swift | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 7e76dbd..a5673da 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -282,27 +282,29 @@ struct CouchDBClientTests { }(), "Expected CouchDBClientError.notFound") } -// @Test("Update document without updating rev. Should throw conflict") -// func update_document_conflict() async throws { -// let doc = ExpectedDoc(name: "should not exist", _id: "nonexistent_doc_id", _rev: "1-abc") -// var insertedDoc: ExpectedDoc! -// -// let error = await #expect(throws: CouchDBClientError.self) { -// insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) -// _ = try await couchDBClient.update(dbName: testsDB, doc: doc) -// } -// -// #expect( -// { -// switch error { -// case .conflictError(let error): -// return error.error == "conflict" -// default: return false -// } -// }(), "Expected CouchDBClientError.conflictError") -// -// _ = try await couchDBClient.delete(fromDb: testsDB, doc: insertedDoc) -// } + @Test("Update document without updating rev. Should throw conflict") + func update_document_conflict() async throws { + let doc = ExpectedDoc(name: "should not exist", _id: Foundation.UUID().uuidString, _rev: "1-abc") + var insertedDoc: ExpectedDoc? = nil + + let error = await #expect(throws: CouchDBClientError.self) { + insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) + _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + } + + #expect( + { + switch error { + case .conflictError(let error): + return error.error == "conflict" + default: return false + } + }(), "Expected CouchDBClientError.conflictError") + + if let docToDelete = insertedDoc { + _ = try await couchDBClient.delete(fromDb: testsDB, doc: docToDelete) + } + } @Test("Delete non existing document. Should throw deleteError") func delete_non_existing_document() async throws { From 4d425e5cfbfaf8f83a2df5451044afabba60ed13 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 00:48:41 +0700 Subject: [PATCH 175/202] more tests and fixes --- .../Models/MangoExplainResponse.swift | 2 +- .../CouchDBClientTests.swift | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/Models/MangoExplainResponse.swift b/Sources/CouchDBClient/Models/MangoExplainResponse.swift index 2bf2500..93d6519 100644 --- a/Sources/CouchDBClient/Models/MangoExplainResponse.swift +++ b/Sources/CouchDBClient/Models/MangoExplainResponse.swift @@ -31,5 +31,5 @@ public struct MangoExplainResponse: Codable, Sendable { public let fields: [String] /// The range that was scanned. - public let range: [String: MangoValue] + public let range: [String: MangoValue]? } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index a5673da..325f83b 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -451,6 +451,48 @@ struct CouchDBClientTests { }(), "Expected CouchDBClientError.revMissing") } + @Test("Create Mango index and verify response") + func test_createIndex() async throws { + let indexDef = IndexDefinition(fields: [["name": "asc"]]) + let index = MangoIndex( + ddoc: "test-ddoc-create", + name: "test-index-create", + type: "json", + def: indexDef + ) + let response = try await couchDBClient.createIndex(inDB: testsDB, index: index) + #expect(response.result == "created" || response.result == "exists") + #expect(response.id != nil) + } + + @Test("Explain Mango query and verify response") + func test_explainQuery() async throws { + // Ensure an index exists for 'name' so explain returns fields + let indexDef = IndexDefinition(fields: [["name": "asc"]]) + let index = MangoIndex( + ddoc: "test-ddoc-explain", + name: "test-index-explain", + type: "json", + def: indexDef + ) + _ = try await couchDBClient.createIndex(inDB: testsDB, index: index) + + // Insert multiple documents with the 'name' field so CouchDB recognizes the index + let names = ["Sam", "Alex", "Jordan", "Taylor", "Morgan"] + for name in names { + let doc = ExpectedDoc(name: name) + _ = try await couchDBClient.insert(dbName: testsDB, doc: doc) + } + + let selector: [String: MangoValue] = ["name": .string("Sam")] + let query = MangoQuery(selector: selector, fields: ["name"]) + let explainResponse = try await couchDBClient.explain(inDB: testsDB, query: query) + + #expect(!explainResponse.fields.isEmpty) + #expect(explainResponse.fields.contains("name")) + #expect(explainResponse.dbname == testsDB) + } + @Test("List indexes") func list_indexes() async throws { let indexDef = IndexDefinition(fields: [["name": "asc"]]) From 9cfe9fe3b746dcda342837832dbda1a154f3b5d1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 00:59:39 +0700 Subject: [PATCH 176/202] docs --- Sources/CouchDBClient/CouchDBClient.swift | 40 +++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index cc17f16..c9f29b4 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -807,7 +807,6 @@ public actor CouchDBClient { /// /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. /// Handle thrown errors appropriately, especially authentication-related issues. - public func find(inDB dbName: String, body: HTTPClientRequest.Body, eventLoopGroup: EventLoopGroup? = nil) async throws -> HTTPClientResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -1336,7 +1335,6 @@ public actor CouchDBClient { /// /// - Note: Ensure that the CouchDB server is operational and accessible before using this function. /// Handle thrown errors appropriately, especially for missing document properties or unexpected server responses. - public func delete(fromDb dbName: String, doc: CouchDBRepresentable, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { guard let rev = doc._rev else { throw CouchDBClientError.revMissing } @@ -1350,6 +1348,13 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. /// - Returns: A `MangoIndexesResponse` containing the list of indexes. /// - Throws: A `CouchDBClientError` if the operation fails. + /// + /// ### Example Usage: + /// ```swift + /// // List all Mango indexes in a database + /// let indexesResponse = try await couchDBClient.listIndexes(inDB: "myDatabase") + /// print(indexesResponse.indexes) + /// ``` public func listIndexes(inDB dbName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoIndexesResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -1397,8 +1402,24 @@ public actor CouchDBClient { /// - dbName: The name of the database. /// - index: The `MangoIndex` to create. /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. - /// - Returns: A `CouchUpdateResponse` indicating the result of the operation. + /// - Returns: A `MangoCreateIndexResponse` indicating the result of the operation. /// - Throws: A `CouchDBClientError` if the operation fails. + /// + /// ### Example Usage: + /// ```swift + /// // Define a Mango index + /// let index = MangoIndex( + /// fields: ["name"], + /// name: "name-index", + /// type: "json" + /// ) + /// // Create the index in the database + /// let response = try await couchDBClient.createIndex(inDB: "myDatabase", index: index) + /// print(response.result) // Should print "created" or "exists" + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for index creation conflicts or server issues. public func createIndex(inDB dbName: String, index: MangoIndex, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoCreateIndexResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) @@ -1454,6 +1475,19 @@ public actor CouchDBClient { /// - eventLoopGroup: An optional `EventLoopGroup` for executing network operations. /// - Returns: A `MangoExplainResponse` containing the query execution plan. /// - Throws: A `CouchDBClientError` if the operation fails. + /// + /// ### Example Usage: + /// ```swift + /// // Define a Mango query + /// let query = MangoQuery(selector: ["name": .string("Sam")]) + /// // Explain the query execution plan + /// let explainResponse = try await couchDBClient.explain(inDB: "myDatabase", query: query) + /// print(explainResponse.index) // Shows which index will be used + /// print(explainResponse.selector) // Shows the query selector + /// ``` + /// + /// - Note: Ensure that the CouchDB server is running and accessible before calling this function. + /// Handle thrown errors appropriately, especially for query or index issues. public func explain(inDB dbName: String, query: MangoQuery, eventLoopGroup: EventLoopGroup? = nil) async throws -> MangoExplainResponse { try await authIfNeed(eventLoopGroup: eventLoopGroup) From 97feb38e6dc7b0acf7225b696bd262bf646e3280 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 01:50:32 +0700 Subject: [PATCH 177/202] new tutorial --- .../AdvancedMangoQueries-1.swift | 5 +++ .../AdvancedMangoQueries-2.swift | 8 ++++ .../AdvancedMangoQueries-3.swift | 9 +++++ .../AdvancedMangoQueries-4.swift | 10 +++++ .../AdvancedMangoQueries-5.swift | 22 ++++++++++ .../AdvancedMangoQueries.tutorial | 40 +++++++++++++++++++ .../Tutorial Table of Contents.tutorial | 8 ++++ 7 files changed, 102 insertions(+) create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift new file mode 100644 index 0000000..d7a4d6e --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift @@ -0,0 +1,5 @@ +// Advanced Mango Queries Step 1: Building Selectors +let selector: [String: MangoValue] = [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) +] diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift new file mode 100644 index 0000000..0a35fd6 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift @@ -0,0 +1,8 @@ +// Advanced Mango Queries Step 2: Sorting, Limit, and Skip +let selector: [String: MangoValue] = [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) +] +let sort: [[String: String]] = [["name": "asc"]] +let limit = 10 +let skip = 0 diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift new file mode 100644 index 0000000..31d3bda --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift @@ -0,0 +1,9 @@ +// Advanced Mango Queries Step 3: Projections (Fields) +let selector: [String: MangoValue] = [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) +] +let sort: [[String: String]] = [["name": "asc"]] +let limit = 10 +let skip = 0 +let fields = ["name", "email"] diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift new file mode 100644 index 0000000..dda4ae9 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift @@ -0,0 +1,10 @@ +// Advanced Mango Queries Step 4: Index Usage +let selector: [String: MangoValue] = [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) +] +let sort: [[String: String]] = [["name": "asc"]] +let limit = 10 +let skip = 0 +let fields = ["name", "email"] +let useIndex = "my-index" diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift new file mode 100644 index 0000000..5f67d6b --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift @@ -0,0 +1,22 @@ +// Advanced Mango Queries Step 5: Executing the Query +struct User: Codable { + let name: String + let email: String +} + +Task { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .dictionary(["$gt": .int(30)]) + ], + fields: ["name", "email"], + sort: [["name": "asc"]], + limit: 10, + skip: 0, + useIndex: "my-index" + ) + + let result: CouchDBFindResponse = try await couchDBClient.find(dbName: dbName, query: query) + print(result.docs) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial new file mode 100644 index 0000000..65823ce --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial @@ -0,0 +1,40 @@ +@Tutorial(time: 5) { + @Intro(title: "Advanced Mango Queries") { + Learn how to build complex selectors, use sorting, pagination, projections, and optimize queries with indexes in CouchDB. + + @Image(source: logo.svg, alt: "Advanced Mango Queries illustration") + } + + @Section(title: "Building Selectors and Queries1") { + @ContentAndMedia { + Advanced Mango queries allow you to filter, sort, and project CouchDB documents using expressive selectors and indexes. The following steps will guide you through building selectors, adding sort/limit/skip, using fields for projections, and optimizing queries with indexes. + } + + @Steps { + @Step { + Use nested dictionaries and operators for selectors ([CouchDB Mango Query Docs](https://docs.couchdb.org/en/stable/api/database/find.html)). + @Code(name: "main.swift", file: AdvancedMangoQueries-1.swift) + } + + @Step { + Add sort, limit, and skip for pagination. + @Code(name: "main.swift", file: AdvancedMangoQueries-2.swift) + } + + @Step { + Use fields for projections. + @Code(name: "main.swift", file: AdvancedMangoQueries-3.swift) + } + + @Step { + Create indexes for query optimization ([CouchDB Indexes](https://docs.couchdb.org/en/stable/api/database/find.html#db-index)). + @Code(name: "main.swift", file: AdvancedMangoQueries-4.swift) + } + + @Step { + Execute the Mango query using CouchDBClient's `find` method to retrieve results from the database. + @Code(name: "main.swift", file: AdvancedMangoQueries-5.swift) + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index f97e13d..9347450 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -23,4 +23,12 @@ @TutorialReference(tutorial: "doc:ErrorsHandlingTutorial") } + + @Chapter(name: "Advanced Mango Queries") { + Learn how to build complex selectors, use sorting, pagination, projections, and optimize queries with indexes in CouchDB. + + @Image(source: logo.svg, alt: "Advanced Mango Queries illustration") + + @TutorialReference(tutorial: "doc:AdvancedMangoQueries") + } } From e92b6882c2a3161dc0a776d7faf7fbf76c76c2f3 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 01:58:21 +0700 Subject: [PATCH 178/202] New tutorial --- .../AdvancedMangoQueries.tutorial | 4 +-- .../CreateIndexTutorial-1.swift | 2 ++ .../CreateIndexTutorial-2.swift | 3 +++ .../CreateIndexTutorial-3.swift | 8 ++++++ .../CreateIndexTutorial.tutorial | 25 +++++++++++++++++++ .../Tutorial Table of Contents.tutorial | 1 + 6 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift create mode 100644 Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial.tutorial diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial index 65823ce..b6347da 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial @@ -27,10 +27,10 @@ } @Step { - Create indexes for query optimization ([CouchDB Indexes](https://docs.couchdb.org/en/stable/api/database/find.html#db-index)). + Create indexes for query optimization. @Code(name: "main.swift", file: AdvancedMangoQueries-4.swift) } - + @Step { Execute the Mango query using CouchDBClient's `find` method to retrieve results from the database. @Code(name: "main.swift", file: AdvancedMangoQueries-5.swift) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift new file mode 100644 index 0000000..f73116b --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift @@ -0,0 +1,2 @@ +// Step 1: Define the index fields +let indexFields = ["type", "age"] diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift new file mode 100644 index 0000000..1469fdb --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift @@ -0,0 +1,3 @@ +// Step 2: Create the MangoIndex object +let indexFields = ["type", "age"] +let mangoIndex = MangoIndex(fields: indexFields) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift new file mode 100644 index 0000000..27fcfcd --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift @@ -0,0 +1,8 @@ +// Step 3: Execute index creation +let indexFields = ["type", "age"] +let mangoIndex = MangoIndex(/* correct initializer here, e.g. fields: indexFields */) + +Task { + let response = try await couchDBClient.createIndex(dbName: dbName, index: mangoIndex) + print(response) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial.tutorial new file mode 100644 index 0000000..73a40c6 --- /dev/null +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial.tutorial @@ -0,0 +1,25 @@ +@Tutorial(time: 3) { + @Intro(title: "Creating a Mango Index") { + Learn how to create a Mango index in CouchDB to optimize query performance. + @Image(source: logo.svg, alt: "Create Index illustration") + } + @Section(title: "Creating an Index") { + @ContentAndMedia { + Creating an index involves defining the fields to index, constructing the MangoIndex object, and executing the index creation using CouchDBClient. + } + @Steps { + @Step { + Define the index fields. + @Code(name: "main.swift", file: CreateIndexTutorial-1.swift) + } + @Step { + Create the MangoIndex object. + @Code(name: "main.swift", file: CreateIndexTutorial-2.swift) + } + @Step { + Execute the index creation with CouchDBClient. + @Code(name: "main.swift", file: CreateIndexTutorial-3.swift) + } + } + } +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial index 9347450..61ecd0d 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/Tutorial Table of Contents.tutorial @@ -29,6 +29,7 @@ @Image(source: logo.svg, alt: "Advanced Mango Queries illustration") + @TutorialReference(tutorial: "doc:CreateIndexTutorial") @TutorialReference(tutorial: "doc:AdvancedMangoQueries") } } From c392db863286843cc516992fe91123bd875d2181 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 02:15:13 +0700 Subject: [PATCH 179/202] wip --- Sources/CouchDBClient/Models/MangoQuery.swift | 73 ++++++++++++++++++- .../CouchDBClientTests/MangoQueryTests.swift | 16 ++-- 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index a85d5c1..9814f71 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -16,7 +16,7 @@ import Foundation /// let query = MangoQuery( /// selector: [ /// "type": .string("user"), -/// "age": .dictionary(["$gt": .int(30)]) +/// "age": .comparison(.greaterThan(.int(30))) /// ], /// fields: ["name", "email"], /// sort: [["name": "asc"]], @@ -78,14 +78,16 @@ public struct MangoQuery: Codable, Sendable { } /// An enum representing the possible values in a Mango query selector. -public enum MangoValue: Codable, Sendable { +public indirect enum MangoValue: Codable, Sendable { case string(String) case int(Int) case double(Double) case bool(Bool) case array([MangoValue]) + case arrayOfDictionaries([[String: MangoValue]]) case dictionary([String: MangoValue]) - + case comparison(MangoComparison) + public func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { @@ -99,11 +101,15 @@ public enum MangoValue: Codable, Sendable { try container.encode(value) case .array(let value): try container.encode(value) + case .arrayOfDictionaries(let value): + try container.encode(value) case .dictionary(let value): try container.encode(value) + case .comparison(let cmp): + try container.encode(cmp) } } - + public init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let value = try? container.decode(String.self) { @@ -116,10 +122,69 @@ public enum MangoValue: Codable, Sendable { self = .bool(value) } else if let value = try? container.decode([MangoValue].self) { self = .array(value) + } else if let value = try? container.decode([[String: MangoValue]].self) { + self = .arrayOfDictionaries(value) } else if let value = try? container.decode([String: MangoValue].self) { self = .dictionary(value) + } else if let value = try? container.decode(MangoComparison.self) { + self = .comparison(value) } else { throw DecodingError.typeMismatch(MangoValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoValue type")) } } } + +public indirect enum MangoComparison: Codable, Sendable { + case equal(MangoValue) + case greaterThan(MangoValue) + case lessThan(MangoValue) + case greaterThanOrEqual(MangoValue) + case lessThanOrEqual(MangoValue) + case notEqual(MangoValue) + + enum CodingKeys: String, CodingKey { + case eq = "$eq" + case gt = "$gt" + case lt = "$lt" + case gte = "$gte" + case lte = "$lte" + case ne = "$ne" + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .equal(let value): + try container.encode(value, forKey: .eq) + case .greaterThan(let value): + try container.encode(value, forKey: .gt) + case .lessThan(let value): + try container.encode(value, forKey: .lt) + case .greaterThanOrEqual(let value): + try container.encode(value, forKey: .gte) + case .lessThanOrEqual(let value): + try container.encode(value, forKey: .lte) + case .notEqual(let value): + try container.encode(value, forKey: .ne) + } + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + if let value = try? container.decode(MangoValue.self, forKey: .eq) { + self = .equal(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .gt) { + self = .greaterThan(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .lt) { + self = .lessThan(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .gte) { + self = .greaterThanOrEqual(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .lte) { + self = .lessThanOrEqual(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .ne) { + self = .notEqual(value) + } else { + throw DecodingError.typeMismatch(MangoComparison.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoComparison type")) + } + } +} diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift index 65f354d..06a9783 100644 --- a/Tests/CouchDBClientTests/MangoQueryTests.swift +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -16,7 +16,7 @@ struct MangoQueryTests { let query = MangoQuery( selector: [ "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) + "age": .comparison(.greaterThan(.int(30))) ], fields: ["name", "email"], sort: [["name": "asc"]], @@ -84,14 +84,11 @@ struct MangoQueryTests { func testMangoValueDecoding() throws { let json = """ { - "stringValue": "hello", - "intValue": 42, - "doubleValue": 3.14, - "boolValue": true, - "arrayValue": [1, "two", true], - "dictionaryValue": { - "nestedString": "world" - } + "stringValue": "hello", + "intValue": 42, + "doubleValue": 3.14, + "boolValue": true, + "arrayValue": [1, "two", true] } """.data(using: .utf8)! @@ -103,6 +100,5 @@ struct MangoQueryTests { #expect(dictionary["doubleValue"] != nil) #expect(dictionary["boolValue"] != nil) #expect(dictionary["arrayValue"] != nil) - #expect(dictionary["dictionaryValue"] != nil) } } From c2c5b60161143642bc2dec1dc0e92ba602b4d82d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 02:21:54 +0700 Subject: [PATCH 180/202] wip --- README.md | 10 +++++++--- .../CouchDBClient/CouchDBClient.docc/CouchDBClient.md | 2 +- Sources/CouchDBClient/Models/MangoQuery.swift | 10 ++++++++-- Tests/CouchDBClientTests/MangoQueryTests.swift | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bcfa249..fc0a225 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # CouchDB Client for Swift

- +

@@ -144,8 +144,12 @@ print(dbs) ### Find Documents in a Database by Selector ```swift -let selector = ["selector": ["name": "Sam"]] -let docs: [ExpectedDoc] = try await couchDBClient.find(in: "databaseName", selector: selector) +let selector: [String: MangoValue] = [ + "type": .string("user"), + "age": .comparison(.greaterThan(.int(30))) +] +let query = MangoQuery(selector: selector, fields: ["name", "email"], sort: [["name": .asc]], limit: 10, skip: 0) +let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: "databaseName", query: query) print(docs) ``` diff --git a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md index 9613778..9086bb3 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md +++ b/Sources/CouchDBClient/CouchDBClient.docc/CouchDBClient.md @@ -31,7 +31,7 @@ Built on top of [AsyncHTTPClient](https://github.com/swift-server/async-http-cli - **Document Operations**: - Get a document by ID or retrieve documents using a view. - Insert or update documents. - - Find documents using a selector. + - Find documents using a MangoQuery and type-safe selectors (see MangoValue and MangoComparison). - Delete documents. - **Authorization**: diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index 9814f71..5ea40fa 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -32,7 +32,7 @@ public struct MangoQuery: Codable, Sendable { public let fields: [String]? /// An array of sort definitions. - public let sort: [[String: String]]? + public let sort: [[String: MangoSortDirection]]? /// The maximum number of results to return. public let limit: Int? @@ -63,7 +63,7 @@ public struct MangoQuery: Codable, Sendable { public init( selector: [String: MangoValue], fields: [String]? = nil, - sort: [[String: String]]? = nil, + sort: [[String: MangoSortDirection]]? = nil, limit: Int? = nil, skip: Int? = nil, useIndex: String? = nil @@ -77,6 +77,12 @@ public struct MangoQuery: Codable, Sendable { } } +/// An enum representing the sort direction in Mango queries. +public enum MangoSortDirection: String, Codable, Sendable { + case asc + case desc +} + /// An enum representing the possible values in a Mango query selector. public indirect enum MangoValue: Codable, Sendable { case string(String) diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift index 06a9783..e6bfcbf 100644 --- a/Tests/CouchDBClientTests/MangoQueryTests.swift +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -19,7 +19,7 @@ struct MangoQueryTests { "age": .comparison(.greaterThan(.int(30))) ], fields: ["name", "email"], - sort: [["name": "asc"]], + sort: [["name": .asc]], limit: 10, skip: 0, useIndex: "my-index" From a575cb100b7c2e0939fd1870fef6887fbbe2ca8b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 02:29:25 +0700 Subject: [PATCH 181/202] tutorials updated --- .../AdvancedMangoQueries-1.swift | 17 +++++++++--- .../AdvancedMangoQueries-2.swift | 23 +++++++++++----- .../AdvancedMangoQueries-3.swift | 25 +++++++++++------ .../AdvancedMangoQueries-4.swift | 27 ++++++++++++------- .../AdvancedMangoQueries-5.swift | 6 ++--- .../CreateIndexTutorial-1.swift | 2 +- .../CreateIndexTutorial-2.swift | 5 ++-- .../CreateIndexTutorial-3.swift | 9 ++++--- 8 files changed, 76 insertions(+), 38 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift index d7a4d6e..7883229 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-1.swift @@ -1,5 +1,14 @@ // Advanced Mango Queries Step 1: Building Selectors -let selector: [String: MangoValue] = [ - "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) -] +struct User: Codable { + let name: String + let email: String +} + +Task { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .comparison(.greaterThan(.int(30))) + ] + ) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift index 0a35fd6..cf22afd 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift @@ -1,8 +1,17 @@ // Advanced Mango Queries Step 2: Sorting, Limit, and Skip -let selector: [String: MangoValue] = [ - "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) -] -let sort: [[String: String]] = [["name": "asc"]] -let limit = 10 -let skip = 0 +struct User: Codable { + let name: String + let email: String +} + +Task { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .comparison(.greaterThan(.int(30))) + ], + sort: [["name": .asc]], + limit: 10, + skip: 0 + ) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift index 31d3bda..ad29512 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift @@ -1,9 +1,18 @@ // Advanced Mango Queries Step 3: Projections (Fields) -let selector: [String: MangoValue] = [ - "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) -] -let sort: [[String: String]] = [["name": "asc"]] -let limit = 10 -let skip = 0 -let fields = ["name", "email"] +struct User: Codable { + let name: String + let email: String +} + +Task { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .comparison(.greaterThan(.int(30))) + ], + sort: [["name": .asc]], + limit: 10, + skip: 0, + fields: ["name", "email"] + ) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift index dda4ae9..1f96253 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift @@ -1,10 +1,19 @@ // Advanced Mango Queries Step 4: Index Usage -let selector: [String: MangoValue] = [ - "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) -] -let sort: [[String: String]] = [["name": "asc"]] -let limit = 10 -let skip = 0 -let fields = ["name", "email"] -let useIndex = "my-index" +struct User: Codable { + let name: String + let email: String +} + +Task { + let query = MangoQuery( + selector: [ + "type": .string("user"), + "age": .comparison(.greaterThan(.int(30))) + ], + sort: [["name": .asc]], + limit: 10, + skip: 0, + fields: ["name", "email"], + useIndex: "my-index" + ) +} diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift index 5f67d6b..e9f06d3 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift @@ -8,12 +8,12 @@ Task { let query = MangoQuery( selector: [ "type": .string("user"), - "age": .dictionary(["$gt": .int(30)]) + "age": .comparison(.greaterThan(.int(30))) ], - fields: ["name", "email"], - sort: [["name": "asc"]], + sort: [["name": .asc]], limit: 10, skip: 0, + fields: ["name", "email"], useIndex: "my-index" ) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift index f73116b..f3429eb 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-1.swift @@ -1,2 +1,2 @@ // Step 1: Define the index fields -let indexFields = ["type", "age"] +let indexFields: [[String: String]] = [["type": "asc"], ["age": "asc"]] diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift index 1469fdb..55499d4 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-2.swift @@ -1,3 +1,4 @@ // Step 2: Create the MangoIndex object -let indexFields = ["type", "age"] -let mangoIndex = MangoIndex(fields: indexFields) +let indexFields: [[String: String]] = [["type": "asc"], ["age": "asc"]] +let indexDef = IndexDefinition(fields: indexFields) +let mangoIndex = MangoIndex(ddoc: "my-ddoc", name: "my-index", type: "json", def: indexDef) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift index 27fcfcd..d9c24db 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/CreateIndexTutorial-3.swift @@ -1,8 +1,9 @@ // Step 3: Execute index creation -let indexFields = ["type", "age"] -let mangoIndex = MangoIndex(/* correct initializer here, e.g. fields: indexFields */) +let indexFields: [[String: String]] = [["type": "asc"], ["age": "asc"]] +let indexDef = IndexDefinition(fields: indexFields) +let mangoIndex = MangoIndex(ddoc: "my-ddoc", name: "my-index", type: "json", def: indexDef) -Task { - let response = try await couchDBClient.createIndex(dbName: dbName, index: mangoIndex) +func createIndexExample(couchDBClient: CouchDBClient, dbName: String) async throws { + let response = try await couchDBClient.createIndex(inDB: dbName, index: mangoIndex) print(response) } From fd9a69e8ae0fe177219d7a8833b963e808e7775d Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 02:53:40 +0700 Subject: [PATCH 182/202] test updated --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 325f83b..0341e1b 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -284,12 +284,13 @@ struct CouchDBClientTests { @Test("Update document without updating rev. Should throw conflict") func update_document_conflict() async throws { - let doc = ExpectedDoc(name: "should not exist", _id: Foundation.UUID().uuidString, _rev: "1-abc") - var insertedDoc: ExpectedDoc? = nil + // Insert document without _rev, let CouchDB assign it + var doc = ExpectedDoc(name: "should not exist") + doc = try await couchDBClient.insert(dbName: testsDB, doc: doc) + let outdatedDoc = ExpectedDoc(name: doc.name, _id: doc._id, _rev: "1-abc") // purposely wrong _rev let error = await #expect(throws: CouchDBClientError.self) { - insertedDoc = try await couchDBClient.insert(dbName: testsDB, doc: doc) - _ = try await couchDBClient.update(dbName: testsDB, doc: doc) + _ = try await couchDBClient.update(dbName: testsDB, doc: outdatedDoc) } #expect( @@ -301,9 +302,8 @@ struct CouchDBClientTests { } }(), "Expected CouchDBClientError.conflictError") - if let docToDelete = insertedDoc { - _ = try await couchDBClient.delete(fromDb: testsDB, doc: docToDelete) - } + // Cleanup + _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) } @Test("Delete non existing document. Should throw deleteError") From 894895324c203cbd362695ae00246a9154487650 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 02:57:26 +0700 Subject: [PATCH 183/202] Attachments API --- README.md | 37 ++++ Sources/CouchDBClient/CouchDBClient.swift | 160 ++++++++++++++++++ .../AttachmentsAPI.tests.swift | 94 ++++++++++ Tests/CouchDBClientTests/test-image.png | 1 + 4 files changed, 292 insertions(+) create mode 100644 Tests/CouchDBClientTests/AttachmentsAPI.tests.swift create mode 100644 Tests/CouchDBClientTests/test-image.png diff --git a/README.md b/README.md index fc0a225..0056962 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,43 @@ let couchDBClient = CouchDBClient(config: config) ## Usage examples +### Uploading an Attachment + +```swift +let response = try await couchDBClient.uploadAttachment( + dbName: "myDatabase", + docId: "docid", + attachmentName: "image.png", + data: imageData, + contentType: "image/png", + rev: "currentRev" +) +print("Attachment uploaded, new revision: \(response.rev)") +``` + +### Downloading an Attachment + +```swift +let attachmentData = try await couchDBClient.downloadAttachment( + dbName: "myDatabase", + docId: "docid", + attachmentName: "image.png" +) +print("Downloaded attachment, size: \(attachmentData.count) bytes") +``` + +### Deleting an Attachment + +```swift +let deleteResponse = try await couchDBClient.deleteAttachment( + dbName: "myDatabase", + docId: "docid", + attachmentName: "image.png", + rev: "currentRev" +) +print("Attachment deleted, new revision: \(deleteResponse.rev)") +``` + ### Define Your Document Model ```swift diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index c9f29b4..9763e4d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -1534,6 +1534,166 @@ public actor CouchDBClient { throw parsingError } } + + /// Uploads an attachment to a CouchDB document. + /// + /// - Parameters: + /// - dbName: The database name. + /// - docId: The document ID. + /// - attachmentName: The name of the attachment. + /// - data: The binary data to upload. + /// - contentType: The MIME type of the attachment. + /// - rev: The current document revision. + /// - eventLoopGroup: Optional EventLoopGroup for network operations. + /// - Returns: A CouchUpdateResponse with the new revision. + /// - Throws: CouchDBClientError on failure. + /// + /// ### Example Usage: + /// ```swift + /// let response = try await couchDBClient.uploadAttachment( + /// dbName: "myDatabase", + /// docId: "docid", + /// attachmentName: "image.png", + /// data: imageData, + /// contentType: "image/png", + /// rev: "currentRev" + /// ) + /// print("Attachment uploaded, new revision: \(response.rev)") + /// ``` + public func uploadAttachment(dbName: String, docId: String, attachmentName: String, data: Data, contentType: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + let url = buildUrl(path: "/\(dbName)/\(docId)/\(attachmentName)", query: [URLQueryItem(name: "rev", value: rev)]) + var request = try buildRequest(fromUrl: url, withMethod: .PUT) + request.headers.replaceOrAdd(name: "Content-Type", value: contentType) + request.body = .bytes(ByteBuffer(data: data)) + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + guard let responseData = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + let decoder = JSONDecoder() + do { + let updateResponse = try decoder.decode(CouchUpdateResponse.self, from: responseData) + return updateResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: responseData) { + throw CouchDBClientError.updateError(error: couchdbError) + } + throw parsingError + } + } + + /// Downloads an attachment from a CouchDB document. + /// + /// - Parameters: + /// - dbName: The database name. + /// - docId: The document ID. + /// - attachmentName: The name of the attachment. + /// - eventLoopGroup: Optional EventLoopGroup for network operations. + /// - Returns: The binary data of the attachment. + /// - Throws: CouchDBClientError on failure. + /// + /// ### Example Usage: + /// ```swift + /// let attachmentData = try await couchDBClient.downloadAttachment( + /// dbName: "myDatabase", + /// docId: "docid", + /// attachmentName: "image.png" + /// ) + /// print("Downloaded attachment, size: \(attachmentData.count) bytes") + /// ``` + public func downloadAttachment(dbName: String, docId: String, attachmentName: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> Data { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + let url = buildUrl(path: "/\(dbName)/\(docId)/\(attachmentName)") + let request = try buildRequest(fromUrl: url, withMethod: .GET) + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + guard let data = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + return data + } + + /// Deletes an attachment from a CouchDB document. + /// + /// - Parameters: + /// - dbName: The database name. + /// - docId: The document ID. + /// - attachmentName: The name of the attachment. + /// - rev: The current document revision. + /// - eventLoopGroup: Optional EventLoopGroup for network operations. + /// - Returns: A CouchUpdateResponse with the new revision. + /// - Throws: CouchDBClientError on failure. + /// + /// ### Example Usage: + /// ```swift + /// let deleteResponse = try await couchDBClient.deleteAttachment( + /// dbName: "myDatabase", + /// docId: "docid", + /// attachmentName: "image.png", + /// rev: "currentRev" + /// ) + /// print("Attachment deleted, new revision: \(deleteResponse.rev)") + /// ``` + public func deleteAttachment(dbName: String, docId: String, attachmentName: String, rev: String, eventLoopGroup: EventLoopGroup? = nil) async throws -> CouchUpdateResponse { + try await authIfNeed(eventLoopGroup: eventLoopGroup) + let httpClient = createHTTPClientIfNeed(eventLoopGroup: eventLoopGroup) + defer { + if eventLoopGroup != nil { + DispatchQueue.main.async { + try? httpClient.syncShutdown() + } + } + } + let url = buildUrl(path: "/\(dbName)/\(docId)/\(attachmentName)", query: [URLQueryItem(name: "rev", value: rev)]) + let request = try buildRequest(fromUrl: url, withMethod: .DELETE) + let response = try await httpClient.execute(request, timeout: .seconds(requestsTimeout)) + if response.status == .unauthorized { + throw CouchDBClientError.unauthorized + } + let body = response.body + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) + var bytes = try await body.collect(upTo: expectedBytes ?? 1024 * 1024 * 10) + guard let responseData = bytes.readData(length: bytes.readableBytes) else { + throw CouchDBClientError.noData + } + let decoder = JSONDecoder() + do { + let updateResponse = try decoder.decode(CouchUpdateResponse.self, from: responseData) + return updateResponse + } catch let parsingError { + if let couchdbError = try? decoder.decode(CouchDBError.self, from: responseData) { + throw CouchDBClientError.deleteError(error: couchdbError) + } + throw parsingError + } + } } // MARK: - Private methods diff --git a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift new file mode 100644 index 0000000..499716e --- /dev/null +++ b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift @@ -0,0 +1,94 @@ +import Foundation +import Testing +import NIOCore // For ByteBuffer +@testable import CouchDBClient + +fileprivate let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), + requestsTimeout: 30 +) + +fileprivate let couchDBClient = CouchDBClient(config: config) +fileprivate let testsDB = "attachments_api_tests" + +@Suite(.serialized) +struct AttachmentsAPITests { + let testDocId = "test_doc_with_attachment" + let testAttachmentName = "test-image.png" + let testAttachmentPath = "Tests/CouchDBClientTests/test-image.png" + let testContentType = "image/png" + + @Test("Setup: Create DB and insert test doc") + func setupDBAndDoc() async throws { + if try await couchDBClient.dbExists(testsDB) { + try await couchDBClient.deleteDB(testsDB) + } + try await couchDBClient.createDB(testsDB) + struct Doc: Codable { + let _id: String + let type: String + } + let doc = Doc(_id: testDocId, type: "attachment-test") + let encodedDoc = try JSONEncoder().encode(doc) + _ = try await couchDBClient.insert(dbName: testsDB, body: .bytes(ByteBuffer(data: encodedDoc))) + } + + @Test("Upload attachment to document") + func uploadAttachment() async throws { + let data = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } + let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] + let rev = (doc?["_rev"] as? String) ?? "" + let uploadResponse = try await couchDBClient.uploadAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName, + data: data, + contentType: testContentType, + rev: rev + ) + #expect(uploadResponse.ok == true) + #expect(!uploadResponse.rev.isEmpty) + } + + @Test("Download attachment and verify data matches upload") + func downloadAttachment() async throws { + let uploadedData = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let downloadedData = try await couchDBClient.downloadAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName + ) + #expect(downloadedData == uploadedData) + } + + @Test("Delete attachment from document") + func deleteAttachment() async throws { + let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } + let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] + let rev = (doc?["_rev"] as? String) ?? "" + let deleteResponse = try await couchDBClient.deleteAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName, + rev: rev + ) + #expect(deleteResponse.ok == true) + #expect(!deleteResponse.rev.isEmpty) + } + + @Test("Cleanup: Delete Test Database") + func cleanupDB() async throws { + try await couchDBClient.deleteDB(testsDB) + } +} diff --git a/Tests/CouchDBClientTests/test-image.png b/Tests/CouchDBClientTests/test-image.png new file mode 100644 index 0000000..4ef8d36 --- /dev/null +++ b/Tests/CouchDBClientTests/test-image.png @@ -0,0 +1 @@ + From 1c1e5672b711206706f5ecb791c2be76b7e7c5d5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:04:46 +0700 Subject: [PATCH 184/202] formatting --- Sources/CouchDBClient/Models/MangoQuery.swift | 316 +++++++++--------- .../AttachmentsAPI.tests.swift | 152 ++++----- .../CouchDBClientTests.swift | 2 +- .../CouchDBClientTests/HTTPClientTests.swift | 87 +++-- 4 files changed, 278 insertions(+), 279 deletions(-) diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index 5ea40fa..a0b8b05 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -1,6 +1,6 @@ // // MangoQuery.swift -// +// // // Created by Sergey Armodin on 26.07.2025. // @@ -25,172 +25,172 @@ import Foundation /// ) /// ``` public struct MangoQuery: Codable, Sendable { - /// The selector defines the criteria for selecting documents. - public let selector: [String: MangoValue] - - /// An array of field names to be returned in the result. - public let fields: [String]? - - /// An array of sort definitions. - public let sort: [[String: MangoSortDirection]]? - - /// The maximum number of results to return. - public let limit: Int? - - /// The number of results to skip. - public let skip: Int? - - /// The name of the index to use for the query. - public let useIndex: String? - - enum CodingKeys: String, CodingKey { - case selector - case fields - case sort - case limit - case skip - case useIndex = "use_index" - } - - /// Initializes a new Mango Query. - /// - Parameters: - /// - selector: The selector to use for the query. - /// - fields: The fields to return in the result. - /// - sort: The sort order for the results. - /// - limit: The maximum number of results to return. - /// - skip: The number of results to skip. - /// - useIndex: The name of the index to use. - public init( - selector: [String: MangoValue], - fields: [String]? = nil, - sort: [[String: MangoSortDirection]]? = nil, - limit: Int? = nil, - skip: Int? = nil, - useIndex: String? = nil - ) { - self.selector = selector - self.fields = fields - self.sort = sort - self.limit = limit - self.skip = skip - self.useIndex = useIndex - } + /// The selector defines the criteria for selecting documents. + public let selector: [String: MangoValue] + + /// An array of field names to be returned in the result. + public let fields: [String]? + + /// An array of sort definitions. + public let sort: [[String: MangoSortDirection]]? + + /// The maximum number of results to return. + public let limit: Int? + + /// The number of results to skip. + public let skip: Int? + + /// The name of the index to use for the query. + public let useIndex: String? + + enum CodingKeys: String, CodingKey { + case selector + case fields + case sort + case limit + case skip + case useIndex = "use_index" + } + + /// Initializes a new Mango Query. + /// - Parameters: + /// - selector: The selector to use for the query. + /// - fields: The fields to return in the result. + /// - sort: The sort order for the results. + /// - limit: The maximum number of results to return. + /// - skip: The number of results to skip. + /// - useIndex: The name of the index to use. + public init( + selector: [String: MangoValue], + fields: [String]? = nil, + sort: [[String: MangoSortDirection]]? = nil, + limit: Int? = nil, + skip: Int? = nil, + useIndex: String? = nil + ) { + self.selector = selector + self.fields = fields + self.sort = sort + self.limit = limit + self.skip = skip + self.useIndex = useIndex + } } /// An enum representing the sort direction in Mango queries. public enum MangoSortDirection: String, Codable, Sendable { - case asc - case desc + case asc + case desc } /// An enum representing the possible values in a Mango query selector. public indirect enum MangoValue: Codable, Sendable { - case string(String) - case int(Int) - case double(Double) - case bool(Bool) - case array([MangoValue]) - case arrayOfDictionaries([[String: MangoValue]]) - case dictionary([String: MangoValue]) - case comparison(MangoComparison) - - public func encode(to encoder: Encoder) throws { - var container = encoder.singleValueContainer() - switch self { - case .string(let value): - try container.encode(value) - case .int(let value): - try container.encode(value) - case .double(let value): - try container.encode(value) - case .bool(let value): - try container.encode(value) - case .array(let value): - try container.encode(value) - case .arrayOfDictionaries(let value): - try container.encode(value) - case .dictionary(let value): - try container.encode(value) - case .comparison(let cmp): - try container.encode(cmp) - } - } - - public init(from decoder: Decoder) throws { - let container = try decoder.singleValueContainer() - if let value = try? container.decode(String.self) { - self = .string(value) - } else if let value = try? container.decode(Int.self) { - self = .int(value) - } else if let value = try? container.decode(Double.self) { - self = .double(value) - } else if let value = try? container.decode(Bool.self) { - self = .bool(value) - } else if let value = try? container.decode([MangoValue].self) { - self = .array(value) - } else if let value = try? container.decode([[String: MangoValue]].self) { - self = .arrayOfDictionaries(value) - } else if let value = try? container.decode([String: MangoValue].self) { - self = .dictionary(value) - } else if let value = try? container.decode(MangoComparison.self) { - self = .comparison(value) - } else { - throw DecodingError.typeMismatch(MangoValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoValue type")) - } - } + case string(String) + case int(Int) + case double(Double) + case bool(Bool) + case array([MangoValue]) + case arrayOfDictionaries([[String: MangoValue]]) + case dictionary([String: MangoValue]) + case comparison(MangoComparison) + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + switch self { + case .string(let value): + try container.encode(value) + case .int(let value): + try container.encode(value) + case .double(let value): + try container.encode(value) + case .bool(let value): + try container.encode(value) + case .array(let value): + try container.encode(value) + case .arrayOfDictionaries(let value): + try container.encode(value) + case .dictionary(let value): + try container.encode(value) + case .comparison(let cmp): + try container.encode(cmp) + } + } + + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let value = try? container.decode(String.self) { + self = .string(value) + } else if let value = try? container.decode(Int.self) { + self = .int(value) + } else if let value = try? container.decode(Double.self) { + self = .double(value) + } else if let value = try? container.decode(Bool.self) { + self = .bool(value) + } else if let value = try? container.decode([MangoValue].self) { + self = .array(value) + } else if let value = try? container.decode([[String: MangoValue]].self) { + self = .arrayOfDictionaries(value) + } else if let value = try? container.decode([String: MangoValue].self) { + self = .dictionary(value) + } else if let value = try? container.decode(MangoComparison.self) { + self = .comparison(value) + } else { + throw DecodingError.typeMismatch(MangoValue.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoValue type")) + } + } } public indirect enum MangoComparison: Codable, Sendable { - case equal(MangoValue) - case greaterThan(MangoValue) - case lessThan(MangoValue) - case greaterThanOrEqual(MangoValue) - case lessThanOrEqual(MangoValue) - case notEqual(MangoValue) - - enum CodingKeys: String, CodingKey { - case eq = "$eq" - case gt = "$gt" - case lt = "$lt" - case gte = "$gte" - case lte = "$lte" - case ne = "$ne" - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - switch self { - case .equal(let value): - try container.encode(value, forKey: .eq) - case .greaterThan(let value): - try container.encode(value, forKey: .gt) - case .lessThan(let value): - try container.encode(value, forKey: .lt) - case .greaterThanOrEqual(let value): - try container.encode(value, forKey: .gte) - case .lessThanOrEqual(let value): - try container.encode(value, forKey: .lte) - case .notEqual(let value): - try container.encode(value, forKey: .ne) - } - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - if let value = try? container.decode(MangoValue.self, forKey: .eq) { - self = .equal(value) - } else if let value = try? container.decode(MangoValue.self, forKey: .gt) { - self = .greaterThan(value) - } else if let value = try? container.decode(MangoValue.self, forKey: .lt) { - self = .lessThan(value) - } else if let value = try? container.decode(MangoValue.self, forKey: .gte) { - self = .greaterThanOrEqual(value) - } else if let value = try? container.decode(MangoValue.self, forKey: .lte) { - self = .lessThanOrEqual(value) - } else if let value = try? container.decode(MangoValue.self, forKey: .ne) { - self = .notEqual(value) - } else { - throw DecodingError.typeMismatch(MangoComparison.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoComparison type")) - } - } + case equal(MangoValue) + case greaterThan(MangoValue) + case lessThan(MangoValue) + case greaterThanOrEqual(MangoValue) + case lessThanOrEqual(MangoValue) + case notEqual(MangoValue) + + enum CodingKeys: String, CodingKey { + case eq = "$eq" + case gt = "$gt" + case lt = "$lt" + case gte = "$gte" + case lte = "$lte" + case ne = "$ne" + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .equal(let value): + try container.encode(value, forKey: .eq) + case .greaterThan(let value): + try container.encode(value, forKey: .gt) + case .lessThan(let value): + try container.encode(value, forKey: .lt) + case .greaterThanOrEqual(let value): + try container.encode(value, forKey: .gte) + case .lessThanOrEqual(let value): + try container.encode(value, forKey: .lte) + case .notEqual(let value): + try container.encode(value, forKey: .ne) + } + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + if let value = try? container.decode(MangoValue.self, forKey: .eq) { + self = .equal(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .gt) { + self = .greaterThan(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .lt) { + self = .lessThan(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .gte) { + self = .greaterThanOrEqual(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .lte) { + self = .lessThanOrEqual(value) + } else if let value = try? container.decode(MangoValue.self, forKey: .ne) { + self = .notEqual(value) + } else { + throw DecodingError.typeMismatch(MangoComparison.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Unsupported MangoComparison type")) + } + } } diff --git a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift index 499716e..d7e1e71 100644 --- a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift +++ b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift @@ -1,15 +1,15 @@ import Foundation import Testing -import NIOCore // For ByteBuffer +import NIOCore // For ByteBuffer @testable import CouchDBClient fileprivate let config = CouchDBClient.Config( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), - requestsTimeout: 30 + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), + requestsTimeout: 30 ) fileprivate let couchDBClient = CouchDBClient(config: config) @@ -17,78 +17,78 @@ fileprivate let testsDB = "attachments_api_tests" @Suite(.serialized) struct AttachmentsAPITests { - let testDocId = "test_doc_with_attachment" - let testAttachmentName = "test-image.png" - let testAttachmentPath = "Tests/CouchDBClientTests/test-image.png" - let testContentType = "image/png" + let testDocId = "test_doc_with_attachment" + let testAttachmentName = "test-image.png" + let testAttachmentPath = "Tests/CouchDBClientTests/test-image.png" + let testContentType = "image/png" - @Test("Setup: Create DB and insert test doc") - func setupDBAndDoc() async throws { - if try await couchDBClient.dbExists(testsDB) { - try await couchDBClient.deleteDB(testsDB) - } - try await couchDBClient.createDB(testsDB) - struct Doc: Codable { - let _id: String - let type: String - } - let doc = Doc(_id: testDocId, type: "attachment-test") - let encodedDoc = try JSONEncoder().encode(doc) - _ = try await couchDBClient.insert(dbName: testsDB, body: .bytes(ByteBuffer(data: encodedDoc))) - } + @Test("Setup: Create DB and insert test doc") + func setupDBAndDoc() async throws { + if try await couchDBClient.dbExists(testsDB) { + try await couchDBClient.deleteDB(testsDB) + } + try await couchDBClient.createDB(testsDB) + struct Doc: Codable { + let _id: String + let type: String + } + let doc = Doc(_id: testDocId, type: "attachment-test") + let encodedDoc = try JSONEncoder().encode(doc) + _ = try await couchDBClient.insert(dbName: testsDB, body: .bytes(ByteBuffer(data: encodedDoc))) + } - @Test("Upload attachment to document") - func uploadAttachment() async throws { - let data = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) - let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) - let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await response.body.collect(upTo: expectedBytes) - guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } - let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] - let rev = (doc?["_rev"] as? String) ?? "" - let uploadResponse = try await couchDBClient.uploadAttachment( - dbName: testsDB, - docId: testDocId, - attachmentName: testAttachmentName, - data: data, - contentType: testContentType, - rev: rev - ) - #expect(uploadResponse.ok == true) - #expect(!uploadResponse.rev.isEmpty) - } + @Test("Upload attachment to document") + func uploadAttachment() async throws { + let data = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } + let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] + let rev = (doc?["_rev"] as? String) ?? "" + let uploadResponse = try await couchDBClient.uploadAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName, + data: data, + contentType: testContentType, + rev: rev + ) + #expect(uploadResponse.ok == true) + #expect(!uploadResponse.rev.isEmpty) + } - @Test("Download attachment and verify data matches upload") - func downloadAttachment() async throws { - let uploadedData = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) - let downloadedData = try await couchDBClient.downloadAttachment( - dbName: testsDB, - docId: testDocId, - attachmentName: testAttachmentName - ) - #expect(downloadedData == uploadedData) - } + @Test("Download attachment and verify data matches upload") + func downloadAttachment() async throws { + let uploadedData = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let downloadedData = try await couchDBClient.downloadAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName + ) + #expect(downloadedData == uploadedData) + } - @Test("Delete attachment from document") - func deleteAttachment() async throws { - let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) - let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 - var bytes = try await response.body.collect(upTo: expectedBytes) - guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } - let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] - let rev = (doc?["_rev"] as? String) ?? "" - let deleteResponse = try await couchDBClient.deleteAttachment( - dbName: testsDB, - docId: testDocId, - attachmentName: testAttachmentName, - rev: rev - ) - #expect(deleteResponse.ok == true) - #expect(!deleteResponse.rev.isEmpty) - } + @Test("Delete attachment from document") + func deleteAttachment() async throws { + let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) + let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await response.body.collect(upTo: expectedBytes) + guard let dataDoc = bytes.readData(length: bytes.readableBytes) else { throw CouchDBClientError.noData } + let doc = try JSONSerialization.jsonObject(with: dataDoc, options: []) as? [String: Any] + let rev = (doc?["_rev"] as? String) ?? "" + let deleteResponse = try await couchDBClient.deleteAttachment( + dbName: testsDB, + docId: testDocId, + attachmentName: testAttachmentName, + rev: rev + ) + #expect(deleteResponse.ok == true) + #expect(!deleteResponse.rev.isEmpty) + } - @Test("Cleanup: Delete Test Database") - func cleanupDB() async throws { - try await couchDBClient.deleteDB(testsDB) - } + @Test("Cleanup: Delete Test Database") + func cleanupDB() async throws { + try await couchDBClient.deleteDB(testsDB) + } } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 0341e1b..31646a0 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -287,7 +287,7 @@ struct CouchDBClientTests { // Insert document without _rev, let CouchDB assign it var doc = ExpectedDoc(name: "should not exist") doc = try await couchDBClient.insert(dbName: testsDB, doc: doc) - let outdatedDoc = ExpectedDoc(name: doc.name, _id: doc._id, _rev: "1-abc") // purposely wrong _rev + let outdatedDoc = ExpectedDoc(name: doc.name, _id: doc._id, _rev: "1-abc") // purposely wrong _rev let error = await #expect(throws: CouchDBClientError.self) { _ = try await couchDBClient.update(dbName: testsDB, doc: outdatedDoc) diff --git a/Tests/CouchDBClientTests/HTTPClientTests.swift b/Tests/CouchDBClientTests/HTTPClientTests.swift index 4b5c375..9df0f9b 100644 --- a/Tests/CouchDBClientTests/HTTPClientTests.swift +++ b/Tests/CouchDBClientTests/HTTPClientTests.swift @@ -10,50 +10,49 @@ import Testing import AsyncHTTPClient @testable import CouchDBClient - @Suite("HTTP Client tests") struct HTTPClientTests { - let config = CouchDBClient.Config( - couchProtocol: .http, - couchHost: "127.0.0.1", - couchPort: 5984, - userName: "admin", - userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), - requestsTimeout: 30 - ) - - @Test("Test buildUrl method") - func buildUrl() async { - let couchDBClient = CouchDBClient(config: config) - let expectedUrl = "http://127.0.0.1:5984?key=testKey" - let url = await couchDBClient.buildUrl( - path: "", - query: [ - URLQueryItem(name: "key", value: "testKey") - ]) - #expect(url == expectedUrl) - } - - @Test("Provide own HTTPClient") - func provide_HTTPClient() async throws { - let httpClient = HTTPClient() - let couchDBClient = CouchDBClient(config: config, httpClient: httpClient) - - let httpClientProvided = try #require(await couchDBClient.httpClient) - - let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() - #expect(httpClientProvided === httpClientCreatedIfNeed) - #expect(httpClientProvided === httpClient) - - try await httpClient.shutdown() - } - - @Test("HTTPClient shutdown") - func shutdown() async throws { - let client = CouchDBClient( - config: config, - httpClient: HTTPClient() - ) - try await client.shutdown() - } + let config = CouchDBClient.Config( + couchProtocol: .http, + couchHost: "127.0.0.1", + couchPort: 5984, + userName: "admin", + userPassword: (ProcessInfo.processInfo.environment["COUCHDB_PASS"] ?? ""), + requestsTimeout: 30 + ) + + @Test("Test buildUrl method") + func buildUrl() async { + let couchDBClient = CouchDBClient(config: config) + let expectedUrl = "http://127.0.0.1:5984?key=testKey" + let url = await couchDBClient.buildUrl( + path: "", + query: [ + URLQueryItem(name: "key", value: "testKey") + ]) + #expect(url == expectedUrl) + } + + @Test("Provide own HTTPClient") + func provide_HTTPClient() async throws { + let httpClient = HTTPClient() + let couchDBClient = CouchDBClient(config: config, httpClient: httpClient) + + let httpClientProvided = try #require(await couchDBClient.httpClient) + + let httpClientCreatedIfNeed = await couchDBClient.createHTTPClientIfNeed() + #expect(httpClientProvided === httpClientCreatedIfNeed) + #expect(httpClientProvided === httpClient) + + try await httpClient.shutdown() + } + + @Test("HTTPClient shutdown") + func shutdown() async throws { + let client = CouchDBClient( + config: config, + httpClient: HTTPClient() + ) + try await client.shutdown() + } } From 425ca2a1d65e0024621a4514d95343a6b27ff7e6 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:12:25 +0700 Subject: [PATCH 185/202] readme --- README.md | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0056962..48a5f29 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,37 @@ [![Test on Ubuntu](https://github.com/makoni/couchdb-swift/actions/workflows/test-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/test-ubuntu.yml) - This is a simple library to work with CouchDB in Swift. -- The latest version supports strict concurrency: `CouchDBClient` is an actor and requires Swift 6.0 or newer. For Swift 5, you can still use version `1.7.0`. -- Compatible with Vapor 4. -- Version `1.0.0` can be used with Vapor 4 without `async/await`; Swift 5.3 is required. -- You can use the old version for Vapor 3 by checking out the `vapor3` branch or using versions earlier than `1.0.0`. +--- + +## Features + +- Strict concurrency: `CouchDBClient` is an actor (Swift 6+) +- Attachments API: upload, download, delete files/images +- Mango queries and indexes +- Document CRUD (create, read, update, delete) +- Vapor and Hummingbird integration +- Robust error handling -The only dependency for this library is [`async-http-client`](https://github.com/swift-server/async-http-client). +--- + +## Supported Platforms & Swift Versions + +- Swift 6.0+ (actor-based concurrency) +- Swift 5.x (use version 1.7.0) +- macOS, Linux (tested on Ubuntu) +- Compatible with Vapor 4 and Hummingbird + +--- + +## Testing + +Comprehensive test suite covers all major APIs, including Attachments: +- Run tests with: + ```bash +COUCHDB_PASS=myPassword swift test +``` --- @@ -193,3 +215,8 @@ print(docs) ### Using with Vapor Here's a simple [tutorial](https://spaceinbox.me/docs/couchdbclient/tutorials/couchdbclient/vaportutorial) for Vapor. +--- + +## License + +This project is licensed under the MIT License. See [LICENSE](LICENSE) for details. \ No newline at end of file From 51982eb05206dfc05779b24ff6f11a98418c726b Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:13:24 +0700 Subject: [PATCH 186/202] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index 48a5f29..69c4091 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,6 @@ This is a simple library to work with CouchDB in Swift. - Vapor and Hummingbird integration - Robust error handling ---- - ## Supported Platforms & Swift Versions - Swift 6.0+ (actor-based concurrency) @@ -37,8 +35,6 @@ This is a simple library to work with CouchDB in Swift. - macOS, Linux (tested on Ubuntu) - Compatible with Vapor 4 and Hummingbird ---- - ## Testing Comprehensive test suite covers all major APIs, including Attachments: @@ -47,14 +43,10 @@ Comprehensive test suite covers all major APIs, including Attachments: COUCHDB_PASS=myPassword swift test ``` ---- - ## Documentation Find documentation, examples, and tutorials [here](https://spaceinbox.me/docs/couchdbclient/documentation/couchdbclient). ---- - ## Installation ### Swift Package Manager @@ -67,8 +59,6 @@ dependencies: [ ] ``` ---- - ## Initialization ```swift From b3c876c5b98fbb735c76aab9d0dd74880e7c9fba Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:14:30 +0700 Subject: [PATCH 187/202] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 69c4091..0688a2d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-swift%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/makoni/couchdb-swift) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fmakoni%2Fcouchdb-swift%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/makoni/couchdb-swift) -[![Vapor 4](https://img.shields.io/badge/vapor-4-blue.svg?style=flat)](https://vapor.codes) [![Build on macOS](https://github.com/makoni/couchdb-swift/actions/workflows/build-macos.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/build-macos.yml) [![Build on Ubuntu](https://github.com/makoni/couchdb-swift/actions/workflows/build-ubuntu.yml/badge.svg?branch=master)](https://github.com/makoni/couchdb-swift/actions/workflows/build-ubuntu.yml) @@ -37,9 +36,9 @@ This is a simple library to work with CouchDB in Swift. ## Testing -Comprehensive test suite covers all major APIs, including Attachments: -- Run tests with: - ```bash +Comprehensive test suite covers all major APIs, including Attachments. Run tests with: + +```bash COUCHDB_PASS=myPassword swift test ``` From 663191c486b16683a677331eb69c6306d1fee272 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:43:44 +0700 Subject: [PATCH 188/202] fixes --- .../AdvancedMangoQueries/AdvancedMangoQueries.tutorial | 2 +- Sources/CouchDBClient/CouchDBClient.swift | 2 +- Tests/CouchDBClientTests/CouchDBClientTests.swift | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial index b6347da..310e43f 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries.tutorial @@ -5,7 +5,7 @@ @Image(source: logo.svg, alt: "Advanced Mango Queries illustration") } - @Section(title: "Building Selectors and Queries1") { + @Section(title: "Building Selectors and Queries") { @ContentAndMedia { Advanced Mango queries allow you to filter, sort, and project CouchDB documents using expressive selectors and indexes. The following steps will guide you through building selectors, adding sort/limit/skip, using fields for projections, and optimizing queries with indexes. } diff --git a/Sources/CouchDBClient/CouchDBClient.swift b/Sources/CouchDBClient/CouchDBClient.swift index 9763e4d..f90ff9d 100644 --- a/Sources/CouchDBClient/CouchDBClient.swift +++ b/Sources/CouchDBClient/CouchDBClient.swift @@ -956,7 +956,7 @@ public actor CouchDBClient { if response.status == .notFound { if let couchdbError = try? decoder.decode(CouchDBError.self, from: data) { - throw CouchDBClientError.deleteError(error: couchdbError) + throw CouchDBClientError.updateError(error: couchdbError) } throw CouchDBClientError.unknownResponse } diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index 31646a0..b1e0a74 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -523,10 +523,10 @@ struct CouchDBClientTests { #expect( { switch error { - case .deleteError(let error): + case .updateError(let error): return error.error == "not_found" default: return false } - }(), "Expected CouchDBClientError.deleteError") + }(), "Expected CouchDBClientError.updateError") } } From f5ded77426121fa8364dd4c12eacece8f25fcb20 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:45:20 +0700 Subject: [PATCH 189/202] updated workflows --- .github/workflows/build-ubuntu.yml | 2 +- .github/workflows/test-ubuntu.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index a7e47e4..16017f6 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{ matrix.swift }} strategy: matrix: - swift: ["6.0", "6.0.3", "6.1"] + swift: ["6.0", "6.1"] runs-on: ubuntu-latest container: image: swift:${{ matrix.swift }} diff --git a/.github/workflows/test-ubuntu.yml b/.github/workflows/test-ubuntu.yml index de369b4..a1460e9 100644 --- a/.github/workflows/test-ubuntu.yml +++ b/.github/workflows/test-ubuntu.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - couchdb: [latest, "3.4", "3.3", "3.2"] + couchdb: [latest, "3.4"] runs-on: ubuntu-latest services: swift: From dc9d65c4e36025da529e9c457b5220385f71bd07 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 27 Jul 2025 03:49:33 +0700 Subject: [PATCH 190/202] Update Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift index e9f06d3..19b634b 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift @@ -17,6 +17,6 @@ Task { useIndex: "my-index" ) - let result: CouchDBFindResponse = try await couchDBClient.find(dbName: dbName, query: query) + let result: CouchDBFindResponse = try await couchDBClient.find(inDB: dbName, query: query) print(result.docs) } From 10a661b7188a0336608eb519339f9ae300ccfea4 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:53:39 +0700 Subject: [PATCH 191/202] correct init --- Sources/CouchDBClient/Models/MangoIndex.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/CouchDBClient/Models/MangoIndex.swift b/Sources/CouchDBClient/Models/MangoIndex.swift index 9ebc9e1..6456156 100644 --- a/Sources/CouchDBClient/Models/MangoIndex.swift +++ b/Sources/CouchDBClient/Models/MangoIndex.swift @@ -36,7 +36,7 @@ public struct MangoIndex: Codable, Sendable { /// - type: The type of the index. /// - def: The definition of the index. public init( - ddoc: String, + ddoc: String? = nil, name: String, type: String, def: IndexDefinition From 9389776664e4ce35bb303070eee3b2872c385f86 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 03:58:55 +0700 Subject: [PATCH 192/202] updated tests --- Tests/CouchDBClientTests/AttachmentsAPI.tests.swift | 13 ++++++++++--- Tests/CouchDBClientTests/test-image.png | 1 - 2 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 Tests/CouchDBClientTests/test-image.png diff --git a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift index d7e1e71..a4d5abb 100644 --- a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift +++ b/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift @@ -19,8 +19,15 @@ fileprivate let testsDB = "attachments_api_tests" struct AttachmentsAPITests { let testDocId = "test_doc_with_attachment" let testAttachmentName = "test-image.png" - let testAttachmentPath = "Tests/CouchDBClientTests/test-image.png" let testContentType = "image/png" + // Embedded PNG data (1x1 transparent pixel) + let embeddedTestImageData: Data = Data([ + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52, + 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x06,0x00,0x00,0x00,0x1F,0x15,0xC4, + 0x89,0x00,0x00,0x00,0x0A,0x49,0x44,0x41,0x54,0x78,0x9C,0x63,0x00,0x01,0x00,0x00, + 0x05,0x00,0x01,0x0D,0x0A,0x2D,0xB4,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE, + 0x42,0x60,0x82 + ]) @Test("Setup: Create DB and insert test doc") func setupDBAndDoc() async throws { @@ -39,7 +46,7 @@ struct AttachmentsAPITests { @Test("Upload attachment to document") func uploadAttachment() async throws { - let data = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let data = embeddedTestImageData let response = try await couchDBClient.get(fromDB: testsDB, uri: testDocId) let expectedBytes = response.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 var bytes = try await response.body.collect(upTo: expectedBytes) @@ -60,7 +67,7 @@ struct AttachmentsAPITests { @Test("Download attachment and verify data matches upload") func downloadAttachment() async throws { - let uploadedData = try Data(contentsOf: URL(fileURLWithPath: testAttachmentPath)) + let uploadedData = embeddedTestImageData let downloadedData = try await couchDBClient.downloadAttachment( dbName: testsDB, docId: testDocId, diff --git a/Tests/CouchDBClientTests/test-image.png b/Tests/CouchDBClientTests/test-image.png deleted file mode 100644 index 4ef8d36..0000000 --- a/Tests/CouchDBClientTests/test-image.png +++ /dev/null @@ -1 +0,0 @@ - From 0067067b9e7d822daa9009dc3a07bd5cb1904a53 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 04:00:43 +0700 Subject: [PATCH 193/202] tests updated --- Tests/CouchDBClientTests/CouchDBClientTests.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tests/CouchDBClientTests/CouchDBClientTests.swift b/Tests/CouchDBClientTests/CouchDBClientTests.swift index b1e0a74..bcafbb8 100644 --- a/Tests/CouchDBClientTests/CouchDBClientTests.swift +++ b/Tests/CouchDBClientTests/CouchDBClientTests.swift @@ -302,6 +302,15 @@ struct CouchDBClientTests { } }(), "Expected CouchDBClientError.conflictError") + // Verify original document is unchanged + let fetchedResponse = try await couchDBClient.get(fromDB: testsDB, uri: doc._id) + let expectedBytes = fetchedResponse.headers.first(name: "content-length").flatMap(Int.init) ?? 1024 * 1024 * 10 + var bytes = try await fetchedResponse.body.collect(upTo: expectedBytes) + let data = bytes.readData(length: bytes.readableBytes) + let fetchedDoc = try JSONDecoder().decode(ExpectedDoc.self, from: data!) + #expect(fetchedDoc._rev == doc._rev) + #expect(fetchedDoc.name == doc.name) + // Cleanup _ = try await couchDBClient.delete(fromDb: testsDB, doc: doc) } From 020956e54fbf2a38a3194ed72d7dbf7f4d8bdced Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 04:10:16 +0700 Subject: [PATCH 194/202] MangoSortField struct --- .../AdvancedMangoQueries-2.swift | 2 +- .../AdvancedMangoQueries-3.swift | 2 +- .../AdvancedMangoQueries-4.swift | 2 +- .../AdvancedMangoQueries-5.swift | 2 +- Sources/CouchDBClient/Models/MangoQuery.swift | 51 ++++++++++++++++++- .../CouchDBClientTests/MangoQueryTests.swift | 2 +- 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift index cf22afd..bb8cc18 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-2.swift @@ -10,7 +10,7 @@ Task { "type": .string("user"), "age": .comparison(.greaterThan(.int(30))) ], - sort: [["name": .asc]], + sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0 ) diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift index ad29512..2e60ece 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-3.swift @@ -10,7 +10,7 @@ Task { "type": .string("user"), "age": .comparison(.greaterThan(.int(30))) ], - sort: [["name": .asc]], + sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0, fields: ["name", "email"] diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift index 1f96253..03b9518 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-4.swift @@ -10,7 +10,7 @@ Task { "type": .string("user"), "age": .comparison(.greaterThan(.int(30))) ], - sort: [["name": .asc]], + sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0, fields: ["name", "email"], diff --git a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift index 19b634b..289eb40 100644 --- a/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift +++ b/Sources/CouchDBClient/CouchDBClient.docc/Tutorials/AdvancedMangoQueries/AdvancedMangoQueries-5.swift @@ -10,7 +10,7 @@ Task { "type": .string("user"), "age": .comparison(.greaterThan(.int(30))) ], - sort: [["name": .asc]], + sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0, fields: ["name", "email"], diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index a0b8b05..db38c52 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -7,6 +7,20 @@ import Foundation +public struct MangoSortField: Codable, Sendable { + public let field: String + public let direction: MangoSortDirection + + public init(field: String, direction: MangoSortDirection) { + self.field = field + self.direction = direction + } + + public func asDictionary() -> [String: MangoSortDirection] { + [field: direction] + } +} + /// A struct representing a Mango Query for CouchDB. /// /// Use this struct to build complex queries to retrieve documents from a CouchDB database. @@ -32,7 +46,7 @@ public struct MangoQuery: Codable, Sendable { public let fields: [String]? /// An array of sort definitions. - public let sort: [[String: MangoSortDirection]]? + public let sort: [MangoSortField]? /// The maximum number of results to return. public let limit: Int? @@ -63,7 +77,7 @@ public struct MangoQuery: Codable, Sendable { public init( selector: [String: MangoValue], fields: [String]? = nil, - sort: [[String: MangoSortDirection]]? = nil, + sort: [MangoSortField]? = nil, limit: Int? = nil, skip: Int? = nil, useIndex: String? = nil @@ -75,6 +89,39 @@ public struct MangoQuery: Codable, Sendable { self.skip = skip self.useIndex = useIndex } + + // Custom encoding to match CouchDB's expected sort format + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(selector, forKey: .selector) + try container.encodeIfPresent(fields, forKey: .fields) + if let sort = sort { + let sortArray = sort.map { $0.asDictionary() } + try container.encode(sortArray, forKey: .sort) + } + try container.encodeIfPresent(limit, forKey: .limit) + try container.encodeIfPresent(skip, forKey: .skip) + try container.encodeIfPresent(useIndex, forKey: .useIndex) + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + selector = try container.decode([String: MangoValue].self, forKey: .selector) + fields = try container.decodeIfPresent([String].self, forKey: .fields) + if let sortArray = try container.decodeIfPresent([[String: MangoSortDirection]].self, forKey: .sort) { + sort = sortArray.map { dict in + guard let (field, direction) = dict.first else { + fatalError("Invalid sort dictionary") + } + return MangoSortField(field: field, direction: direction) + } + } else { + sort = nil + } + limit = try container.decodeIfPresent(Int.self, forKey: .limit) + skip = try container.decodeIfPresent(Int.self, forKey: .skip) + useIndex = try container.decodeIfPresent(String.self, forKey: .useIndex) + } } /// An enum representing the sort direction in Mango queries. diff --git a/Tests/CouchDBClientTests/MangoQueryTests.swift b/Tests/CouchDBClientTests/MangoQueryTests.swift index e6bfcbf..1c164a2 100644 --- a/Tests/CouchDBClientTests/MangoQueryTests.swift +++ b/Tests/CouchDBClientTests/MangoQueryTests.swift @@ -19,7 +19,7 @@ struct MangoQueryTests { "age": .comparison(.greaterThan(.int(30))) ], fields: ["name", "email"], - sort: [["name": .asc]], + sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0, useIndex: "my-index" From 6f402d0b1e96632cf758ec5ab067daca9dde37ab Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 04:10:22 +0700 Subject: [PATCH 195/202] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0688a2d..f4bcff1 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,7 @@ let selector: [String: MangoValue] = [ "type": .string("user"), "age": .comparison(.greaterThan(.int(30))) ] -let query = MangoQuery(selector: selector, fields: ["name", "email"], sort: [["name": .asc]], limit: 10, skip: 0) +let query = MangoQuery(selector: selector, fields: ["name", "email"], sort: [MangoSortField(field: "name", direction: .asc)], limit: 10, skip: 0) let docs: [ExpectedDoc] = try await couchDBClient.find(inDB: "databaseName", query: query) print(docs) ``` From a9173b8503e408017571df52a018c852d97cd9c1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 04:10:27 +0700 Subject: [PATCH 196/202] docs --- Sources/CouchDBClient/Models/MangoQuery.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index db38c52..6eb4c6c 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -7,6 +7,19 @@ import Foundation +/// A struct representing a sort field and direction for Mango queries. +/// +/// Use `MangoSortField` to specify the field and sort direction (ascending or descending) +/// when constructing a MangoQuery. This enables type-safe and self-documenting sort definitions. +/// +/// Example: +/// ```swift +/// let sortField = MangoSortField(field: "name", direction: .asc) +/// let query = MangoQuery( +/// selector: ["type": .string("user")], +/// sort: [sortField] +/// ) +/// ``` public struct MangoSortField: Codable, Sendable { public let field: String public let direction: MangoSortDirection From 69dbb9bb04f812420c596e50feee16a56e64369e Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 12:27:22 +0700 Subject: [PATCH 197/202] throw error --- Sources/CouchDBClient/Models/MangoQuery.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Sources/CouchDBClient/Models/MangoQuery.swift b/Sources/CouchDBClient/Models/MangoQuery.swift index 6eb4c6c..708cf1e 100644 --- a/Sources/CouchDBClient/Models/MangoQuery.swift +++ b/Sources/CouchDBClient/Models/MangoQuery.swift @@ -122,9 +122,12 @@ public struct MangoQuery: Codable, Sendable { selector = try container.decode([String: MangoValue].self, forKey: .selector) fields = try container.decodeIfPresent([String].self, forKey: .fields) if let sortArray = try container.decodeIfPresent([[String: MangoSortDirection]].self, forKey: .sort) { - sort = sortArray.map { dict in + sort = try sortArray.map { dict in guard let (field, direction) = dict.first else { - fatalError("Invalid sort dictionary") + throw DecodingError.dataCorrupted(DecodingError.Context( + codingPath: container.codingPath, + debugDescription: "Invalid sort dictionary: expected a field and direction." + )) } return MangoSortField(field: field, direction: direction) } From 2d6199b4a6a3ebd94a421df32013d91c75390006 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Sun, 27 Jul 2025 12:28:08 +0700 Subject: [PATCH 198/202] Rename --- .../{AttachmentsAPI.tests.swift => AttachmentsAPITests.swift} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tests/CouchDBClientTests/{AttachmentsAPI.tests.swift => AttachmentsAPITests.swift} (100%) diff --git a/Tests/CouchDBClientTests/AttachmentsAPI.tests.swift b/Tests/CouchDBClientTests/AttachmentsAPITests.swift similarity index 100% rename from Tests/CouchDBClientTests/AttachmentsAPI.tests.swift rename to Tests/CouchDBClientTests/AttachmentsAPITests.swift From 9bb126b270440a24bf1789984514c1ffa2d4fed5 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 22 Sep 2025 20:22:12 +0700 Subject: [PATCH 199/202] Update dependencies in Package.resolved to latest versions --- Package.resolved | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Package.resolved b/Package.resolved index b440dd3..8ee0219 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "60235983163d040f343a489f7e2e77c1918a8bd9", - "version" : "1.26.1" + "revision" : "7dc119c7edf3c23f52638faadb89182861dee853", + "version" : "1.28.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-certificates.git", "state" : { - "revision" : "c059d9c9d08d6654b9a92dda93d9049a278964c6", - "version" : "1.12.0" + "revision" : "4b092f15164144c24554e0a75e080a960c5190a6", + "version" : "1.14.0" } }, { @@ -69,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-crypto.git", "state" : { - "revision" : "334e682869394ee239a57dbe9262bff3cd9495bd", - "version" : "3.14.0" + "revision" : "d1c6b70f7c5f19fb0b8750cb8dcdf2ea6e2d8c34", + "version" : "3.15.0" } }, { @@ -150,8 +150,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "385f5bd783ffbfff46b246a7db7be8e4f04c53bd", - "version" : "2.33.0" + "revision" : "737e550e607d82bf15bdfddf158ec61652ce836f", + "version" : "2.34.0" } }, { @@ -168,8 +168,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-numerics.git", "state" : { - "revision" : "e0ec0f5f3af6f3e4d5e7a19d2af26b481acb6ba8", - "version" : "1.0.3" + "revision" : "bbadd4b853a33fd78c4ae977d17bb2af15eb3f2a", + "version" : "1.1.0" } }, { @@ -186,8 +186,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-system.git", "state" : { - "revision" : "890830fff1a577dc83134890c7984020c5f6b43b", - "version" : "1.6.2" + "revision" : "395a77f0aa927f0ff73941d7ac35f2b46d47c9db", + "version" : "1.6.3" } } ], From e948318eb871ea2bbf643b5236c2a56eee593cf1 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 22 Sep 2025 20:24:55 +0700 Subject: [PATCH 200/202] Update Swift version matrix in Ubuntu build workflow --- .github/workflows/build-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml index 16017f6..a60d226 100644 --- a/.github/workflows/build-ubuntu.yml +++ b/.github/workflows/build-ubuntu.yml @@ -11,7 +11,7 @@ jobs: name: Build on Ubuntu with Swift ${{ matrix.swift }} strategy: matrix: - swift: ["6.0", "6.1"] + swift: ["6.1", "6.2"] runs-on: ubuntu-latest container: image: swift:${{ matrix.swift }} From 72decbc87d49d5b4da843efa44716723fa8c5fe9 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Mon, 10 Nov 2025 19:19:42 +0700 Subject: [PATCH 201/202] Update dependencies in Package.resolved to latest versions --- Package.resolved | 70 ++++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/Package.resolved b/Package.resolved index 8ee0219..7188b86 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "7dc119c7edf3c23f52638faadb89182861dee853", - "version" : "1.28.0" + "revision" : "efb14fec9f79f3f8d4f2a6c0530303efb6fe6533", + "version" : "1.29.1" } }, { @@ -24,8 +24,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-asn1.git", "state" : { - "revision" : "f70225981241859eb4aa1a18a75531d26637c8cc", - "version" : "1.4.0" + "revision" : "40d25bbb2fc5b557a9aa8512210bded327c0f60d", + "version" : "1.5.0" } }, { @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-certificates.git", "state" : { - "revision" : "4b092f15164144c24554e0a75e080a960c5190a6", - "version" : "1.14.0" + "revision" : "c399f90e7bbe8874f6cbfda1d5f9023d1f5ce122", + "version" : "1.15.1" } }, { @@ -60,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-collections.git", "state" : { - "revision" : "8c0c0a8b49e080e54e5e328cc552821ff07cd341", - "version" : "1.2.1" + "revision" : "7b847a3b7008b2dc2f47ca3110d8c782fb2e5c7e", + "version" : "1.3.0" } }, { @@ -69,8 +69,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-crypto.git", "state" : { - "revision" : "d1c6b70f7c5f19fb0b8750cb8dcdf2ea6e2d8c34", - "version" : "3.15.0" + "revision" : "e8ed8867ec23bccf5f3bb9342148fa8deaff9b49", + "version" : "4.1.0" + } + }, + { + "identity" : "swift-distributed-tracing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-distributed-tracing.git", + "state" : { + "revision" : "baa932c1336f7894145cbaafcd34ce2dd0b77c97", + "version" : "1.3.1" } }, { @@ -96,8 +105,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-structured-headers.git", "state" : { - "revision" : "1625f271afb04375bf48737a5572613248d0e7a0", - "version" : "1.4.0" + "revision" : "a9f3c352f4d46afd155e00b3c6e85decae6bcbeb", + "version" : "1.5.0" } }, { @@ -105,8 +114,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-types.git", "state" : { - "revision" : "a0a57e949a8903563aba4615869310c0ebf14c03", - "version" : "1.4.0" + "revision" : "45eb0224913ea070ec4fba17291b9e7ecf4749ca", + "version" : "1.5.1" } }, { @@ -123,8 +132,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "1c30f0f2053b654e3d1302492124aa6d242cdba7", - "version" : "2.86.0" + "revision" : "a24771a4c228ff116df343c85fcf3dcfae31a06c", + "version" : "2.88.0" } }, { @@ -132,8 +141,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "a55c3dd3a81d035af8a20ce5718889c0dcab073d", - "version" : "1.29.0" + "revision" : "7ee281d816fa8e5f3967a2c294035a318ea551c7", + "version" : "1.31.0" } }, { @@ -150,8 +159,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "737e550e607d82bf15bdfddf158ec61652ce836f", - "version" : "2.34.0" + "revision" : "173cc69a058623525a58ae6710e2f5727c663793", + "version" : "2.36.0" } }, { @@ -159,8 +168,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "e645014baea2ec1c2db564410c51a656cf47c923", - "version" : "1.25.1" + "revision" : "df6c28355051c72c884574a6c858bc54f7311ff9", + "version" : "1.25.2" } }, { @@ -168,8 +177,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-numerics.git", "state" : { - "revision" : "bbadd4b853a33fd78c4ae977d17bb2af15eb3f2a", - "version" : "1.1.0" + "revision" : "0c0290ff6b24942dadb83a929ffaaa1481df04a2", + "version" : "1.1.1" + } + }, + { + "identity" : "swift-service-context", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-service-context.git", + "state" : { + "revision" : "1983448fefc717a2bc2ebde5490fe99873c5b8a6", + "version" : "1.2.1" } }, { @@ -177,8 +195,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/swift-service-lifecycle.git", "state" : { - "revision" : "e7187309187695115033536e8fc9b2eb87fd956d", - "version" : "2.8.0" + "revision" : "1de37290c0ab3c5a96028e0f02911b672fd42348", + "version" : "2.9.1" } }, { From 879af7d92b62e628db39361b574bb404dd1409b7 Mon Sep 17 00:00:00 2001 From: Sergey Armodin Date: Wed, 12 Nov 2025 22:49:32 +0700 Subject: [PATCH 202/202] Update dependencies in Package.resolved to latest versions --- Package.resolved | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Package.resolved b/Package.resolved index 7188b86..2ad10e1 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "efb14fec9f79f3f8d4f2a6c0530303efb6fe6533", - "version" : "1.29.1" + "revision" : "b2faff932b956df50668241d14f1b42f7bae12b4", + "version" : "1.30.0" } }, { @@ -105,8 +105,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-http-structured-headers.git", "state" : { - "revision" : "a9f3c352f4d46afd155e00b3c6e85decae6bcbeb", - "version" : "1.5.0" + "revision" : "76d7627bd88b47bf5a0f8497dd244885960dde0b", + "version" : "1.6.0" } }, { @@ -132,8 +132,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "a24771a4c228ff116df343c85fcf3dcfae31a06c", - "version" : "2.88.0" + "revision" : "56724a2b6d8e2aed1b2c5f23865b9ea5c43f9977", + "version" : "2.89.0" } }, { @@ -150,8 +150,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "5e9e99ec96c53bc2c18ddd10c1e25a3cd97c55e5", - "version" : "1.38.0" + "revision" : "c2ba4cfbb83f307c66f5a6df6bb43e3c88dfbf80", + "version" : "1.39.0" } }, {

W1SA|Po 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