mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-07 12:00:09 +02:00
♻️ Cleanup, updated target for tests
This commit is contained in:
@ -25,6 +25,8 @@
|
|||||||
C4232EE52612526500158FC6 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = C4232EE42612526500158FC6 /* Credits.html */; };
|
C4232EE52612526500158FC6 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = C4232EE42612526500158FC6 /* Credits.html */; };
|
||||||
C42759672627662800093CAE /* NSMenuExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C42759662627662800093CAE /* NSMenuExtension.swift */; };
|
C42759672627662800093CAE /* NSMenuExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C42759662627662800093CAE /* NSMenuExtension.swift */; };
|
||||||
C42759682627662800093CAE /* NSMenuExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C42759662627662800093CAE /* NSMenuExtension.swift */; };
|
C42759682627662800093CAE /* NSMenuExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C42759662627662800093CAE /* NSMenuExtension.swift */; };
|
||||||
|
C43603A0275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = C436039F275E67610028EFC6 /* AppDelegate+Notifications.swift */; };
|
||||||
|
C43603A1275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = C436039F275E67610028EFC6 /* AppDelegate+Notifications.swift */; };
|
||||||
C43A8A1A25D9CD1000591B77 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = C43A8A1925D9CD1000591B77 /* Utility.swift */; };
|
C43A8A1A25D9CD1000591B77 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = C43A8A1925D9CD1000591B77 /* Utility.swift */; };
|
||||||
C43A8A2025D9D1D700591B77 /* brew.json in Resources */ = {isa = PBXBuildFile; fileRef = C43A8A1F25D9D1D700591B77 /* brew.json */; };
|
C43A8A2025D9D1D700591B77 /* brew.json in Resources */ = {isa = PBXBuildFile; fileRef = C43A8A1F25D9D1D700591B77 /* brew.json */; };
|
||||||
C43A8A2425D9D20D00591B77 /* BrewJsonParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C43A8A2325D9D20D00591B77 /* BrewJsonParserTest.swift */; };
|
C43A8A2425D9D20D00591B77 /* BrewJsonParserTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C43A8A2325D9D20D00591B77 /* BrewJsonParserTest.swift */; };
|
||||||
@ -131,6 +133,7 @@
|
|||||||
C42295DC2358D02000E263B2 /* Command.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Command.swift; sourceTree = "<group>"; };
|
C42295DC2358D02000E263B2 /* Command.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Command.swift; sourceTree = "<group>"; };
|
||||||
C4232EE42612526500158FC6 /* Credits.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = Credits.html; sourceTree = "<group>"; };
|
C4232EE42612526500158FC6 /* Credits.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = Credits.html; sourceTree = "<group>"; };
|
||||||
C42759662627662800093CAE /* NSMenuExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSMenuExtension.swift; sourceTree = "<group>"; };
|
C42759662627662800093CAE /* NSMenuExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSMenuExtension.swift; sourceTree = "<group>"; };
|
||||||
|
C436039F275E67610028EFC6 /* AppDelegate+Notifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Notifications.swift"; sourceTree = "<group>"; };
|
||||||
C43A8A1925D9CD1000591B77 /* Utility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utility.swift; sourceTree = "<group>"; };
|
C43A8A1925D9CD1000591B77 /* Utility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utility.swift; sourceTree = "<group>"; };
|
||||||
C43A8A1F25D9D1D700591B77 /* brew.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = brew.json; sourceTree = "<group>"; };
|
C43A8A1F25D9D1D700591B77 /* brew.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = brew.json; sourceTree = "<group>"; };
|
||||||
C43A8A2325D9D20D00591B77 /* BrewJsonParserTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrewJsonParserTest.swift; sourceTree = "<group>"; };
|
C43A8A2325D9D20D00591B77 /* BrewJsonParserTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrewJsonParserTest.swift; sourceTree = "<group>"; };
|
||||||
@ -352,6 +355,7 @@
|
|||||||
children = (
|
children = (
|
||||||
C41C1B3622B0097F00E7CF16 /* AppDelegate.swift */,
|
C41C1B3622B0097F00E7CF16 /* AppDelegate.swift */,
|
||||||
C4B97B74275CF08C003F3378 /* AppDelegate+MenuOutlets.swift */,
|
C4B97B74275CF08C003F3378 /* AppDelegate+MenuOutlets.swift */,
|
||||||
|
C436039F275E67610028EFC6 /* AppDelegate+Notifications.swift */,
|
||||||
C41C1B3C22B0098000E7CF16 /* Main.storyboard */,
|
C41C1B3C22B0098000E7CF16 /* Main.storyboard */,
|
||||||
C4811D2322D70A4700B5F6B3 /* App.swift */,
|
C4811D2322D70A4700B5F6B3 /* App.swift */,
|
||||||
C4B97B77275CF1B5003F3378 /* App+ActivationPolicy.swift */,
|
C4B97B77275CF1B5003F3378 /* App+ActivationPolicy.swift */,
|
||||||
@ -523,6 +527,7 @@
|
|||||||
C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */,
|
C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */,
|
||||||
C4AF9F7A2754499000D44ED0 /* Valet.swift in Sources */,
|
C4AF9F7A2754499000D44ED0 /* Valet.swift in Sources */,
|
||||||
5420395926135DC100FB00FA /* PrefsVC.swift in Sources */,
|
5420395926135DC100FB00FA /* PrefsVC.swift in Sources */,
|
||||||
|
C43603A0275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */,
|
||||||
C41C1B4722B009A400E7CF16 /* Shell.swift in Sources */,
|
C41C1B4722B009A400E7CF16 /* Shell.swift in Sources */,
|
||||||
C4F2E43A2752F7D00020E974 /* PhpInstallation.swift in Sources */,
|
C4F2E43A2752F7D00020E974 /* PhpInstallation.swift in Sources */,
|
||||||
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */,
|
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */,
|
||||||
@ -575,6 +580,7 @@
|
|||||||
C4F2E4382752F08D0020E974 /* HomebrewDiagnostics.swift in Sources */,
|
C4F2E4382752F08D0020E974 /* HomebrewDiagnostics.swift in Sources */,
|
||||||
C4F780AE25D80B37000DBC97 /* ExtensionParserTest.swift in Sources */,
|
C4F780AE25D80B37000DBC97 /* ExtensionParserTest.swift in Sources */,
|
||||||
C4F780C725D80B75000DBC97 /* StatusMenu.swift in Sources */,
|
C4F780C725D80B75000DBC97 /* StatusMenu.swift in Sources */,
|
||||||
|
C43603A1275E67610028EFC6 /* AppDelegate+Notifications.swift in Sources */,
|
||||||
C42759682627662800093CAE /* NSMenuExtension.swift in Sources */,
|
C42759682627662800093CAE /* NSMenuExtension.swift in Sources */,
|
||||||
C4B97B76275CF08C003F3378 /* AppDelegate+MenuOutlets.swift in Sources */,
|
C4B97B76275CF08C003F3378 /* AppDelegate+MenuOutlets.swift in Sources */,
|
||||||
C4F780CD25D80B75000DBC97 /* Alert.swift in Sources */,
|
C4F780CD25D80B75000DBC97 /* Alert.swift in Sources */,
|
||||||
@ -808,7 +814,7 @@
|
|||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
"@loader_path/../Frameworks",
|
"@loader_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon-tests";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon-tests";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@ -829,7 +835,7 @@
|
|||||||
"@executable_path/../Frameworks",
|
"@executable_path/../Frameworks",
|
||||||
"@loader_path/../Frameworks",
|
"@loader_path/../Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon-tests";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.nicoverbruggen.phpmon-tests";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
44
phpmon/Domain/Core/AppDelegate+Notifications.swift
Normal file
44
phpmon/Domain/Core/AppDelegate+Notifications.swift
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
//
|
||||||
|
// AppDelegate+Notifications.swift
|
||||||
|
// PHP Monitor
|
||||||
|
//
|
||||||
|
// Created by Nico Verbruggen on 06/12/2021.
|
||||||
|
// Copyright © 2021 Nico Verbruggen. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UserNotifications
|
||||||
|
|
||||||
|
extension AppDelegate {
|
||||||
|
|
||||||
|
// MARK: - Notifications
|
||||||
|
|
||||||
|
public func setupNotifications() {
|
||||||
|
let notificationCenter = UNUserNotificationCenter.current()
|
||||||
|
notificationCenter.delegate = self
|
||||||
|
notificationCenter.requestAuthorization(options: [.alert], completionHandler: { granted, error in
|
||||||
|
if granted {
|
||||||
|
print("PHP Monitor has permission to show notifications.")
|
||||||
|
} else {
|
||||||
|
print("PHP Monitor does not have permission to show notifications.")
|
||||||
|
}
|
||||||
|
if let error = error {
|
||||||
|
print("PHP Monitor encounted an error determining notification permissions:")
|
||||||
|
print(error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Ensure that the application displays notifications even when the app is active.
|
||||||
|
*/
|
||||||
|
func userNotificationCenter(
|
||||||
|
_ center: UNUserNotificationCenter,
|
||||||
|
willPresent notification: UNNotification,
|
||||||
|
withCompletionHandler completionHandler:
|
||||||
|
@escaping (UNNotificationPresentationOptions) -> Void
|
||||||
|
) {
|
||||||
|
completionHandler([.banner])
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -70,21 +70,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele
|
|||||||
startup procedure.
|
startup procedure.
|
||||||
*/
|
*/
|
||||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||||
LocalNotification.askForPermission()
|
// Make sure notifications will work
|
||||||
UNUserNotificationCenter.current().delegate = self
|
setupNotifications()
|
||||||
self.menu.startup()
|
// Make sure the menu performs its initial checks
|
||||||
}
|
menu.startup()
|
||||||
|
|
||||||
/**
|
|
||||||
Ensure that the application displays notifications even when the app is active.
|
|
||||||
*/
|
|
||||||
func userNotificationCenter(
|
|
||||||
_ center: UNUserNotificationCenter,
|
|
||||||
willPresent notification: UNNotification,
|
|
||||||
withCompletionHandler completionHandler:
|
|
||||||
@escaping (UNNotificationPresentationOptions) -> Void
|
|
||||||
) {
|
|
||||||
completionHandler([.banner])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,20 +10,6 @@ import UserNotifications
|
|||||||
|
|
||||||
class LocalNotification {
|
class LocalNotification {
|
||||||
|
|
||||||
public static func askForPermission() {
|
|
||||||
UNUserNotificationCenter.current().requestAuthorization(options: [.alert], completionHandler: { granted, error in
|
|
||||||
if granted {
|
|
||||||
print("PHP Monitor has permission to show notifications.")
|
|
||||||
} else {
|
|
||||||
print("PHP Monitor does not have permission to show notifications.")
|
|
||||||
}
|
|
||||||
if let error = error {
|
|
||||||
print("PHP Monitor encounted an error determining notification permissions:")
|
|
||||||
print(error)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func send(title: String, subtitle: String) {
|
public static func send(title: String, subtitle: String) {
|
||||||
let content = UNMutableNotificationContent()
|
let content = UNMutableNotificationContent()
|
||||||
content.title = title
|
content.title = title
|
||||||
|
@ -12,9 +12,13 @@ class Valet {
|
|||||||
|
|
||||||
static let shared = Valet()
|
static let shared = Valet()
|
||||||
|
|
||||||
|
/// The version of Valet that was detected.
|
||||||
var version: String
|
var version: String
|
||||||
|
|
||||||
|
/// The Valet configuration file.
|
||||||
var config: Valet.Configuration
|
var config: Valet.Configuration
|
||||||
|
|
||||||
|
/// A cached list of sites that were detected after analyzing the paths set up for Valet.
|
||||||
var sites: [Site] = []
|
var sites: [Site] = []
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
@ -70,13 +74,20 @@ class Valet {
|
|||||||
// MARK: - Structs
|
// MARK: - Structs
|
||||||
|
|
||||||
class Site {
|
class Site {
|
||||||
|
/// Name of the site. Does not include the TLD.
|
||||||
var name: String!
|
var name: String!
|
||||||
|
|
||||||
|
/// The absolute path to the directory that is served.
|
||||||
var absolutePath: String!
|
var absolutePath: String!
|
||||||
|
|
||||||
|
/// Location of the alias. If set, this is a linked domain.
|
||||||
var aliasPath: String?
|
var aliasPath: String?
|
||||||
|
|
||||||
|
/// Whether the site has been secured.
|
||||||
var secured: Bool!
|
var secured: Bool!
|
||||||
var driver: String = "???"
|
|
||||||
|
/// What driver is currently in use. If not detected, defaults to nil.
|
||||||
|
var driver: String? = nil
|
||||||
|
|
||||||
init() {}
|
init() {}
|
||||||
|
|
||||||
@ -110,15 +121,23 @@ class Valet {
|
|||||||
.replacingOccurrences(of: "This site is served by [", with: "")
|
.replacingOccurrences(of: "This site is served by [", with: "")
|
||||||
.replacingOccurrences(of: "ValetDriver].\n", with: "")
|
.replacingOccurrences(of: "ValetDriver].\n", with: "")
|
||||||
} else {
|
} else {
|
||||||
self.driver = "???"
|
self.driver = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Configuration: Decodable {
|
struct Configuration: Decodable {
|
||||||
|
/// Top level domain suffix. Usually "test" but can be set to something else.
|
||||||
|
/// - Important: Does not include the actual dot. ("test", not ".test"!)
|
||||||
let tld: String
|
let tld: String
|
||||||
|
|
||||||
|
/// The paths that need to be checked.
|
||||||
let paths: [String]
|
let paths: [String]
|
||||||
|
|
||||||
|
/// The loopback address.
|
||||||
let loopback: String
|
let loopback: String
|
||||||
|
|
||||||
|
/// The default site that is served if the domain is not found. Optional.
|
||||||
let defaultSite: String?
|
let defaultSite: String?
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
@ -108,7 +108,7 @@ class StatusMenu : NSMenu {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let stats = App.phpInstall!.configuration
|
let stats = App.phpInstall!.limits
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
self.addItem(NSMenuItem.separator())
|
self.addItem(NSMenuItem.separator())
|
||||||
|
@ -19,7 +19,7 @@ import Foundation
|
|||||||
class ActivePhpInstallation {
|
class ActivePhpInstallation {
|
||||||
|
|
||||||
var version: Version!
|
var version: Version!
|
||||||
var configuration: Configuration!
|
var limits: Limits!
|
||||||
var extensions: [PhpExtension]!
|
var extensions: [PhpExtension]!
|
||||||
|
|
||||||
// MARK: - Computed
|
// MARK: - Computed
|
||||||
@ -36,7 +36,7 @@ class ActivePhpInstallation {
|
|||||||
|
|
||||||
// If an error occurred, exit early
|
// If an error occurred, exit early
|
||||||
if (version.error) {
|
if (version.error) {
|
||||||
configuration = Configuration()
|
limits = Limits()
|
||||||
extensions = []
|
extensions = []
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -46,7 +46,7 @@ class ActivePhpInstallation {
|
|||||||
extensions = PhpExtension.load(from: path)
|
extensions = PhpExtension.load(from: path)
|
||||||
|
|
||||||
// Get configuration values
|
// Get configuration values
|
||||||
configuration = Configuration(
|
limits = Limits(
|
||||||
memory_limit: getByteCount(key: "memory_limit"),
|
memory_limit: getByteCount(key: "memory_limit"),
|
||||||
upload_max_filesize: getByteCount(key: "upload_max_filesize"),
|
upload_max_filesize: getByteCount(key: "upload_max_filesize"),
|
||||||
post_max_size: getByteCount(key: "post_max_size")
|
post_max_size: getByteCount(key: "post_max_size")
|
||||||
@ -161,14 +161,24 @@ class ActivePhpInstallation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Structs
|
// MARK: - Structs
|
||||||
|
|
||||||
|
/**
|
||||||
|
Struct containing information about the version number of the current PHP installation.
|
||||||
|
Also includes information about whether the install is considered "broken" or not.
|
||||||
|
If an error was found in the terminal output, `error` is set to `true` and the installation
|
||||||
|
can be considered broken. (The app will display this as well.)
|
||||||
|
*/
|
||||||
struct Version {
|
struct Version {
|
||||||
var short = "???"
|
var short = "???"
|
||||||
var long = "???"
|
var long = "???"
|
||||||
var error = false
|
var error = false
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Configuration {
|
/**
|
||||||
|
Struct containing information about the limits of the current PHP installation.
|
||||||
|
Includes: memory limit, max upload size and max post size.
|
||||||
|
*/
|
||||||
|
struct Limits {
|
||||||
var memory_limit = "???"
|
var memory_limit = "???"
|
||||||
var upload_max_filesize = "???"
|
var upload_max_filesize = "???"
|
||||||
var post_max_size = "???"
|
var post_max_size = "???"
|
||||||
|
@ -44,6 +44,6 @@ class SiteListCell: NSTableCellView
|
|||||||
: NSColor.red
|
: NSColor.red
|
||||||
|
|
||||||
// Show the current driver
|
// Show the current driver
|
||||||
labelDriver.stringValue = site.driver
|
labelDriver.stringValue = site.driver ?? "???"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,13 @@ class SiteListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
|
|||||||
|
|
||||||
// MARK: - Variables
|
// MARK: - Variables
|
||||||
|
|
||||||
|
/// List of sites that will be displayed in this view. Originates from the `Valet` object.
|
||||||
var sites: [Valet.Site] = []
|
var sites: [Valet.Site] = []
|
||||||
|
|
||||||
|
/// Array that contains various editors that might open a particular site directory.
|
||||||
var editorAvailability: [String] = []
|
var editorAvailability: [String] = []
|
||||||
|
|
||||||
|
/// String that was last searched for. Empty by default.
|
||||||
var lastSearchedFor = ""
|
var lastSearchedFor = ""
|
||||||
|
|
||||||
// MARK: - Helper Variables
|
// MARK: - Helper Variables
|
||||||
|
@ -36,7 +36,6 @@ class SiteListWC: PMWindowController, NSSearchFieldDelegate, NSToolbarDelegate {
|
|||||||
|
|
||||||
func controlTextDidChange(_ notification: Notification) {
|
func controlTextDidChange(_ notification: Notification) {
|
||||||
guard let searchField = notification.object as? NSSearchField else {
|
guard let searchField = notification.object as? NSSearchField else {
|
||||||
print("Unexpected control in update notification")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user