Class: USER_SPACE::UserSpace

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

Constant Summary collapse

OPTIONS =
{:config  => 'config',
:parser  =>  JSON,
:ext     =>  nil,
:version => 'VERSION'}
PARAMETERS =
{:appname  => File.basename($PROGRAM_NAME),
: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

Returns a new instance of UserSpace.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/user_space/user_space.rb', line 15

def initialize(parameters=PARAMETERS)

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

  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
    verbose.puts "Warning: UserSpace#appdir heuristics used" if verbose
  end

  # install with no overwrite
  install(false)
end

Instance Attribute Details

#appdirObject (readonly)

Returns the value of attribute appdir.



14
15
16
# File 'lib/user_space/user_space.rb', line 14

def appdir
  @appdir
end

#appnameObject (readonly)

Returns the value of attribute appname.



14
15
16
# File 'lib/user_space/user_space.rb', line 14

def appname
  @appname
end

#optionsObject (readonly)

Returns the value of attribute options.



14
15
16
# File 'lib/user_space/user_space.rb', line 14

def options
  @options
end

#traceObject

Returns the value of attribute trace.



13
14
15
# File 'lib/user_space/user_space.rb', line 13

def trace
  @trace
end

#verboseObject

Returns the value of attribute verbose.



13
14
15
# File 'lib/user_space/user_space.rb', line 13

def verbose
  @verbose
end

#xdgbasesObject (readonly)

Returns the value of attribute xdgbases.



14
15
16
# File 'lib/user_space/user_space.rb', line 14

def xdgbases
  @xdgbases
end

Instance Method Details

#cachedirObject



63
64
65
# File 'lib/user_space/user_space.rb', line 63

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

#config(options = @options) ⇒ Object

Reads config



93
94
95
96
97
98
99
# File 'lib/user_space/user_space.rb', line 93

def config(options=@options)
  options[:parser].parse File.read(config_file_name(options))
rescue
  trace.puts $!.message    if trace
  verbose.puts $!.backtrace if verbose
  nil
end

#config=(obj, options = @options) ⇒ Object

Saves config



102
103
104
# File 'lib/user_space/user_space.rb', line 102

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

#config?(options = @options) ⇒ Boolean

Returns:

  • (Boolean)


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

def config?(options=@options)
  File.exist?(config_file_name(options))
end

#config_file_name(options = @options) ⇒ Object

Not really for public use.



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

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

#configdirObject



67
68
69
# File 'lib/user_space/user_space.rb', line 67

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

#configures(hash) ⇒ Object



106
107
108
109
110
111
112
113
# File 'lib/user_space/user_space.rb', line 106

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

#datadirObject



71
72
73
# File 'lib/user_space/user_space.rb', line 71

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.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/user_space/user_space.rb', line 46

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



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

def version
  File.read(version_file_name).strip
rescue
  trace.puts $!.message    if trace
  verbose.puts $!.backtrace if verbose
  nil
end

#version=(v) ⇒ Object



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

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

#version?Boolean

Returns:

  • (Boolean)


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

def version?
  File.exist?(version_file_name)
end

#version_file_nameObject

Not really for public use.



84
85
86
# File 'lib/user_space/user_space.rb', line 84

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

#xdg_pairsObject



33
34
35
36
37
38
39
40
# File 'lib/user_space/user_space.rb', line 33

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