From 99881bf4cd8eb1ac015227c86e6c1590e8e2b4c0 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Wed, 4 May 2022 20:25:59 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20WIP:=20Refactor=20determin?= =?UTF-8?q?ing=20PHP=20configuration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The way .ini files are loaded is changing with this commit. Instead of directly saving which extensions were found, the extensions loaded are now determined by reading the .ini file. However, there are some performance concerns here. Perhaps it is worth *not* reloading the contents of these files unless absolutely necessary. --- PHP Monitor.xcodeproj/project.pbxproj | 10 +++++ phpmon-tests/Parsers/PhpIniTest.swift | 23 +++++++++++ phpmon/Common/PHP/ActivePhpInstallation.swift | 30 +++++++++++---- phpmon/Common/PHP/PhpInitializationFile.swift | 38 +++++++++++++++++++ 4 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 phpmon-tests/Parsers/PhpIniTest.swift create mode 100644 phpmon/Common/PHP/PhpInitializationFile.swift diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 320449b..185f08e 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -118,6 +118,9 @@ C464ADB0275A7A6A003FCD53 /* DomainListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAE275A7A69003FCD53 /* DomainListVC.swift */; }; C464ADB2275A87CA003FCD53 /* DomainListCellProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADB1275A87CA003FCD53 /* DomainListCellProtocol.swift */; }; C46FA23F246C358E00944F05 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA23E246C358E00944F05 /* StringExtension.swift */; }; + C46FA9882822EFDC00D78807 /* PhpInitializationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA9872822EFDC00D78807 /* PhpInitializationFile.swift */; }; + C46FA9892822EFDC00D78807 /* PhpInitializationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA9872822EFDC00D78807 /* PhpInitializationFile.swift */; }; + C46FA98C2822F08F00D78807 /* PhpIniTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA98A2822F08F00D78807 /* PhpIniTest.swift */; }; C473319F2470923A009A0597 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C473319E2470923A009A0597 /* Localizable.strings */; }; C47331A2247093B7009A0597 /* StatusMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C47331A1247093B7009A0597 /* StatusMenu.swift */; }; C474B00624C0E98C00066A22 /* LocalNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = C474B00524C0E98C00066A22 /* LocalNotification.swift */; }; @@ -338,6 +341,8 @@ C464ADAE275A7A69003FCD53 /* DomainListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomainListVC.swift; sourceTree = ""; }; C464ADB1275A87CA003FCD53 /* DomainListCellProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomainListCellProtocol.swift; sourceTree = ""; }; C46FA23E246C358E00944F05 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = ""; }; + C46FA9872822EFDC00D78807 /* PhpInitializationFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpInitializationFile.swift; sourceTree = ""; }; + C46FA98A2822F08F00D78807 /* PhpIniTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpIniTest.swift; sourceTree = ""; }; C473319E2470923A009A0597 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; C47331A1247093B7009A0597 /* StatusMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusMenu.swift; sourceTree = ""; }; C474B00524C0E98C00066A22 /* LocalNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalNotification.swift; sourceTree = ""; }; @@ -461,6 +466,7 @@ C41C1B4A22B019FF00E7CF16 /* ActivePhpInstallation.swift */, C4F2E4392752F7D00020E974 /* PhpInstallation.swift */, C4ACA38E25C754C100060C66 /* PhpExtension.swift */, + C46FA9872822EFDC00D78807 /* PhpInitializationFile.swift */, ); path = PHP; sourceTree = ""; @@ -854,6 +860,7 @@ children = ( C4AF9F76275447F100D44ED0 /* ValetConfigurationTest.swift */, C4F780AD25D80B37000DBC97 /* PhpExtensionTest.swift */, + C46FA98A2822F08F00D78807 /* PhpIniTest.swift */, C43A8A2325D9D20D00591B77 /* HomebrewPackageTest.swift */, C42CFB1927DFE8BD00862737 /* NginxConfigurationTest.swift */, ); @@ -1125,6 +1132,7 @@ C48D6C70279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */, C4B585412770FE3900DA4FBE /* Shell.swift in Sources */, C4998F0A2617633900B2526E /* PrefsWC.swift in Sources */, + C46FA9882822EFDC00D78807 /* PhpInitializationFile.swift in Sources */, C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */, C4AF9F7A2754499000D44ED0 /* Valet.swift in Sources */, C4C0E8EA27F88B80002D32A9 /* ValetProxy+Fake.swift in Sources */, @@ -1271,6 +1279,7 @@ C4C0E8E327F88B13002D32A9 /* ValetSiteScanner.swift in Sources */, C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */, C4B5635F276AB09000F12CCB /* VersionExtractor.swift in Sources */, + C46FA98C2822F08F00D78807 /* PhpIniTest.swift in Sources */, C4BF90C127C57C220054E78C /* MainMenu+FixMyValet.swift in Sources */, C4C0E8EB27F88B80002D32A9 /* ValetProxy+Fake.swift in Sources */, C4F2E4382752F08D0020E974 /* HomebrewDiagnostics.swift in Sources */, @@ -1331,6 +1340,7 @@ C44CCD4A27AFF3BC00CE40E5 /* MainMenu+Async.swift in Sources */, C449B4F327EE7FC600C47E8A /* DomainListTypeCell.swift in Sources */, C48D6C71279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */, + C46FA9892822EFDC00D78807 /* PhpInitializationFile.swift in Sources */, C41C02AB27E61CB3009F26CB /* ValetSite+Fake.swift in Sources */, C4F780C925D80B75000DBC97 /* StringExtension.swift in Sources */, C4D9F24C280B69E100DCD39A /* AddProxyVC.swift in Sources */, diff --git a/phpmon-tests/Parsers/PhpIniTest.swift b/phpmon-tests/Parsers/PhpIniTest.swift new file mode 100644 index 0000000..d6f20b6 --- /dev/null +++ b/phpmon-tests/Parsers/PhpIniTest.swift @@ -0,0 +1,23 @@ +// +// PhpIniTest.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/05/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import XCTest + +class PhpIniTest: XCTestCase { + + static var phpIniFileUrl: URL { + return Bundle(for: Self.self).url(forResource: "php", withExtension: "ini")! + } + + func testCanLoadExtension() throws { + let iniFile = PhpInitializationFile(fileUrl: Self.phpIniFileUrl) + + XCTAssertNotNil(iniFile) + } + +} diff --git a/phpmon/Common/PHP/ActivePhpInstallation.swift b/phpmon/Common/PHP/ActivePhpInstallation.swift index cc462ad..4eb125d 100644 --- a/phpmon/Common/PHP/ActivePhpInstallation.swift +++ b/phpmon/Common/PHP/ActivePhpInstallation.swift @@ -20,7 +20,13 @@ class ActivePhpInstallation { var version: Version! var limits: Limits! - var extensions: [PhpExtension]! + var iniFiles: [PhpInitializationFile] = [] + + var extensions: [PhpExtension] { + return iniFiles.flatMap { initFile in + return initFile.extensions + } + } // MARK: - Computed @@ -34,16 +40,23 @@ class ActivePhpInstallation { // Show information about the current version getVersion() + // Initialize the list of ini files that are loaded + iniFiles = [] + // If an error occurred, exit early if version.error { limits = Limits() - extensions = [] return } // Load extension information - let path = URL(fileURLWithPath: "\(Paths.etcPath)/php/\(version.short)/php.ini") - extensions = PhpExtension.load(from: path) + let mainConfigurationFileUrl = URL(fileURLWithPath: "\(Paths.etcPath)/php/\(version.short)/php.ini") + + iniFiles.append( + PhpInitializationFile(fileUrl: mainConfigurationFileUrl) + ) + + // extensions.append(contentsOf: PhpExtension.load(from: mainConfigurationFileUrl)) // Get configuration values limits = Limits( @@ -60,10 +73,11 @@ class ActivePhpInstallation { // See if any extensions are present in said .ini files paths.forEach { (iniFilePath) in - let loadedExtensions = PhpExtension.load(from: URL(fileURLWithPath: iniFilePath)) - if loadedExtensions.isEmpty { - extensions.append(contentsOf: loadedExtensions) - } + let fileUrl = URL(fileURLWithPath: iniFilePath) + + iniFiles.append( + PhpInitializationFile(fileUrl: fileUrl) + ) } } diff --git a/phpmon/Common/PHP/PhpInitializationFile.swift b/phpmon/Common/PHP/PhpInitializationFile.swift new file mode 100644 index 0000000..c731941 --- /dev/null +++ b/phpmon/Common/PHP/PhpInitializationFile.swift @@ -0,0 +1,38 @@ +// +// PhpInitFile.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/05/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import Foundation + +class PhpInitializationFile { + + /// The file where this extension was located. + let file: String + + /// The original string contained within the file when scanned. + let raw: [String] + + /// The extensions found in this .ini file. + let extensions: [PhpExtension] + + init(fileUrl: URL) { + self.file = fileUrl.path + + let rawString = (try? String(contentsOf: fileUrl, encoding: .utf8)) ?? "" + + self.raw = rawString.components(separatedBy: "\n") + + self.extensions = PhpExtension.load(from: fileUrl) + + dump(self) + + // TODO: Actually parse the .ini file + // Parsing the file could be done like this gist: + // https://gist.github.com/jetmind/f776c0d223e4ac6aec1ff9389e874553 + } + +}