From 5c92d47ff09704cf7c794efec334d5aa86f973cb Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Sat, 4 Feb 2023 22:13:43 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Parse=20CaskFile,=20WIP=20for=20new?= =?UTF-8?q?=20AppUpdater?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP Monitor.xcodeproj/project.pbxproj | 32 ++++++++++++ phpmon/Common/Core/Constants.swift | 2 +- phpmon/Common/Core/Logger.swift | 2 +- phpmon/Domain/App/AppUpdater.swift | 51 +++++++++++++++++++ .../DomainList/Cells/DomainListPhpCell.swift | 2 +- .../Integrations/Homebrew/CaskFile.swift | 47 +++++++++++++++++ tests/unit/Parsers/CaskFileParserTest.swift | 48 +++++++++++++++++ tests/unit/Test Files/brew/phpmon-dev.rb | 13 +++++ 8 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 phpmon/Domain/App/AppUpdater.swift create mode 100644 phpmon/Domain/Integrations/Homebrew/CaskFile.swift create mode 100644 tests/unit/Parsers/CaskFileParserTest.swift create mode 100644 tests/unit/Test Files/brew/phpmon-dev.rb diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index ddebf97..8aab78f 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -56,6 +56,18 @@ C4080FF727BD8C6400BF2C6B /* BetterAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4080FF527BD8C6400BF2C6B /* BetterAlert.swift */; }; C4080FFA27BD956700BF2C6B /* BetterAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4080FF927BD956700BF2C6B /* BetterAlertVC.swift */; }; C4080FFB27BD956700BF2C6B /* BetterAlertVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4080FF927BD956700BF2C6B /* BetterAlertVC.swift */; }; + C409349D298EE8E900D25014 /* AppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = C409349C298EE8E900D25014 /* AppUpdater.swift */; }; + C409349E298EE8E900D25014 /* AppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = C409349C298EE8E900D25014 /* AppUpdater.swift */; }; + C409349F298EE8E900D25014 /* AppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = C409349C298EE8E900D25014 /* AppUpdater.swift */; }; + C40934A0298EE8E900D25014 /* AppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = C409349C298EE8E900D25014 /* AppUpdater.swift */; }; + C40934A2298EEB2C00D25014 /* CaskFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40934A1298EEB2C00D25014 /* CaskFile.swift */; }; + C40934A3298EEB2C00D25014 /* CaskFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40934A1298EEB2C00D25014 /* CaskFile.swift */; }; + C40934A4298EEB2C00D25014 /* CaskFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40934A1298EEB2C00D25014 /* CaskFile.swift */; }; + C40934A5298EEB2C00D25014 /* CaskFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40934A1298EEB2C00D25014 /* CaskFile.swift */; }; + C40934A7298EEB8700D25014 /* phpmon-dev.rb in Resources */ = {isa = PBXBuildFile; fileRef = C40934A6298EEB8700D25014 /* phpmon-dev.rb */; }; + C40934A8298EEB8700D25014 /* phpmon-dev.rb in Resources */ = {isa = PBXBuildFile; fileRef = C40934A6298EEB8700D25014 /* phpmon-dev.rb */; }; + C40934A9298EEB8700D25014 /* phpmon-dev.rb in Resources */ = {isa = PBXBuildFile; fileRef = C40934A6298EEB8700D25014 /* phpmon-dev.rb */; }; + C40934AB298EEDA900D25014 /* CaskFileParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40934AA298EEDA900D25014 /* CaskFileParserTest.swift */; }; C40B24F227A310770018C7D2 /* Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4EC1E72279DFCF40010F296 /* Events.swift */; }; C40B24F427A310830018C7D2 /* StatusMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C47331A1247093B7009A0597 /* StatusMenu.swift */; }; C40C5C9C2846A40600E28255 /* Preset.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C5C9B2846A40600E28255 /* Preset.swift */; }; @@ -773,6 +785,10 @@ C406A601298AD50D00B5B85A /* Updater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Updater.swift; sourceTree = ""; }; C4080FF527BD8C6400BF2C6B /* BetterAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BetterAlert.swift; sourceTree = ""; }; C4080FF927BD956700BF2C6B /* BetterAlertVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BetterAlertVC.swift; sourceTree = ""; }; + C409349C298EE8E900D25014 /* AppUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppUpdater.swift; sourceTree = ""; }; + C40934A1298EEB2C00D25014 /* CaskFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaskFile.swift; sourceTree = ""; }; + C40934A6298EEB8700D25014 /* phpmon-dev.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = "phpmon-dev.rb"; sourceTree = ""; }; + C40934AA298EEDA900D25014 /* CaskFileParserTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaskFileParserTest.swift; sourceTree = ""; }; C40C5C9B2846A40600E28255 /* Preset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preset.swift; sourceTree = ""; }; C40C7F1D2772136000DDDCDC /* PhpEnv.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpEnv.swift; sourceTree = ""; }; C40C7F2727721FF600DDDCDC /* ActivePhpInstallation+Checks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActivePhpInstallation+Checks.swift"; sourceTree = ""; }; @@ -1347,6 +1363,7 @@ C459B4BF27F6094100E9B4B4 /* brew */ = { isa = PBXGroup; children = ( + C40934A6298EEB8700D25014 /* phpmon-dev.rb */, C4E2E85228FC256B003B070C /* brew-services-normal.json */, C4E2E85128FC256B003B070C /* brew-services-sudo.json */, C43A8A1F25D9D1D700591B77 /* brew-formula.json */, @@ -1520,6 +1537,7 @@ isa = PBXGroup; children = ( C4F2E4362752F0870020E974 /* HomebrewDiagnostics.swift */, + C40934A1298EEB2C00D25014 /* CaskFile.swift */, ); path = Homebrew; sourceTree = ""; @@ -1542,6 +1560,7 @@ C46E206C28299B3800D909D6 /* AppUpdateChecker.swift */, C40FE736282ABA4F00A302C2 /* AppVersion.swift */, C4A6957528D23EE300A14CF8 /* EnvironmentManager.swift */, + C409349C298EE8E900D25014 /* AppUpdater.swift */, ); path = App; sourceTree = ""; @@ -1628,6 +1647,7 @@ C43A8A2325D9D20D00591B77 /* HomebrewPackageTest.swift */, C42CFB1927DFE8BD00862737 /* NginxConfigurationTest.swift */, C4551656297AED18009B8466 /* ValetRcTest.swift */, + C40934AA298EEDA900D25014 /* CaskFileParserTest.swift */, ); path = Parsers; sourceTree = ""; @@ -1998,6 +2018,7 @@ C4570C3B28FC355300D18420 /* Localizable.strings in Resources */, C4E2E85528FC256B003B070C /* brew-services-sudo.json in Resources */, C4E2E85928FC256B003B070C /* brew-services-normal.json in Resources */, + C40934A8298EEB8700D25014 /* phpmon-dev.rb in Resources */, C4E2E84F28FC22E4003B070C /* brew-formula.json in Resources */, C4E2E86228FC28A6003B070C /* brew-services.json in Resources */, ); @@ -2010,6 +2031,7 @@ C4570C3A28FC355300D18420 /* Localizable.strings in Resources */, C4E2E85628FC256B003B070C /* brew-services-sudo.json in Resources */, C4E2E85A28FC256B003B070C /* brew-services-normal.json in Resources */, + C40934A9298EEB8700D25014 /* phpmon-dev.rb in Resources */, C4E2E85028FC22E4003B070C /* brew-formula.json in Resources */, C4E2E86128FC28A6003B070C /* brew-services.json in Resources */, ); @@ -2036,6 +2058,7 @@ C455165B297AEDB5009B8466 /* valetrc.broken in Resources */, 54A18D40282A566E000A0D81 /* nginx-secure-proxy-custom-tld.test in Resources */, C42CFB1627DFDE7900862737 /* nginx-site.test in Resources */, + C40934A7298EEB8700D25014 /* phpmon-dev.rb in Resources */, C459B4BD27F6093700E9B4B4 /* nginx-proxy.test in Resources */, C4E2E85428FC256B003B070C /* brew-services-sudo.json in Resources */, ); @@ -2088,6 +2111,7 @@ C4ACA38F25C754C100060C66 /* PhpExtension.swift in Sources */, C4D3661A291173EA006BD146 /* DictionaryExtension.swift in Sources */, C4C8900728F0E3EF00CE5E97 /* ActiveFileSystem.swift in Sources */, + C409349D298EE8E900D25014 /* AppUpdater.swift in Sources */, C4D8016622B1584700C6DA1B /* Startup.swift in Sources */, C42C49DB27C2806F0074ABAC /* MainMenu+FixMyValet.swift in Sources */, C48D6C70279CD2AC00F26D7E /* VersionNumber.swift in Sources */, @@ -2157,6 +2181,7 @@ C4CE3BB827B31F2E0086CA49 /* MainMenu+Switcher.swift in Sources */, C415937F27A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */, C4811D2422D70A4700B5F6B3 /* App.swift in Sources */, + C40934A2298EEB2C00D25014 /* CaskFile.swift in Sources */, C495F5AF28A42E080087F70A /* EnvironmentCheck.swift in Sources */, C46EBC4428DB95F0007ACC74 /* ShellProtocol.swift in Sources */, C41C1B4922B00A9800E7CF16 /* MenuBarImageGenerator.swift in Sources */, @@ -2283,6 +2308,7 @@ C471E84C28F9BB650021E251 /* EnvironmentManager.swift in Sources */, C471E84D28F9BB650021E251 /* ActivePhpInstallation+Checks.swift in Sources */, C471E84E28F9BB650021E251 /* MainMenu.swift in Sources */, + C40934A4298EEB2C00D25014 /* CaskFile.swift in Sources */, C471E84F28F9BB650021E251 /* MainMenu+Startup.swift in Sources */, C471E85028F9BB650021E251 /* MainMenu+Async.swift in Sources */, C471E85128F9BB650021E251 /* MainMenu+Switcher.swift in Sources */, @@ -2382,6 +2408,7 @@ C471E81C28F9BB250021E251 /* BetterAlert.swift in Sources */, C471E7DB28F9BA8F0021E251 /* RealShell.swift in Sources */, C471E7FF28F9BAD10021E251 /* Xdebug.swift in Sources */, + C409349F298EE8E900D25014 /* AppUpdater.swift in Sources */, C471E7F228F9BAC70021E251 /* PhpEnv.swift in Sources */, C471E7E628F9BAC20021E251 /* Process.swift in Sources */, C471E81928F9BAE80021E251 /* NSMenuItemExtension.swift in Sources */, @@ -2422,6 +2449,7 @@ C471E89228F9BB8F0021E251 /* Alert.swift in Sources */, C471E89328F9BB8F0021E251 /* Application.swift in Sources */, C471E89428F9BB8F0021E251 /* LocalNotification.swift in Sources */, + C40934A5298EEB2C00D25014 /* CaskFile.swift in Sources */, C471E89528F9BB8F0021E251 /* MenuBarImageGenerator.swift in Sources */, C471E89628F9BB8F0021E251 /* PMWindowController.swift in Sources */, C471E89728F9BB8F0021E251 /* VersionExtractor.swift in Sources */, @@ -2526,6 +2554,7 @@ C4BB393C2981AFC700F8E797 /* PhpVersionSource.swift in Sources */, C471E7F628F9BAC80021E251 /* PhpHelper.swift in Sources */, C471E7EE28F9BAC30021E251 /* Constants.swift in Sources */, + C40934A0298EE8E900D25014 /* AppUpdater.swift in Sources */, C471E80E28F9BAE80021E251 /* DateExtension.swift in Sources */, C471E7D028F9BA630021E251 /* FileSystemProtocol.swift in Sources */, C471E81228F9BAE80021E251 /* TimeIntervalExtension.swift in Sources */, @@ -2592,6 +2621,7 @@ C485707128BF452E00539B36 /* WarningManager.swift in Sources */, C41CA5EE2774F8EE00A2C80E /* DomainListVC+Actions.swift in Sources */, C4FACE81288F1C0D00FC478F /* PreferencesWindowController+Hotkey.swift in Sources */, + C40934A3298EEB2C00D25014 /* CaskFile.swift in Sources */, 54D9E0B727E4F51E003B9AD9 /* HotKey.swift in Sources */, C413E43528DA3EB100AE33C7 /* TestableShellTest.swift in Sources */, C4205A7F27F4D21800191A39 /* ValetProxy.swift in Sources */, @@ -2730,6 +2760,7 @@ C4F30B0A278E1A1A00755FCE /* ComposerJson.swift in Sources */, C4C0E8E027F88AEB002D32A9 /* FakeDomainScanner.swift in Sources */, C4463FCD29804BCB007B93D5 /* RCFile.swift in Sources */, + C409349E298EE8E900D25014 /* AppUpdater.swift in Sources */, C4AF9F7D275454A900D44ED0 /* ValetVersionExtractorTest.swift in Sources */, C4B56362276AB0A500F12CCB /* VersionExtractorTest.swift in Sources */, C4B585452770FE3900DA4FBE /* RealCommand.swift in Sources */, @@ -2755,6 +2786,7 @@ C4A81CA528C67101008DD9D1 /* PMTableView.swift in Sources */, C45E76152854A65300B4FE0C /* ServicesManager.swift in Sources */, C4D36602291132B7006BD146 /* ValetScanners.swift in Sources */, + C40934AB298EEDA900D25014 /* CaskFileParserTest.swift in Sources */, C4551657297AED18009B8466 /* ValetRcTest.swift in Sources */, C464ADAD275A7A3F003FCD53 /* DomainListWindowController.swift in Sources */, C40C7F1F2772136000DDDCDC /* PhpEnv.swift in Sources */, diff --git a/phpmon/Common/Core/Constants.swift b/phpmon/Common/Core/Constants.swift index 85fe851..96b5e26 100644 --- a/phpmon/Common/Core/Constants.swift +++ b/phpmon/Common/Core/Constants.swift @@ -41,7 +41,7 @@ struct Constants { 3: // Valet v3 dropped support for v5.6 [ "7.0", "7.1", "7.2", "7.3", "7.4", - "8.0", "8.1", "8.2", + "8.0", "8.1", "8.2", "8.3" // dev ], 4: // Valet v4 dropped support for v7.0 diff --git a/phpmon/Common/Core/Logger.swift b/phpmon/Common/Core/Logger.swift index 8f940b2..c7f331f 100644 --- a/phpmon/Common/Core/Logger.swift +++ b/phpmon/Common/Core/Logger.swift @@ -13,7 +13,7 @@ class Log { static var shared = Log() var logFilePath = "~/.config/phpmon/last_session.log" - + var logExists = false enum Verbosity: Int { diff --git a/phpmon/Domain/App/AppUpdater.swift b/phpmon/Domain/App/AppUpdater.swift new file mode 100644 index 0000000..dfc25ea --- /dev/null +++ b/phpmon/Domain/App/AppUpdater.swift @@ -0,0 +1,51 @@ +// +// AppUpdater.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/02/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import Foundation + +class AppUpdater { + + var caskFile: CaskFile? + + public func checkForUpdates(background: Bool) { + guard let caskFile = CaskFile.from( + url: App.version.contains("-dev") + ? Constants.Urls.DevBuildCaskFile + : Constants.Urls.StableBuildCaskFile + ) else { + return presentCouldNotRetrieveUpdate() + } + + self.caskFile = caskFile + + if newerVersionExists() { + presentNewerVersionAvailableAlert() + } else { + if !background { + presentNoNewerVersionAvailableAlert() + } + } + } + + public func newerVersionExists() -> Bool { + // Do the comparison w/ current version + return true + } + + public func presentNewerVersionAvailableAlert() { + + } + + public func presentNoNewerVersionAvailableAlert() { + + } + + public func presentCouldNotRetrieveUpdate() { + + } +} diff --git a/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift b/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift index 882ff56..5ee78f5 100644 --- a/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift +++ b/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift @@ -57,7 +57,7 @@ class DomainListPhpCell: NSTableCellView, DomainListCellProtocol { if site.isolatedPhpVersion != nil { return [] } - + guard let install = PhpEnv.phpInstall else { return [] } diff --git a/phpmon/Domain/Integrations/Homebrew/CaskFile.swift b/phpmon/Domain/Integrations/Homebrew/CaskFile.swift new file mode 100644 index 0000000..b2db7f7 --- /dev/null +++ b/phpmon/Domain/Integrations/Homebrew/CaskFile.swift @@ -0,0 +1,47 @@ +// +// CaskFile.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/02/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import Foundation + +struct CaskFile { + var properties: [String: String] + + public static func from(url: URL) -> CaskFile? { + let string = try? String(contentsOf: url) + + guard let string else { + return nil + } + + let lines = string.split(separator: "\n") + .filter { $0 != "" } + + if lines.count < 4 { + return nil + } + + if !lines.first!.starts(with: "cask") || !lines.last!.starts(with: "end") { + return nil + } + + var props: [String: String] = [:] + + lines.forEach { line in + let text = line.trimmingCharacters(in: .whitespacesAndNewlines) + let parts = text.split(separator: " ") + + if parts.count == 2 { + props[String(parts[0])] = String(parts[1]) + .replacingOccurrences(of: "\'", with: "") + } + } + + return CaskFile(properties: props) + } + +} diff --git a/tests/unit/Parsers/CaskFileParserTest.swift b/tests/unit/Parsers/CaskFileParserTest.swift new file mode 100644 index 0000000..8cc661b --- /dev/null +++ b/tests/unit/Parsers/CaskFileParserTest.swift @@ -0,0 +1,48 @@ +// +// CaskFileParserTest.swift +// Unit Tests +// +// Created by Nico Verbruggen on 04/02/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import XCTest + +class CaskFileParserTest: XCTestCase { + + // MARK: - Test Files + static var exampleFilePath: URL { + return Bundle(for: Self.self) + .url(forResource: "phpmon-dev", withExtension: "rb")! + } + + func test_can_extract_fields_from_cask_file() throws { + let caskFile = CaskFile.from(url: CaskFileParserTest.exampleFilePath) + + XCTAssertEqual( + caskFile!.properties["version"], + "5.7.2_1035" + ) + XCTAssertEqual( + caskFile!.properties["homepage"], + "https://phpmon.app" + ) + XCTAssertEqual( + caskFile!.properties["appcast"], + "https://github.com/nicoverbruggen/phpmon/releases.atom" + ) + XCTAssertEqual( + caskFile!.properties["url"], + "https://github.com/nicoverbruggen/phpmon/releases/download/v5.7.2/phpmon-dev.zip" + ) + } + + func test_can_extract_fields_from_remote_cask_file() throws { + let caskFile = CaskFile.from(url: Constants.Urls.StableBuildCaskFile) + + XCTAssertTrue(caskFile!.properties.keys.contains("version")) + XCTAssertTrue(caskFile!.properties.keys.contains("homepage")) + XCTAssertTrue(caskFile!.properties.keys.contains("url")) + XCTAssertTrue(caskFile!.properties.keys.contains("appcast")) + } +} diff --git a/tests/unit/Test Files/brew/phpmon-dev.rb b/tests/unit/Test Files/brew/phpmon-dev.rb new file mode 100644 index 0000000..2b487c9 --- /dev/null +++ b/tests/unit/Test Files/brew/phpmon-dev.rb @@ -0,0 +1,13 @@ +cask 'phpmon-dev' do + depends_on formula: 'gnu-sed' + + version '5.7.2_1035' + sha256 '1cb147bd1b1fbd52971d90dff577465b644aee7c878f15ede57f46e8f217067a' + + url 'https://github.com/nicoverbruggen/phpmon/releases/download/v5.7.2/phpmon-dev.zip' + appcast 'https://github.com/nicoverbruggen/phpmon/releases.atom' + name 'PHP Monitor DEV' + homepage 'https://phpmon.app' + + app 'PHP Monitor DEV.app', target: "PHP Monitor DEV.app" +end