user_space 0.3.1 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +61 -0
- data/lib/user_space.rb +128 -4
- metadata +14 -72
- data/History.txt +0 -9
- data/README.rdoc +0 -64
- data/TODO.txt +0 -5
- data/data/VERSION +0 -1
- data/features/main.feature +0 -9
- data/features/step_definitions/main_steps.rb +0 -18
- data/lib/user_space/user_space.rb +0 -130
- data/lib/user_space/version.rb +0 -3
- data/test/user_space.rb +0 -129
- data/user_space.gemspec +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1dfcc971479291e90e318bd01ba58aa13ebfd8879b8cea95e308b37530933393
|
4
|
+
data.tar.gz: c0bccd867a3a6aa2ab2a6af9280391e6e6c0393b1f9df9664dd9f0ac7f0ccdc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a22b5d23502cb1216d444510f1fe0474125a9d5b9ce3bfd87908516071f1efc59290ce367eda718bfb259bc5f1306796cb4e41f075f7b9b6b7623eee7a457fab
|
7
|
+
data.tar.gz: 210fad38ba6a7c41852176660b59ee0301eec0ad193cf04b9cc7273c8de0601942a6b2a9415990379ed59515e933c4cc576c4072a7a9aa52f28e290fa0180403
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# UserSpace
|
2
|
+
|
3
|
+
* [VERSION 3.0.3](https://github.com/carlosjhr64/user_space/releases)
|
4
|
+
* [github](https://www.github.com/carlosjhr64/user_space)
|
5
|
+
* [rubygems](https://rubygems.org/gems/user_space)
|
6
|
+
|
7
|
+
## DESCRIPTION:
|
8
|
+
|
9
|
+
Maintains the app's XDG features: app's cache, config, and data directories.
|
10
|
+
|
11
|
+
## SYNOPSIS:
|
12
|
+
|
13
|
+
require 'json' # Using JSON parser for the config file.
|
14
|
+
require 'user_space'
|
15
|
+
# APP::CONFIG is your app's configuration.
|
16
|
+
# Perhaps like...
|
17
|
+
APP::CONFIG = {:tts=>'espeak', }
|
18
|
+
USERSPACE = UserSpace.new(JSON)
|
19
|
+
# Unless this version has been installed,
|
20
|
+
# we copy over our data and cache directories.
|
21
|
+
USERSPACE.install unless USERSPACE.version == APP::VERSION
|
22
|
+
if USERSPACE.config?
|
23
|
+
# Because JSON hashes by String, converting to Symbol.
|
24
|
+
# We pad up APP::CONFIG with user's preferences:
|
25
|
+
USERSPACE.config.each{|opt, value| APP::CONFIG[opt.to_sym] = value}
|
26
|
+
else
|
27
|
+
# We initialize user preferences with our initial APP::CONFIG
|
28
|
+
STDERR.puts "Writting '#{USERSPACE.config_file_name}'"
|
29
|
+
USERSPACE.config = APP::CONFIG
|
30
|
+
end
|
31
|
+
# To do the same thing, you can also say:
|
32
|
+
# USERSPACE.configures(APP::CONFIG)
|
33
|
+
|
34
|
+
## INSTALL:
|
35
|
+
|
36
|
+
sudo gem install user_space
|
37
|
+
|
38
|
+
## LICENSE:
|
39
|
+
|
40
|
+
(The MIT License)
|
41
|
+
|
42
|
+
Copyright (c) 2020 CarlosJHR64
|
43
|
+
|
44
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
45
|
+
a copy of this software and associated documentation files (the
|
46
|
+
'Software'), to deal in the Software without restriction, including
|
47
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
48
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
49
|
+
permit persons to whom the Software is furnished to do so, subject to
|
50
|
+
the following conditions:
|
51
|
+
|
52
|
+
The above copyright notice and this permission notice shall be
|
53
|
+
included in all copies or substantial portions of the Software.
|
54
|
+
|
55
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
56
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
57
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
58
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
59
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
60
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
61
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/user_space.rb
CHANGED
@@ -1,8 +1,132 @@
|
|
1
|
-
require 'English'
|
2
1
|
require 'fileutils'
|
3
|
-
require 'json' # default parser
|
4
2
|
require 'xdg'
|
5
|
-
require 'user_space/version.rb'
|
6
|
-
require 'user_space/user_space.rb'
|
7
3
|
# Requires:
|
8
4
|
#`ruby`
|
5
|
+
|
6
|
+
class UserSpace
|
7
|
+
VERSION = '3.0.3'
|
8
|
+
|
9
|
+
def self.appdir
|
10
|
+
appdir = File.dirname File.dirname caller_locations(1,1)[0].path
|
11
|
+
appdir = File.dirname appdir if File.basename(appdir)=='lib'
|
12
|
+
File.expand_path appdir
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :parser,:ext,:appname,:xdgbases,:appdir,:config
|
16
|
+
def initialize(
|
17
|
+
parser,
|
18
|
+
ext: parser.to_s.downcase,
|
19
|
+
appname: File.basename($0),
|
20
|
+
xdgbases: ['CACHE', 'CONFIG', 'DATA'],
|
21
|
+
appdir: UserSpace.appdir,
|
22
|
+
config: 'config'
|
23
|
+
)
|
24
|
+
@parser,@ext,@appname,@xdgbases,@appdir,@config = parser,ext,appname,xdgbases,appdir,config
|
25
|
+
install(false) # install with no overwrite
|
26
|
+
end
|
27
|
+
|
28
|
+
def xdg_pairs
|
29
|
+
@xdgbases.each do |base|
|
30
|
+
xdg = XDG[base].to_s
|
31
|
+
userdir = File.join(xdg, @appname)
|
32
|
+
basedir = File.join @appdir, base.downcase
|
33
|
+
yield basedir, userdir
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Note that initialize will not overwrite anything.
|
38
|
+
# This overwrites the user's data directory with a fresh install.
|
39
|
+
# App should consider being nice about this,
|
40
|
+
# like warn the user or something.
|
41
|
+
def install(overwrite=true)
|
42
|
+
xdg_pairs do |basedir, userdir|
|
43
|
+
if File.exist?(userdir)
|
44
|
+
# Sanity check
|
45
|
+
raise "Not a directory: #{userdir}" unless File.directory?(userdir)
|
46
|
+
# Pre-existing directory.
|
47
|
+
# Return unless user wants to overwrite.
|
48
|
+
next unless overwrite
|
49
|
+
else
|
50
|
+
Dir.mkdir(userdir, 0700)
|
51
|
+
end
|
52
|
+
if File.directory? basedir
|
53
|
+
Dir.glob("#{basedir}/**/*").each do |src|
|
54
|
+
dest = src.sub(basedir, userdir)
|
55
|
+
if File.directory? src
|
56
|
+
Dir.mkdir dest unless File.exist? dest
|
57
|
+
else
|
58
|
+
FileUtils.cp src, dest
|
59
|
+
end
|
60
|
+
FileUtils.chmod('u+rwX,go-rwx', dest)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def cachedir
|
67
|
+
File.join XDG['CACHE'].to_s, @appname
|
68
|
+
end
|
69
|
+
|
70
|
+
def configdir
|
71
|
+
File.join XDG['CONFIG'].to_s, @appname
|
72
|
+
end
|
73
|
+
|
74
|
+
def datadir
|
75
|
+
File.join XDG['DATA'].to_s, @appname
|
76
|
+
end
|
77
|
+
|
78
|
+
# Not really for public use.
|
79
|
+
def config_file_name
|
80
|
+
File.join XDG['CONFIG'].to_s, @appname, "#{@config}.#{@ext}"
|
81
|
+
end
|
82
|
+
|
83
|
+
# Not really for public use.
|
84
|
+
def version_file_name
|
85
|
+
File.join XDG['DATA'].to_s, @appname, 'VERSION'
|
86
|
+
end
|
87
|
+
|
88
|
+
def config?
|
89
|
+
File.exist?(config_file_name)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Reads config
|
93
|
+
def config
|
94
|
+
@parser.load File.read(config_file_name)
|
95
|
+
rescue
|
96
|
+
$stderr.puts $!.message if $VERBOSE
|
97
|
+
$stderr.puts $!.backtrace if $DEBUG
|
98
|
+
nil
|
99
|
+
end
|
100
|
+
|
101
|
+
# Saves config
|
102
|
+
def config=(obj)
|
103
|
+
dump = (@parser.respond_to?(:pretty_generate))? @parser.pretty_generate(obj) : @parser.dump(obj)
|
104
|
+
File.open(config_file_name, 'w', 0600){|fh|fh.puts dump}
|
105
|
+
end
|
106
|
+
|
107
|
+
def configures(hash)
|
108
|
+
if self.config? # file exists
|
109
|
+
self.config.each{|opt, value| hash[opt.to_sym] = value}
|
110
|
+
else
|
111
|
+
$stderr.puts config_file_name if $VERBOSE
|
112
|
+
self.config = hash
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def version?
|
117
|
+
File.exist?(version_file_name)
|
118
|
+
end
|
119
|
+
|
120
|
+
# This reads the data directory's version file
|
121
|
+
def version
|
122
|
+
File.read(version_file_name).strip
|
123
|
+
rescue
|
124
|
+
$stderr.puts $!.message if $VERBOSE
|
125
|
+
$stderr.puts $!.backtrace if $DEBUG
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
|
129
|
+
def version=(v)
|
130
|
+
File.open(version_file_name, 'w', 0600){|fh| fh.puts v}
|
131
|
+
end
|
132
|
+
end
|
metadata
CHANGED
@@ -1,102 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: user_space
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3
|
4
|
+
version: 3.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- carlosjhr64
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xdg
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.2'
|
20
|
-
- - ">="
|
17
|
+
- - '='
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 2.2.3
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '2.2'
|
30
|
-
- - ">="
|
24
|
+
- - '='
|
31
25
|
- !ruby/object:Gem::Version
|
32
26
|
version: 2.2.3
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '1.99'
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: 1.99.1
|
43
|
-
type: :development
|
44
|
-
prerelease: false
|
45
|
-
version_requirements: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '1.99'
|
50
|
-
- - ">="
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: 1.99.1
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: test-unit
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '2.5'
|
60
|
-
- - ">="
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 2.5.5
|
63
|
-
type: :development
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - "~>"
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '2.5'
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 2.5.5
|
73
|
-
description: |
|
74
|
-
Automates certain XDG features.
|
27
|
+
description: 'Maintains the app''s XDG features: app''s cache, config, and data directories.
|
28
|
+
|
29
|
+
'
|
75
30
|
email: carlosjhr64@gmail.com
|
76
31
|
executables: []
|
77
32
|
extensions: []
|
78
|
-
extra_rdoc_files:
|
79
|
-
- README.rdoc
|
33
|
+
extra_rdoc_files: []
|
80
34
|
files:
|
81
|
-
-
|
82
|
-
- README.rdoc
|
83
|
-
- TODO.txt
|
84
|
-
- data/VERSION
|
85
|
-
- features/main.feature
|
86
|
-
- features/step_definitions/main_steps.rb
|
35
|
+
- README.md
|
87
36
|
- lib/user_space.rb
|
88
|
-
- lib/user_space/user_space.rb
|
89
|
-
- lib/user_space/version.rb
|
90
|
-
- test/user_space.rb
|
91
|
-
- user_space.gemspec
|
92
37
|
homepage: https://github.com/carlosjhr64/user_space
|
93
38
|
licenses:
|
94
39
|
- MIT
|
95
40
|
metadata: {}
|
96
41
|
post_install_message:
|
97
|
-
rdoc_options:
|
98
|
-
- "--main"
|
99
|
-
- README.rdoc
|
42
|
+
rdoc_options: []
|
100
43
|
require_paths:
|
101
44
|
- lib
|
102
45
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -110,10 +53,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
53
|
- !ruby/object:Gem::Version
|
111
54
|
version: '0'
|
112
55
|
requirements:
|
113
|
-
- 'ruby: ruby 2.
|
114
|
-
|
115
|
-
rubygems_version: 2.2.0
|
56
|
+
- 'ruby: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]'
|
57
|
+
rubygems_version: 3.1.2
|
116
58
|
signing_key:
|
117
59
|
specification_version: 4
|
118
|
-
summary:
|
60
|
+
summary: 'Maintains the app''s XDG features: app''s cache, config, and data directories.'
|
119
61
|
test_files: []
|
data/History.txt
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
=== 0.0.0 / 2013-12-21 09:33:10 -0800
|
2
|
-
=== 0.0.0 / 2013-12-22 15:18:15 -0800
|
3
|
-
2421f13574dd2ad78d6cc591e52b4261 pkg/user_space-0.0.0.gem
|
4
|
-
=== 0.1.0 / 2013-12-30 11:51:13 -0800
|
5
|
-
c0014415ced058f3b79910f5c52bfe1e pkg/user_space-0.1.0.gem
|
6
|
-
=== 0.2.0 / 2014-01-02 10:12:47 -0800
|
7
|
-
1cd8d6d59f08ff03b32c895ee254ca14 pkg/user_space-0.2.0.gem
|
8
|
-
=== 0.3.0 / 2014-01-16 08:17:03 -0800
|
9
|
-
b2df08bdd1e6f0be634109602ef1c63e pkg/user_space-0.3.0.gem
|
data/README.rdoc
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
= user_space
|
2
|
-
|
3
|
-
github :: https://www.github.com/carlosjhr64/user_space
|
4
|
-
rubygems :: https://rubygems.org/gems/user_space
|
5
|
-
|
6
|
-
== DESCRIPTION:
|
7
|
-
|
8
|
-
Automates certain XDG features.
|
9
|
-
|
10
|
-
== SYNOPSIS:
|
11
|
-
|
12
|
-
require 'user_space'
|
13
|
-
# APP::CONFIG is your app's configuration.
|
14
|
-
# Perhaps like...
|
15
|
-
APP::CONFIG = {:tts=>'espeak', }
|
16
|
-
# By default, UserSpace works with the JSON parser.
|
17
|
-
USERSPACE = USER_SPACE::UserSpace.new
|
18
|
-
# Unless this version has been installed,
|
19
|
-
# we copy over our data and cache directories.
|
20
|
-
USERSPACE.install unless USERSPACE.version == APP::VERSION
|
21
|
-
if USERSPACE.config?
|
22
|
-
# Because JSON hashes by String, converting to Symbol.
|
23
|
-
# We pad up APP::CONFIG with user's preferences:
|
24
|
-
USERSPACE.config.each{|opt, value| APP::CONFIG[opt.to_sym] = value}
|
25
|
-
else
|
26
|
-
# We initialize user preferences with our initial APP::CONFIG
|
27
|
-
STDERR.puts "Writting '#{USERSPACE.config_file_name}'"
|
28
|
-
USERSPACE.config = APP::CONFIG
|
29
|
-
end
|
30
|
-
# To do the same thing, you can also say:
|
31
|
-
# USERSPACE.configures(APP::CONFIG)
|
32
|
-
|
33
|
-
== FEATURES:
|
34
|
-
|
35
|
-
* used in mplay[https://www.rubygems.org/gems/mplay]
|
36
|
-
|
37
|
-
== INSTALL:
|
38
|
-
|
39
|
-
sudo gem install user_space
|
40
|
-
|
41
|
-
== LICENSE:
|
42
|
-
|
43
|
-
(The MIT License)
|
44
|
-
|
45
|
-
Copyright (c) 2013 CarlosJHR64
|
46
|
-
|
47
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
48
|
-
a copy of this software and associated documentation files (the
|
49
|
-
'Software'), to deal in the Software without restriction, including
|
50
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
51
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
52
|
-
permit persons to whom the Software is furnished to do so, subject to
|
53
|
-
the following conditions:
|
54
|
-
|
55
|
-
The above copyright notice and this permission notice shall be
|
56
|
-
included in all copies or substantial portions of the Software.
|
57
|
-
|
58
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
59
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
60
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
61
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
62
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
63
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
64
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/TODO.txt
DELETED
data/data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.20.300
|
data/features/main.feature
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'rainbow'
|
2
|
-
# TODO: Come up with some good cucumber tests.
|
3
|
-
Given /^(\w+) (.*)$/ do |given, condition|
|
4
|
-
condition.strip!
|
5
|
-
case given
|
6
|
-
when 'Given'
|
7
|
-
#raise "'Given' form not defined."
|
8
|
-
STDERR.puts "Need to come up with some cucumber tests".color(:blue)
|
9
|
-
when 'When'
|
10
|
-
#raise "'When' form not defined."
|
11
|
-
STDERR.puts "Need to come up with some cucumber tests".color(:blue)
|
12
|
-
when 'Then'
|
13
|
-
#raise "'Then' form not defined."
|
14
|
-
STDERR.puts "Need to come up with some cucumber tests".color(:blue)
|
15
|
-
else
|
16
|
-
raise "'#{given}' form not defined."
|
17
|
-
end
|
18
|
-
end
|
@@ -1,130 +0,0 @@
|
|
1
|
-
module USER_SPACE
|
2
|
-
class UserSpace
|
3
|
-
|
4
|
-
OPTIONS = {:config => 'config',
|
5
|
-
:parser => JSON,
|
6
|
-
:ext => nil,
|
7
|
-
:version => 'VERSION'}
|
8
|
-
|
9
|
-
PARAMETERS = {:appname => File.basename($PROGRAM_NAME),
|
10
|
-
:appdir => nil, # Can't guess at this point yet?
|
11
|
-
:xdgbases => ['CACHE', 'CONFIG', 'DATA']}
|
12
|
-
|
13
|
-
attr_accessor :trace, :verbose
|
14
|
-
attr_reader :appname, :appdir, :xdgbases, :options
|
15
|
-
def initialize(parameters=PARAMETERS)
|
16
|
-
|
17
|
-
@appname = parameters[:appname] || PARAMETERS[:appname]
|
18
|
-
@appdir = parameters[:appdir] || PARAMETERS[:appdir]
|
19
|
-
@xdgbases = parameters[:xdgbases] || PARAMETERS[:xdgbases]
|
20
|
-
@options = OPTIONS
|
21
|
-
|
22
|
-
unless @appdir
|
23
|
-
appdir = File.dirname File.dirname caller.first.split(/:/,2).first
|
24
|
-
@appdir = File.expand_path appdir
|
25
|
-
end
|
26
|
-
|
27
|
-
# install with no overwrite
|
28
|
-
install(false)
|
29
|
-
end
|
30
|
-
|
31
|
-
def xdg_pairs
|
32
|
-
@xdgbases.each do |base|
|
33
|
-
xdg = XDG[base].to_s
|
34
|
-
userdir = File.join(xdg, @appname)
|
35
|
-
basedir = File.join @appdir, base.downcase
|
36
|
-
yield basedir, userdir
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Note that initialize will not overwrite anything.
|
41
|
-
# This overwrites the user's data directory with a fresh install.
|
42
|
-
# App should consider being nice about this,
|
43
|
-
# like warn the user or something.
|
44
|
-
def install(overwrite=true)
|
45
|
-
xdg_pairs do |basedir, userdir|
|
46
|
-
if File.exist?(userdir)
|
47
|
-
# Sanity check
|
48
|
-
raise "Not a directory: #{userdir}" unless File.directory?(userdir)
|
49
|
-
# Pre-existing directory.
|
50
|
-
# Return unless user wants to overwrite.
|
51
|
-
next unless overwrite
|
52
|
-
else
|
53
|
-
Dir.mkdir(userdir, 0700)
|
54
|
-
end
|
55
|
-
FileUtils.cp_r(Dir.glob("#{basedir}/*"), userdir) if File.directory? basedir
|
56
|
-
FileUtils.chmod_R 'og-rwx', userdir
|
57
|
-
FileUtils.chmod_R 'u+rwX', userdir
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def cachedir
|
62
|
-
File.join XDG['CACHE'].to_s, @appname
|
63
|
-
end
|
64
|
-
|
65
|
-
def configdir
|
66
|
-
File.join XDG['CONFIG'].to_s, @appname
|
67
|
-
end
|
68
|
-
|
69
|
-
def datadir
|
70
|
-
File.join XDG['DATA'].to_s, @appname
|
71
|
-
end
|
72
|
-
|
73
|
-
# Not really for public use.
|
74
|
-
def config_file_name(options=@options)
|
75
|
-
parser = options[:parser]
|
76
|
-
ext = options[:ext] || parser.to_s.downcase
|
77
|
-
basename = "#{options[:config]}.#{ext}"
|
78
|
-
File.join XDG['CONFIG'].to_s, @appname, basename
|
79
|
-
end
|
80
|
-
|
81
|
-
# Not really for public use.
|
82
|
-
def version_file_name
|
83
|
-
File.join XDG['DATA'].to_s, @appname, @options[:version]
|
84
|
-
end
|
85
|
-
|
86
|
-
def config?(options=@options)
|
87
|
-
File.exist?(config_file_name(options))
|
88
|
-
end
|
89
|
-
|
90
|
-
# Reads config
|
91
|
-
def config(options=@options)
|
92
|
-
options[:parser].parse File.read(config_file_name(options))
|
93
|
-
rescue
|
94
|
-
trace.puts $!.message if trace
|
95
|
-
vebose.puts $!.backtrace if verbose
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
# Saves config
|
100
|
-
def config=(obj, options=@options)
|
101
|
-
File.open(config_file_name, 'w', 0600){|fh| fh.puts options[:parser].pretty_generate obj}
|
102
|
-
end
|
103
|
-
|
104
|
-
def configures(hash)
|
105
|
-
if self.config? # file exists
|
106
|
-
self.config.each{|opt, value| hash[opt.to_sym] = value}
|
107
|
-
else
|
108
|
-
trace.puts config_file_name if trace
|
109
|
-
self.config = hash
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def version?
|
114
|
-
File.exist?(version_file_name)
|
115
|
-
end
|
116
|
-
|
117
|
-
# This reads the data directory's version file
|
118
|
-
def version
|
119
|
-
File.read(version_file_name).strip
|
120
|
-
rescue
|
121
|
-
trace.puts $!.message if trace
|
122
|
-
vebose.puts $!.backtrace if verbose
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
|
126
|
-
def version=(v)
|
127
|
-
File.open(version_file_name, 'w', 0600){|fh| fh.puts v}
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
data/lib/user_space/version.rb
DELETED
data/test/user_space.rb
DELETED
@@ -1,129 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'tmpdir'
|
3
|
-
TMPDIR = Dir.mktmpdir
|
4
|
-
Dir.mkdir File.join TMPDIR, '.cache'
|
5
|
-
Dir.mkdir File.join TMPDIR, '.config'
|
6
|
-
Dir.mkdir File.join TMPDIR, '.local'
|
7
|
-
Dir.mkdir File.join TMPDIR, '.local', 'share'
|
8
|
-
APPNAME = 'ima2awesome'
|
9
|
-
|
10
|
-
ENV['HOME'] = TMPDIR
|
11
|
-
$0 = APPNAME
|
12
|
-
|
13
|
-
# Needed to setup the enviroment first, now...
|
14
|
-
require 'user_space'
|
15
|
-
|
16
|
-
class TestUserSpace < Test::Unit::TestCase
|
17
|
-
|
18
|
-
include USER_SPACE
|
19
|
-
|
20
|
-
def test_user_space_version
|
21
|
-
assert_equal('0.3.1', VERSION)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_user_space_constants
|
25
|
-
assert_equal 'config', UserSpace::OPTIONS[:config]
|
26
|
-
assert_equal JSON, UserSpace::OPTIONS[:parser]
|
27
|
-
assert_equal 'VERSION', UserSpace::OPTIONS[:version]
|
28
|
-
assert_nil UserSpace::OPTIONS[:ext]
|
29
|
-
|
30
|
-
assert_equal 'ima2awesome', UserSpace::PARAMETERS[:appname]
|
31
|
-
|
32
|
-
xdgbases = UserSpace::PARAMETERS[:xdgbases]
|
33
|
-
assert xdgbases.include? 'CACHE'
|
34
|
-
assert xdgbases.include? 'CONFIG'
|
35
|
-
assert xdgbases.include? 'DATA'
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_user_space_new
|
39
|
-
userspace = nil
|
40
|
-
assert_nothing_raised(Exception){userspace = UserSpace.new}
|
41
|
-
|
42
|
-
assert_equal(APPNAME, userspace.appname)
|
43
|
-
|
44
|
-
dirname = File.dirname File.dirname File.expand_path __FILE__
|
45
|
-
assert_equal(dirname, userspace.appdir)
|
46
|
-
|
47
|
-
xdgbases = userspace.xdgbases
|
48
|
-
assert(userspace.xdgbases.include?('CACHE'))
|
49
|
-
assert(userspace.xdgbases.include?('CONFIG'))
|
50
|
-
assert(userspace.xdgbases.include?('DATA'))
|
51
|
-
|
52
|
-
count = 0
|
53
|
-
userspace.xdg_pairs do |basedir, userdir|
|
54
|
-
count += 1
|
55
|
-
assert(File.directory?(userdir))
|
56
|
-
refute_nil(userdir=~/\/ima2awesome$/)
|
57
|
-
refute_nil(basedir=~/user_space\/((data)|(config)|(cache))$/)
|
58
|
-
end
|
59
|
-
assert_equal(3, count)
|
60
|
-
|
61
|
-
options = userspace.options
|
62
|
-
assert_equal('config', options[:config])
|
63
|
-
assert_equal('VERSION', options[:version])
|
64
|
-
assert_equal(JSON, options[:parser])
|
65
|
-
assert_nil(options[:ext])
|
66
|
-
|
67
|
-
cachedir, configdir, datadir = userspace.cachedir, userspace.configdir, userspace.datadir
|
68
|
-
assert File.exist? cachedir
|
69
|
-
assert File.exist? configdir
|
70
|
-
assert File.exist? datadir
|
71
|
-
|
72
|
-
version = File.read('data/VERSION').strip
|
73
|
-
assert_equal version, userspace.version
|
74
|
-
|
75
|
-
config_file_name = userspace.config_file_name
|
76
|
-
refute File.exist? config_file_name
|
77
|
-
config1 = {'a'=>"A", 'b'=>"B"}
|
78
|
-
userspace.config = config1
|
79
|
-
assert File.exist? config_file_name
|
80
|
-
config2 = JSON.parse File.read config_file_name
|
81
|
-
assert_equal config1, config2
|
82
|
-
|
83
|
-
# Overwrite version file...
|
84
|
-
version_file_name = userspace.version_file_name
|
85
|
-
File.open(version_file_name, 'w'){|fh|fh.puts 'A.B.C'}
|
86
|
-
# Now we get the version given to the file:
|
87
|
-
assert_equal 'A.B.C', userspace.version
|
88
|
-
# Which is different from the initial version
|
89
|
-
refute version == 'A.B.C'
|
90
|
-
|
91
|
-
# But we can re-fresh our install
|
92
|
-
assert_nothing_raised(Exception){userspace.install}
|
93
|
-
# Now we have our initial version back
|
94
|
-
assert_equal version, userspace.version
|
95
|
-
|
96
|
-
[config_file_name, version_file_name].each do |fn|
|
97
|
-
stat = File.stat(fn)
|
98
|
-
assert_equal stat.mode.to_s(8), '100600'
|
99
|
-
end
|
100
|
-
|
101
|
-
[cachedir, configdir, datadir].each do |dn|
|
102
|
-
stat = File.stat(dn)
|
103
|
-
assert_equal stat.mode.to_s(8), '40700'
|
104
|
-
end
|
105
|
-
|
106
|
-
assert userspace.version?
|
107
|
-
assert_nothing_raised(Exception){ userspace.version='Fantastico' }
|
108
|
-
assert_equal userspace.version, 'Fantastico'
|
109
|
-
|
110
|
-
# testing configures
|
111
|
-
config_file_name = userspace.config_file_name
|
112
|
-
File.unlink config_file_name if File.exist? config_file_name
|
113
|
-
config1 = {:a=>'A', :b=>'B'}
|
114
|
-
refute File.exist? config_file_name
|
115
|
-
userspace.configures(config1)
|
116
|
-
# Here, it copies to file.
|
117
|
-
assert File.exist? config_file_name
|
118
|
-
# And config1 remains unchanged.
|
119
|
-
assert_equal(config1[:a], 'A')
|
120
|
-
assert_equal(config1[:b], 'B')
|
121
|
-
assert_equal(config1[:c], nil)
|
122
|
-
config2 = {:a=>'AAA', :c=>'CCC'}
|
123
|
-
# Here, config2 is overwritten with config1 from file.
|
124
|
-
userspace.configures(config2)
|
125
|
-
assert_equal(config2[:a], 'A') # overwritten
|
126
|
-
assert_equal(config2[:b], 'B') # padded up
|
127
|
-
assert_equal(config2[:c], 'CCC') # Original value
|
128
|
-
end
|
129
|
-
end
|
data/user_space.gemspec
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
Gem::Specification.new do |s|
|
2
|
-
|
3
|
-
s.name = 'user_space'
|
4
|
-
s.version = '0.3.1'
|
5
|
-
|
6
|
-
s.homepage = 'https://github.com/carlosjhr64/user_space'
|
7
|
-
|
8
|
-
s.author = 'CarlosJHR64'
|
9
|
-
s.email = 'carlosjhr64@gmail.com'
|
10
|
-
|
11
|
-
s.date = '2014-01-16'
|
12
|
-
s.licenses = ['MIT']
|
13
|
-
|
14
|
-
s.description = <<DESCRIPTION
|
15
|
-
Automates certain XDG features.
|
16
|
-
DESCRIPTION
|
17
|
-
|
18
|
-
s.summary = <<SUMMARY
|
19
|
-
Automates certain XDG features.
|
20
|
-
SUMMARY
|
21
|
-
|
22
|
-
s.extra_rdoc_files = ['README.rdoc']
|
23
|
-
s.rdoc_options = ["--main", "README.rdoc"]
|
24
|
-
|
25
|
-
s.require_paths = ["lib"]
|
26
|
-
s.files = %w(
|
27
|
-
History.txt
|
28
|
-
README.rdoc
|
29
|
-
TODO.txt
|
30
|
-
data/VERSION
|
31
|
-
features/main.feature
|
32
|
-
features/step_definitions/main_steps.rb
|
33
|
-
lib/user_space.rb
|
34
|
-
lib/user_space/user_space.rb
|
35
|
-
lib/user_space/version.rb
|
36
|
-
test/user_space.rb
|
37
|
-
user_space.gemspec
|
38
|
-
)
|
39
|
-
|
40
|
-
s.add_runtime_dependency 'xdg', '~> 2.2', '>= 2.2.3'
|
41
|
-
s.add_development_dependency 'rainbow', '~> 1.99', '>= 1.99.1'
|
42
|
-
s.add_development_dependency 'test-unit', '~> 2.5', '>= 2.5.5'
|
43
|
-
s.requirements << 'ruby: ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]'
|
44
|
-
|
45
|
-
end
|