From 8c9e4dff491a5c6b62dfd681a2224cff38005c8a Mon Sep 17 00:00:00 2001 From: Ethan Wong Date: Sun, 19 Jun 2022 11:57:10 +0800 Subject: [PATCH 1/3] use .package(path:) for local package dependencies to resolve Xcode 14 errors. --- Account/Package.swift | 34 ++++++++++++++++++++++++---------- ArticlesDatabase/Package.swift | 23 +++++++++++++++++------ SyncDatabase/Package.swift | 21 ++++++++++++++++----- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/Account/Package.swift b/Account/Package.swift index 040712530..5c6289899 100644 --- a/Account/Package.swift +++ b/Account/Package.swift @@ -1,6 +1,29 @@ // swift-tools-version:5.3 import PackageDescription +var dependencies: [Package.Dependency] = [ + .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), + .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), + .package(url: "https://github.com/Ranchero-Software/RSParser.git", .upToNextMajor(from: "2.0.2")), + .package(url: "https://github.com/Ranchero-Software/RSWeb.git", .upToNextMajor(from: "1.0.0")), +] + +#if swift(>=5.6) +dependencies.append(contentsOf: [ + .package(path: "../Articles"), + .package(path: "../ArticlesDatabase"), + .package(path: "../Secrets"), + .package(path: "../SyncDatabase"), +]) +#else +dependencies.append(contentsOf: [ + .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), + .package(url: "../ArticlesDatabase", .upToNextMajor(from: "1.0.0")), + .package(url: "../Secrets", .upToNextMajor(from: "1.0.0")), + .package(url: "../SyncDatabase", .upToNextMajor(from: "1.0.0")), +]) +#endif + let package = Package( name: "Account", platforms: [.macOS(SupportedPlatform.MacOSVersion.v10_15), .iOS(SupportedPlatform.IOSVersion.v13)], @@ -10,16 +33,7 @@ let package = Package( type: .dynamic, targets: ["Account"]), ], - dependencies: [ - .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), - .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), - .package(url: "https://github.com/Ranchero-Software/RSParser.git", .upToNextMajor(from: "2.0.2")), - .package(url: "https://github.com/Ranchero-Software/RSWeb.git", .upToNextMajor(from: "1.0.0")), - .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), - .package(url: "../ArticlesDatabase", .upToNextMajor(from: "1.0.0")), - .package(url: "../Secrets", .upToNextMajor(from: "1.0.0")), - .package(url: "../SyncDatabase", .upToNextMajor(from: "1.0.0")), - ], + dependencies: dependencies, targets: [ .target( name: "Account", diff --git a/ArticlesDatabase/Package.swift b/ArticlesDatabase/Package.swift index 127979844..e47d036b5 100644 --- a/ArticlesDatabase/Package.swift +++ b/ArticlesDatabase/Package.swift @@ -3,6 +3,22 @@ import PackageDescription +var dependencies: [Package.Dependency] = [ + .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), + .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), + .package(url: "https://github.com/Ranchero-Software/RSParser.git", .upToNextMajor(from: "2.0.2")), +] + +#if swift(>=5.6) +dependencies.append(contentsOf: [ + .package(path: "../Articles"), +]) +#else +dependencies.append(contentsOf: [ + .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), +]) +#endif + let package = Package( name: "ArticlesDatabase", platforms: [.macOS(SupportedPlatform.MacOSVersion.v10_15), .iOS(SupportedPlatform.IOSVersion.v13)], @@ -12,12 +28,7 @@ let package = Package( type: .dynamic, targets: ["ArticlesDatabase"]), ], - dependencies: [ - .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), - .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), - .package(url: "https://github.com/Ranchero-Software/RSParser.git", .upToNextMajor(from: "2.0.2")), - .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), - ], + dependencies: dependencies, targets: [ .target( name: "ArticlesDatabase", diff --git a/SyncDatabase/Package.swift b/SyncDatabase/Package.swift index 15f06261c..19f86b7ce 100644 --- a/SyncDatabase/Package.swift +++ b/SyncDatabase/Package.swift @@ -1,6 +1,21 @@ // swift-tools-version:5.3 import PackageDescription +var dependencies: [Package.Dependency] = [ + .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), + .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), +] + +#if swift(>=5.6) +dependencies.append(contentsOf: [ + .package(path: "../Articles"), +]) +#else +dependencies.append(contentsOf: [ + .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), +]) +#endif + let package = Package( name: "SyncDatabase", platforms: [.macOS(SupportedPlatform.MacOSVersion.v10_15), .iOS(SupportedPlatform.IOSVersion.v13)], @@ -10,11 +25,7 @@ let package = Package( type: .dynamic, targets: ["SyncDatabase"]), ], - dependencies: [ - .package(url: "https://github.com/Ranchero-Software/RSCore.git", .upToNextMajor(from: "1.0.0")), - .package(url: "https://github.com/Ranchero-Software/RSDatabase.git", .upToNextMajor(from: "1.0.0")), - .package(url: "../Articles", .upToNextMajor(from: "1.0.0")), - ], + dependencies: dependencies, targets: [ .target( name: "SyncDatabase", From 6baee150071ea512b11d4683f7c1900fbfdc3a7c Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 2 Oct 2022 14:57:48 -0500 Subject: [PATCH 2/3] Remove requirement for "alternate" element which shouldn't be required. Fixes #3708 --- .../Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift | 2 +- Account/Sources/Account/ReaderAPI/ReaderAPIEntry.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift index 58422a96f..e93ffb282 100644 --- a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift +++ b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift @@ -1060,7 +1060,7 @@ private extension ReaderAPIAccountDelegate { uniqueID: entry.uniqueID(variant: variant), feedURL: streamID, url: nil, - externalURL: entry.alternates.first?.url, + externalURL: entry.alternates?.first?.url, title: entry.title, language: nil, contentHTML: entry.summary.content, diff --git a/Account/Sources/Account/ReaderAPI/ReaderAPIEntry.swift b/Account/Sources/Account/ReaderAPI/ReaderAPIEntry.swift index 5d8575945..93de146f8 100644 --- a/Account/Sources/Account/ReaderAPI/ReaderAPIEntry.swift +++ b/Account/Sources/Account/ReaderAPI/ReaderAPIEntry.swift @@ -58,7 +58,7 @@ struct ReaderAPIEntry: Codable { let timestampUsec: String? let summary: ReaderAPIArticleSummary - let alternates: [ReaderAPIAlternateLocation] + let alternates: [ReaderAPIAlternateLocation]? let categories: [String] let origin: ReaderAPIEntryOrigin From 948b02d0ac4fea5f764db9ee2628a4659b927358 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 28 Oct 2022 15:53:26 -0500 Subject: [PATCH 3/3] Change so that we only send 300 markers per request. Fixes #3711 --- .../Account/Feedly/FeedlyAPICaller.swift | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/Account/Sources/Account/Feedly/FeedlyAPICaller.swift b/Account/Sources/Account/Feedly/FeedlyAPICaller.swift index 40942b2f8..e84b801bd 100644 --- a/Account/Sources/Account/Feedly/FeedlyAPICaller.swift +++ b/Account/Sources/Account/Feedly/FeedlyAPICaller.swift @@ -7,6 +7,7 @@ // import Foundation +import RSCore import RSWeb import Secrets @@ -820,33 +821,48 @@ extension FeedlyAPICaller: FeedlyMarkArticlesService { fatalError("\(components) does not produce a valid URL.") } - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.addValue("application/json", forHTTPHeaderField: HTTPRequestHeader.contentType) - request.addValue("application/json", forHTTPHeaderField: "Accept-Type") - request.addValue("OAuth \(accessToken)", forHTTPHeaderField: HTTPRequestHeader.authorization) - - do { - let body = MarkerEntriesBody(action: action.actionValue, entryIds: Array(articleIds)) - let encoder = JSONEncoder() - let data = try encoder.encode(body) - request.httpBody = data - } catch { - return DispatchQueue.main.async { - completion(.failure(error)) + let articleIdChunks = Array(articleIds).chunked(into: 300) + let dispatchGroup = DispatchGroup() + var groupError: Error? = nil + + for articleIdChunk in articleIdChunks { + + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.addValue("application/json", forHTTPHeaderField: HTTPRequestHeader.contentType) + request.addValue("application/json", forHTTPHeaderField: "Accept-Type") + request.addValue("OAuth \(accessToken)", forHTTPHeaderField: HTTPRequestHeader.authorization) + + do { + let body = MarkerEntriesBody(action: action.actionValue, entryIds: Array(articleIdChunk)) + let encoder = JSONEncoder() + let data = try encoder.encode(body) + request.httpBody = data + } catch { + return DispatchQueue.main.async { + completion(.failure(error)) + } + } + + dispatchGroup.enter() + send(request: request, resultType: String.self, dateDecoding: .millisecondsSince1970, keyDecoding: .convertFromSnakeCase) { result in + switch result { + case .success(let (httpResponse, _)): + if httpResponse.statusCode != 200 { + groupError = URLError(.cannotDecodeContentData) + } + case .failure(let error): + groupError = error + } + dispatchGroup.leave() } } - send(request: request, resultType: String.self, dateDecoding: .millisecondsSince1970, keyDecoding: .convertFromSnakeCase) { result in - switch result { - case .success(let (httpResponse, _)): - if httpResponse.statusCode == 200 { - completion(.success(())) - } else { - completion(.failure(URLError(.cannotDecodeContentData))) - } - case .failure(let error): - completion(.failure(error)) + dispatchGroup.notify(queue: .main) { + if let groupError = groupError { + completion(.failure(groupError)) + } else { + completion(.success(())) } } }