Fix lint issues.

This commit is contained in:
Brent Simmons 2025-01-22 22:20:08 -08:00
parent bbef99f2d3
commit 10f4351904
64 changed files with 506 additions and 545 deletions

View File

@ -25,7 +25,7 @@ protocol ArticleExtractorDelegate {
class ArticleExtractor { class ArticleExtractor {
private var dataTask: URLSessionDataTask? = nil private var dataTask: URLSessionDataTask?
var state: ArticleExtractorState! var state: ArticleExtractorState!
var article: ExtractedArticle? var article: ExtractedArticle?
@ -56,7 +56,7 @@ class ArticleExtractor {
state = .processing state = .processing
dataTask = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in dataTask = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
guard let self = self else { return } guard let self = self else { return }

View File

@ -230,8 +230,7 @@ private extension ArticleRenderer {
components.path = article.articleID components.path = article.articleID
if let imageIconURLString = components.string { if let imageIconURLString = components.string {
d["avatar_src"] = imageIconURLString d["avatar_src"] = imageIconURLString
} } else {
else {
d["avatar_src"] = "" d["avatar_src"] = ""
} }
@ -283,27 +282,22 @@ private extension ArticleRenderer {
} }
isFirstAuthor = false isFirstAuthor = false
var authorEmailAddress: String? = nil var authorEmailAddress: String?
if let emailAddress = author.emailAddress, !(emailAddress.contains("noreply@") || emailAddress.contains("no-reply@")) { if let emailAddress = author.emailAddress, !(emailAddress.contains("noreply@") || emailAddress.contains("no-reply@")) {
authorEmailAddress = emailAddress authorEmailAddress = emailAddress
} }
if let emailAddress = authorEmailAddress, emailAddress.contains(" ") { if let emailAddress = authorEmailAddress, emailAddress.contains(" ") {
byline += emailAddress // probably name plus email address byline += emailAddress // probably name plus email address
} } else if let name = author.name, let url = author.url {
else if let name = author.name, let url = author.url {
byline += name.htmlByAddingLink(url) byline += name.htmlByAddingLink(url)
} } else if let name = author.name, let emailAddress = authorEmailAddress {
else if let name = author.name, let emailAddress = authorEmailAddress {
byline += "\(name) <\(emailAddress)>" byline += "\(name) <\(emailAddress)>"
} } else if let name = author.name {
else if let name = author.name {
byline += name byline += name
} } else if let emailAddress = authorEmailAddress {
else if let emailAddress = authorEmailAddress {
byline += "<\(emailAddress)>" // TODO: mailto link byline += "<\(emailAddress)>" // TODO: mailto link
} } else if let url = author.url {
else if let url = author.url {
byline += String.htmlWithLink(url) byline += String.htmlWithLink(url)
} }
} }
@ -355,4 +349,3 @@ private extension Article {
return url return url
} }
} }

View File

@ -32,7 +32,6 @@ public class ArticleThemeDownloader {
NotificationCenter.default.post(name: .didEndDownloadingTheme, object: nil, userInfo: ["url": unzippedFileLocation]) NotificationCenter.default.post(name: .didEndDownloadingTheme, object: nil, userInfo: ["url": unzippedFileLocation])
} }
/// Creates `Application Support/NetNewsWire/Downloads` if needed. /// Creates `Application Support/NetNewsWire/Downloads` if needed.
private func createDownloadDirectoryIfRequired() { private func createDownloadDirectoryIfRequired() {
try? FileManager.default.createDirectory(at: downloadDirectory(), withIntermediateDirectories: true, attributes: nil) try? FileManager.default.createDirectory(at: downloadDirectory(), withIntermediateDirectories: true, attributes: nil)
@ -68,7 +67,6 @@ public class ArticleThemeDownloader {
} }
} }
/// Performs a deep search of the unzipped directory to find the theme file. /// Performs a deep search of the unzipped directory to find the theme file.
/// - Parameter searchPath: directory to search /// - Parameter searchPath: directory to search
/// - Returns: optional `String` /// - Returns: optional `String`

