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 + } + +}