From 52bac34ad73386c95ec8ff868072dcaed65810e4 Mon Sep 17 00:00:00 2001 From: Mark Gardner Date: Mon, 6 Apr 2026 14:11:54 -0500 Subject: [PATCH] Add my_config() to Darwin drivers On macOS, ~/Library/Application Support is Apple's recommended location for both application configuration and data files. ~/Library/Preferences is reserved for CFPreferences/NSUserDefaults plists and is not suitable for arbitrary config files. Without my_config(), my_dist_config() falls back to my_documents(), which can resolve to unexpected locations (e.g., OneDrive-redirected ~/Documents on corporate machines). This makes my_dist_config() unreliable on macOS for its intended purpose. Changes: - Add my_config() to File::HomeDir::Darwin (pure Perl fallback) - Add my_config() to File::HomeDir::Darwin::Cocoa (Cocoa API) - Add my_config() dispatcher to File::HomeDir - Add my_config to @EXPORT_OK - Add tests for my_config in t/11_darwin.t and t/13_darwin_cocoa.t Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- lib/File/HomeDir.pm | 8 ++++++++ lib/File/HomeDir/Darwin.pm | 7 +++++++ lib/File/HomeDir/Darwin/Cocoa.pm | 12 ++++++++++++ t/11_darwin.t | 10 +++++++++- t/13_darwin_cocoa.t | 10 +++++++++- 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/File/HomeDir.pm b/lib/File/HomeDir.pm index eb4561a..054c714 100644 --- a/lib/File/HomeDir.pm +++ b/lib/File/HomeDir.pm @@ -30,6 +30,7 @@ BEGIN my_pictures my_videos my_data + my_config my_dist_config my_dist_data users_home @@ -153,6 +154,13 @@ sub my_data : Carp::croak("The my_data method is not implemented on this platform"); } +sub my_config +{ + $IMPLEMENTED_BY->can('my_config') + ? $IMPLEMENTED_BY->my_config + : Carp::croak("The my_config method is not implemented on this platform"); +} + sub my_dist_data { my $params = ref $_[-1] eq 'HASH' ? pop : {}; diff --git a/lib/File/HomeDir/Darwin.pm b/lib/File/HomeDir/Darwin.pm index 9b79d89..d712602 100644 --- a/lib/File/HomeDir/Darwin.pm +++ b/lib/File/HomeDir/Darwin.pm @@ -54,6 +54,12 @@ sub my_data $class->_my_home('Library/Application Support'); } +sub my_config +{ + my $class = shift; + $class->_my_home('Library/Application Support'); +} + sub my_music { my $class = shift; @@ -142,6 +148,7 @@ always be used via L. $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support + $config = File::HomeDir->my_config; # /Users/mylogin/Library/Application Support =head1 COPYRIGHT diff --git a/lib/File/HomeDir/Darwin/Cocoa.pm b/lib/File/HomeDir/Darwin/Cocoa.pm index 74c195e..86f6aca 100644 --- a/lib/File/HomeDir/Darwin/Cocoa.pm +++ b/lib/File/HomeDir/Darwin/Cocoa.pm @@ -64,6 +64,17 @@ sub my_data || $class->SUPER::my_data; } +# Apple recommends ~/Library/Application Support for both config and data. +# ~/Library/Preferences is reserved for CFPreferences/NSUserDefaults plists. +sub my_config +{ + my $class = shift; + + require Mac::SystemDirectory; + eval { $class->_find_folder(Mac::SystemDirectory::NSApplicationSupportDirectory()) } + || $class->SUPER::my_config; +} + # from 10.6 sub my_music { @@ -147,6 +158,7 @@ is not installed, L will fall back to L. $pics = File::HomeDir->my_pictures; # /Users/mylogin/Pictures $videos = File::HomeDir->my_videos; # /Users/mylogin/Movies $data = File::HomeDir->my_data; # /Users/mylogin/Library/Application Support + $config = File::HomeDir->my_config; # /Users/mylogin/Library/Application Support =head1 COPYRIGHT diff --git a/t/11_darwin.t b/t/11_darwin.t index db101d1..7c180a3 100644 --- a/t/11_darwin.t +++ b/t/11_darwin.t @@ -15,7 +15,7 @@ if ($File::HomeDir::IMPLEMENTED_BY->isa('File::HomeDir::Darwin')) { # Force pure perl since it should work everywhere $File::HomeDir::IMPLEMENTED_BY = 'File::HomeDir::Darwin'; - plan(tests => 9); + plan(tests => 10); } else { @@ -87,4 +87,12 @@ SCOPE: skip("Have data directory", 1) if defined $data; is_deeply([File::HomeDir->my_data], [undef], "Returns undef in list context",); } + + SKIP: + { + my $config = File::HomeDir->my_config; + skip("No config directory", 1) unless defined $config; + like($config, qr/Application Support/, + 'my_config returns ~/Library/Application Support on macOS'); + } } diff --git a/t/13_darwin_cocoa.t b/t/13_darwin_cocoa.t index fe218ed..c0f86cf 100644 --- a/t/13_darwin_cocoa.t +++ b/t/13_darwin_cocoa.t @@ -17,7 +17,7 @@ if ($File::HomeDir::IMPLEMENTED_BY->isa('File::HomeDir::Darwin') # Force Cocoa if you have Mac::SystemDirectory require File::HomeDir::Darwin::Cocoa; $File::HomeDir::IMPLEMENTED_BY = 'File::HomeDir::Darwin::Cocoa'; - plan(tests => 5); + plan(tests => 6); } else { @@ -70,4 +70,12 @@ SCOPE: skip("No application support directory", 1) unless defined $data; like($data, qr/Application Support/); } + + SKIP: + { + my $config = File::HomeDir->my_config; + skip("No config directory", 1) unless defined $config; + like($config, qr/Application Support/, + 'my_config returns ~/Library/Application Support on macOS'); + } }