File-BaseDir

 view release on metacpan or  search on metacpan

lib/File/BaseDir.pm  view on Meta::CPAN

package File::BaseDir;

use strict;
use warnings;
use Exporter 5.57 qw( import );
use File::Spec;
use Config;

# ABSTRACT: Use the Freedesktop.org base directory specification
our $VERSION = '0.09'; # VERSION

our %EXPORT_TAGS = (
  vars => [ qw(
    xdg_data_home xdg_data_dirs
    xdg_config_home xdg_config_dirs
    xdg_cache_home
  ) ],
  lookup => [ qw(
    data_home data_dirs data_files
    config_home config_dirs config_files
    cache_home
  ) ],
);
our @EXPORT_OK = (
  qw(xdg_data_files xdg_config_files),
  map @$_, values %EXPORT_TAGS
);

if($^O eq 'MSWin32')
{
  *_rootdir = sub { 'C:\\' };
  *_home    = sub { $ENV{USERPROFILE} || $ENV{HOMEDRIVE}.$ENV{HOMEPATH} || 'C:\\' };
}
else
{
  *_rootdir = sub { File::Spec->rootdir };
  *_home    = sub { $ENV{HOME} || eval { [getpwuid($>)]->[7] } || File::Spec->rootdir };
}

# OO method
sub new { bless \$VERSION, shift } # what else is there to bless ?

# Variable methods
sub xdg_data_home { $ENV{XDG_DATA_HOME} || File::Spec->catdir(_home(), qw/.local share/) }

sub xdg_data_dirs {
  ( $ENV{XDG_DATA_DIRS}
    ? _adapt($ENV{XDG_DATA_DIRS})
    : (File::Spec->catdir(_rootdir(), qw/usr local share/), File::Spec->catdir(_rootdir(), qw/usr share/))
  )
}

sub xdg_config_home {$ENV{XDG_CONFIG_HOME} || File::Spec->catdir(_home(), '.config') }

sub xdg_config_dirs {
  ( $ENV{XDG_CONFIG_DIRS}
    ? _adapt($ENV{XDG_CONFIG_DIRS})
    : File::Spec->catdir(_rootdir(), qw/etc xdg/)
  )
}

sub xdg_cache_home { $ENV{XDG_CACHE_HOME} || File::Spec->catdir(_home(), '.cache') }

sub _adapt {
  map { File::Spec->catdir( split(/\//, $_) ) } split /\Q$Config{path_sep}\E/, shift;
    # ':' defined in the spec, but ';' is standard on win32
}

# Lookup methods
sub data_home { _catfile(xdg_data_home, @_) }

sub data_dirs { _find_files(\&_dir, \@_, xdg_data_home, xdg_data_dirs) }

sub data_files { _find_files(\&_file, \@_, xdg_data_home, xdg_data_dirs) }

sub xdg_data_files { my @dirs = data_files(@_); return @dirs }

sub config_home { _catfile(xdg_config_home, @_) }

sub config_dirs { _find_files(\&_dir, \@_, xdg_config_home, xdg_config_dirs) }

sub config_files { _find_files(\&_file, \@_, xdg_config_home, xdg_config_dirs) }

sub xdg_config_files { my @dirs = config_files(@_); return @dirs }

sub cache_home { _catfile(xdg_cache_home, @_) }

sub _catfile {
  my $dir = shift;
  shift if ref $_[0] or $_[0] =~ /::/; # OO call
  return File::Spec->catfile($dir, @_);
}

sub _find_files {
  my $type = shift;
  my $file = shift;
  shift @$file if ref $$file[0] or $$file[0] =~ /::/; # OO call



( run in 2.156 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )