mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Mark classes as final that can be marked as final.
This commit is contained in:
@@ -13,7 +13,7 @@ import CloudKit
|
||||
import RSCore
|
||||
import Articles
|
||||
|
||||
class CloudKitAcountZoneDelegate: CloudKitZoneDelegate {
|
||||
final class CloudKitAcountZoneDelegate: CloudKitZoneDelegate {
|
||||
|
||||
struct UnclaimedFeed {
|
||||
let url: URL
|
||||
|
||||
@@ -16,7 +16,7 @@ import SyncDatabase
|
||||
import Articles
|
||||
import ArticlesDatabase
|
||||
|
||||
class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate {
|
||||
final class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate {
|
||||
|
||||
private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import Foundation
|
||||
import os.log
|
||||
import RSCore
|
||||
|
||||
class CloudKitReceiveStatusOperation: MainThreadOperation {
|
||||
final class CloudKitReceiveStatusOperation: MainThreadOperation {
|
||||
|
||||
private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import Foundation
|
||||
import os.log
|
||||
import RSCore
|
||||
|
||||
class CloudKitRemoteNotificationOperation: MainThreadOperation {
|
||||
final class CloudKitRemoteNotificationOperation: MainThreadOperation {
|
||||
|
||||
private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import RSCore
|
||||
import RSWeb
|
||||
import SyncDatabase
|
||||
|
||||
class CloudKitSendStatusOperation: MainThreadOperation {
|
||||
final class CloudKitSendStatusOperation: MainThreadOperation {
|
||||
|
||||
private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
|
||||
private let blockSize = 150
|
||||
|
||||
@@ -11,7 +11,7 @@ import Parser
|
||||
import RSWeb
|
||||
import RSCore
|
||||
|
||||
class FeedFinder {
|
||||
final class FeedFinder {
|
||||
|
||||
static func find(url: URL, completion: @escaping (Result<Set<FeedSpecifier>, Error>) -> Void) {
|
||||
Downloader.shared.download(url) { (data, response, error) in
|
||||
|
||||
@@ -11,7 +11,7 @@ import Parser
|
||||
|
||||
private let feedURLWordsToMatch = ["feed", "xml", "rss", "atom", "json"]
|
||||
|
||||
class HTMLFeedFinder {
|
||||
final class HTMLFeedFinder {
|
||||
|
||||
var feedSpecifiers: Set<FeedSpecifier> {
|
||||
return Set(feedSpecifiersDictionary.values)
|
||||
|
||||
@@ -12,7 +12,7 @@ import RSWeb
|
||||
import RSCore
|
||||
import Secrets
|
||||
|
||||
class FeedlyAddExistingFeedOperation: FeedlyOperation, FeedlyOperationDelegate, FeedlyCheckpointOperationDelegate {
|
||||
final class FeedlyAddExistingFeedOperation: FeedlyOperation, FeedlyOperationDelegate, FeedlyCheckpointOperationDelegate {
|
||||
|
||||
private let operationQueue = MainThreadOperationQueue()
|
||||
var addCompletionHandler: ((Result<Void, Error>) -> Void)?
|
||||
|
||||
@@ -13,7 +13,7 @@ import RSWeb
|
||||
import RSCore
|
||||
import Secrets
|
||||
|
||||
class FeedlyAddNewFeedOperation: FeedlyOperation, FeedlyOperationDelegate, FeedlySearchOperationDelegate, FeedlyCheckpointOperationDelegate {
|
||||
final class FeedlyAddNewFeedOperation: FeedlyOperation, FeedlyOperationDelegate, FeedlySearchOperationDelegate, FeedlyCheckpointOperationDelegate {
|
||||
|
||||
private let operationQueue = MainThreadOperationQueue()
|
||||
private let folder: Folder
|
||||
|
||||
@@ -11,7 +11,7 @@ import os.log
|
||||
import RSCore
|
||||
import RSWeb
|
||||
|
||||
class FeedlyDownloadArticlesOperation: FeedlyOperation {
|
||||
final class FeedlyDownloadArticlesOperation: FeedlyOperation {
|
||||
|
||||
private let account: Account
|
||||
private let log: OSLog
|
||||
|
||||
@@ -14,7 +14,7 @@ import Secrets
|
||||
///
|
||||
/// Typically, it pages through the article ids of the global.all stream.
|
||||
/// When all the article ids are collected, it is the responsibility of another operation to download them when appropriate.
|
||||
class FeedlyGetUpdatedArticleIdsOperation: FeedlyOperation, FeedlyEntryIdentifierProviding {
|
||||
final class FeedlyGetUpdatedArticleIdsOperation: FeedlyOperation, FeedlyEntryIdentifierProviding {
|
||||
|
||||
private let account: Account
|
||||
private let resource: FeedlyResourceId
|
||||
|
||||
@@ -15,7 +15,7 @@ import Secrets
|
||||
/// Typically, it pages through the article ids of the global.all stream.
|
||||
/// As the article ids are collected, a default read status is created for each.
|
||||
/// So this operation has side effects *for the entire account* it operates on.
|
||||
class FeedlyIngestStreamArticleIdsOperation: FeedlyOperation {
|
||||
final class FeedlyIngestStreamArticleIdsOperation: FeedlyOperation {
|
||||
|
||||
private let account: Account
|
||||
private let resource: FeedlyResourceId
|
||||
|
||||
@@ -18,7 +18,7 @@ protocol FeedlySearchOperationDelegate: AnyObject {
|
||||
|
||||
/// Find one and only one feed for a given query (usually, a URL).
|
||||
/// What happens when a feed is found for the URL is delegated to the `searchDelegate`.
|
||||
class FeedlySearchOperation: FeedlyOperation {
|
||||
final class FeedlySearchOperation: FeedlyOperation {
|
||||
|
||||
let query: String
|
||||
let locale: Locale
|
||||
|
||||
@@ -11,7 +11,7 @@ import RSWeb
|
||||
@testable import Account
|
||||
import Secrets
|
||||
|
||||
class AccountCredentialsTest: XCTestCase {
|
||||
final class AccountCredentialsTest: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class AccountFeedbinFolderContentsSyncTest: XCTestCase {
|
||||
final class AccountFeedbinFolderContentsSyncTest: XCTestCase {
|
||||
|
||||
override func setUp() {
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class AccountFeedbinFolderSyncTest: XCTestCase {
|
||||
final class AccountFeedbinFolderSyncTest: XCTestCase {
|
||||
|
||||
override func setUp() {
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class AccountFeedbinSyncTest: XCTestCase {
|
||||
final class AccountFeedbinSyncTest: XCTestCase {
|
||||
|
||||
override func setUp() {
|
||||
}
|
||||
|
||||
@@ -10,9 +10,9 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlyCheckpointOperationTests: XCTestCase {
|
||||
final class FeedlyCheckpointOperationTests: XCTestCase {
|
||||
|
||||
class TestDelegate: FeedlyCheckpointOperationDelegate {
|
||||
final class TestDelegate: FeedlyCheckpointOperationDelegate {
|
||||
|
||||
var didReachCheckpointExpectation: XCTestExpectation?
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class FeedlyCollectionParserTests: XCTestCase {
|
||||
final class FeedlyCollectionParserTests: XCTestCase {
|
||||
|
||||
func testParsing() {
|
||||
let collection = FeedlyCollection(feeds: [], label: "Test Collection", id: "test/collection/1")
|
||||
|
||||
@@ -10,7 +10,7 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlyCreateFeedsForCollectionFoldersOperationTests: XCTestCase {
|
||||
final class FeedlyCreateFeedsForCollectionFoldersOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
@@ -27,7 +27,7 @@ class FeedlyCreateFeedsForCollectionFoldersOperationTests: XCTestCase {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
class FeedsAndFoldersProvider: FeedlyFeedsAndFoldersProviding {
|
||||
final class FeedsAndFoldersProvider: FeedlyFeedsAndFoldersProviding {
|
||||
var feedsAndFolders = [([FeedlyFeed], Folder)]()
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class FeedlyEntryParserTests: XCTestCase {
|
||||
final class FeedlyEntryParserTests: XCTestCase {
|
||||
|
||||
func testParsing() {
|
||||
let content = FeedlyEntry.Content(content: "Test Content", direction: .leftToRight)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class FeedlyFeedParserTests: XCTestCase {
|
||||
final class FeedlyFeedParserTests: XCTestCase {
|
||||
|
||||
func testParsing() {
|
||||
let name = "Test Feed"
|
||||
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
import os.log
|
||||
import RSCore
|
||||
|
||||
class FeedlyGetCollectionsOperationTests: XCTestCase {
|
||||
final class FeedlyGetCollectionsOperationTests: XCTestCase {
|
||||
|
||||
func testGetCollections() {
|
||||
let support = FeedlyTestSupport()
|
||||
@@ -58,7 +58,7 @@ class FeedlyGetCollectionsOperationTests: XCTestCase {
|
||||
|
||||
func testGetCollectionsError() {
|
||||
|
||||
class TestDelegate: FeedlyOperationDelegate {
|
||||
final class TestDelegate: FeedlyOperationDelegate {
|
||||
var errorExpectation: XCTestExpectation?
|
||||
var error: Error?
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlyGetStreamContentsOperationTests: XCTestCase {
|
||||
final class FeedlyGetStreamContentsOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
|
||||
@@ -10,7 +10,7 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlyGetStreamIdsOperationTests: XCTestCase {
|
||||
final class FeedlyGetStreamIdsOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
import RSCore
|
||||
import Secrets
|
||||
|
||||
class FeedlyLogoutOperationTests: XCTestCase {
|
||||
final class FeedlyLogoutOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
@@ -36,7 +36,7 @@ class FeedlyLogoutOperationTests: XCTestCase {
|
||||
return (accessToken, refreshToken)
|
||||
}
|
||||
|
||||
class TestFeedlyLogoutService: FeedlyLogoutService {
|
||||
final class TestFeedlyLogoutService: FeedlyLogoutService {
|
||||
var mockResult: Result<Void, Error>?
|
||||
var logoutExpectation: XCTestExpectation?
|
||||
|
||||
@@ -123,7 +123,7 @@ class FeedlyLogoutOperationTests: XCTestCase {
|
||||
}
|
||||
}
|
||||
|
||||
class TestLogoutDelegate: FeedlyOperationDelegate {
|
||||
final class TestLogoutDelegate: FeedlyOperationDelegate {
|
||||
var error: Error?
|
||||
var didFailExpectation: XCTestExpectation?
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlyMirrorCollectionsAsFoldersOperationTests: XCTestCase {
|
||||
final class FeedlyMirrorCollectionsAsFoldersOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
@@ -27,7 +27,7 @@ class FeedlyMirrorCollectionsAsFoldersOperationTests: XCTestCase {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
class CollectionsProvider: FeedlyCollectionProviding {
|
||||
final class CollectionsProvider: FeedlyCollectionProviding {
|
||||
var collections = [
|
||||
FeedlyCollection(feeds: [], label: "One", id: "collections/1"),
|
||||
FeedlyCollection(feeds: [], label: "Two", id: "collections/2")
|
||||
@@ -105,7 +105,7 @@ class FeedlyMirrorCollectionsAsFoldersOperationTests: XCTestCase {
|
||||
XCTAssertTrue(removeFolders.feedsAndFolders.isEmpty)
|
||||
}
|
||||
|
||||
class CollectionsAndFeedsProvider: FeedlyCollectionProviding {
|
||||
final class CollectionsAndFeedsProvider: FeedlyCollectionProviding {
|
||||
var feedsForCollectionOne = [
|
||||
FeedlyFeed(id: "feed/1", title: "Feed One", updated: nil, website: nil),
|
||||
FeedlyFeed(id: "feed/2", title: "Feed Two", updated: nil, website: nil)
|
||||
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
import RSWeb
|
||||
import RSCore
|
||||
|
||||
class FeedlyOperationTests: XCTestCase {
|
||||
final class FeedlyOperationTests: XCTestCase {
|
||||
|
||||
enum TestOperationError: Error, Equatable {
|
||||
case mockError
|
||||
|
||||
@@ -11,7 +11,7 @@ import XCTest
|
||||
import Parser
|
||||
import RSCore
|
||||
|
||||
class FeedlyOrganiseParsedItemsByFeedOperationTests: XCTestCase {
|
||||
final class FeedlyOrganiseParsedItemsByFeedOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
|
||||
@@ -12,7 +12,7 @@ import RSWeb
|
||||
import RSCore
|
||||
import Secrets
|
||||
|
||||
class FeedlyRefreshAccessTokenOperationTests: XCTestCase {
|
||||
final class FeedlyRefreshAccessTokenOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
@@ -29,7 +29,7 @@ class FeedlyRefreshAccessTokenOperationTests: XCTestCase {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
class TestRefreshTokenService: OAuthAccessTokenRefreshing {
|
||||
final class TestRefreshTokenService: OAuthAccessTokenRefreshing {
|
||||
var mockResult: Result<OAuthAuthorizationGrant, Error>?
|
||||
var refreshAccessTokenExpectation: XCTestExpectation?
|
||||
var parameterTester: ((String, OAuthAuthorizationClient) -> Void)?
|
||||
@@ -71,7 +71,7 @@ class FeedlyRefreshAccessTokenOperationTests: XCTestCase {
|
||||
XCTAssertTrue(refresh.isCanceled)
|
||||
}
|
||||
|
||||
class TestRefreshTokenDelegate: FeedlyOperationDelegate {
|
||||
final class TestRefreshTokenDelegate: FeedlyOperationDelegate {
|
||||
var error: Error?
|
||||
var didFailExpectation: XCTestExpectation?
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class FeedlyResourceIdTests: XCTestCase {
|
||||
final class FeedlyResourceIdTests: XCTestCase {
|
||||
|
||||
func testFeedResourceId() {
|
||||
let expectedUrl = "http://ranchero.com/blog/atom.xml"
|
||||
|
||||
@@ -12,7 +12,7 @@ import SyncDatabase
|
||||
import Articles
|
||||
import RSCore
|
||||
|
||||
class FeedlySendArticleStatusesOperationTests: XCTestCase {
|
||||
final class FeedlySendArticleStatusesOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class FeedlyMockResponseProvider: TestTransportMockResponseProviding {
|
||||
final class FeedlyMockResponseProvider: TestTransportMockResponseProviding {
|
||||
|
||||
let subdirectory: String
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import XCTest
|
||||
@testable import Account
|
||||
import RSCore
|
||||
|
||||
class FeedlySyncStreamContentsOperationTests: XCTestCase {
|
||||
final class FeedlySyncStreamContentsOperationTests: XCTestCase {
|
||||
|
||||
private var account: Account!
|
||||
private let support = FeedlyTestSupport()
|
||||
|
||||
@@ -13,7 +13,7 @@ import Secrets
|
||||
import os.log
|
||||
import SyncDatabase
|
||||
|
||||
class FeedlyTestSupport {
|
||||
final class FeedlyTestSupport {
|
||||
var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "FeedlyTests")
|
||||
var accessToken = Credentials(type: .oauthAccessToken, username: "Test", secret: "t3st-access-tok3n")
|
||||
var refreshToken = Credentials(type: .oauthRefreshToken, username: "Test", secret: "t3st-refresh-tok3n")
|
||||
@@ -54,7 +54,7 @@ class FeedlyTestSupport {
|
||||
return TestDatabaseContainer()
|
||||
}
|
||||
|
||||
class TestDatabaseContainer {
|
||||
final class TestDatabaseContainer {
|
||||
private let path: String
|
||||
private(set) var database: SyncDatabase!
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class FeedlyTextSanitizationTests: XCTestCase {
|
||||
final class FeedlyTextSanitizationTests: XCTestCase {
|
||||
|
||||
func testRTLSanitization() {
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import Account
|
||||
|
||||
class TestMarkArticlesService: FeedlyMarkArticlesService {
|
||||
final class TestMarkArticlesService: FeedlyMarkArticlesService {
|
||||
|
||||
var didMarkExpectation: XCTestExpectation?
|
||||
var parameterTester: ((Set<String>, FeedlyMarkAction) -> Void)?
|
||||
|
||||
@@ -11,7 +11,7 @@ import RSWeb
|
||||
|
||||
@testable import Account
|
||||
|
||||
class TestAccountManager {
|
||||
final class TestAccountManager {
|
||||
|
||||
static let shared = TestAccountManager()
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#if os(macOS)
|
||||
import Cocoa
|
||||
|
||||
public class RSAppMovementMonitor: NSObject {
|
||||
public final class RSAppMovementMonitor: NSObject {
|
||||
|
||||
// If provided, the handler will be consulted when the app is moved.
|
||||
// Return true to indicate that the default handler should be invoked.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#if os(macOS)
|
||||
import AppKit
|
||||
|
||||
class RSDarkModeAdaptingToolbarButton: NSButton {
|
||||
final class RSDarkModeAdaptingToolbarButton: NSButton {
|
||||
// Clients probably should not bother using this class unless they want
|
||||
// to force the template in dark mode, but if you are using this in a more
|
||||
// general context where you want to control and/or override it on a
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#if os(macOS)
|
||||
import AppKit
|
||||
|
||||
public class RSToolbarItem: NSToolbarItem {
|
||||
public final class RSToolbarItem: NSToolbarItem {
|
||||
|
||||
override public func validate() {
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import RSCore
|
||||
|
||||
class MacroProcessorTests: XCTestCase {
|
||||
final class MacroProcessorTests: XCTestCase {
|
||||
let substitutions = ["one": "1", "two": "2"]
|
||||
|
||||
func testMacroProcessor() {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import RSCore
|
||||
|
||||
class MainThreadOperationTests: XCTestCase {
|
||||
final class MainThreadOperationTests: XCTestCase {
|
||||
|
||||
func testSingleOperation() {
|
||||
let queue = MainThreadOperationQueue()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
import XCTest
|
||||
|
||||
class StringRSCore: XCTestCase {
|
||||
final class StringRSCore: XCTestCase {
|
||||
|
||||
func testCollapsingWhitespace() {
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ public enum ReachabilityError: Error {
|
||||
case unableToGetFlags(Int32)
|
||||
}
|
||||
|
||||
public class Reachability {
|
||||
public final class Reachability {
|
||||
|
||||
/// Returns true if the internet is reachable.
|
||||
///
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
import XCTest
|
||||
|
||||
class DictionaryTests: XCTestCase {
|
||||
final class DictionaryTests: XCTestCase {
|
||||
|
||||
func testSimpleQueryString() {
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import XCTest
|
||||
@testable import RSWeb
|
||||
|
||||
class RSWebTests: XCTestCase {
|
||||
final class RSWebTests: XCTestCase {
|
||||
|
||||
func testExample() {
|
||||
// This is an example of a functional test case.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
import XCTest
|
||||
|
||||
class StringTests: XCTestCase {
|
||||
final class StringTests: XCTestCase {
|
||||
|
||||
func testHTMLEscaping() {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user