View File

@ -20,11 +20,11 @@ final class DeleteCommand: UndoableCommand {
var redoActionName: String { var redoActionName: String {
return undoActionName return undoActionName
} }
let errorHandler: (Error) -> () let errorHandler: (Error) -> Void
private let itemSpecifiers: [SidebarItemSpecifier] private let itemSpecifiers: [SidebarItemSpecifier]
init?(nodesToDelete: [Node], treeController: TreeController? = nil, undoManager: UndoManager, errorHandler: @escaping (Error) -> ()) { init?(nodesToDelete: [Node], treeController: TreeController? = nil, undoManager: UndoManager, errorHandler: @escaping (Error) -> Void) {
guard DeleteCommand.canDelete(nodesToDelete) else { guard DeleteCommand.canDelete(nodesToDelete) else {
return nil return nil
@ -50,7 +50,7 @@ final class DeleteCommand: UndoableCommand {
let group = DispatchGroup() let group = DispatchGroup()
for itemSpecifier in itemSpecifiers { for itemSpecifier in itemSpecifiers {
group.enter() group.enter()
itemSpecifier.delete() { itemSpecifier.delete {
group.leave() group.leave()
} }
} }
@ -101,7 +101,7 @@ private struct SidebarItemSpecifier {
private let folder: Folder? private let folder: Folder?
private let feed: Feed? private let feed: Feed?
private let path: ContainerPath private let path: ContainerPath
private let errorHandler: (Error) -> () private let errorHandler: (Error) -> Void
private var container: Container? { private var container: Container? {
if let parentFolder = parentFolder { if let parentFolder = parentFolder {
@ -113,7 +113,7 @@ private struct SidebarItemSpecifier {
return nil return nil
} }
init?(node: Node, errorHandler: @escaping (Error) -> ()) { init?(node: Node, errorHandler: @escaping (Error) -> Void) {
var account: Account? var account: Account?
@ -123,13 +123,11 @@ private struct SidebarItemSpecifier {
self.feed = feed self.feed = feed
self.folder = nil self.folder = nil
account = feed.account account = feed.account
} } else if let folder = node.representedObject as? Folder {
else if let folder = node.representedObject as? Folder {
self.feed = nil self.feed = nil
self.folder = folder self.folder = folder
account = folder.account account = folder.account
} } else {
else {
return nil return nil
} }
if account == nil { if account == nil {
@ -175,8 +173,7 @@ private struct SidebarItemSpecifier {
if let _ = feed { if let _ = feed {
restoreFeed() restoreFeed()
} } else if let _ = folder {
else if let _ = folder {
restoreFolder() restoreFolder()
} }
} }
@ -246,8 +243,7 @@ private extension Node {
while nomad != nil { while nomad != nil {
if let folder = nomad!.representedObject as? Folder { if let folder = nomad!.representedObject as? Folder {
folders += [folder] folders += [folder]
} } else {
else {
break break
} }
nomad = nomad!.parent nomad = nomad!.parent
@ -274,11 +270,9 @@ private struct DeleteActionName {
for node in nodes { for node in nodes {
if let _ = node.representedObject as? Feed { if let _ = node.representedObject as? Feed {
numberOfFeeds += 1 numberOfFeeds += 1
} } else if let _ = node.representedObject as? Folder {
else if let _ = node.representedObject as? Folder {
numberOfFolders += 1 numberOfFolders += 1
} } else {
else {
return nil // Delete only Feeds and Folders. return nil // Delete only Feeds and Folders.
} }
} }

View File

@ -20,7 +20,7 @@ final class MarkStatusCommand: UndoableCommand {
let undoManager: UndoManager let undoManager: UndoManager
let flag: Bool let flag: Bool
let statusKey: ArticleStatus.Key let statusKey: ArticleStatus.Key
var completion: (() -> Void)? = nil var completion: (() -> Void)?
init?(initialArticles: [Article], statusKey: ArticleStatus.Key, flag: Bool, undoManager: UndoManager, completion: (() -> Void)? = nil) { init?(initialArticles: [Article], statusKey: ArticleStatus.Key, flag: Bool, undoManager: UndoManager, completion: (() -> Void)? = nil) {

View File

@ -57,7 +57,7 @@ private extension SendToMarsEditCommand {
let authorName = article.authors?.first?.name let authorName = article.authors?.first?.name
let sender = SendToBlogEditorApp(targetDescriptor: targetDescriptor, title: article.title, body: body, summary: article.summary, link: article.externalLink, permalink: article.link, subject: nil, creator: authorName, commentsURL: nil, guid: article.uniqueID, sourceName: article.feed?.nameForDisplay, sourceHomeURL: article.feed?.homePageURL, sourceFeedURL: article.feed?.url) let sender = SendToBlogEditorApp(targetDescriptor: targetDescriptor, title: article.title, body: body, summary: article.summary, link: article.externalLink, permalink: article.link, subject: nil, creator: authorName, commentsURL: nil, guid: article.uniqueID, sourceName: article.feed?.nameForDisplay, sourceHomeURL: article.feed?.homePageURL, sourceFeedURL: article.feed?.url)
let _ = sender.send() sender.send()
} }
func appToUse() -> UserApp? { func appToUse() -> UserApp? {

View File

@ -116,4 +116,3 @@ struct ArticleStringFormatter {
return dateFormatter.string(from: date) return dateFormatter.string(from: date)
} }
} }

View File

@ -161,24 +161,20 @@ extension Article {
} }
isFirstAuthor = false isFirstAuthor = false
var authorEmailAddress: String? = nil var authorEmailAddress: String?
if let emailAddress = author.emailAddress, !(emailAddress.contains("noreply@") || emailAddress.contains("no-reply@")) { if let emailAddress = author.emailAddress, !(emailAddress.contains("noreply@") || emailAddress.contains("no-reply@")) {
authorEmailAddress = emailAddress authorEmailAddress = emailAddress
} }
if let emailAddress = authorEmailAddress, emailAddress.contains(" ") { if let emailAddress = authorEmailAddress, emailAddress.contains(" ") {
byline += emailAddress // probably name plus email address byline += emailAddress // probably name plus email address
} } else if let name = author.name, let emailAddress = authorEmailAddress {
else if let name = author.name, let emailAddress = authorEmailAddress {
byline += "\(name) <\(emailAddress)>" byline += "\(name) <\(emailAddress)>"
} } else if let name = author.name {
else if let name = author.name {
byline += name byline += name
} } else if let emailAddress = authorEmailAddress {
else if let emailAddress = authorEmailAddress {
byline += "<\(emailAddress)>" byline += "<\(emailAddress)>"
} } else if let url = author.url {
else if let url = author.url {
byline += url byline += url
} }
} }

View File

@ -60,7 +60,7 @@ final class IconImage {
} }
#endif #endif
fileprivate enum ImageLuminanceType { private enum ImageLuminanceType {
case regular, bright, dark case regular, bright, dark
} }
@ -161,7 +161,6 @@ extension CGImage {
} }
enum IconSize: Int, CaseIterable { enum IconSize: Int, CaseIterable {
case small = 1 case small = 1
case medium = 2 case medium = 2

View File

@ -40,7 +40,7 @@ extension NSAttributedString {
let baseDescriptor = baseFont.fontDescriptor let baseDescriptor = baseFont.fontDescriptor
let baseSymbolicTraits = baseDescriptor.symbolicTraits let baseSymbolicTraits = baseDescriptor.symbolicTraits
mutable.enumerateAttribute(.font, in: fullRange, options: []) { (font: Any?, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) in mutable.enumerateAttribute(.font, in: fullRange, options: []) { (font: Any?, range: NSRange, _: UnsafeMutablePointer<ObjCBool>) in
guard let font = font as? Font else { return } guard let font = font as? Font else { return }
let currentDescriptor = font.fontDescriptor let currentDescriptor = font.fontDescriptor
@ -186,20 +186,19 @@ extension NSAttributedString {
} else { } else {
if char == "&" { if char == "&" {
var entity = "&" var entity = "&"
var lastchar: Character? = nil var lastchar: Character?
while let entitychar = iterator.next() { while let entitychar = iterator.next() {
if entitychar.isWhitespace { if entitychar.isWhitespace {
lastchar = entitychar lastchar = entitychar
break; break
} }
entity.append(entitychar) entity.append(entitychar)
if (entitychar == ";") { break } if entitychar == ";" { break }
} }
result.mutableString.append(entity.decodedEntity) result.mutableString.append(entity.decodedEntity)
if let lastchar = lastchar { result.mutableString.append(String(lastchar)) } if let lastchar = lastchar { result.mutableString.append(String(lastchar)) }

View File

@ -63,5 +63,3 @@ private extension Node {
} }
} }
} }

View File

@ -13,8 +13,6 @@ import AppKit
import UIKit import UIKit
#endif #endif
import RSCore
extension RSImage { extension RSImage {
static let maxIconSize = 48 static let maxIconSize = 48

View File

@ -169,7 +169,7 @@ final class FaviconDownloader {
self.currentHomePageHasOnlyFaviconICO = faviconURLs.count == 1 self.currentHomePageHasOnlyFaviconICO = faviconURLs.count == 1
if let firstIconURL = faviconURLs.first { if let firstIconURL = faviconURLs.first {
let _ = self.favicon(with: firstIconURL, homePageURL: url) _ = self.favicon(with: firstIconURL, homePageURL: url)
self.remainingFaviconURLs[url] = faviconURLs.dropFirst() self.remainingFaviconURLs[url] = faviconURLs.dropFirst()
} }
} }
@ -196,8 +196,8 @@ final class FaviconDownloader {
guard let _ = singleFaviconDownloader.iconImage else { guard let _ = singleFaviconDownloader.iconImage else {
if let faviconURLs = remainingFaviconURLs[homePageURL] { if let faviconURLs = remainingFaviconURLs[homePageURL] {
if let nextIconURL = faviconURLs.first { if let nextIconURL = faviconURLs.first {
let _ = favicon(with: nextIconURL, homePageURL: singleFaviconDownloader.homePageURL) _ = favicon(with: nextIconURL, homePageURL: singleFaviconDownloader.homePageURL)
remainingFaviconURLs[homePageURL] = faviconURLs.dropFirst(); remainingFaviconURLs[homePageURL] = faviconURLs.dropFirst()
} else { } else {
remainingFaviconURLs[homePageURL] = nil remainingFaviconURLs[homePageURL] = nil

View File

@ -127,8 +127,7 @@ private extension SingleFaviconDownloader {
DispatchQueue.main.async { DispatchQueue.main.async {
self.diskStatus = .onDisk self.diskStatus = .onDisk
} }
} } catch {}
catch {}
} }
} }

View File

@ -44,8 +44,7 @@ final class AuthorAvatarDownloader {
if let imageData = imageDownloader.image(for: avatarURL) { if let imageData = imageDownloader.image(for: avatarURL) {
scaleAndCacheImageData(imageData, avatarURL) scaleAndCacheImageData(imageData, avatarURL)
} } else {
else {
waitingForAvatarURLs.insert(avatarURL) waitingForAvatarURLs.insert(avatarURL)
} }

View File

@ -17,7 +17,7 @@ extension HTMLMetadata {
return nil return nil
} }
var bestImage: HTMLMetadataAppleTouchIcon? = nil var bestImage: HTMLMetadataAppleTouchIcon?
for image in icons { for image in icons {
if let size = image.size { if let size = image.size {
@ -31,7 +31,7 @@ extension HTMLMetadata {
} }
if let size = image.size, let bestImageSize = bestImage!.size { if let size = image.size, let bestImageSize = bestImage!.size {
if size.height > bestImageSize.height && size.width > bestImageSize.width { if size.height > bestImageSize.height && size.width > bestImageSize.width {
bestImage = image; bestImage = image
} }
} }
} }

View File

@ -31,4 +31,3 @@ struct ImageUtilities {
return false return false
} }
} }

View File

@ -14,8 +14,7 @@ struct DefaultFeedsImporter {
static func importDefaultFeeds(account: Account) { static func importDefaultFeeds(account: Account) {
let defaultFeedsURL = Bundle.main.url(forResource: "DefaultFeeds", withExtension: "opml")! let defaultFeedsURL = Bundle.main.url(forResource: "DefaultFeeds", withExtension: "opml")!
AccountManager.shared.defaultAccount.importOPML(defaultFeedsURL) { result in } AccountManager.shared.defaultAccount.importOPML(defaultFeedsURL) { _ in }
} }
} }

View File

@ -45,7 +45,7 @@ final class ExtensionContainersFile {
let errorPointer: NSErrorPointer = nil let errorPointer: NSErrorPointer = nil
let fileCoordinator = NSFileCoordinator() let fileCoordinator = NSFileCoordinator()
let fileURL = URL(fileURLWithPath: ExtensionContainersFile.filePath) let fileURL = URL(fileURLWithPath: ExtensionContainersFile.filePath)
var extensionContainers: ExtensionContainers? = nil var extensionContainers: ExtensionContainers?
fileCoordinator.coordinate(readingItemAt: fileURL, options: [], error: errorPointer, byAccessor: { readURL in fileCoordinator.coordinate(readingItemAt: fileURL, options: [], error: errorPointer, byAccessor: { readURL in
if let fileData = try? Data(contentsOf: readURL) { if let fileData = try? Data(contentsOf: readURL) {

View File

@ -105,7 +105,7 @@ private extension ExtensionFeedAddRequestFile {
let fileCoordinator = NSFileCoordinator(filePresenter: self) let fileCoordinator = NSFileCoordinator(filePresenter: self)
let fileURL = URL(fileURLWithPath: ExtensionFeedAddRequestFile.filePath) let fileURL = URL(fileURLWithPath: ExtensionFeedAddRequestFile.filePath)
var requests: [ExtensionFeedAddRequest]? = nil var requests: [ExtensionFeedAddRequest]?
fileCoordinator.coordinate(writingItemAt: fileURL, options: [.forMerging], error: errorPointer, byAccessor: { url in fileCoordinator.coordinate(writingItemAt: fileURL, options: [.forMerging], error: errorPointer, byAccessor: { url in
do { do {
@ -135,7 +135,7 @@ private extension ExtensionFeedAddRequestFile {
} }
func processRequest(_ request: ExtensionFeedAddRequest) { func processRequest(_ request: ExtensionFeedAddRequest) {
var destinationAccountID: String? = nil var destinationAccountID: String?
switch request.destinationContainerID { switch request.destinationContainerID {
case .account(let accountID): case .account(let accountID):
destinationAccountID = accountID destinationAccountID = accountID
@ -149,7 +149,7 @@ private extension ExtensionFeedAddRequestFile {
return return
} }
var destinationContainer: Container? = nil var destinationContainer: Container?
if account.containerID == request.destinationContainerID { if account.containerID == request.destinationContainerID {
destinationContainer = account destinationContainer = account
} else { } else {

View File

@ -36,4 +36,3 @@ struct SearchFeedDelegate: SmartFeedDelegate {
// TODO: after 5.0 // TODO: after 5.0
} }
} }

View File

@ -14,7 +14,7 @@ import Account
final class SmartFeed: PseudoFeed { final class SmartFeed: PseudoFeed {
var account: Account? = nil var account: Account?
public var defaultReadFilterType: ReadFilterType { public var defaultReadFilterType: ReadFilterType {
return .none return .none

View File

@ -40,4 +40,3 @@ import RSCore
return plist return plist
} }
} }

View File

@ -28,4 +28,3 @@ struct TodayFeedDelegate: SmartFeedDelegate {
account.fetchUnreadCountForToday(completion) account.fetchUnreadCountForToday(completion)
} }
} }

View File

@ -20,7 +20,7 @@ import ArticlesDatabase
final class UnreadFeed: PseudoFeed { final class UnreadFeed: PseudoFeed {
var account: Account? = nil var account: Account?
public var defaultReadFilterType: ReadFilterType { public var defaultReadFilterType: ReadFilterType {
return .alwaysRead return .alwaysRead

View File

@ -23,10 +23,10 @@ extension Array where Element == Article {
func orderedRowIndexes(fromIndex startIndex: Int, wrappingToTop wrapping: Bool) -> [Int] { func orderedRowIndexes(fromIndex startIndex: Int, wrappingToTop wrapping: Bool) -> [Int] {
if startIndex >= self.count { if startIndex >= self.count {
// Wrap around to the top if specified // Wrap around to the top if specified
return wrapping ? Array<Int>(0..<self.count) : [] return wrapping ? [Int](0..<self.count) : []
} else { } else {
// Start at the selection and wrap around to the beginning // Start at the selection and wrap around to the beginning
return Array<Int>(startIndex..<self.count) + (wrapping ? Array<Int>(0..<startIndex) : []) return [Int](startIndex..<self.count) + (wrapping ? [Int](0..<startIndex) : [])
} }
} }
func rowOfNextUnreadArticle(_ selectedRow: Int, wrappingToTop wrapping: Bool) -> Int? { func rowOfNextUnreadArticle(_ selectedRow: Int, wrappingToTop wrapping: Bool) -> Int? {
@ -130,4 +130,3 @@ extension Array where Element == Article {
} }
} }

View File

@ -96,4 +96,3 @@ final class FetchRequestOperation {
} }
} }
} }

View File

@ -13,7 +13,7 @@ import Foundation
final class FetchRequestQueue { final class FetchRequestQueue {
private var pendingRequests = [FetchRequestOperation]() private var pendingRequests = [FetchRequestOperation]()
private var currentRequest: FetchRequestOperation? = nil private var currentRequest: FetchRequestOperation?
var isAnyCurrentRequest: Bool { var isAnyCurrentRequest: Bool {
if let currentRequest = currentRequest { if let currentRequest = currentRequest {

View File

@ -30,4 +30,3 @@ struct LatestArticle: Codable, Identifiable {
let pubDate: String let pubDate: String
} }

View File

@ -14,7 +14,6 @@ import RSCore
import Articles import Articles
import Account import Account
public final class WidgetDataEncoder { public final class WidgetDataEncoder {
private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application") private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "Application")
@ -40,7 +39,7 @@ public final class WidgetDataEncoder {
os_log(.debug, log: log, "Starting encoding widget data.") os_log(.debug, log: log, "Starting encoding widget data.")
DispatchQueue.main.async { DispatchQueue.main.async {
self.encodeWidgetData() { latestData in self.encodeWidgetData { latestData in
guard let latestData = latestData else { guard let latestData = latestData else {
self.isRunning = false self.isRunning = false
return return
@ -67,7 +66,7 @@ public final class WidgetDataEncoder {
private func encodeWidgetData(completion: @escaping (WidgetData?) -> Void) { private func encodeWidgetData(completion: @escaping (WidgetData?) -> Void) {
let dispatchGroup = DispatchGroup() let dispatchGroup = DispatchGroup()
var groupError: Error? = nil var groupError: Error?
var unread = [LatestArticle]() var unread = [LatestArticle]()
@ -178,5 +177,3 @@ public final class WidgetDataEncoder {
} }
} }