class UserSpace

Requires:

`ruby`

Constants

VERSION
XDG

Attributes

appdir[R]
appname[R]
cfg[R]
ext[R]
parser[R]
xdgbases[R]

Public Class Methods

appdir(lib='/lib') click to toggle source
# File lib/user_space.rb, line 13
def self.appdir(lib='/lib')
  (_ = caller(1..2)[-1]&.split(':',2)&.fetch(0)) and File.dirname(File.dirname(File.expand_path(_)))&.chomp(lib)
end
new( parser:, appdir: UserSpace.appdir, ext: parser.to_s.downcase, appname: File.basename($0), xdgbases: ['cache', 'config', 'data'], config: 'config') click to toggle source
# File lib/user_space.rb, line 18
def initialize( parser:,
                appdir:   UserSpace.appdir,
                ext:      parser.to_s.downcase,
                appname:  File.basename($0),
                xdgbases: ['cache', 'config', 'data'],
                config:   'config')
  @parser,@ext,@appname,@xdgbases,@appdir,@cfg = parser,ext,appname,xdgbases,appdir,config
  install
end

Public Instance Methods

cachedir() click to toggle source
# File lib/user_space.rb, line 65
def cachedir
  File.join XDG['cache'], @appname
end
config() click to toggle source

Reads config

# File lib/user_space.rb, line 86
def config
  @parser.load File.read(config_file_name)
rescue
  $stderr.puts $!.message   if $VERBOSE
  $stderr.puts $!.backtrace if $DEBUG
  nil
end
config=(obj) click to toggle source

Saves config

# File lib/user_space.rb, line 95
def config=(obj)
  dump = (@parser.respond_to?(:pretty_generate))? @parser.pretty_generate(obj) : @parser.dump(obj)
  File.open(config_file_name, 'w', 0600){|fh|fh.puts dump}
end
config?() click to toggle source
# File lib/user_space.rb, line 81
def config?
  File.exist?(config_file_name)
end
config_file_name() click to toggle source
# File lib/user_space.rb, line 77
def config_file_name
  File.join XDG['config'], @appname, "#{@cfg}.#{@ext}"
end
configdir() click to toggle source
# File lib/user_space.rb, line 69
def configdir
  File.join XDG['config'], @appname
end
configures(hash) click to toggle source
# File lib/user_space.rb, line 100
def configures(hash)
  if config? # file exists
    hash.merge! config
  else
    $stderr.puts config_file_name if $VERBOSE
    self.config = hash
  end
end
datadir() click to toggle source
# File lib/user_space.rb, line 73
def datadir
  File.join XDG['data'], @appname
end
install() click to toggle source

Will not overwrite anything. Only copies over missing directories and files. Verifies directory expectations.

# File lib/user_space.rb, line 38
def install
  xdg_pairs do |basedir, userdir|
    if File.exist?(userdir)
      # Sanity check
      assert_directory(userdir)
    else
      Dir.mkdir(userdir, 0700)
    end
    if File.directory? basedir
      Dir.glob("#{basedir}/**/*").each do |src|
        dest = src.sub(basedir, userdir)
        if File.exist? dest
          # Sanity checks
          assert_directory(dest) if File.directory? src
        else
          if File.directory? src
            Dir.mkdir dest
          else
            FileUtils.cp src, dest
          end
          FileUtils.chmod('u+rwX,go-rwx', dest)
        end
      end
    end
  end
end
xdg_pairs() { |join, join(XDG, appname)| ... } click to toggle source
# File lib/user_space.rb, line 28
def xdg_pairs
  @xdgbases.each do |base|
    # yield basedir, userdir
    yield File.join(@appdir, base), File.join(XDG[base], @appname)
  end
end

Private Instance Methods

assert_directory(dir) click to toggle source
# File lib/user_space.rb, line 111
def assert_directory(dir)
  raise "Not a directory: #{dir}" unless File.directory?(dir)
end