From c2ac173beb9e12086c48a6eb42b4a117c58ec76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Sun, 24 Nov 2024 13:14:38 +0100 Subject: [PATCH] Rely on SPM plugins to consume SwiftLint and SwiftFormat Use their latest releases and fix some violations and issues. --- .github/workflows/linting.yml | 45 --------------- .github/workflows/testing.yml | 3 +- .swiftformat | 13 ++++- .swiftlint.yml | 8 ++- pass.xcodeproj/project.pbxproj | 30 ++++++++-- .../xcshareddata/swiftpm/Package.resolved | 21 ++++++- pass/AppDelegate.swift | 2 +- .../AboutRepositoryTableViewController.swift | 2 +- .../BasicStaticTableViewController.swift | 5 -- pass/Controllers/KeyImporter.swift | 6 +- .../PGPKeyFIleImportTableViewController.swift | 1 + pass/Controllers/PGPKeyImporter.swift | 2 +- .../PasswordDetailTableViewController.swift | 2 +- ... SSHKeyURLImportTableViewController.swift} | 0 .../PasswordDetailTitleTableViewCell.swift | 10 ---- passKit/Helpers/DefaultsKeys.swift | 56 +++++++++---------- passKit/Parser/Parser.swift | 1 + passKitTests/Crypto/CryptoFrameworkTest.swift | 5 +- passKitTests/Crypto/PGPAgentTest.swift | 4 +- .../Extensions/Array+SlicesTest.swift | 2 +- .../Extensions/String+UtilitiesTest.swift | 2 +- passKitTests/Helpers/KeyFileManagerTest.swift | 2 +- passKitTests/Models/GitCredentialTest.swift | 2 +- passKitTests/Models/PasswordStoreTest.swift | 2 +- .../Models/PasswordTableEntryTest.swift | 2 +- passKitTests/Models/PasswordTest.swift | 2 +- passKitTests/Parser/AdditionFieldTest.swift | 2 +- passKitTests/Parser/ConstantsTest.swift | 2 +- passKitTests/Parser/OTPTypeTest.swift | 4 +- passKitTests/Parser/ParserTest.swift | 2 +- passKitTests/Parser/TokenBuilderTest.swift | 2 +- .../PasswordGeneratorFlavorTest.swift | 2 +- .../Passwords/PasswordGeneratorTest.swift | 2 +- passKitTests/Testbase/TestPGPKeys.swift | 2 +- passTests/Models/QRKeyScannerTest.swift | 2 +- passTests/Models/ScannableKeyTypeTest.swift | 2 +- scripts/swiftformat.sh | 25 --------- scripts/swiftlint.sh | 26 --------- 38 files changed, 122 insertions(+), 181 deletions(-) delete mode 100644 .github/workflows/linting.yml rename pass/Controllers/{SSHKeyURLImportTableViewController..swift => SSHKeyURLImportTableViewController.swift} (100%) delete mode 100755 scripts/swiftformat.sh delete mode 100755 scripts/swiftlint.sh diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml deleted file mode 100644 index 18a8bbe8..00000000 --- a/.github/workflows/linting.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Linting - -on: pull_request - -jobs: - swiftformat: - runs-on: macos-12 - steps: - - uses: actions/checkout@v3 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '2.7' - bundler-cache: true - - name: Installing packages - run: | - brew update - if brew ls --version swiftformat > /dev/null; then - brew upgrade swiftformat - else - brew install swiftformat - fi - - name: Formatting code - run: | - swiftformat --lint . - - swiftlint: - runs-on: macos-12 - steps: - - uses: actions/checkout@v3 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '2.7' - bundler-cache: true - - name: Installing packages - run: | - brew update - if brew ls --version swiftlint > /dev/null; then - brew upgrade swiftlint - else - # For some reason the SwiftLint binary is kept at its location after shutdown. - brew install swiftlint || brew link --overwrite swiftlint - fi - - name: Linting code - run: | - swiftlint --strict diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 379528e2..63968a4b 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,9 +14,8 @@ jobs: - name: Installing packages run: | brew update - brew install carthage swiftformat + brew install carthage brew install go || brew link --overwrite go - brew install swiftlint || brew link --overwrite swiftlint gem install bundler - uses: actions/cache@v3 id: carthage-cache diff --git a/.swiftformat b/.swiftformat index 88c88150..6bb5f80c 100644 --- a/.swiftformat +++ b/.swiftformat @@ -19,6 +19,7 @@ blankLinesAroundMark, \ blankLinesAtEndOfScope, \ blankLinesAtStartOfScope, \ + blankLinesBetweenChainedFunctions, \ # blankLinesBetweenImports, \ blankLinesBetweenScopes, \ blockComments, \ @@ -32,6 +33,7 @@ extensionAccessControl, \ fileHeader, \ # genericExtensions, \ + headerFileName, \ hoistPatternLet, \ indent, \ initCoderUnavailable, \ @@ -41,9 +43,11 @@ linebreaks, \ modifierOrder, \ # markTypes, \ + noExplicitOwnership, \ numberFormatting, \ # opaqueGenericParameters, \ # organizeDeclarations, \ +# preferForLoop, \ preferKeyPath, \ redundantBackticks, \ redundantBreak, \ @@ -52,6 +56,7 @@ redundantFileprivate, \ redundantGet, \ redundantInit, \ + redundantInternal, \ redundantLet, \ redundantLetError, \ redundantNilInit, \ @@ -62,11 +67,13 @@ redundantRawValues, \ redundantReturn, \ redundantSelf, \ + redundantStaticSelf, \ redundantType, \ redundantVoidReturnType, \ semicolons, \ - sortedImports, \ - sortedSwitchCases, \ + sortImports, \ + sortSwitchCases, \ + sortTypealiases, \ spaceAroundBraces, \ spaceAroundBrackets, \ spaceAroundComments, \ @@ -93,6 +100,8 @@ wrapAttributes, \ wrapConditionalBodies, \ # wrapEnumCases, \ + wrapLoopBodies, \ + wrapMultilineConditionalAssignment, \ # wrapMultilineStatementBraces, \ wrapSingleLineComments, \ # wrapSwitchCases, \ diff --git a/.swiftlint.yml b/.swiftlint.yml index 9ac39cff..5c9606b4 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -7,6 +7,7 @@ excluded: - go - Pods - vendor + - xcode ## Active rules @@ -15,8 +16,8 @@ opt_in_rules: disabled_rules: - anonymous_argument_in_multiline_closure - - anyobject_protocol # Deprecated. - balanced_xctest_lifecycle + - contrasted_opening_brace - discouraged_none_name - discouraged_object_literal - discouraged_optional_collection # Too many false positives in implementations of system protocols. @@ -40,10 +41,12 @@ disabled_rules: - legacy_objc_type - line_length - missing_docs + - no_empty_block # To be fixed later. - no_extension_access_modifier - no_grouping_extension - no_magic_numbers # Causes a lot of violations in tests. - number_separator # Contradicts with SwiftFormat rule 'decimalgrouping'. There are not many numbers anyway in the source code. + - one_declaration_per_file - prefer_nimble - prefixed_toplevel_constant # Violations are mostly in test code. - private_outlet @@ -66,6 +69,8 @@ attributes: closure_body_length: warning: 40 error: 60 +explicit_init: + include_bare_init: true identifier_name: excluded: ["id", "to", "Defaults"] allowed_symbols: ["_"] @@ -80,4 +85,3 @@ trailing_comma: xct_specific_matcher: matchers: - two-argument-asserts - diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 6fe21cb6..1fbe1c23 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -199,7 +199,7 @@ DC4914961E434301007FF592 /* LabelTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4914941E434301007FF592 /* LabelTableViewCell.swift */; }; DC4914991E434600007FF592 /* PasswordDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4914981E434600007FF592 /* PasswordDetailTableViewController.swift */; }; DC5F385B1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5F385A1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift */; }; - DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */; }; + DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */; }; DC917BD71E2E8231000FDF54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC917BD61E2E8231000FDF54 /* AppDelegate.swift */; }; DC917BDC1E2E8231000FDF54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC917BDA1E2E8231000FDF54 /* Main.storyboard */; }; DC917BDE1E2E8231000FDF54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC917BDD1E2E8231000FDF54 /* Assets.xcassets */; }; @@ -496,7 +496,7 @@ DC4914941E434301007FF592 /* LabelTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelTableViewCell.swift; sourceTree = ""; }; DC4914981E434600007FF592 /* PasswordDetailTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordDetailTableViewController.swift; sourceTree = ""; }; DC5F385A1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PGPKeyArmorImportTableViewController.swift; sourceTree = ""; }; - DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHKeyURLImportTableViewController..swift; sourceTree = ""; }; + DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHKeyURLImportTableViewController.swift; sourceTree = ""; }; DC917BD31E2E8231000FDF54 /* Pass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Pass.app; sourceTree = BUILT_PRODUCTS_DIR; }; DC917BD61E2E8231000FDF54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DC917BDB1E2E8231000FDF54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -982,7 +982,7 @@ DC037CA91E4B8EAE00609409 /* SpecialThanksTableViewController.swift */, DCC441531E916382008A90C4 /* SSHKeyArmorImportTableViewController.swift */, 30650E7023F82AF8005CCD5E /* SSHKeyFileImportTableViewController.swift */, - DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */, + DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */, ); path = Controllers; sourceTree = ""; @@ -1361,6 +1361,8 @@ 9A1F47F826E5CF4B000C0E01 /* XCRemoteSwiftPackageReference "OneTimePassword" */, 30ED1775276F8842009BA876 /* XCRemoteSwiftPackageReference "objective-git-swift-package" */, 9A2C7D802782CB2F00BD9AF3 /* XCRemoteSwiftPackageReference "yubikit-ios" */, + 307CA2312CF346D40099F6DE /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, + 307CA2322CF348260099F6DE /* XCRemoteSwiftPackageReference "SwiftFormat" */, ); productRefGroup = DC917BD41E2E8231000FDF54 /* Products */; projectDirPath = ""; @@ -1478,7 +1480,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ". \"${SRCROOT}/scripts/swiftformat.sh\"\n"; + shellScript = "SWIFT_PACKAGE_DIR=\"${BUILD_DIR%Build/*}SourcePackages/checkouts\"\nSWIFTFORMAT_CMD=\"$SWIFT_PACKAGE_DIR\"/SwiftFormat/CommandLineTool/swiftformat\n\nif [[ \"${CI}\" == \"true\" ]]; then\n echo \"Running in a Continuous Integration environment. Formatting is skipped.\"\n exit 0 \nfi\n\nif [[ \"${CONFIGURATION}\" == \"Release\" ]]; then\n echo \"Running during a release build. Formatting is skipped.\"\n exit 0\nfi\n\nif test -f \"$SWIFTFORMAT_CMD\" 2>&1\nthen\n \"$SWIFTFORMAT_CMD\" .\nelse\n echo \"warning: `swiftformat` command not found\"\nfi\n"; }; 308800C124EB0D3600E87ED3 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1497,7 +1499,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ". \"${SRCROOT}/scripts/swiftlint.sh\"\n"; + shellScript = "SWIFT_PACKAGE_DIR=\"${BUILD_DIR%Build/*}SourcePackages/artifacts\"\nSWIFTLINT_CMD=$(ls \"$SWIFT_PACKAGE_DIR\"/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/swiftlint-*/bin/swiftlint | head -n 1)\n\nSTRICT_OPT=\n\nif [[ \"${CI}\" == \"true\" ]]; then\n echo \"Running in a Continuous Integration environment. Linting is strictly.\"\n STRICT_OPT=--strict\nfi\n\nif [[ \"${CONFIGURATION}\" == \"Release\" ]]; then\n echo \"Running during a release build. Linting is skipped.\"\n exit 0\nfi\n\nif test -f \"$SWIFTLINT_CMD\" 2>&1\nthen\n \"$SWIFTLINT_CMD\" lint --fix\n \"$SWIFTLINT_CMD\" lint $STRICT_OPT\nelse\n echo \"warning: `swiftlint` command not found\"\nfi\n"; }; 9A996C4726DDEAF100A4485D /* Remove SPM Duplicate Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -1661,7 +1663,7 @@ DCC441541E916382008A90C4 /* SSHKeyArmorImportTableViewController.swift in Sources */, 306D970E24091CDD006C0E2E /* SwitchTableViewCell.swift in Sources */, A2A61C201EEFABAD00CFE063 /* UtilsExtension.swift in Sources */, - DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift in Sources */, + DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift in Sources */, DC30F83829BED4E2001EB12B /* PasswordGeneratorUISwitch.swift in Sources */, 9AFC87F025B514AD008D6060 /* PasswordDecryptor.swift in Sources */, 3066AD6823EE0D6500F65535 /* PGPKeyImporter.swift in Sources */, @@ -2846,6 +2848,22 @@ minimumVersion = 0.99.2; }; }; + 307CA2312CF346D40099F6DE /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.57.0; + }; + }; + 307CA2322CF348260099F6DE /* XCRemoteSwiftPackageReference "SwiftFormat" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/nicklockwood/SwiftFormat"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.55.2; + }; + }; 30A3000C26DA62F4002A734E /* XCRemoteSwiftPackageReference "Base32" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mattrubin/Base32"; diff --git a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8c99b560..46310dbb 100644 --- a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "cfd99fa2de57765d4ea0531870a48806df8e3971c39177b2ec90b24da2c77efb", "pins" : [ { "identity" : "base32", @@ -53,6 +54,24 @@ "revision" : "8d59e4abba762d0f1e9aed161081f7b3fe21daa0" } }, + { + "identity" : "swiftformat", + "kind" : "remoteSourceControl", + "location" : "https://github.com/nicklockwood/SwiftFormat", + "state" : { + "revision" : "eb55d16245567e99d18ea871a7609befc8210c46", + "version" : "0.55.2" + } + }, + { + "identity" : "swiftlintplugins", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SimplyDanny/SwiftLintPlugins.git", + "state" : { + "revision" : "7c80ce6f142164b0201871e580b021d1b2c69804", + "version" : "0.57.0" + } + }, { "identity" : "swiftyuserdefaults", "kind" : "remoteSourceControl", @@ -72,5 +91,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/pass/AppDelegate.swift b/pass/AppDelegate.swift index 40965f1d..cb762742 100644 --- a/pass/AppDelegate.swift +++ b/pass/AppDelegate.swift @@ -20,7 +20,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - lazy var passcodeLockPresenter: PasscodeLockPresenter = .init(mainWindow: self.window) + lazy var passcodeLockPresenter = PasscodeLockPresenter(mainWindow: self.window) func application(_: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. diff --git a/pass/Controllers/AboutRepositoryTableViewController.swift b/pass/Controllers/AboutRepositoryTableViewController.swift index 2d60ed69..dd2b0386 100644 --- a/pass/Controllers/AboutRepositoryTableViewController.swift +++ b/pass/Controllers/AboutRepositoryTableViewController.swift @@ -13,7 +13,7 @@ class AboutRepositoryTableViewController: BasicStaticTableViewController { private static let VALUE_NOT_AVAILABLE = "ValueNotAvailable".localize() private var needRefresh = false - private var indicator: UIActivityIndicatorView = .init(style: .medium) + private var indicator = UIActivityIndicatorView(style: .medium) private let passwordStore = PasswordStore.shared diff --git a/pass/Controllers/BasicStaticTableViewController.swift b/pass/Controllers/BasicStaticTableViewController.swift index d77ae8fb..f6f2202e 100644 --- a/pass/Controllers/BasicStaticTableViewController.swift +++ b/pass/Controllers/BasicStaticTableViewController.swift @@ -38,11 +38,6 @@ class BasicStaticTableViewController: UITableViewController, MFMailComposeViewCo tableData[section].count } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - override func tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellData = tableData[indexPath.section][indexPath.row] let cellDataStyle = cellData[CellDataKey.style] as? CellDataStyle diff --git a/pass/Controllers/KeyImporter.swift b/pass/Controllers/KeyImporter.swift index 8e8635c0..64d55552 100644 --- a/pass/Controllers/KeyImporter.swift +++ b/pass/Controllers/KeyImporter.swift @@ -24,13 +24,13 @@ protocol KeyImporter { extension KeyImporter { static var isCurrentKeySource: Bool { - Defaults.gitSSHKeySource == Self.keySource + Defaults.gitSSHKeySource == keySource } static var menuLabel: String { if isCurrentKeySource { - return "✓ \(Self.label)" + return "✓ \(label)" } - return Self.label + return label } } diff --git a/pass/Controllers/PGPKeyFIleImportTableViewController.swift b/pass/Controllers/PGPKeyFIleImportTableViewController.swift index 74d95aba..088ae4c7 100644 --- a/pass/Controllers/PGPKeyFIleImportTableViewController.swift +++ b/pass/Controllers/PGPKeyFIleImportTableViewController.swift @@ -16,6 +16,7 @@ class PGPKeyFileImportTableViewController: AutoCellHeightUITableViewController, private var privateKey: String? private enum KeyType { case none, `private`, `public` } + private var currentlyPicking = KeyType.none @IBAction diff --git a/pass/Controllers/PGPKeyImporter.swift b/pass/Controllers/PGPKeyImporter.swift index 4a3bd01a..65542778 100644 --- a/pass/Controllers/PGPKeyImporter.swift +++ b/pass/Controllers/PGPKeyImporter.swift @@ -14,7 +14,7 @@ protocol PGPKeyImporter: KeyImporter { extension PGPKeyImporter { static var isCurrentKeySource: Bool { - Defaults.pgpKeySource == Self.keySource + Defaults.pgpKeySource == keySource } func doAfterImport() {} diff --git a/pass/Controllers/PasswordDetailTableViewController.swift b/pass/Controllers/PasswordDetailTableViewController.swift index e6a65389..6f47fa83 100644 --- a/pass/Controllers/PasswordDetailTableViewController.swift +++ b/pass/Controllers/PasswordDetailTableViewController.swift @@ -30,7 +30,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni // preserve path so it can be reloaded even if the passwordEntity is deleted during the update process private var passwordPath: String? - private lazy var editUIBarButtonItem: UIBarButtonItem = .init(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) + private lazy var editUIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) private struct TableSection { var type: PasswordDetailTableViewControllerSectionType diff --git a/pass/Controllers/SSHKeyURLImportTableViewController..swift b/pass/Controllers/SSHKeyURLImportTableViewController.swift similarity index 100% rename from pass/Controllers/SSHKeyURLImportTableViewController..swift rename to pass/Controllers/SSHKeyURLImportTableViewController.swift diff --git a/pass/Views/PasswordDetailTitleTableViewCell.swift b/pass/Views/PasswordDetailTitleTableViewCell.swift index c45d4551..34679f77 100644 --- a/pass/Views/PasswordDetailTitleTableViewCell.swift +++ b/pass/Views/PasswordDetailTitleTableViewCell.swift @@ -14,14 +14,4 @@ class PasswordDetailTitleTableViewCell: UITableViewCell { @IBOutlet var passwordImageImageView: UIImageView! @IBOutlet var labelImageConstraint: NSLayoutConstraint! @IBOutlet var labelCellConstraint: NSLayoutConstraint! - - override func awakeFromNib() { - super.awakeFromNib() - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } } diff --git a/passKit/Helpers/DefaultsKeys.swift b/passKit/Helpers/DefaultsKeys.swift index 1f31d3d4..7e2fdef8 100644 --- a/passKit/Helpers/DefaultsKeys.swift +++ b/passKit/Helpers/DefaultsKeys.swift @@ -35,39 +35,39 @@ extension SearchBarScope: DefaultsSerializable {} extension PasswordGenerator: DefaultsSerializable {} public extension DefaultsKeys { - var pgpKeySource: DefaultsKey { .init("pgpKeySource") } - var pgpPublicKeyURL: DefaultsKey { .init("pgpPublicKeyURL") } - var pgpPrivateKeyURL: DefaultsKey { .init("pgpPrivateKeyURL") } - var isYubiKeyEnabled: DefaultsKey { .init("isYubiKeyEnabled", defaultValue: false) } + var pgpKeySource: DefaultsKey { DefaultsKey("pgpKeySource") } + var pgpPublicKeyURL: DefaultsKey { DefaultsKey("pgpPublicKeyURL") } + var pgpPrivateKeyURL: DefaultsKey { DefaultsKey("pgpPrivateKeyURL") } + var isYubiKeyEnabled: DefaultsKey { DefaultsKey("isYubiKeyEnabled", defaultValue: false) } // Keep them for legacy reasons. - var pgpPublicKeyArmor: DefaultsKey { .init("pgpPublicKeyArmor") } - var pgpPrivateKeyArmor: DefaultsKey { .init("pgpPrivateKeyArmor") } - var gitSSHPrivateKeyArmor: DefaultsKey { .init("gitSSHPrivateKeyArmor") } - var passcodeKey: DefaultsKey { .init("passcodeKey") } + var pgpPublicKeyArmor: DefaultsKey { DefaultsKey("pgpPublicKeyArmor") } + var pgpPrivateKeyArmor: DefaultsKey { DefaultsKey("pgpPrivateKeyArmor") } + var gitSSHPrivateKeyArmor: DefaultsKey { DefaultsKey("gitSSHPrivateKeyArmor") } + var passcodeKey: DefaultsKey { DefaultsKey("passcodeKey") } - var gitURL: DefaultsKey { .init("gitURL", defaultValue: URL(string: "https://")!) } - var gitAuthenticationMethod: DefaultsKey { .init("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password) } - var gitUsername: DefaultsKey { .init("gitUsername", defaultValue: "git") } - var gitBranchName: DefaultsKey { .init("gitBranchName", defaultValue: "master") } - var gitSSHPrivateKeyURL: DefaultsKey { .init("gitSSHPrivateKeyURL") } - var gitSSHKeySource: DefaultsKey { .init("gitSSHKeySource") } - var gitSignatureName: DefaultsKey { .init("gitSignatureName") } - var gitSignatureEmail: DefaultsKey { .init("gitSignatureEmail") } + var gitURL: DefaultsKey { DefaultsKey("gitURL", defaultValue: URL(string: "https://")!) } + var gitAuthenticationMethod: DefaultsKey { DefaultsKey("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password) } + var gitUsername: DefaultsKey { DefaultsKey("gitUsername", defaultValue: "git") } + var gitBranchName: DefaultsKey { DefaultsKey("gitBranchName", defaultValue: "master") } + var gitSSHPrivateKeyURL: DefaultsKey { DefaultsKey("gitSSHPrivateKeyURL") } + var gitSSHKeySource: DefaultsKey { DefaultsKey("gitSSHKeySource") } + var gitSignatureName: DefaultsKey { DefaultsKey("gitSignatureName") } + var gitSignatureEmail: DefaultsKey { DefaultsKey("gitSignatureEmail") } - var lastSyncedTime: DefaultsKey { .init("lastSyncedTime") } + var lastSyncedTime: DefaultsKey { DefaultsKey("lastSyncedTime") } - var isHideUnknownOn: DefaultsKey { .init("isHideUnknownOn", defaultValue: false) } - var isHideOTPOn: DefaultsKey { .init("isHideOTPOn", defaultValue: false) } - var isRememberPGPPassphraseOn: DefaultsKey { .init("isRememberPGPPassphraseOn", defaultValue: false) } - var isRememberGitCredentialPassphraseOn: DefaultsKey { .init("isRememberGitCredentialPassphraseOn", defaultValue: false) } - var isEnableGPGIDOn: DefaultsKey { .init("isEnableGPGIDOn", defaultValue: false) } - var isShowFolderOn: DefaultsKey { .init("isShowFolderOn", defaultValue: true) } - var isHidePasswordImagesOn: DefaultsKey { .init("isHidePasswordImagesOn", defaultValue: false) } - var searchDefault: DefaultsKey { .init("searchDefault", defaultValue: .all) } - var passwordGenerator: DefaultsKey { .init("passwordGenerator", defaultValue: PasswordGenerator()) } + var isHideUnknownOn: DefaultsKey { DefaultsKey("isHideUnknownOn", defaultValue: false) } + var isHideOTPOn: DefaultsKey { DefaultsKey("isHideOTPOn", defaultValue: false) } + var isRememberPGPPassphraseOn: DefaultsKey { DefaultsKey("isRememberPGPPassphraseOn", defaultValue: false) } + var isRememberGitCredentialPassphraseOn: DefaultsKey { DefaultsKey("isRememberGitCredentialPassphraseOn", defaultValue: false) } + var isEnableGPGIDOn: DefaultsKey { DefaultsKey("isEnableGPGIDOn", defaultValue: false) } + var isShowFolderOn: DefaultsKey { DefaultsKey("isShowFolderOn", defaultValue: true) } + var isHidePasswordImagesOn: DefaultsKey { DefaultsKey("isHidePasswordImagesOn", defaultValue: false) } + var searchDefault: DefaultsKey { DefaultsKey("searchDefault", defaultValue: .all) } + var passwordGenerator: DefaultsKey { DefaultsKey("passwordGenerator", defaultValue: PasswordGenerator()) } - var encryptInArmored: DefaultsKey { .init("encryptInArmored", defaultValue: false) } + var encryptInArmored: DefaultsKey { DefaultsKey("encryptInArmored", defaultValue: false) } - var autoCopyOTP: DefaultsKey { .init("autoCopyOTP", defaultValue: false) } + var autoCopyOTP: DefaultsKey { DefaultsKey("autoCopyOTP", defaultValue: false) } } diff --git a/passKit/Parser/Parser.swift b/passKit/Parser/Parser.swift index 1dab852a..e521bf2c 100644 --- a/passKit/Parser/Parser.swift +++ b/passKit/Parser/Parser.swift @@ -48,6 +48,7 @@ class Parser { guard lineNumber < purgedAdditionalLines.count else { return result } + // swiftlint:disable:next unused_enumerated let numberInitialBlanks = purgedAdditionalLines[lineNumber].enumerated().first { $1 != Character(Constants.BLANK) }?.0 ?? purgedAdditionalLines[lineNumber].count diff --git a/passKitTests/Crypto/CryptoFrameworkTest.swift b/passKitTests/Crypto/CryptoFrameworkTest.swift index 8078c542..dc8fd445 100644 --- a/passKitTests/Crypto/CryptoFrameworkTest.swift +++ b/passKitTests/Crypto/CryptoFrameworkTest.swift @@ -8,11 +8,12 @@ import XCTest +@testable import Gopenpgp + // swiftformat:disable:next sortedImports @testable import passKit -@testable import Gopenpgp -class CryptoFrameworkTest: XCTestCase { +final class CryptoFrameworkTest: XCTestCase { private typealias MessageConverter = (CryptoPGPMessage, NSErrorPointer) -> CryptoPGPMessage? private let testText = "Hello World!" diff --git a/passKitTests/Crypto/PGPAgentTest.swift b/passKitTests/Crypto/PGPAgentTest.swift index 1acd37ed..8acb2bee 100644 --- a/passKitTests/Crypto/PGPAgentTest.swift +++ b/passKitTests/Crypto/PGPAgentTest.swift @@ -11,11 +11,11 @@ import XCTest @testable import passKit -class PGPAgentTest: XCTestCase { +final class PGPAgentTest: XCTestCase { private var keychain: KeyStore! private var pgpAgent: PGPAgent! - private let testData = "Hello World!".data(using: .utf8)! + private let testData = Data("Hello World!".utf8) override func setUp() { super.setUp() diff --git a/passKitTests/Extensions/Array+SlicesTest.swift b/passKitTests/Extensions/Array+SlicesTest.swift index 9c85c1f5..1162c2bd 100644 --- a/passKitTests/Extensions/Array+SlicesTest.swift +++ b/passKitTests/Extensions/Array+SlicesTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class ArraySlicesTest: XCTestCase { +final class ArraySlicesTest: XCTestCase { func testZeroCount() { XCTAssertEqual([1, 2, 3].slices(count: 0), []) } diff --git a/passKitTests/Extensions/String+UtilitiesTest.swift b/passKitTests/Extensions/String+UtilitiesTest.swift index ad2e9e3b..40350c42 100644 --- a/passKitTests/Extensions/String+UtilitiesTest.swift +++ b/passKitTests/Extensions/String+UtilitiesTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class StringUtilitiesTest: XCTestCase { +final class StringUtilitiesTest: XCTestCase { func testTrimmed() { [ (" ", ""), diff --git a/passKitTests/Helpers/KeyFileManagerTest.swift b/passKitTests/Helpers/KeyFileManagerTest.swift index 3e6a61fb..56acf4b7 100644 --- a/passKitTests/Helpers/KeyFileManagerTest.swift +++ b/passKitTests/Helpers/KeyFileManagerTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class KeyFileManagerTest: XCTestCase { +final class KeyFileManagerTest: XCTestCase { private static let filePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("test.txt").path private static let keyFileManager = KeyFileManager(keyType: PGPKey.PUBLIC, keyPath: filePath) { _, _ in } diff --git a/passKitTests/Models/GitCredentialTest.swift b/passKitTests/Models/GitCredentialTest.swift index bfc47480..9a0d3e84 100644 --- a/passKitTests/Models/GitCredentialTest.swift +++ b/passKitTests/Models/GitCredentialTest.swift @@ -12,7 +12,7 @@ import ObjectiveGit import SwiftyUserDefaults @testable import passKit -class GitCredentialTest: XCTestCase { +final class GitCredentialTest: XCTestCase { private static let defaultsID = "SharedDefaultsForGitCredentialTest" private let keyStore = DictBasedKeychain() diff --git a/passKitTests/Models/PasswordStoreTest.swift b/passKitTests/Models/PasswordStoreTest.swift index 5ea205d2..78ffa782 100644 --- a/passKitTests/Models/PasswordStoreTest.swift +++ b/passKitTests/Models/PasswordStoreTest.swift @@ -12,7 +12,7 @@ import XCTest @testable import passKit -class PasswordStoreTest: XCTestCase { +final class PasswordStoreTest: XCTestCase { private let remoteRepoURL = URL(string: "https://github.com/mssun/passforios-password-store.git")! func testCloneAndDecryptMultiKeys() throws { diff --git a/passKitTests/Models/PasswordTableEntryTest.swift b/passKitTests/Models/PasswordTableEntryTest.swift index a7da5073..f84f18c9 100644 --- a/passKitTests/Models/PasswordTableEntryTest.swift +++ b/passKitTests/Models/PasswordTableEntryTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordTableEntryTest: XCTestCase { +final class PasswordTableEntryTest: XCTestCase { func testExample() { let nameWithCategoryList = [ "github", diff --git a/passKitTests/Models/PasswordTest.swift b/passKitTests/Models/PasswordTest.swift index 6ee05a03..7b73b720 100644 --- a/passKitTests/Models/PasswordTest.swift +++ b/passKitTests/Models/PasswordTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordTest: XCTestCase { +final class PasswordTest: XCTestCase { func testURL() { let password = getPasswordObjectWith(content: "") diff --git a/passKitTests/Parser/AdditionFieldTest.swift b/passKitTests/Parser/AdditionFieldTest.swift index 42d408ce..34ae7912 100644 --- a/passKitTests/Parser/AdditionFieldTest.swift +++ b/passKitTests/Parser/AdditionFieldTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class AdditionFieldTest: XCTestCase { +final class AdditionFieldTest: XCTestCase { func testAdditionField() { let field1 = AdditionField(title: "key", content: "value") let field2 = AdditionField(title: "no content") diff --git a/passKitTests/Parser/ConstantsTest.swift b/passKitTests/Parser/ConstantsTest.swift index b1b3d3fb..ceca88d0 100644 --- a/passKitTests/Parser/ConstantsTest.swift +++ b/passKitTests/Parser/ConstantsTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class ConstantsTest: XCTestCase { +final class ConstantsTest: XCTestCase { func testIsOtpRelated() { XCTAssert(Constants.isOtpRelated(line: "otpauth://something")) XCTAssert(Constants.isOtpRelated(line: "otp_algorithm: algorithm")) diff --git a/passKitTests/Parser/OTPTypeTest.swift b/passKitTests/Parser/OTPTypeTest.swift index 8c69bba4..9d785b69 100644 --- a/passKitTests/Parser/OTPTypeTest.swift +++ b/passKitTests/Parser/OTPTypeTest.swift @@ -11,9 +11,9 @@ import XCTest @testable import passKit -class OTPTypeTest: XCTestCase { +final class OTPTypeTest: XCTestCase { func testInitFromToken() { - let secret = "secret".data(using: .utf8)! + let secret = Data("secret".utf8) let totpGenerator = Generator(factor: .timer(period: 30.0), secret: secret, algorithm: .sha1, digits: 6)! let totpToken = Token(name: "", issuer: "", generator: totpGenerator) diff --git a/passKitTests/Parser/ParserTest.swift b/passKitTests/Parser/ParserTest.swift index 1e4f867a..24a797e4 100644 --- a/passKitTests/Parser/ParserTest.swift +++ b/passKitTests/Parser/ParserTest.swift @@ -9,7 +9,7 @@ import XCTest @testable import passKit -class ParserTest: XCTestCase { +final class ParserTest: XCTestCase { func testInit() { [ ("", "", "", []), diff --git a/passKitTests/Parser/TokenBuilderTest.swift b/passKitTests/Parser/TokenBuilderTest.swift index 58777042..726d1565 100644 --- a/passKitTests/Parser/TokenBuilderTest.swift +++ b/passKitTests/Parser/TokenBuilderTest.swift @@ -12,7 +12,7 @@ import XCTest @testable import passKit -class TokenBuilderTest: XCTestCase { +final class TokenBuilderTest: XCTestCase { private let SECRET = "secret" private let DIGITS = Constants.DEFAULT_DIGITS private let TIMER = Generator.Factor.timer(period: Constants.DEFAULT_PERIOD) diff --git a/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift b/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift index f2f7f289..78acc467 100644 --- a/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift +++ b/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordGeneratorFlavorTest: XCTestCase { +final class PasswordGeneratorFlavorTest: XCTestCase { func testLengthLimits() { // Ensure properly chosen length limits. So this check no longer needs to be performed in the code. PasswordGeneratorFlavor.allCases.map(\.lengthLimits).forEach { diff --git a/passKitTests/Passwords/PasswordGeneratorTest.swift b/passKitTests/Passwords/PasswordGeneratorTest.swift index 8b4f68e2..08cefbeb 100644 --- a/passKitTests/Passwords/PasswordGeneratorTest.swift +++ b/passKitTests/Passwords/PasswordGeneratorTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordGeneratorTest: XCTestCase { +final class PasswordGeneratorTest: XCTestCase { func testLimitedLength() { [ PasswordGenerator(length: 15), diff --git a/passKitTests/Testbase/TestPGPKeys.swift b/passKitTests/Testbase/TestPGPKeys.swift index d7951a79..da2177c2 100644 --- a/passKitTests/Testbase/TestPGPKeys.swift +++ b/passKitTests/Testbase/TestPGPKeys.swift @@ -11,7 +11,7 @@ import XCTest @testable import passKit struct PGPTestSet { - fileprivate static var ALL_TEST_SETS: [String: PGPTestSet] = [:] // swiftlint:disable:this strict_fileprivate + fileprivate static var ALL_TEST_SETS: [String: Self] = [:] // swiftlint:disable:this strict_fileprivate let publicKey: String let privateKey: String diff --git a/passTests/Models/QRKeyScannerTest.swift b/passTests/Models/QRKeyScannerTest.swift index 21153c7c..3f9d3b22 100644 --- a/passTests/Models/QRKeyScannerTest.swift +++ b/passTests/Models/QRKeyScannerTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import Pass -class QRKeyScannerTest: XCTestCase { +final class QRKeyScannerTest: XCTestCase { private let header = "-----BEGIN PGP PUBLIC KEY BLOCK-----" private let body = "key body" private let footer = "-----END PGP PUBLIC KEY BLOCK-----" diff --git a/passTests/Models/ScannableKeyTypeTest.swift b/passTests/Models/ScannableKeyTypeTest.swift index e53c8a60..b390f71b 100644 --- a/passTests/Models/ScannableKeyTypeTest.swift +++ b/passTests/Models/ScannableKeyTypeTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import Pass -class ScannableKeyTypeTest: XCTestCase { +final class ScannableKeyTypeTest: XCTestCase { func testPGPPublicKey() { let type = ScannableKeyType.pgpPublic diff --git a/scripts/swiftformat.sh b/scripts/swiftformat.sh deleted file mode 100755 index 01bb9700..00000000 --- a/scripts/swiftformat.sh +++ /dev/null @@ -1,25 +0,0 @@ -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" -SWIFTFORMAT_VERSION="0.51.*" - -if [[ "${CI}" == "true" ]]; then - echo "Running in a Continuous Integration environment. Formatting is skipped." - exit 0 -fi - -if [[ "${CONFIGURATION}" == "Release" ]]; then - echo "Running during a release build. Formatting is skipped." - exit 0 -fi - -if which swiftformat > /dev/null; then - if [[ "$(swiftformat --version)" == $SWIFTFORMAT_VERSION ]]; then - swiftformat . - else - echo "Failure: SwiftFormat $SWIFTFORMAT_VERSION is required. Install it or update the build script to use a newer version." - exit 1 - fi -else - echo "Failure: SwiftFormat not installed. Get it via 'brew install swiftformat'." - exit 2 -fi - diff --git a/scripts/swiftlint.sh b/scripts/swiftlint.sh deleted file mode 100755 index a5c83a53..00000000 --- a/scripts/swiftlint.sh +++ /dev/null @@ -1,26 +0,0 @@ -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" - -SWIFTLINT_VERSION="0.52.*" - -if [[ "${CI}" == "true" ]]; then - echo "Running in a Continuous Integration environment. Linting is skipped." - exit 0 -fi - -if [[ "${CONFIGURATION}" == "Release" ]]; then - echo "Running during a release build. Linting is skipped." - exit 0 -fi - -if which swiftlint > /dev/null; then - if [[ "$(swiftlint version)" == $SWIFTLINT_VERSION ]]; then - swiftlint --strict - else - echo "Failure: SwiftLint $SWIFTLINT_VERSION is required. Install it or update the build script to use a newer version." - exit 1 - fi -else - echo "Failure: SwiftLint not installed. Get it via 'brew install swiftlint'." - exit 2 -fi -