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
# 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.first.split(/:/,2).first
    @appdir = File.expand_path appdir
  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



61
62
63
# File 'lib/user_space/user_space.rb', line 61

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

#config(options = @options) ⇒ Object

Reads config



91
92
93
94
95
96
97
# File 'lib/user_space/user_space.rb', line 91

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

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

Saves config



100
101
102
# File 'lib/user_space/user_space.rb', line 100

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)


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

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

#config_file_name(options = @options) ⇒ Object

Not really for public use.



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

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



65
66
67
# File 'lib/user_space/user_space.rb', line 65

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

#configures(hash) ⇒ Object



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

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



69
70
71
# File 'lib/user_space/user_space.rb', line 69

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.



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

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



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

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

#version=(v) ⇒ Object



126
127
128
# File 'lib/user_space/user_space.rb', line 126

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

#version?Boolean

Returns:

  • (Boolean)


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

def version?
  File.exist?(version_file_name)
end

#version_file_nameObject

Not really for public use.



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

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

#xdg_pairsObject



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

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