diff --git a/LICENSE.md b/LICENSE.md index 364690c4..43361c06 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -172,4 +172,4 @@ d. Nothing in this Public License constitutes or may be interpreted as a limitat Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. Creative Commons may be contacted at creativecommons.org -``` \ No newline at end of file +``` diff --git a/Latest/Interface/Release Notes/Controller/ReleaseNotesContentProtocol.swift b/Latest/Interface/Release Notes/Controller/ReleaseNotesContentProtocol.swift index 3b21fbbc..57cf9979 100644 --- a/Latest/Interface/Release Notes/Controller/ReleaseNotesContentProtocol.swift +++ b/Latest/Interface/Release Notes/Controller/ReleaseNotesContentProtocol.swift @@ -14,7 +14,7 @@ protocol ReleaseNotesContentProtocol { /// The type of the viewController associatedtype ReleaseNotesContentController: NSViewController - /// The identifier from which the object is instatiated + /// The identifier from which the object is instantiated static var StoryboardIdentifier: String { get } /// The method loading the storyboard diff --git a/Latest/Interface/Release Notes/Controller/ReleaseNotesViewController.swift b/Latest/Interface/Release Notes/Controller/ReleaseNotesViewController.swift index b113a028..c2057d86 100644 --- a/Latest/Interface/Release Notes/Controller/ReleaseNotesViewController.swift +++ b/Latest/Interface/Release Notes/Controller/ReleaseNotesViewController.swift @@ -88,7 +88,6 @@ fileprivate enum ReleaseNotesContent { } } - /** This is a super rudimentary implementation of an release notes viewer. It can open urls or display HTML strings right away. diff --git a/Latest/Interface/Update Table View/Controller/UpdateTableViewController.swift b/Latest/Interface/Update Table View/Controller/UpdateTableViewController.swift index 345639bd..cf278fa0 100644 --- a/Latest/Interface/Update Table View/Controller/UpdateTableViewController.swift +++ b/Latest/Interface/Update Table View/Controller/UpdateTableViewController.swift @@ -36,7 +36,7 @@ class UpdateTableViewController: NSViewController, NSMenuItemValidation, NSTable /// The empty state label centered in the list view indicating that no updates are available @IBOutlet weak var placeholderLabel: NSTextField! - /// The label indicating how many updates are vailable + /// The label indicating how many updates are available @IBOutlet weak var updatesLabel: NSTextField! /// The menu displayed on secondary clicks on cells in the list diff --git a/Latest/Interface/Update Table View/Views/UpdateTableView.swift b/Latest/Interface/Update Table View/Views/UpdateTableView.swift index f1ef5ec8..ac48403a 100644 --- a/Latest/Interface/Update Table View/Views/UpdateTableView.swift +++ b/Latest/Interface/Update Table View/Views/UpdateTableView.swift @@ -8,7 +8,7 @@ import Cocoa -/// The tableView behinf the updates list +/// The tableView behind the updates list class UpdateTableView: NSTableView { /// Only the separator lines for populated rows will be drawn diff --git a/Latest/Interface/Utilities/DisplayLink.swift b/Latest/Interface/Utilities/DisplayLink.swift index 42a5995f..4f5964dc 100644 --- a/Latest/Interface/Utilities/DisplayLink.swift +++ b/Latest/Interface/Utilities/DisplayLink.swift @@ -8,16 +8,16 @@ import Foundation import QuartzCore -/// Cross-plattform convenience for accessing a DisplayLink. +/// Cross-platform convenience for accessing a DisplayLink. class DisplayLink: NSObject { - /// The amount of time the display link should be running. If set to `nil`, the display link runs indefinitly. + /// The amount of time the display link should be running. If set to `nil`, the display link runs indefinitely. private(set) var duration : Double? /// An optional completion handler called after the display link stopped animating. var completionHandler : (() -> ())? - /// The current animation progess. Only useful if a duration has been set. + /// The current animation progress. Only useful if a duration has been set. private(set) var progress : Double = 0 #if os(macOS) diff --git a/Latest/Interface/Views/UpdateButton.swift b/Latest/Interface/Views/UpdateButton.swift index 8401e8b8..0643013b 100644 --- a/Latest/Interface/Views/UpdateButton.swift +++ b/Latest/Interface/Views/UpdateButton.swift @@ -226,7 +226,6 @@ class UpdateButton: NSButton { } - // MARK: - Error Handling private extension UpdateButton { @@ -272,7 +271,6 @@ private extension UpdateButton { } - // MARK: - Animator Proxy extension UpdateButton { override func animation(forKey key: NSAnimatablePropertyKey) -> Any? { diff --git a/Latest/Interface/Views/UpdateButtonCell.swift b/Latest/Interface/Views/UpdateButtonCell.swift index 681ec752..6e19ec20 100644 --- a/Latest/Interface/Views/UpdateButtonCell.swift +++ b/Latest/Interface/Views/UpdateButtonCell.swift @@ -60,7 +60,7 @@ class UpdateButtonCell: NSButtonCell { } } - /// The progress to be rendered when `.progess` is set as the content type. Animates the transition. + /// The progress to be rendered when `.progress` is set as the content type. Animates the transition. private var _oldUpdateProgress: Double = 0.0 var updateProgress: Double = 0.0 { didSet { diff --git a/Latest/Model/App.swift b/Latest/Model/App.swift index 1306dee2..3d1cd4d8 100644 --- a/Latest/Model/App.swift +++ b/Latest/Model/App.swift @@ -127,7 +127,7 @@ extension App { return self.update?.isUpdating ?? false } - /// Updates the app. This is a subclassing hook. The default implementation opens the app. + /// Updates the app. This is a sub-classing hook. The default implementation opens the app. final func performUpdate() { self.update?.perform() } diff --git a/Latest/Model/AppDataStore.swift b/Latest/Model/AppDataStore.swift index 7e4a8103..a3ff2ad4 100644 --- a/Latest/Model/AppDataStore.swift +++ b/Latest/Model/AppDataStore.swift @@ -23,7 +23,7 @@ protocol AppProviding { /// Adds the observer if it is not already registered. func addObserver(_ observer: NSObject, handler: @escaping ObserverHandler) - /// Remvoes the observer. + /// Removes the observer. func removeObserver(_ observer: NSObject) /// Sets the ignored state for the given app. @@ -168,7 +168,7 @@ class AppDataStore: AppProviding { // MARK: - Observer Handling - /// A mapping of observers assotiated with apps. + /// A mapping of observers associated with apps. private var observers = [NSObject: ObserverHandler]() /// Adds the observer if it is not already registered. diff --git a/Latest/Model/Update Checker Extensions/MacAppStoreCheckerOperation.swift b/Latest/Model/Update Checker Extensions/MacAppStoreCheckerOperation.swift index 69d34443..70595cf6 100644 --- a/Latest/Model/Update Checker Extensions/MacAppStoreCheckerOperation.swift +++ b/Latest/Model/Update Checker Extensions/MacAppStoreCheckerOperation.swift @@ -154,7 +154,6 @@ extension MacAppStoreUpdateCheckerOperation { } - // MARK: - Decoding /// Object containing a list of App Store entries. diff --git a/Latest/Model/Update Checker Extensions/SparkleCheckerOperation.swift b/Latest/Model/Update Checker Extensions/SparkleCheckerOperation.swift index 152c32af..ae11b879 100644 --- a/Latest/Model/Update Checker Extensions/SparkleCheckerOperation.swift +++ b/Latest/Model/Update Checker Extensions/SparkleCheckerOperation.swift @@ -267,7 +267,6 @@ extension SparkleUpdateCheckerOperation: XMLParserDelegate { } - // MARK: - Utilities /// Simple container holding update information for a single entry in the update feed. @@ -281,7 +280,7 @@ fileprivate class UpdateEntry { /// The version number of the entry. var versionNumber: String? - /// The build number of the entryl. + /// The build number of the entry. var buildNumber: String? /// The release date of the update entry. diff --git a/Latest/Model/Update.swift b/Latest/Model/Update.swift index 026571f2..96fe1155 100644 --- a/Latest/Model/Update.swift +++ b/Latest/Model/Update.swift @@ -53,7 +53,7 @@ extension App { // MARK: - Actions - /// Updates the app. This is a subclassing hook. The default implementation opens the app. + /// Updates the app. This is a sub-classing hook. The default implementation opens the app. final func perform() { guard !self.isUpdating else { fatalError("Attempt to perform update on app that is already updating.") diff --git a/Latest/Model/UpdateCheckCoordinator.swift b/Latest/Model/UpdateCheckCoordinator.swift index 8d74d0f4..f3336829 100644 --- a/Latest/Model/UpdateCheckCoordinator.swift +++ b/Latest/Model/UpdateCheckCoordinator.swift @@ -58,7 +58,7 @@ class UpdateCheckCoordinator { // MARK: - Update Checking - /// Whether the checker is curently waiting for the initial update check. + /// Whether the checker is currently waiting for the initial update check. private var waitForInitialCheck = true /// The delegate for the progress of the entire update checking progress @@ -79,7 +79,7 @@ class UpdateCheckCoordinator { private let updateOperationQueue: OperationQueue = { let operationQueue = OperationQueue() - // Allow 100 simultanious updates + // Allow 100 simultaneously updates operationQueue.maxConcurrentOperationCount = 100 return operationQueue @@ -140,7 +140,6 @@ class UpdateCheckCoordinator { } - // MARK: - Update Checking Operations extension UpdateCheckCoordinator { diff --git a/Latest/Model/Updater/SparkleUpdateOperation.swift b/Latest/Model/Updater/SparkleUpdateOperation.swift index 67d65606..f2c64ab1 100644 --- a/Latest/Model/Updater/SparkleUpdateOperation.swift +++ b/Latest/Model/Updater/SparkleUpdateOperation.swift @@ -104,7 +104,6 @@ class SparkleUpdateOperation: UpdateOperation { } - // MARK: - Driver Implementation extension SparkleUpdateOperation: SPUUserDriver { diff --git a/Latest/Model/Updater/UpdateOperation.swift b/Latest/Model/Updater/UpdateOperation.swift index d3370fbc..f6f812e8 100644 --- a/Latest/Model/Updater/UpdateOperation.swift +++ b/Latest/Model/Updater/UpdateOperation.swift @@ -13,7 +13,7 @@ class UpdateOperation: StatefulOperation { /// Encapsulates different states that may be active during the update process. enum ProgressState { - /// No update is ocurring at the moment. + /// No update is occurring at the moment. case none /// The update is currently waiting to be executed. This may happen due to external constraints like the Mac App Store update queue. @@ -62,7 +62,7 @@ class UpdateOperation: StatefulOperation { } - // MARK: - Operation subclassing + // MARK: - Operation sub-classing override func execute() { self.progressState = .initializing diff --git a/Latest/Model/Updater/UpdateQueue.swift b/Latest/Model/Updater/UpdateQueue.swift index b4b9e50e..2a56334a 100644 --- a/Latest/Model/Updater/UpdateQueue.swift +++ b/Latest/Model/Updater/UpdateQueue.swift @@ -74,7 +74,7 @@ class UpdateQueue: OperationQueue { /// Called whenever an app update completes. typealias CompletionHandler = (_: App.Bundle.Identifier) -> Void - /// A mapping of observers assotiated with apps. + /// A mapping of observers associated with apps. private var observers = [App.Bundle.Identifier : [NSObject: ObserverHandler]]() /// The completion handler to be called when an operation completes. @@ -98,7 +98,7 @@ class UpdateQueue: OperationQueue { self.observers[identifier] = observers } - /// Remvoes the observer. + /// Removes the observer. func removeObserver(_ observer: NSObject, for identifier: App.Bundle.Identifier) { self.observers[identifier]?.removeValue(forKey: observer) } diff --git a/Latest/Model/Utilities/StatefulOperation.swift b/Latest/Model/Utilities/StatefulOperation.swift index 0bfda615..1e554ac5 100644 --- a/Latest/Model/Utilities/StatefulOperation.swift +++ b/Latest/Model/Utilities/StatefulOperation.swift @@ -43,7 +43,7 @@ class StatefulOperation: Operation { /// A lock to guard reads and writes to the `_state` property private let stateLock = NSLock() - /// The actial state of the operation + /// The actual state of the operation private var state: State { get { return self.stateLock.withCriticalScope(block: { diff --git a/Latest/Model/Utilities/Version.swift b/Latest/Model/Utilities/Version.swift index f621169d..aab9bc5c 100644 --- a/Latest/Model/Utilities/Version.swift +++ b/Latest/Model/Utilities/Version.swift @@ -8,8 +8,6 @@ import Foundation - - /** A Version represents a single version of an app. It contains both the version number and the build number to uniquely identify an app (in theory). diff --git a/Latest/View Model/ReleaseNotesProvider.swift b/Latest/View Model/ReleaseNotesProvider.swift index 335b3592..53f41d19 100644 --- a/Latest/View Model/ReleaseNotesProvider.swift +++ b/Latest/View Model/ReleaseNotesProvider.swift @@ -96,7 +96,7 @@ class ReleaseNotesProvider { return .failure(error) } - // Having only one line means that the text was no HTML but plain text. Therefore we reinstantiate the attributed string as plain text + // Having only one line means that the text was no HTML but plain text. Therefore we instantiate the attributed string as plain text again. // The initialization with HTML enabled removes all new lines // If anyone has a better idea for checking if the data is valid HTML or plain text, feel free to fix. if string.string.split(separator: "\n").count == 1 { diff --git a/README.md b/README.md index a58bacfe..3f411758 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,31 @@ # Latest -[![Build Status][image-1]][1] [![Translation status][image-2]][2] + +[![Build Status][image-1]][1] [![Translation status][image-2]][2] This is Latest, a small utility app for the Mac. Latest is a free and open-source app for macOS that checks if all your apps are up to date. Get a quick overview of which apps changed and what changed and update them right away. Latest currently supports apps downloaded from the Mac App Store and apps that use Sparkle for updates, which covers most of the apps on the market. -Latest is developed in my freetime, so occasional updates may happen. Take a look at the [Issues][3] section to see what's coming. If you have an idea for a new feature, or encounter any bugs, feel free to open a new issue. +Latest is developed in my free time, so occasional updates may happen. Take a look at the [Issues][3] section to see what's coming. If you have an idea for a new feature, or encounter any bugs, feel free to open a new issue. I am thankful for contributions. Check out the section below for more information. -![][image-3] +![Latest][image-3] ## Installation + There are multiple ways to install the app. ### Download the App + The easiest way to install Latest is to [download][4] the latest release as an app. You unzip the download by double-clicking on it (if that does not happen automatically) and then move the `Latest.app` into the `Applications` folder. If you would like to check out earlier versions, head over to the [Releases][5] page to browse the history of Latest. ### Homebrew Cask + Latest can also be installed via [Homebrew Cask][6]. If you have not installed Homebrew, follow the simple instructions [here][7]. After that, run `brew install --cask latest` to install the current version of Latest. ### Build from Source + **To build Latest, Xcode 11 and Swift 5 is required.** You can build Latest directly on your machine. To do that, you have to download the source code by cloning the repository: `git clone --recurse-submodules git@github.com:mangerlahn/Latest.git`. @@ -28,35 +33,39 @@ You can build Latest directly on your machine. To do that, you have to download Then you can open the `Latest.xcodeproj` and hit *Build and Run*. Make sure that the `Latest` scheme is selected. Latest uses submodules to organize its dependencies. If the project is not building, make sure submodules are initialized correctly. To update them, call `git submodule update --init --recursive`. ## Contribution -I am thankful for all contributions to the project. You can contribute typo-fixes, translations, code and of course suggestions, wishes, and bug reports. + +I am thankful for all contributions to the project. You can contribute typo-fixes, translations, code and of course suggestions, wishes, and bug reports. ### Translations -The text used in Latest is hosted by the kind people over at [Weblate][8]. If you would like to add a new language, or improve an existing one, [here][9] is your starting point. + +The text used in Latest is hosted by the kind people over at [Weblate][8]. If you would like to add a new language, or improve an existing one, [here][9] is your starting point. [![Translation status][image-4]][10] ### Code + Take a look at the [Issues][11] section to see what you can do. If you have your own idea, and it does not appear in the issues list, please add it first. I don't think that I would reject any pull request, but it is useful to know about your idea earlier. Imagine two people have the same idea at the same time and both put a lot of work into that just to find out that someone else has made the same when it's too late. I would like to assign every issue to the person working on that particular thing, so if you would like to implement something, leave a small note in the issue. I will assign the issue to you and it's yours. ## Donation + As mentioned above, Latest is free for you to use. I work on the app in my spare time. If you would like to support the development by donating, you can do so [here][12]. -[1]: https://travis-ci.org/mangerlahn/Latest -[2]: https://hosted.weblate.org/engage/latest/ -[3]: https://github.com/mangerlahn/latest/issues -[4]: https://max.codes/latest/Latest.zip -[5]: https://github.com/mangerlahn/Latest/releases -[6]: https://github.com/Homebrew/homebrew-cask -[7]: https://brew.sh -[8]: https://weblate.org/ -[9]: https://hosted.weblate.org/engage/latest/ -[10]: https://hosted.weblate.org/engage/latest/ -[11]: https://github.com/mangerlahn/latest/issues -[12]: https://max.codes/latest/donate - -[image-1]: https://travis-ci.org/mangerlahn/Latest.svg?branch=master -[image-2]: https://hosted.weblate.org/widgets/latest/-/svg-badge.svg -[image-3]: ./latest.png -[image-4]: https://hosted.weblate.org/widgets/latest/-/multi-auto.svg \ No newline at end of file +[1]: https://travis-ci.org/mangerlahn/Latest +[2]: https://hosted.weblate.org/engage/latest/ +[3]: https://github.com/mangerlahn/latest/issues +[4]: https://max.codes/latest/Latest.zip +[5]: https://github.com/mangerlahn/Latest/releases +[6]: https://github.com/Homebrew/homebrew-cask +[7]: https://brew.sh +[8]: https://weblate.org/ +[9]: https://hosted.weblate.org/engage/latest/ +[10]: https://hosted.weblate.org/engage/latest/ +[11]: https://github.com/mangerlahn/latest/issues +[12]: https://max.codes/latest/donate + +[image-1]: https://travis-ci.org/mangerlahn/Latest.svg?branch=master +[image-2]: https://hosted.weblate.org/widgets/latest/-/svg-badge.svg +[image-3]: ./latest.png +[image-4]: https://hosted.weblate.org/widgets/latest/-/multi-auto.svg diff --git a/Tests/VersionTest.swift b/Tests/VersionTest.swift index af6563cc..2718c729 100644 --- a/Tests/VersionTest.swift +++ b/Tests/VersionTest.swift @@ -115,7 +115,6 @@ class VersionTest: XCTestCase { var v2 = Version("2.1.5", "216") self.newer(v1, v2) - v1 = Version("2.3.6", "215") v2 = Version("2.2.4", nil) self.newer(v1, v2)