Class: UserSpace

Inherits:
Object
  • Object
show all
Defined in:
lib/user_space/version.rb,
lib/user_space/user_space.rb

Constant Summary collapse

VERSION =
'2.0.1'
OPTIONS =
{
  config:  'config',
  version: 'VERSION',
  ext:     nil,
  parser:  nil,
}
PARAMETERS =
{
  appname:  File.basename($0),
  appdir:   nil, # Can't guess at this point yet?
  xdgbases: ['CACHE', 'CONFIG', 'DATA'],
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parameters = PARAMETERS) ⇒ UserSpace



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/user_space/user_space.rb', line 25

def initialize(parameters=PARAMETERS)

  @appname  = parameters[:appname]  || PARAMETERS[:appname]
  @appdir   = parameters[:appdir]   || PARAMETERS[:appdir]
  @xdgbases = parameters[:xdgbases] || PARAMETERS[:xdgbases]
  @options  = OPTIONS.dup

  unless @appdir
    appdir = File.dirname File.dirname caller_locations(1,1)[0].path
    appdir = File.dirname appdir if File.basename(appdir)=='lib'
    @appdir = File.expand_path appdir
    $stderr.puts "UserSpace#appdir=\"#{@appdir}\" # heuristics used" if $VERBOSE
  end

  # install with no overwrite
  install(false)
end

Instance Attribute Details

#appdirObject (readonly)

Returns the value of attribute appdir.



24
25
26
# File 'lib/user_space/user_space.rb', line 24

def appdir
  @appdir
end

#appnameObject (readonly)

Returns the value of attribute appname.



24
25
26
# File 'lib/user_space/user_space.rb', line 24

def appname
  @appname
end

#optionsObject (readonly)

Returns the value of attribute options.



24
25
26
# File 'lib/user_space/user_space.rb', line 24

def options
  @options
end

#xdgbasesObject (readonly)

Returns the value of attribute xdgbases.



24
25
26
# File 'lib/user_space/user_space.rb', line 24

def xdgbases
  @xdgbases
end

Instance Method Details

#cachedirObject



73
74
75
# File 'lib/user_space/user_space.rb', line 73

def cachedir
  File.join XDG['CACHE'].to_s, @appname
end

#configObject

Reads config



103
104
105
106
107
108
109
110
# File 'lib/user_space/user_space.rb', line 103

def config
  p, d = @options[:parser], File.read(config_file_name)
  p.load(d)
rescue
  $stderr.puts $!.message   if $VERBOSE
  $stderr.puts $!.backtrace if $DEBUG
  nil
end

#config=(obj) ⇒ Object

Saves config



113
114
115
116
117
# File 'lib/user_space/user_space.rb', line 113

def config=(obj)
  p = @options[:parser]
  d = (p.respond_to?(:pretty_generate))? p.pretty_generate(obj) : p.dump(obj)
  File.open(config_file_name, 'w', 0600){|fh| fh.puts d}
end

#config?Boolean



98
99
100
# File 'lib/user_space/user_space.rb', line 98

def config?
  File.exist?(config_file_name)
end

#config_file_nameObject

Not really for public use.



86
87
88
89
90
91
# File 'lib/user_space/user_space.rb', line 86

def config_file_name
  parser   = @options[:parser]
  ext      = @options[:ext] || parser.to_s.downcase
  basename = "#{@options[:config]}.#{ext}"
  File.join XDG['CONFIG'].to_s, @appname, basename
end

#configdirObject



77
78
79
# File 'lib/user_space/user_space.rb', line 77

def configdir
  File.join XDG['CONFIG'].to_s, @appname
end

#configures(hash) ⇒ Object



119
120
121
122
123
124
125
126
# File 'lib/user_space/user_space.rb', line 119

def configures(hash)
  if self.config? # file exists
    self.config.each{|opt, value| hash[opt.to_sym] = value}
  else
    $stderr.puts config_file_name if $VERBOSE
    self.config = hash
  end
end

#datadirObject



81
82
83
# File 'lib/user_space/user_space.rb', line 81

def datadir
  File.join XDG['DATA'].to_s, @appname
end

#install(overwrite = true) ⇒ Object

Note that initialize will not overwrite anything. This overwrites the user’s data directory with a fresh install. App should consider being nice about this, like warn the user or something.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/user_space/user_space.rb', line 56

def install(overwrite=true)
  xdg_pairs do |basedir, userdir|
    if File.exist?(userdir)
      # Sanity check
      raise "Not a directory: #{userdir}" unless File.directory?(userdir)
      # Pre-existing directory.
      # Return unless user wants to overwrite.
      next unless overwrite
    else
      Dir.mkdir(userdir, 0700)
    end
    FileUtils.cp_r(Dir.glob("#{basedir}/*"), userdir) if File.directory? basedir
    FileUtils.chmod_R 'og-rwx', userdir
    FileUtils.chmod_R 'u+rwX',  userdir
  end
end

#versionObject

This reads the data directory’s version file



133
134
135
136
137
138
139
# File 'lib/user_space/user_space.rb', line 133

def version
  File.read(version_file_name).strip
rescue
  $stderr.puts $!.message   if $VERBOSE
  $stderr.puts $!.backtrace if $DEBUG
  nil
end

#version=(v) ⇒ Object



141
142
143
# File 'lib/user_space/user_space.rb', line 141

def version=(v)
  File.open(version_file_name, 'w', 0600){|fh| fh.puts v}
end

#version?Boolean



128
129
130
# File 'lib/user_space/user_space.rb', line 128

def version?
  File.exist?(version_file_name)
end

#version_file_nameObject

Not really for public use.



94
95
96
# File 'lib/user_space/user_space.rb', line 94

def version_file_name
  File.join XDG['DATA'].to_s, @appname, @options[:version]
end

#xdg_pairsObject



43
44
45
46
47
48
49
50
# File 'lib/user_space/user_space.rb', line 43

def xdg_pairs
  @xdgbases.each do |base|
    xdg = XDG[base].to_s
    userdir = File.join(xdg, @appname)
    basedir = File.join @appdir, base.downcase
    yield basedir, userdir
  end
end