diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 7bc490b..f0bb1aa 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -197,6 +197,15 @@ C4551657297AED18009B8466 /* ValetRcTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4551656297AED18009B8466 /* ValetRcTest.swift */; }; C4551659297AED7D009B8466 /* valetrc.valid in Resources */ = {isa = PBXBuildFile; fileRef = C4551658297AED7D009B8466 /* valetrc.valid */; }; C455165B297AEDB5009B8466 /* valetrc.broken in Resources */ = {isa = PBXBuildFile; fileRef = C455165A297AEDB5009B8466 /* valetrc.broken */; }; + C456A0C62AA614BD0080144F /* PhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0C52AA614BD0080144F /* PhpPreference.swift */; }; + C456A0C72AA614BD0080144F /* PhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0C52AA614BD0080144F /* PhpPreference.swift */; }; + C456A0C82AA614BD0080144F /* PhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0C52AA614BD0080144F /* PhpPreference.swift */; }; + C456A0C92AA614BD0080144F /* PhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0C52AA614BD0080144F /* PhpPreference.swift */; }; + C456A0CB2AA6166F0080144F /* BytePhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */; }; + C456A0CC2AA6166F0080144F /* BytePhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */; }; + C456A0CD2AA6166F0080144F /* BytePhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */; }; + C456A0CE2AA6166F0080144F /* BytePhpPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */; }; + C456A0D22AA6179D0080144F /* BytePhpPreferenceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C456A0D12AA6179D0080144F /* BytePhpPreferenceTest.swift */; }; C459B4BD27F6093700E9B4B4 /* nginx-proxy.test in Resources */ = {isa = PBXBuildFile; fileRef = C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */; }; C45B9149295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; }; C45B914A295607F400F4EC78 /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = C45B9148295607F400F4EC78 /* Service.swift */; }; @@ -239,7 +248,7 @@ C46FA23F246C358E00944F05 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA23E246C358E00944F05 /* StringExtension.swift */; }; C46FA9882822EFDC00D78807 /* PhpConfigurationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA9872822EFDC00D78807 /* PhpConfigurationFile.swift */; }; C46FA9892822EFDC00D78807 /* PhpConfigurationFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA9872822EFDC00D78807 /* PhpConfigurationFile.swift */; }; - C46FA98C2822F08F00D78807 /* PhpConfigurationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA98A2822F08F00D78807 /* PhpConfigurationTest.swift */; }; + C46FA98C2822F08F00D78807 /* PhpConfigurationFileTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46FA98A2822F08F00D78807 /* PhpConfigurationFileTest.swift */; }; C4709CA228524B3400088BB8 /* StatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4709CA128524B3400088BB8 /* StatsView.swift */; }; C471E79328F9B21F0021E251 /* ActiveFileSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C8900628F0E3EF00CE5E97 /* ActiveFileSystem.swift */; }; C471E79428F9B23B0021E251 /* FileSystemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C8900228F0E28800CE5E97 /* FileSystemProtocol.swift */; }; @@ -896,6 +905,7 @@ C417DC73277614690015E6EE /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; C4181F1028FAF9330042EA28 /* UITestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITestCase.swift; sourceTree = ""; }; C41ADCE72970CCC700120423 /* FSNotifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FSNotifier.swift; sourceTree = ""; }; + C41B5AF02AA226CD00BB633C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; C41C02A827E61A65009F26CB /* FakeValetSite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FakeValetSite.swift; sourceTree = ""; }; C41C1B3322B0097F00E7CF16 /* PHP Monitor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PHP Monitor.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C41C1B3622B0097F00E7CF16 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -952,6 +962,9 @@ C4551656297AED18009B8466 /* ValetRcTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetRcTest.swift; sourceTree = ""; }; C4551658297AED7D009B8466 /* valetrc.valid */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = valetrc.valid; sourceTree = ""; }; C455165A297AEDB5009B8466 /* valetrc.broken */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = valetrc.broken; sourceTree = ""; }; + C456A0C52AA614BD0080144F /* PhpPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpPreference.swift; sourceTree = ""; }; + C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BytePhpPreference.swift; sourceTree = ""; }; + C456A0D12AA6179D0080144F /* BytePhpPreferenceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BytePhpPreferenceTest.swift; sourceTree = ""; }; C459B4BC27F6093700E9B4B4 /* nginx-proxy.test */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "nginx-proxy.test"; sourceTree = ""; }; C45B9148295607F400F4EC78 /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; C45B914D295608E300F4EC78 /* ValetServicesManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValetServicesManager.swift; sourceTree = ""; }; @@ -971,7 +984,7 @@ C46EBC4928DB966A007ACC74 /* TestableShell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestableShell.swift; sourceTree = ""; }; C46FA23E246C358E00944F05 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = ""; }; C46FA9872822EFDC00D78807 /* PhpConfigurationFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpConfigurationFile.swift; sourceTree = ""; }; - C46FA98A2822F08F00D78807 /* PhpConfigurationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpConfigurationTest.swift; sourceTree = ""; }; + C46FA98A2822F08F00D78807 /* PhpConfigurationFileTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpConfigurationFileTest.swift; sourceTree = ""; }; C4709CA128524B3400088BB8 /* StatsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsView.swift; sourceTree = ""; }; C471E79228F9B1D30021E251 /* PHP Monitor.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "PHP Monitor.xctestplan"; sourceTree = ""; }; C471E7AD28F9B4940021E251 /* Feature Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Feature Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1063,7 +1076,6 @@ C4D9ADC7277611A0007277F4 /* InternalSwitcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalSwitcher.swift; sourceTree = ""; }; C4D9F24A280B69E100DCD39A /* AddProxyVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddProxyVC.swift; sourceTree = ""; }; C4DD662A2A4A1B4E00D6A731 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - C4DD662B2A4A1E5B00D6A731 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/Main.storyboard; sourceTree = ""; }; C4DEB7D327A5D60B00834718 /* Stats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stats.swift; sourceTree = ""; }; C4E0F7EC27BEBDA9007475F2 /* NSWindowExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSWindowExtension.swift; sourceTree = ""; }; C4E2E84628FC1D8C003B070C /* TestableConfigurationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestableConfigurationTest.swift; sourceTree = ""; }; @@ -1527,6 +1539,8 @@ C44DFA842A6706C900B98ED5 /* Data */ = { isa = PBXGroup; children = ( + C456A0C52AA614BD0080144F /* PhpPreference.swift */, + C456A0CA2AA6166F0080144F /* BytePhpPreference.swift */, ); path = Data; sourceTree = ""; @@ -1563,6 +1577,15 @@ path = phpmon; sourceTree = ""; }; + C456A0D02AA6175D0080144F /* Config */ = { + isa = PBXGroup; + children = ( + C46FA98A2822F08F00D78807 /* PhpConfigurationFileTest.swift */, + C456A0D12AA6179D0080144F /* BytePhpPreferenceTest.swift */, + ); + path = Config; + sourceTree = ""; + }; C459B4BE27F6093A00E9B4B4 /* nginx */ = { isa = PBXGroup; children = ( @@ -1893,9 +1916,9 @@ C4C1019727C65A11001FACC2 /* Parsers */ = { isa = PBXGroup; children = ( + C456A0D02AA6175D0080144F /* Config */, C4AF9F76275447F100D44ED0 /* ValetConfigurationTest.swift */, C4F780AD25D80B37000DBC97 /* PhpExtensionTest.swift */, - C46FA98A2822F08F00D78807 /* PhpConfigurationTest.swift */, C43A8A2325D9D20D00591B77 /* HomebrewPackageTest.swift */, C42CFB1927DFE8BD00862737 /* NginxConfigurationTest.swift */, C4551656297AED18009B8466 /* ValetRcTest.swift */, @@ -2225,6 +2248,7 @@ nl, de, "pt-PT", + Base, ); mainGroup = C41C1B2A22B0097F00E7CF16; packageReferences = ( @@ -2423,6 +2447,7 @@ C40FE737282ABA4F00A302C2 /* AppVersion.swift in Sources */, C44A874828905BB000498BC4 /* ProgressVC.swift in Sources */, C4CCBA6C275C567B008C7055 /* PMWindowController.swift in Sources */, + C456A0C62AA614BD0080144F /* PhpPreference.swift in Sources */, C4B585442770FE3900DA4FBE /* RealCommand.swift in Sources */, C44067F527E2582B0045BD4E /* DomainListNameCell.swift in Sources */, C40C5C9C2846A40600E28255 /* Preset.swift in Sources */, @@ -2449,6 +2474,7 @@ 54B48B5F275F66AE006D90C5 /* Application.swift in Sources */, C4B97B78275CF1B5003F3378 /* App+ActivationPolicy.swift in Sources */, C4CE3BB827B31F2E0086CA49 /* MainMenu+Switcher.swift in Sources */, + C456A0CB2AA6166F0080144F /* BytePhpPreference.swift in Sources */, C415937F27A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */, C4811D2422D70A4700B5F6B3 /* App.swift in Sources */, C44DFA7C2A67043000B98ED5 /* ConfigManagerView.swift in Sources */, @@ -2567,6 +2593,7 @@ C471E83428F9BB650021E251 /* VersionExtractor.swift in Sources */, C471E83528F9BB650021E251 /* ValetProxy.swift in Sources */, C471E83728F9BB650021E251 /* DomainScanner.swift in Sources */, + C456A0C82AA614BD0080144F /* PhpPreference.swift in Sources */, C490E3BE29BCA375006D2DE6 /* Measurements.swift in Sources */, C471E83928F9BB650021E251 /* ValetSite.swift in Sources */, C471E83A28F9BB650021E251 /* FakeValetSite.swift in Sources */, @@ -2674,6 +2701,7 @@ C471E88D28F9BB650021E251 /* Key.swift in Sources */, C471E88E28F9BB650021E251 /* KeyCombo.swift in Sources */, C471E88F28F9BB650021E251 /* ModifierFlagsExtension.swift in Sources */, + C456A0CD2AA6166F0080144F /* BytePhpPreference.swift in Sources */, C471E7E928F9BAC20021E251 /* Paths.swift in Sources */, C45B91552956123A00F4EC78 /* FakeServicesManager.swift in Sources */, C471E7FE28F9BACE0021E251 /* HomebrewDecodable.swift in Sources */, @@ -2819,6 +2847,7 @@ C471E8C928F9BB8F0021E251 /* PhpDoctorWindowController.swift in Sources */, C41ADCEB2970CCC700120423 /* FSNotifier.swift in Sources */, C471E8CA28F9BB8F0021E251 /* OnboardingWindowController.swift in Sources */, + C456A0C92AA614BD0080144F /* PhpPreference.swift in Sources */, C4D4CB3A29C109CF00DB9F93 /* InternalSwitcher+Valet.swift in Sources */, C471E8CB28F9BB8F0021E251 /* PreferencesWindowController.swift in Sources */, C471E8CC28F9BB8F0021E251 /* PreferencesWindowController+Hotkey.swift in Sources */, @@ -2858,6 +2887,7 @@ C471E8EA28F9BB8F0021E251 /* SectionHeaderView.swift in Sources */, C4D36604291132B7006BD146 /* ValetScanners.swift in Sources */, C471E8EB28F9BB8F0021E251 /* HeaderView.swift in Sources */, + C456A0CE2AA6166F0080144F /* BytePhpPreference.swift in Sources */, C4FD87A829AB9ABD0002D701 /* PhpConfigChecker.swift in Sources */, C45B9151295608E300F4EC78 /* ValetServicesManager.swift in Sources */, C471E8EC28F9BB8F0021E251 /* SwiftUIHelper.swift in Sources */, @@ -3000,7 +3030,7 @@ C4CCBA6D275C567B008C7055 /* PMWindowController.swift in Sources */, C4B5635F276AB09000F12CCB /* VersionExtractor.swift in Sources */, C463E381284930EE00422731 /* PresetHelper.swift in Sources */, - C46FA98C2822F08F00D78807 /* PhpConfigurationTest.swift in Sources */, + C46FA98C2822F08F00D78807 /* PhpConfigurationFileTest.swift in Sources */, C4D5576529C77CC5001A44CD /* PhpVersionManagerWindowController.swift in Sources */, C4BF90C127C57C220054E78C /* MainMenu+FixMyValet.swift in Sources */, C4E49DEB28F7643D0026AC4E /* CommandProtocol.swift in Sources */, @@ -3008,6 +3038,7 @@ C485707428BF454E00539B36 /* ServicesView.swift in Sources */, C4B79EC729CA474200A483EE /* FakeCommand.swift in Sources */, C4F780AE25D80B37000DBC97 /* PhpExtensionTest.swift in Sources */, + C456A0C72AA614BD0080144F /* PhpPreference.swift in Sources */, C4C8E819276F54D8003AC782 /* App+ConfigWatch.swift in Sources */, C4FC21B128391F8E00D368BB /* MainMenu+Actions.swift in Sources */, 54D9E0B927E4F51E003B9AD9 /* KeyCombo.swift in Sources */, @@ -3077,6 +3108,7 @@ C4E2E84B28FC1E70003B070C /* DataExtension.swift in Sources */, C449B4F127EE7FC200C47E8A /* DomainListNameCell.swift in Sources */, C4F780BA25D80B62000DBC97 /* AppDelegate.swift in Sources */, + C456A0D22AA6179D0080144F /* BytePhpPreferenceTest.swift in Sources */, 54FCFD31276C8DA4004CE748 /* HotkeyPreferenceView.swift in Sources */, C4998F0B2617633900B2526E /* PreferencesWindowController.swift in Sources */, C485707228BF453800539B36 /* SwiftUIHelper.swift in Sources */, @@ -3111,6 +3143,7 @@ C4927F0C27B2DFC200C55AFD /* Errors.swift in Sources */, C485707628BF455100539B36 /* SectionHeaderView.swift in Sources */, C46EBC4828DB9644007ACC74 /* RealShell.swift in Sources */, + C456A0CC2AA6166F0080144F /* BytePhpPreference.swift in Sources */, C48DDD0E29C75C9E00D032D9 /* BlockingOverlayView.swift in Sources */, C4E4404727C56F4700D225E1 /* ValetSite.swift in Sources */, C44CCD4A27AFF3BC00CE40E5 /* MainMenu+Async.swift in Sources */, @@ -3169,7 +3202,7 @@ C41C1B3C22B0098000E7CF16 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - C4DD662B2A4A1E5B00D6A731 /* en */, + C41B5AF02AA226CD00BB633C /* Base */, ); name = Main.storyboard; sourceTree = ""; diff --git a/phpmon/Common/Extensions/StringExtension.swift b/phpmon/Common/Extensions/StringExtension.swift index d98ac58..cc7afb5 100644 --- a/phpmon/Common/Extensions/StringExtension.swift +++ b/phpmon/Common/Extensions/StringExtension.swift @@ -131,4 +131,10 @@ extension String { return "" } } + + var isNumber: Bool { + return self.range( + of: "^[0-9]*$", // 1 + options: .regularExpression) != nil + } } diff --git a/phpmon/Domain/App/en.lproj/Main.storyboard b/phpmon/Domain/App/Base.lproj/Main.storyboard similarity index 100% rename from phpmon/Domain/App/en.lproj/Main.storyboard rename to phpmon/Domain/App/Base.lproj/Main.storyboard diff --git a/phpmon/Modules/PHP Config Editor/Data/BytePhpPreference.swift b/phpmon/Modules/PHP Config Editor/Data/BytePhpPreference.swift new file mode 100644 index 0000000..5a4adc3 --- /dev/null +++ b/phpmon/Modules/PHP Config Editor/Data/BytePhpPreference.swift @@ -0,0 +1,75 @@ +// +// BytePhpPreference.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/09/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import Foundation + +class BytePhpPreference: PhpPreference { + enum UnitOption: String, CaseIterable { + case kilobyte = "K" + case megabyte = "M" + case gigabyte = "G" + + public var displayValue: String { + switch self { + case .kilobyte: return "KB" + case .megabyte: return "MB" + case .gigabyte: return "GB" + } + } + } + + // MARK: Internal Values + + var internalValue: String + + var value: Int = 256 { + didSet { updatedFieldValue() } + } + + var unit: UnitOption = .megabyte { + didSet { updatedFieldValue() } + } + + override init(key: String) { + let value = Command.execute( + path: Paths.php, arguments: ["-r", "echo ini_get('\(key)');"], + trimNewlines: false + ) + + self.internalValue = value + if let (unit, value) = BytePhpPreference.readFrom(internalValue: self.internalValue) { + self.unit = unit + self.value = value + } + super.init(key: key) + } + + // MARK: Save Value + + private func updatedFieldValue() { + internalValue = "\(value)\(unit.rawValue)" + } + + public static func readFrom(internalValue: String) -> (UnitOption, Int)? { + let pattern = "(-?\\d+)([KMG]?)" + let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive) + let range = NSRange(location: 0, length: internalValue.utf16.count) + + if let match = regex.firstMatch(in: internalValue, options: [], range: range) { + let valueRange = match.range(at: 1) + let unitRange = match.range(at: 2) + + if let value = Int(internalValue[Range(valueRange, in: internalValue)!]) { + let unitString = internalValue[Range(unitRange, in: internalValue)!] as String + return (UnitOption(rawValue: unitString) ?? UnitOption.kilobyte, value) + } + } + + return nil + } +} diff --git a/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift b/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift new file mode 100644 index 0000000..b49dea0 --- /dev/null +++ b/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift @@ -0,0 +1,26 @@ +// +// PhpPreference.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 04/09/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import Foundation +import SwiftUI + +class PhpPreference { + let key: String + + init(key: String) { + self.key = key + } +} + +class BoolPhpPreference: PhpPreference { + @State var value: Bool = true +} + +class StringPhpPreference: PhpPreference { + @State var value: String = "" +} diff --git a/phpmon/Modules/PHP Config Editor/UI/ByteLimitView.swift b/phpmon/Modules/PHP Config Editor/UI/ByteLimitView.swift index aeca6a2..71cabab 100644 --- a/phpmon/Modules/PHP Config Editor/UI/ByteLimitView.swift +++ b/phpmon/Modules/PHP Config Editor/UI/ByteLimitView.swift @@ -48,41 +48,52 @@ struct PreferenceContainer: View { } struct ByteLimitView: View { - @State private var selection = "256 MB" + @State private var unit: BytePhpPreference.UnitOption + @State private var numberText: String + @State private var unlimited: Bool - let colors = [ - "128 MB", - "256 MB", - "512 MB", - "1 GB", - "2 GB", - "Unlimited", - "Other" - ] + private var preference: BytePhpPreference + + init(preference: BytePhpPreference) { + self.preference = preference + self.numberText = String(preference.value) + self.unit = preference.unit + self.unlimited = (preference.value == -1) + } var body: some View { - Picker("Limit Name", selection: $selection) { - ForEach(colors, id: \.self) { - Text($0) + if !unlimited { + HStack { + TextField("", text: $numberText) + .onChange(of: numberText) { newText in + self.preference.value = Int(newText) ?? 256 + print(self.preference.internalValue) + } + Picker("Limit Name", selection: $unit) { + ForEach(BytePhpPreference.UnitOption.allCases, id: \.self) { + Text($0.displayValue) + } + } + .frame(maxWidth: 100) + .labelsHidden() + .pickerStyle(.menu) + .onChange(of: unit) { newValue in + self.preference.unit = newValue + print(self.preference.internalValue) + } } } - .labelsHidden() - .pickerStyle(.menu) - } - func setValue(value: String) { - return - } - - func getValue() -> String { - return "ok" + Toggle(isOn: $unlimited) { + Label("Allow unlimited usage", systemImage: "heart").labelStyle(.titleOnly) + } } } struct ByteLimitView_Previews: PreviewProvider { static var previews: some View { - PreferenceContainer(name: "Something\nStupid", description: "Description") { - ByteLimitView() + PreferenceContainer(name: "Max Size", description: "Some maximum size") { + ByteLimitView(preference: BytePhpPreference(key: "max_memory")) } ConfigManagerView() diff --git a/phpmon/Modules/PHP Config Editor/UI/ConfigManagerView.swift b/phpmon/Modules/PHP Config Editor/UI/ConfigManagerView.swift index 7e53d1a..dd9de19 100644 --- a/phpmon/Modules/PHP Config Editor/UI/ConfigManagerView.swift +++ b/phpmon/Modules/PHP Config Editor/UI/ConfigManagerView.swift @@ -9,32 +9,6 @@ import Foundation import SwiftUI -class PhpPreference { - let key: String - - init(key: String) { - self.key = key - } -} - -class BoolPhpPreference: PhpPreference { - @State var value: Bool = true -} - -class StringPhpPreference: PhpPreference { - @State var value: String = "" -} - -class BytePhpPreference: PhpPreference { - @State var value: String = "" -} - -enum PhpPreferenceType { - case byteLimit - case string - case boolean -} - struct ConfigManagerView: View { var preferences: [PhpPreference] = [ BytePhpPreference(key: "memory_limit"), @@ -75,7 +49,7 @@ struct ConfigManagerView: View { description: "php_ini.\(preference.key).description" ) { if let preference = preference as? BytePhpPreference { - ByteLimitView() + ByteLimitView(preference: preference) } if let preference = preference as? BoolPhpPreference { Toggle("", isOn: preference.$value) diff --git a/tests/unit/Parsers/Config/BytePhpPreferenceTest.swift b/tests/unit/Parsers/Config/BytePhpPreferenceTest.swift new file mode 100644 index 0000000..4e48c15 --- /dev/null +++ b/tests/unit/Parsers/Config/BytePhpPreferenceTest.swift @@ -0,0 +1,42 @@ +// +// BytePhpPreferenceTest.swift +// Unit Tests +// +// Created by Nico Verbruggen on 04/09/2023. +// Copyright © 2023 Nico Verbruggen. All rights reserved. +// + +import XCTest + +class BytePhpPreferenceTest: XCTestCase { + + func test_can_extract_memory_value() throws { + let pref = BytePhpPreference(key: "memory_limit") + + XCTAssertEqual(pref.internalValue, "512M") + XCTAssertEqual(pref.unit, .megabyte) + XCTAssertEqual(pref.value, 512) + } + + func test_can_parse_all_kinds_of_values() throws { + var (unit, value) = BytePhpPreference.readFrom(internalValue: "1G")! + XCTAssertEqual(unit, .gigabyte) + XCTAssertEqual(value, 1) + + (unit, value) = BytePhpPreference.readFrom(internalValue: "256M")! + XCTAssertEqual(unit, .megabyte) + XCTAssertEqual(value, 256) + + (unit, value) = BytePhpPreference.readFrom(internalValue: "512K")! + XCTAssertEqual(unit, .kilobyte) + XCTAssertEqual(value, 512) + + (unit, value) = BytePhpPreference.readFrom(internalValue: "1024")! + XCTAssertEqual(unit, .kilobyte) + XCTAssertEqual(value, 1024) + + (unit, value) = BytePhpPreference.readFrom(internalValue: "-1")! + XCTAssertEqual(unit, .kilobyte) + XCTAssertEqual(value, -1) + } +} diff --git a/tests/unit/Parsers/PhpConfigurationTest.swift b/tests/unit/Parsers/Config/PhpConfigurationFileTest.swift similarity index 96% rename from tests/unit/Parsers/PhpConfigurationTest.swift rename to tests/unit/Parsers/Config/PhpConfigurationFileTest.swift index 749c8ac..036c5a9 100644 --- a/tests/unit/Parsers/PhpConfigurationTest.swift +++ b/tests/unit/Parsers/Config/PhpConfigurationFileTest.swift @@ -1,5 +1,5 @@ // -// PhpConfigurationTest.swift +// PhpConfigurationFileTest.swift // PHP Monitor // // Created by Nico Verbruggen on 04/05/2022. @@ -8,7 +8,7 @@ import XCTest -class PhpConfigurationTest: XCTestCase { +class PhpConfigurationFileTest: XCTestCase { static var phpIniFileUrl: URL { return Bundle(for: Self.self).url(forResource: "php", withExtension: "ini")!