XDG Base Directory Standard

The 2.0 API is much a great deal more concise than the original 0.0+ and 1.0+ APIs. It consists primarily of a single interface method ‘XDG[]`. Yet all the functionality of the older API remain and then some.

First we need to require the library.

require 'xdg'

In the applique we have setup a fake root directory with coorepsonding environment settings to use as test fixtures.

Data Paths

Home

XDG['DATA_HOME'].environment.assert == ENV['XDG_DATA_HOME'].to_s
XDG['DATA_HOME'].environment_variables.assert == ['XDG_DATA_HOME']

Looking at the data home location by default it should be point to our joe user’s home directory under ‘.local/share`.

XDG['DATA_HOME'].to_a.assert == [$froot + 'home/joe/.local/share']

Dirs

XDG['DATA_DIRS'].environment.assert == ENV['XDG_DATA_DIRS'].to_s
XDG['DATA_DIRS'].environment_variables.assert == ['XDG_DATA_DIRS']

Looking at the system data locations

XDG['DATA_DIRS'].to_a.assert == [$froot + 'usr/share']

Combined

XDG['DATA'].environment_variables.assert == ['XDG_DATA_HOME', 'XDG_DATA_DIRS']

Lookking at both data location combined

XDG['DATA'].to_a.assert == [$froot + 'home/joe/.local/share', $froot + 'usr/share']

Config Paths

Home

XDG['CONFIG_HOME'].environment.assert == ENV['XDG_CONFIG_HOME'].to_s
XDG['CONFIG_HOME'].to_a.assert == [$froot + 'home/joe/.config']

Dirs

XDG['CONFIG_DIRS'].environment.assert == ENV['XDG_CONFIG_DIRS'].to_s
XDG['CONFIG_DIRS'].to_a.assert == [$froot + 'etc/xdg', $froot + 'etc']

Combined

XDG['CONFIG'].to_a.assert == [$froot + 'home/joe/.config', $froot + 'etc/xdg', $froot + 'etc']

Cache Paths

Home

XDG['CACHE_HOME'].environment.assert == ENV['XDG_CACHE_HOME'].to_s
XDG['CACHE_HOME'].to_a.assert == [$froot + 'home/joe/.cache']

Dirs

XDG['CACHE_DIRS'].environment.assert == ENV['XDG_CACHE_DIRS'].to_s
XDG['CACHE_DIRS'].to_a.assert == [$froot + 'tmp']

Combined

XDG['CACHE'].to_a.assert == [$froot + 'home/joe/.cache', $froot + 'tmp']

Extended Base Directory Standard

The extended base directory standard provides additional locations not apart the offical standard. These are somewhat experimental.

Resource

XDG['RESOURCE_HOME'].environment.assert == ENV['XDG_RESOURCE_HOME'].to_s

XDG['RESOURCE_HOME'].environment_variables.assert == ['XDG_RESOURCE_HOME']

Looking at the data home location by default it should be pointing to our joe users home directory under ‘.local`.

XDG['RESOURCE_HOME'].list.assert == ['~/.local']

XDG['RESOURCE_HOME'].to_a.assert == [$froot + 'home/joe/.local']

Work

The working configuration directory

XDG['CONFIG_WORK'].environment.assert == ENV['XDG_CONFIG_WORK'].to_s

XDG['CONFIG_WORK'].environment_variables.assert == ['XDG_CONFIG_WORK']

Looking at the config work location, by default it should be pointing to the current working directorys ‘.config` or `config` directory.

XDG['CONFIG_WORK'].list.assert == ['.config', 'config']

XDG['CONFIG_WORK'].to_a.assert == [Dir.pwd + '/.config', Dir.pwd + '/config']

The working cache directory

XDG['CACHE_WORK'].environment.assert == ENV['XDG_CACHE_WORK'].to_s

XDG['CACHE_WORK'].environment_variables.assert == ['XDG_CACHE_WORK']

Looking at the cache work location, by default it should be pointing to the current working directorys ‘.tmp` or `tmp` directory.

XDG['CACHE_WORK'].list.assert == ['.tmp', 'tmp']

XDG['CACHE_WORK'].to_a.assert == [Dir.pwd + '/.tmp', Dir.pwd + '/tmp']

Base Directory Mixin

The base directory mixin is used to easy augment a class for access to a named subdirectory of the XDG directories.

class MyAppConfig
  include XDG::BaseDir::Mixin

  def subdirectory
    'myapp'
  end
end

c = MyAppConfig.new

c.config.home.to_a  #=> [$froot + 'home/joe/.config/myapp']