user_space 3.0.0 → 5.1.210201

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +74 -0
  3. data/lib/user_space.rb +49 -68
  4. metadata +16 -33
  5. data/README.rdoc +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d3ae8aaabb7afea9d1a3196eaf03f8966452af23
4
- data.tar.gz: ad86d87a76f09b750b816bd0ed2fa6b50a4b4fc2
2
+ SHA256:
3
+ metadata.gz: c868edf8d004a22ff97fc912b5562df08524a5b7a0369531758e302ae9b323bf
4
+ data.tar.gz: f1cd273b38bcb8209128ce601a9165404a287cecf9852678e9a20541c4d949e4
5
5
  SHA512:
6
- metadata.gz: 2f32473a4e15619c124c18afbf4076934148e2d5bc1e28da76dcd46948ee6ad58e98bfa28bcf209d7c2d64ececf9302663ef1a5f12c65ce9684db7e3b68b68ca
7
- data.tar.gz: ffa7851b59e727ac38aedb942fcfd32685eef4317152048912382732853a144eb41c26517a1d8ccf0dd593ede3edb7f9dcf8488795e7ec8037db3333bd2118aa
6
+ metadata.gz: dbd37a67613e70b2f8490d6c70962cf6e364f5e866b65b576109392c40b820cd84857a2edde91ba5d79e4bedab2ee12a12ba037e717b55e7dde9bc0dd71347f7
7
+ data.tar.gz: b810e6a240efa6c022045e4b49b9b7de2a6e64fa8c0c9a60cdaf5e767383591441da1aae90781864ef0ad1ba85ff52d350dd6deb9aa701a34e9aa88c48132244
data/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # UserSpace
2
+
3
+ * [VERSION 5.1.210201](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 user's cache, config, and data directories
10
+ with the gem-apps cache, config, and data files.
11
+
12
+ ## SYNOPSIS:
13
+
14
+ ```ruby
15
+ require 'rbon' # Using RBON(is not JSON!) parser for the config file.
16
+ require 'user_space'
17
+
18
+ module App
19
+ # ::App::CONFIG is your app's configuration.
20
+ CONFIG = {:tts=>'espeak', }
21
+ VERSION = '1.2.3'
22
+ end
23
+
24
+ USERSPACE = UserSpace.new(parser:RBON, appname:'myapp') #~> ^#<UserSpace:
25
+ # Will maintain these directories:
26
+ ['~/.cache/myapp',
27
+ '~/.config/myapp',
28
+ '~/.local/share/myapp'
29
+ ].all?{File.directory? File.expand_path _1} #=> true
30
+
31
+ if USERSPACE.config?
32
+ # Update APP::CONFIG with user's preferences.
33
+ App::CONFIG.merge! USERSPACE.config
34
+ else
35
+ # Write initial configuration with App::CONFIG
36
+ STDERR.puts "Writting '#{USERSPACE.config_file_name}'"
37
+ USERSPACE.config = App::CONFIG
38
+ end
39
+ # To do the same thing, you can also say:
40
+ # USERSPACE.configures(App::CONFIG)
41
+ # We have a config file:
42
+ File.exist? File.expand_path '~/.config/myapp/config.rbon' #=> true
43
+ ```
44
+
45
+ ## INSTALL:
46
+
47
+ ```shell
48
+ $ gem install user_space
49
+ ```
50
+
51
+ ## LICENSE:
52
+
53
+ (The MIT License)
54
+
55
+ Copyright (c) 2021 CarlosJHR64
56
+
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of this software and associated documentation files (the
59
+ 'Software'), to deal in the Software without restriction, including
60
+ without limitation the rights to use, copy, modify, merge, publish,
61
+ distribute, sublicense, and/or sell copies of the Software, and to
62
+ permit persons to whom the Software is furnished to do so, subject to
63
+ the following conditions:
64
+
65
+ The above copyright notice and this permission notice shall be
66
+ included in all copies or substantial portions of the Software.
67
+
68
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
69
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
71
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
72
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
73
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
74
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/user_space.rb CHANGED
@@ -1,89 +1,81 @@
1
1
  require 'fileutils'
2
- require 'xdg'
3
2
  # Requires:
4
3
  #`ruby`
5
4
 
6
- module FileUtils
7
- class << self
8
- def user_space_cpr(src, dest)
9
- fu_each_src_dest(src, dest) do |s, d|
10
- copy_entry(s, d)
11
- chmod('u+rwX,go-rwx', d)
12
- end
13
- end
14
- end
15
- end
16
-
17
5
  class UserSpace
18
- VERSION = '3.0.0'
6
+ VERSION = '5.1.210201'
7
+ XDG = {
8
+ 'cache' => ENV['XDG_CACHE_HOME'] || File.expand_path('~/.cache'),
9
+ 'config' => ENV['XDG_CONFIG_HOME'] || File.expand_path('~/.config'),
10
+ 'data' => ENV['XDG_DATA_HOME'] || File.expand_path('~/.local/share'),
11
+ }
19
12
 
20
- def self.appdir
21
- appdir = File.dirname File.dirname caller_locations(1,1)[0].path
22
- appdir = File.dirname appdir if File.basename(appdir)=='lib'
23
- File.expand_path appdir
13
+ def self.appdir(lib='/lib')
14
+ (_ = caller(1..2)[-1]&.split(':',2)&.fetch(0)) and File.dirname(File.dirname(File.expand_path(_)))&.chomp(lib)
24
15
  end
25
16
 
26
- attr_reader :parser,:ext,:appname,:xdgbases,:appdir,:config
27
- def initialize(
28
- parser,
29
- ext: parser.to_s.downcase,
30
- appname: File.basename($0),
31
- xdgbases: ['CACHE', 'CONFIG', 'DATA'],
32
- appdir: UserSpace.appdir,
33
- config: 'config'
34
- )
35
- @parser,@ext,@appname,@xdgbases,@appdir,@config = parser,ext,appname,xdgbases,appdir,config
36
- install(false) # install with no overwrite
17
+ attr_reader :parser,:ext,:appname,:xdgbases,:appdir,:cfg
18
+ def initialize( parser:,
19
+ appdir: UserSpace.appdir,
20
+ ext: parser.to_s.downcase,
21
+ appname: File.basename($0),
22
+ xdgbases: ['cache', 'config', 'data'],
23
+ config: 'config')
24
+ @parser,@ext,@appname,@xdgbases,@appdir,@cfg = parser,ext,appname,xdgbases,appdir,config
25
+ install
37
26
  end
38
27
 
39
28
  def xdg_pairs
40
29
  @xdgbases.each do |base|
41
- xdg = XDG[base].to_s
42
- userdir = File.join(xdg, @appname)
43
- basedir = File.join @appdir, base.downcase
44
- yield basedir, userdir
30
+ # yield basedir, userdir
31
+ yield File.join(@appdir, base), File.join(XDG[base], @appname)
45
32
  end
46
33
  end
47
34
 
48
- # Note that initialize will not overwrite anything.
49
- # This overwrites the user's data directory with a fresh install.
50
- # App should consider being nice about this,
51
- # like warn the user or something.
52
- def install(overwrite=true)
35
+ # Will not overwrite anything.
36
+ # Only copies over missing directories and files.
37
+ # Verifies directory expectations.
38
+ def install
53
39
  xdg_pairs do |basedir, userdir|
54
40
  if File.exist?(userdir)
55
41
  # Sanity check
56
- raise "Not a directory: #{userdir}" unless File.directory?(userdir)
57
- # Pre-existing directory.
58
- # Return unless user wants to overwrite.
59
- next unless overwrite
42
+ assert_directory(userdir)
60
43
  else
61
44
  Dir.mkdir(userdir, 0700)
62
45
  end
63
- FileUtils.user_space_cpr(Dir.glob("#{basedir}/*"), userdir) if File.directory? basedir
46
+ if File.directory? basedir
47
+ Dir.glob("#{basedir}/**/*").each do |src|
48
+ dest = src.sub(basedir, userdir)
49
+ if File.exist? dest
50
+ # Sanity checks
51
+ assert_directory(dest) if File.directory? src
52
+ else
53
+ if File.directory? src
54
+ Dir.mkdir dest
55
+ else
56
+ FileUtils.cp src, dest
57
+ end
58
+ FileUtils.chmod('u+rwX,go-rwx', dest)
59
+ end
60
+ end
61
+ end
64
62
  end
65
63
  end
66
64
 
67
65
  def cachedir
68
- File.join XDG['CACHE'].to_s, @appname
66
+ File.join XDG['cache'], @appname
69
67
  end
70
68
 
71
69
  def configdir
72
- File.join XDG['CONFIG'].to_s, @appname
70
+ File.join XDG['config'], @appname
73
71
  end
74
72
 
75
73
  def datadir
76
- File.join XDG['DATA'].to_s, @appname
74
+ File.join XDG['data'], @appname
77
75
  end
78
76
 
79
- # Not really for public use.
80
77
  def config_file_name
81
- File.join XDG['CONFIG'].to_s, @appname, "#{@config}.#{@ext}"
82
- end
83
-
84
- # Not really for public use.
85
- def version_file_name
86
- File.join XDG['DATA'].to_s, @appname, 'VERSION'
78
+ File.join XDG['config'], @appname, "#{@cfg}.#{@ext}"
87
79
  end
88
80
 
89
81
  def config?
@@ -106,28 +98,17 @@ class UserSpace
106
98
  end
107
99
 
108
100
  def configures(hash)
109
- if self.config? # file exists
110
- self.config.each{|opt, value| hash[opt.to_sym] = value}
101
+ if config? # file exists
102
+ hash.merge! config
111
103
  else
112
104
  $stderr.puts config_file_name if $VERBOSE
113
105
  self.config = hash
114
106
  end
115
107
  end
116
108
 
117
- def version?
118
- File.exist?(version_file_name)
119
- end
120
-
121
- # This reads the data directory's version file
122
- def version
123
- File.read(version_file_name).strip
124
- rescue
125
- $stderr.puts $!.message if $VERBOSE
126
- $stderr.puts $!.backtrace if $DEBUG
127
- nil
128
- end
109
+ private
129
110
 
130
- def version=(v)
131
- File.open(version_file_name, 'w', 0600){|fh| fh.puts v}
111
+ def assert_directory(dir)
112
+ raise "Not a directory: #{dir}" unless File.directory?(dir)
132
113
  end
133
114
  end
metadata CHANGED
@@ -1,48 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_space
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 5.1.210201
5
5
  platform: ruby
6
6
  authors:
7
7
  - carlosjhr64
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-27 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: xdg
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 2.2.3
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 2.2.3
27
- description: 'Maintains the app''s XDG features: app''s cache, config, and data directories.
28
-
29
- '
11
+ date: 2021-02-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: |
14
+ Maintains the user's cache, config, and data directories
15
+ with the gem-apps cache, config, and data files.
30
16
  email: carlosjhr64@gmail.com
31
17
  executables: []
32
18
  extensions: []
33
- extra_rdoc_files:
34
- - README.rdoc
19
+ extra_rdoc_files: []
35
20
  files:
36
- - README.rdoc
21
+ - README.md
37
22
  - lib/user_space.rb
38
23
  homepage: https://github.com/carlosjhr64/user_space
39
24
  licenses:
40
25
  - MIT
41
26
  metadata: {}
42
- post_install_message:
43
- rdoc_options:
44
- - "--main"
45
- - README.rdoc
27
+ post_install_message:
28
+ rdoc_options: []
46
29
  require_paths:
47
30
  - lib
48
31
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -56,10 +39,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
39
  - !ruby/object:Gem::Version
57
40
  version: '0'
58
41
  requirements:
59
- - 'ruby: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]'
60
- rubyforge_project:
61
- rubygems_version: 2.6.13
62
- signing_key:
42
+ - 'ruby: ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]'
43
+ rubygems_version: 3.2.3
44
+ signing_key:
63
45
  specification_version: 4
64
- summary: 'Maintains the app''s XDG features: app''s cache, config, and data directories.'
46
+ summary: Maintains the user's cache, config, and data directories with the gem-apps
47
+ cache, config, and data files.
65
48
  test_files: []
data/README.rdoc DELETED
@@ -1,60 +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
- Maintains the app's XDG features: app's cache, config, and data directories.
9
-
10
- == SYNOPSIS:
11
-
12
- require 'json' # Using JSON parser for the config file.
13
- require 'user_space'
14
- # APP::CONFIG is your app's configuration.
15
- # Perhaps like...
16
- APP::CONFIG = {:tts=>'espeak', }
17
- USERSPACE = UserSpace.new(JSON)
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
- == INSTALL:
34
-
35
- sudo gem install user_space
36
-
37
- == LICENSE:
38
-
39
- (The MIT License)
40
-
41
- Copyright (c) 2017 CarlosJHR64
42
-
43
- Permission is hereby granted, free of charge, to any person obtaining
44
- a copy of this software and associated documentation files (the
45
- 'Software'), to deal in the Software without restriction, including
46
- without limitation the rights to use, copy, modify, merge, publish,
47
- distribute, sublicense, and/or sell copies of the Software, and to
48
- permit persons to whom the Software is furnished to do so, subject to
49
- the following conditions:
50
-
51
- The above copyright notice and this permission notice shall be
52
- included in all copies or substantial portions of the Software.
53
-
54
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
55
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
57
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
58
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
59
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
60
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.