runcom 3.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a98cb95e15551d9c14e28202fdd9523597d57019ae14a08ddb4c67cdee658c15
4
- data.tar.gz: 89c481cb06412eeb84b317011e64cbed9a608d12d7f8269defe71c729bdf514c
3
+ metadata.gz: a0cccf991ffd5ecf95af5725c8c0b223f098ca93bdae3d49135cd0a29ba19eb9
4
+ data.tar.gz: d34cb932f9bd927eb2da2aff0e94180f0d2c5dca1fd15a7409d4529726b4158c
5
5
  SHA512:
6
- metadata.gz: 72c4cfe15072de9486d048c459c6216e07bca8c61a3408d303ad6d5e5d7675ba65a07d63e9c1aa24e4537253687d7fbdfe8becd5f4b54f11b53a0099fbe1a690
7
- data.tar.gz: 4d1a3322b39bc8125228a186cf71b241d7e84bf65e7ff601139f50c0dc63e12285a49778cb123ad94f9e22a87a98febcc5dc6c26c1ad001adfc93c0fced3438f
6
+ metadata.gz: f5b489c2cca56abd562427d4d6263f1563a104b3709336c66d3499554aff3e24b8d1a2ebbf76fe31db080dc9888287ae2339a802ab5127862a71f32f15b1cffb
7
+ data.tar.gz: 19af5524f8622d785a633d005e2b0d696cd762be47678b67b05da54002002327c6c3699ac67fdaa07fe58375241792803dd3a9733d1ac2ae14f38490562a5589
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -7,9 +7,9 @@
7
7
 
8
8
  Runcom (a.k.a. [Run Command](https://en.wikipedia.org/wiki/Run_commands)) provides common
9
9
  functionality for Command Line Interfaces (CLIs) in which to manage global, local, or multiple
10
- configurations in general. It does this by leveraging the
11
- [XDG Base Directory Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html).
12
- Read on for further details.
10
+ caches, configurations, or data in general. It does this by leveraging the [XDG Base Directory
11
+ Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html). Read on for
12
+ further details.
13
13
 
14
14
  <!-- Tocer[start]: Auto-generated, don't remove. -->
15
15
 
@@ -19,11 +19,16 @@ Read on for further details.
19
19
  - [Requirements](#requirements)
20
20
  - [Setup](#setup)
21
21
  - [Usage](#usage)
22
- - [`Runcom::Configuration`](#runcomconfiguration)
23
22
  - [XDG](#xdg)
24
- - [`$XDG_CONFIG_DIRS`](#xdg_config_dirs)
25
- - [`$XDG_CONFIG_HOME`](#xdg_config_home)
23
+ - [Overview](#overview)
24
+ - [Variable Behavior](#variable-behavior)
25
+ - [`$XDG_*_DIRS`](#xdg__dirs)
26
+ - [`$XDG_*_HOME`](#xdg__home)
26
27
  - [Variable Priority](#variable-priority)
28
+ - [Runcom](#runcom)
29
+ - [Overview](#overview-1)
30
+ - [Variable Priority](#variable-priority-1)
31
+ - [Configuration Specialization](#configuration-specialization)
27
32
  - [Examples](#examples)
28
33
  - [Tests](#tests)
29
34
  - [Versioning](#versioning)
@@ -37,19 +42,22 @@ Read on for further details.
37
42
 
38
43
  ## Features
39
44
 
40
- - Provides run command customization by loading a CLI-specific configuration from a
41
- [YAML](http://yaml.org) file.
42
- - Automatically detects and resolves resource configuration file path based on XDG environment
43
- variables which provides several benefits:
44
- - Uses the `$XDG_CONFIG_HOME` or `$XDG_CONFIG_DIRS` variables to define configuration paths.
45
- - Improves configuration organization by not littering your `$HOME` directory with `*rc` files and
46
- keeping them within a central configuration folder.
47
- - Supports loading and merging of nested/complex configurations.
48
- - Supports hash representation of configuration.
45
+ - Provides an embedded `XDG::Environment` implementation that strictly adheres to the *XDG Base
46
+ Directory Specification* which provides access to the following environment settings:
47
+ - `$XDG_CACHE_HOME`
48
+ - `$XDG_CONFIG_HOME`
49
+ - `$XDG_CONFIG_DIRS`
50
+ - `$XDG_DATA_HOME`
51
+ - `$XDG_DATA_DIRS`
52
+ - Provides a developer friendly wrapping of the XDG implementation for cache, config, and data. For
53
+ the config, the following is supported:
54
+ - Supports loading of CLI-specific [YAML](http://yaml.org) configuration file.
55
+ - Supports loading and merging of nested/complex configurations.
56
+ - Supports hash representation of configuration.
49
57
 
50
58
  ## Requirements
51
59
 
52
- 0. [Ruby 2.5.x](https://www.ruby-lang.org)
60
+ 1. [Ruby 2.6.x](https://www.ruby-lang.org).
53
61
 
54
62
  ## Setup
55
63
 
@@ -63,51 +71,47 @@ Add the following to your Gemfile:
63
71
 
64
72
  ## Usage
65
73
 
66
- ### `Runcom::Configuration`
74
+ This gem provides an embedded XDG implementation along with a developer friendly wrapper
75
+ implementation. Both of which are described in detail below.
67
76
 
68
- This object provides support for loading custom CLI configurations directly from the command line or
69
- from custom locations. It is meant to be used within your CLI program(s).
70
-
71
- An object can be initialized as follows:
72
-
73
- configuration = Runcom::Configuration.new "example"
74
-
75
- The default file name for a configuration is `configuration.yml` but a custom name can be used if
76
- desired:
77
-
78
- configuration = Runcom::Configuration.new "example", file_name: "example.yml"
79
-
80
- Default settings can be initialized as well:
81
-
82
- configuration = Runcom::Configuration.new "example", defaults: {name: "Example"}
83
-
84
- Once a configuration has been initialized, a hash representation can be obtained:
77
+ ### XDG
85
78
 
86
- configuration.to_h
79
+ The following describes the embedded XDG implementation. It's worth noting there is a [XDG
80
+ Gem](https://github.com/rubyworks/xdg) which also implements the *XDG Base Directory Specification*
81
+ but hasn't been updated in ~6 years.
87
82
 
88
- A configuration can be merged with another hash (handy for runtime overrides):
83
+ #### Overview
89
84
 
90
- updated_configuration = configuration.merge {name: "Updated Name"}
85
+ Provides an API that strictly adheres to the *XDG Base Directory Specification*. Usage:
91
86
 
92
- A configuration can also be merged with another configuration:
87
+ xdg = Runcom::XDG::Environment.new
88
+ xdg.cache_home # <= Answers computed `$XDG_CACHE_HOME` value.
89
+ xdg.config_home # <= Answers computed `$XDG_CONFIG_HOME` value.
90
+ xdg.config_dirs # <= Answers computed `$XDG_CONFIG_DIRS` value.
91
+ xdg.data_home # <= Answers computed `$XDG_DATA_HOME` value.
92
+ xdg.data_dirs # <= Answers computed `$XDG_DATA_DIRS` value.
93
93
 
94
- updated_configuration = configuration.merge Runcom::Configuration.new("other", defaults: {a: 1})
94
+ `Runcom::XDG::Environment` wraps the following objects which can be used individually if you don't
95
+ want to load the entire environment:
95
96
 
96
- The computed path of the configuration can be asked for as well:
97
+ cache = Runcom::XDG::Cache.new
98
+ config = Runcom::XDG::Config.new
99
+ data = Runcom::XDG::Data.new
97
100
 
98
- configuration.path # "~/.config/example/configuration.yml"
101
+ The `cache`, `config`, and `data` objects share the same API which means you can ask each the
102
+ following messages:
99
103
 
100
- For further details, study the public interface as provided by the
101
- [`Runcom::Configuration`](lib/runcom/configuration.rb) object.
104
+ - `#home` - Answers the home directory as computed via the `$XDG_*_HOME` key.
105
+ - `#directories` - Answers an array directories as computed via the `$XDG_*_DIRS` key.
106
+ - `#all` - Answers an array of *all* directories as computed from the combined `$XDG_*_HOME` and
107
+ `$XDG_*_DIRS` values (with `$XDG_*_HOME` prefixed at the start of the array).
102
108
 
103
- ### XDG
109
+ #### Variable Behavior
104
110
 
105
- This gem leverages the XDG `$XDG_CONFIG_DIRS` and `$XDG_CONFIG_HOME` environment variables which are
106
- used to compute the configuration path (as mentioned above). The following details how to take
107
- advantage of the XDG variables (additional details can be found by reading the
108
- [XDG Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html)).
111
+ The behavior of all XDG environment variables can be lumped into two categories of `$XDG_*_HOME` and
112
+ `$XDG_*_DIRS` behavior. Each is described below.
109
113
 
110
- #### `$XDG_CONFIG_DIRS`
114
+ ##### `$XDG_*_DIRS`
111
115
 
112
116
  This variable is used to define a colon delimited list of configuration directories. The order is
113
117
  important as the first directory defined will take precedent over the following directory and so
@@ -126,66 +130,112 @@ In the above example, the `"/example/one/.config"` path will take highest priori
126
130
  defined first.
127
131
 
128
132
  When the `$XDG_CONFIG_DIRS` is not defined, it will default to the following array: `["/etc/xdg"]`.
133
+ Other `$XDG_*_DIRS` variables share similar behavior.
129
134
 
130
- #### `$XDG_CONFIG_HOME`
135
+ ##### `$XDG_*_HOME`
131
136
 
132
137
  This is the environment variable you'll want to use the most as it takes precidence over
133
- `$XDG_CONFIG_DIRS` environment variable. It is not required to be defined as it defaults to
134
- `$HOME/.config` which is generally want you want.
138
+ `$XDG_*_DIRS` environment variable. When not defined, it defaults to `$HOME/.config` which is
139
+ generally want you want. Other `$XDG_*_HOME` variables share similar behavior.
135
140
 
136
141
  #### Variable Priority
137
142
 
138
143
  Configuration path precedence is determined in the following order (with the first taking highest
139
144
  priority):
140
145
 
141
- 0. `$XDG_CONFIG_HOME` - Will be used if defined *and* exists on the local file system. Otherwise,
142
- falls back to the `$XDG_CONFIG_DIRS` array.
143
- 0. `$XDG_CONFIG_DIRS` - Iterates through defined directories starting with the first one defined
144
- (highest priority). It will choose the first directory, in priority, that exists on the file
145
- system while skipping any that don't exist.
146
+ 1. `$XDG_*_HOME` - Will be used if defined. Otherwise, falls back to specification default.
147
+ 1. `$XDG_*_DIRS` - Iterates through directories in order defined (with first taking highest
148
+ priority). Otherwise, falls back to specification default.
146
149
 
147
- ### Examples
150
+ ### Runcom
151
+
152
+ Provides wrapper objects around the `XDG` objects which extends and enhances beyond what is found in
153
+ the *XDG Base Directory Specification*. This includes preference of local over global
154
+ configurations by default as well as other conveniences.
155
+
156
+ #### Overview
157
+
158
+ While there isn't an environment convenience object as found in the `XDG` namespace, you can
159
+ instantiate each object individually:
160
+
161
+ cache = Runcom::Cache.new
162
+ config = Runcom::Config.new
163
+ data = Runcom::Data.new
164
+
165
+ Each of the above objects share the same basic API:
166
+
167
+ - `#path` - Answers first existing file system path first computed by the `$XDG_*_HOME` value
168
+ followed by each computed `$XDG_*_DIRS` value in the order defined.
169
+ - `#paths` - Answers all file system paths which is the combined `$XDG_*_HOME` and `$XDG_*_DIRS`
170
+ values in the order defined.
171
+
172
+ #### Variable Priority
173
+
174
+ Configuration path precedence is determined in the following order (with the first taking highest
175
+ priority):
176
+
177
+ 1. **Local Configuration** - If a `$XDG_*_HOME` or `$XDG_*_DIRS` path relative to the current
178
+ working directory is detected, it will take preference over the global configuration. This is the
179
+ same behavior as found in Git where the local `.git/config` takes precedence over the global
180
+ `~/.gitconfig`.
181
+ 1. **Global Configuration** - When a local configuration isn't found, the global configuration is
182
+ used as defined by the *XDG Base Directory Specification*.
183
+
184
+ #### Configuration Specialization
185
+
186
+ The `Runcom::Config` deserves additional highlighting as it provides support for loading custom CLI
187
+ configurations directly from the command line or from custom locations. It is meant to be used
188
+ within your CLI program(s).
189
+
190
+ An object can be initialized as follows:
191
+
192
+ configuration = Runcom::Config.new "example"
193
+
194
+ The default file name for a configuration is `configuration.yml` but a custom name can be used if
195
+ desired:
196
+
197
+ configuration = Runcom::Config.new "example", file_name: "example.yml"
198
+
199
+ Default settings can be initialized as well:
200
+
201
+ configuration = Runcom::Config.new "example", defaults: {name: "Example"}
202
+
203
+ Once a configuration has been initialized, a hash representation can be obtained:
148
204
 
149
- One of the best use cases of this gem is when it is combined with an environment switcher like
150
- [direnv](https://direnv.net) where you can define a custom `XDG_CONFIG_HOME` for your specific
151
- project.
205
+ configuration.to_h
152
206
 
153
- With `direnv` installed, you could have the following project structure:
207
+ A configuration can be merged with another hash (handy for runtime overrides):
154
208
 
155
- /example
156
- /.config/test/configuration.yml
157
- /.envrc
209
+ updated_configuration = configuration.merge {name: "Updated Name"}
158
210
 
159
- The `.envrc` file could then have this setting:
211
+ A configuration can also be merged with another configuration:
160
212
 
161
- export XDG_CONFIG_HOME=".config"
213
+ updated_configuration = configuration.merge Runcom::Config.new("other", defaults: {a: 1})
162
214
 
163
- This would end up pointing to the `/example/.config` folder of the current project, as shown above,
164
- instead of `~/.config` (which is the default behavior). While running code within this project, you
165
- could initialize your configuration object like this:
215
+ The computed path of the configuration can be asked for as well:
166
216
 
167
- configuration = Runcom::Configuration.new "test"
217
+ configuration.path # "~/.config/example/configuration.yml"
168
218
 
169
- The `configuration` object would have the following path due `direnv` setting your `XDG_CONFIG_HOME`
170
- to your current project:
219
+ For further details, study the public interface as provided by the
220
+ [`Runcom::Config`](lib/runcom/config.rb) object.
171
221
 
172
- configuration.path # "~/.config/test/configuration.yml"
222
+ ### Examples
173
223
 
174
224
  If you need further examples of gems that use this gem, check out the following:
175
225
 
176
226
  - [Gemsmith](https://github.com/bkuhlmann/gemsmith) - A command line interface for smithing new Ruby
177
227
  gems.
228
+ - [Git Cop](https://github.com/bkuhlmann/git-cop) - Enforces consistent Git commits.
178
229
  - [Milestoner](https://github.com/bkuhlmann/milestoner) - A command line interface for releasing Git
179
230
  repository milestones.
180
- - [Git Cop](https://github.com/bkuhlmann/git-cop) - Enforces consistent Git commits.
181
- - [Tocer](https://github.com/bkuhlmann/tocer) - A command line interface for generating table of
182
- contents for Markdown files.
231
+ - [Pennyworth](https://github.com/bkuhlmann/pennyworth) - A command line interface that enhances and
232
+ extends [Alfred](https://www.alfredapp.com) with Ruby support.
183
233
  - [Pragmater](https://github.com/bkuhlmann/pragmater) - A command line interface for
184
234
  managing/formatting source file pragma comments.
185
235
  - [Sublime Text Kit](https://github.com/bkuhlmann/sublime_text_kit) - A command line interface for
186
236
  managing Sublime Text metadata.
187
- - [Pennyworth](https://github.com/bkuhlmann/pennyworth) - A command line interface that enhances and
188
- extends Alfred with Ruby support.
237
+ - [Tocer](https://github.com/bkuhlmann/tocer) - A command line interface for generating table of
238
+ contents for Markdown files.
189
239
 
190
240
  ## Tests
191
241
 
@@ -195,7 +245,7 @@ To test, run:
195
245
 
196
246
  ## Versioning
197
247
 
198
- Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
248
+ Read [Semantic Versioning](https://semver.org) for details. Briefly, it means:
199
249
 
200
250
  - Major (X.y.z) - Incremented for any backwards incompatible public API changes.
201
251
  - Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runcom
4
+ # A developer friendly wrapper of XDG cache.
5
+ Cache = Struct.new :name, :home, :environment, keyword_init: true do
6
+ def initialize *arguments
7
+ super
8
+
9
+ self[:home] ||= Runcom::Paths::Friendly
10
+ self[:environment] ||= ENV
11
+ freeze
12
+ end
13
+
14
+ def path
15
+ paths.find(&:exist?)
16
+ end
17
+
18
+ def paths
19
+ XDG::Cache.new(home: home, environment: environment).all
20
+ end
21
+ end
22
+ end
@@ -5,8 +5,8 @@ require "yaml"
5
5
  require "refinements/hashes"
6
6
 
7
7
  module Runcom
8
- # Default gem configuration with support for custom settings.
9
- class Configuration
8
+ # A developer friendly wrapper of XDG config.
9
+ class Config
10
10
  using Refinements::Hashes
11
11
 
12
12
  DEFAULT_FILE_NAME = "configuration.yml"
@@ -22,13 +22,19 @@ module Runcom
22
22
  paths.find(&:exist?)
23
23
  end
24
24
 
25
+ def paths
26
+ XDG::Config.new(home: Runcom::Paths::Friendly).all.map do |root|
27
+ Pathname "#{root}/#{name}/#{file_name}"
28
+ end
29
+ end
30
+
25
31
  def merge other
26
32
  self.class.new name, file_name: file_name, defaults: settings.deep_merge(other.to_h)
27
33
  end
28
34
 
29
35
  # :reek:FeatureEnvy
30
36
  def == other
31
- other.is_a?(Configuration) && hash == other.hash
37
+ other.is_a?(Config) && hash == other.hash
32
38
  end
33
39
 
34
40
  alias eql? ==
@@ -57,11 +63,5 @@ module Runcom
57
63
  yaml = YAML.load_file path
58
64
  yaml.is_a?(Hash) ? yaml : {}
59
65
  end
60
-
61
- def paths
62
- XDG::Configuration.computed_dirs.map do |root|
63
- Pathname "#{root}/#{name}/#{file_name}"
64
- end
65
- end
66
66
  end
67
67
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module Runcom
6
+ # A developer friendly wrapper of XDG data.
7
+ Data = Struct.new :name, :home, :environment, keyword_init: true do
8
+ def initialize *arguments
9
+ super
10
+
11
+ self[:home] ||= Runcom::Paths::Friendly
12
+ self[:environment] ||= ENV
13
+ freeze
14
+ end
15
+
16
+ def path
17
+ paths.find(&:exist?)
18
+ end
19
+
20
+ def paths
21
+ XDG::Data.new(home: home, environment: environment).all.map do |root|
22
+ Pathname "#{root}/#{name}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -12,7 +12,7 @@ module Runcom
12
12
  end
13
13
 
14
14
  def self.version
15
- "3.1.0"
15
+ "4.0.0"
16
16
  end
17
17
 
18
18
  def self.version_label
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runcom
4
+ # A generic key-value pair (KVP).
5
+ Pair = Struct.new :key, :value do
6
+ def to_env
7
+ Hash[*values]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module Runcom
6
+ module Paths
7
+ # The combined home and directories for environment.
8
+ class Combined
9
+ def initialize initial_home, initial_directories
10
+ @initial_home = initial_home
11
+ @initial_directories = initial_directories
12
+ end
13
+
14
+ def home
15
+ initial_home.dynamic
16
+ end
17
+
18
+ def directories
19
+ initial_directories.dynamic
20
+ end
21
+
22
+ def all
23
+ directories.prepend home
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :initial_home, :initial_directories
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module Runcom
6
+ module Paths
7
+ # A collection of XDG directories with a strict adherence to the XDG specification.
8
+ class Directory
9
+ DELIMITER = ":"
10
+
11
+ def initialize pair, environment = ENV
12
+ @pair = pair
13
+ @environment = environment
14
+ end
15
+
16
+ def default
17
+ String(pair.value).split(DELIMITER).map { |path| Pathname(path).expand_path }
18
+ end
19
+
20
+ def dynamic
21
+ environment.fetch(pair.key, String(pair.value)).split(DELIMITER).uniq.map do |path|
22
+ Pathname(path).expand_path
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :pair, :environment
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Runcom
6
+ module Paths
7
+ # A XDG home path with a loose adherence to XDG specification by preferring local path if it
8
+ # exists, otherwise defaulting to standard computed path.
9
+ class Friendly
10
+ extend Forwardable
11
+
12
+ delegate %i[key value default] => :standard
13
+
14
+ def initialize pair, environment = ENV
15
+ @standard = Standard.new pair, environment
16
+ end
17
+
18
+ def dynamic
19
+ path = String value
20
+ File.exist?(path) ? Pathname(path).expand_path : standard.dynamic
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :standard
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+ require "pathname"
5
+
6
+ module Runcom
7
+ module Paths
8
+ # A XDG home path with a strict adherence to the XDG specification.
9
+ class Standard
10
+ extend Forwardable
11
+
12
+ HOME_KEY = "HOME"
13
+
14
+ delegate %i[key value] => :pair
15
+
16
+ def initialize pair, environment = ENV
17
+ @pair = pair
18
+ @environment = environment
19
+ end
20
+
21
+ def default
22
+ home.join(String(value)).expand_path
23
+ end
24
+
25
+ def dynamic
26
+ path = String environment[key]
27
+ path.empty? ? default : home.join(path).expand_path
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :pair, :environment
33
+
34
+ def home
35
+ Pathname environment.fetch(HOME_KEY)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Runcom
6
+ module XDG
7
+ # A XDG cache that adheres to specification defaults.
8
+ class Cache
9
+ extend Forwardable
10
+
11
+ HOME_PAIR = Pair.new("XDG_CACHE_HOME", ".cache").freeze
12
+
13
+ delegate %i[home directories all] => :combined
14
+
15
+ def initialize home: Paths::Standard, directories: Paths::Directory, environment: ENV
16
+ @combined = Paths::Combined.new home.new(HOME_PAIR, environment),
17
+ directories.new(Runcom::Pair.new, environment)
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :combined
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Runcom
6
+ module XDG
7
+ # A XDG configuration that adheres to specification defaults.
8
+ class Config
9
+ extend Forwardable
10
+
11
+ HOME_PAIR = Pair.new("XDG_CONFIG_HOME", ".config").freeze
12
+ DIRS_PAIR = Pair.new("XDG_CONFIG_DIRS", "/etc/xdg").freeze
13
+
14
+ delegate %i[home directories all] => :combined
15
+
16
+ def initialize home: Paths::Standard, directories: Paths::Directory, environment: ENV
17
+ @combined = Paths::Combined.new home.new(HOME_PAIR, environment),
18
+ directories.new(DIRS_PAIR, environment)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :combined
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Runcom
6
+ module XDG
7
+ # XDG data that adheres to specification defaults.
8
+ class Data
9
+ extend Forwardable
10
+
11
+ HOME_PAIR = Pair.new("XDG_DATA_HOME", ".local/share").freeze
12
+ DIRS_PAIR = Pair.new("XDG_DATA_DIRS", "/usr/local/share:/usr/share").freeze
13
+
14
+ delegate %i[home directories all] => :combined
15
+
16
+ def initialize home: Paths::Standard, directories: Paths::Directory, environment: ENV
17
+ @combined = Paths::Combined.new home.new(HOME_PAIR, environment),
18
+ directories.new(DIRS_PAIR, environment)
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :combined
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Runcom
4
+ module XDG
5
+ # A XDG environment that provides access to all variables.
6
+ class Environment
7
+ def initialize home: Paths::Standard, directories: Paths::Directory, environment: ENV
8
+ @cache = Cache.new home: home, directories: directories, environment: environment
9
+ @config = Config.new home: home, directories: directories, environment: environment
10
+ @data = Data.new home: home, directories: directories, environment: environment
11
+ end
12
+
13
+ def cache_home
14
+ cache.home
15
+ end
16
+
17
+ def config_home
18
+ config.home
19
+ end
20
+
21
+ def config_dirs
22
+ config.directories
23
+ end
24
+
25
+ def data_home
26
+ data.home
27
+ end
28
+
29
+ def data_dirs
30
+ data.directories
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :cache, :config, :data
36
+ end
37
+ end
38
+ end
data/lib/runcom.rb CHANGED
@@ -3,5 +3,15 @@
3
3
  require "runcom/identity"
4
4
  require "runcom/errors/base"
5
5
  require "runcom/errors/syntax"
6
- require "runcom/xdg/configuration"
7
- require "runcom/configuration"
6
+ require "runcom/pair"
7
+ require "runcom/paths/standard"
8
+ require "runcom/paths/friendly"
9
+ require "runcom/paths/directory"
10
+ require "runcom/paths/combined"
11
+ require "runcom/xdg/config"
12
+ require "runcom/xdg/data"
13
+ require "runcom/xdg/cache"
14
+ require "runcom/xdg/environment"
15
+ require "runcom/config"
16
+ require "runcom/cache"
17
+ require "runcom/data"
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runcom
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -29,7 +29,7 @@ cert_chain:
29
29
  4Zrsxi713z6sndd9JBAm4G7mJiV93MsuCM5N4ZDY7XaxIhvctNSNhX/Yn8LLdtGI
30
30
  b4jw5t40FKyNUvLPPXYAvQALBtk=
31
31
  -----END CERTIFICATE-----
32
- date: 2018-05-02 00:00:00.000000000 Z
32
+ date: 2019-01-01 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: refinements
@@ -37,14 +37,14 @@ dependencies:
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '5.2'
40
+ version: '6.0'
41
41
  type: :runtime
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.2'
47
+ version: '6.0'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: bundler-audit
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -74,145 +74,131 @@ dependencies:
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0.1'
76
76
  - !ruby/object:Gem::Dependency
77
- name: codeclimate-test-reporter
78
- requirement: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.0'
83
- type: :development
84
- prerelease: false
85
- version_requirements: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.0'
90
- - !ruby/object:Gem::Dependency
91
- name: gemsmith
77
+ name: guard-rspec
92
78
  requirement: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '12.0'
82
+ version: '4.7'
97
83
  type: :development
98
84
  prerelease: false
99
85
  version_requirements: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '12.0'
89
+ version: '4.7'
104
90
  - !ruby/object:Gem::Dependency
105
- name: git-cop
91
+ name: pry
106
92
  requirement: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '2.2'
96
+ version: '0.10'
111
97
  type: :development
112
98
  prerelease: false
113
99
  version_requirements: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '2.2'
103
+ version: '0.10'
118
104
  - !ruby/object:Gem::Dependency
119
- name: guard-rspec
105
+ name: pry-byebug
120
106
  requirement: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '4.7'
110
+ version: '3.5'
125
111
  type: :development
126
112
  prerelease: false
127
113
  version_requirements: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: '4.7'
117
+ version: '3.5'
132
118
  - !ruby/object:Gem::Dependency
133
- name: pry
119
+ name: rake
134
120
  requirement: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: '0.10'
124
+ version: '12.3'
139
125
  type: :development
140
126
  prerelease: false
141
127
  version_requirements: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - "~>"
144
130
  - !ruby/object:Gem::Version
145
- version: '0.10'
131
+ version: '12.3'
146
132
  - !ruby/object:Gem::Dependency
147
- name: pry-byebug
133
+ name: reek
148
134
  requirement: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - "~>"
151
137
  - !ruby/object:Gem::Version
152
- version: '3.5'
138
+ version: '5.0'
153
139
  type: :development
154
140
  prerelease: false
155
141
  version_requirements: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - "~>"
158
144
  - !ruby/object:Gem::Version
159
- version: '3.5'
145
+ version: '5.0'
160
146
  - !ruby/object:Gem::Dependency
161
- name: rake
147
+ name: rspec
162
148
  requirement: !ruby/object:Gem::Requirement
163
149
  requirements:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
- version: '12.3'
152
+ version: '3.8'
167
153
  type: :development
168
154
  prerelease: false
169
155
  version_requirements: !ruby/object:Gem::Requirement
170
156
  requirements:
171
157
  - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: '12.3'
159
+ version: '3.8'
174
160
  - !ruby/object:Gem::Dependency
175
- name: reek
161
+ name: rubocop
176
162
  requirement: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: '4.8'
166
+ version: '0.62'
181
167
  type: :development
182
168
  prerelease: false
183
169
  version_requirements: !ruby/object:Gem::Requirement
184
170
  requirements:
185
171
  - - "~>"
186
172
  - !ruby/object:Gem::Version
187
- version: '4.8'
173
+ version: '0.62'
188
174
  - !ruby/object:Gem::Dependency
189
- name: rspec
175
+ name: rubocop-rspec
190
176
  requirement: !ruby/object:Gem::Requirement
191
177
  requirements:
192
178
  - - "~>"
193
179
  - !ruby/object:Gem::Version
194
- version: '3.7'
180
+ version: '1.30'
195
181
  type: :development
196
182
  prerelease: false
197
183
  version_requirements: !ruby/object:Gem::Requirement
198
184
  requirements:
199
185
  - - "~>"
200
186
  - !ruby/object:Gem::Version
201
- version: '3.7'
187
+ version: '1.30'
202
188
  - !ruby/object:Gem::Dependency
203
- name: rubocop
189
+ name: simplecov
204
190
  requirement: !ruby/object:Gem::Requirement
205
191
  requirements:
206
192
  - - "~>"
207
193
  - !ruby/object:Gem::Version
208
- version: '0.54'
194
+ version: '0.13'
209
195
  type: :development
210
196
  prerelease: false
211
197
  version_requirements: !ruby/object:Gem::Requirement
212
198
  requirements:
213
199
  - - "~>"
214
200
  - !ruby/object:Gem::Version
215
- version: '0.54'
201
+ version: '0.13'
216
202
  description:
217
203
  email:
218
204
  - brooke@alchemists.io
@@ -225,11 +211,21 @@ files:
225
211
  - LICENSE.md
226
212
  - README.md
227
213
  - lib/runcom.rb
228
- - lib/runcom/configuration.rb
214
+ - lib/runcom/cache.rb
215
+ - lib/runcom/config.rb
216
+ - lib/runcom/data.rb
229
217
  - lib/runcom/errors/base.rb
230
218
  - lib/runcom/errors/syntax.rb
231
219
  - lib/runcom/identity.rb
232
- - lib/runcom/xdg/configuration.rb
220
+ - lib/runcom/pair.rb
221
+ - lib/runcom/paths/combined.rb
222
+ - lib/runcom/paths/directory.rb
223
+ - lib/runcom/paths/friendly.rb
224
+ - lib/runcom/paths/standard.rb
225
+ - lib/runcom/xdg/cache.rb
226
+ - lib/runcom/xdg/config.rb
227
+ - lib/runcom/xdg/data.rb
228
+ - lib/runcom/xdg/environment.rb
233
229
  homepage: https://github.com/bkuhlmann/runcom
234
230
  licenses:
235
231
  - Apache-2.0
@@ -245,15 +241,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
241
  requirements:
246
242
  - - "~>"
247
243
  - !ruby/object:Gem::Version
248
- version: '2.5'
244
+ version: '2.6'
249
245
  required_rubygems_version: !ruby/object:Gem::Requirement
250
246
  requirements:
251
247
  - - ">="
252
248
  - !ruby/object:Gem::Version
253
249
  version: '0'
254
250
  requirements: []
255
- rubyforge_project:
256
- rubygems_version: 2.7.6
251
+ rubygems_version: 3.0.2
257
252
  signing_key:
258
253
  specification_version: 4
259
254
  summary: A run command manager for command line interfaces.
metadata.gz.sig CHANGED
Binary file
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "pathname"
4
-
5
- module Runcom
6
- module XDG
7
- # Represents X Desktop Group (XGD) configuration support. XGD is also known as
8
- # [Free Desktop](https://www.freedesktop.org). Here is the exact
9
- # [specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html) used
10
- # for this implementation.
11
- class Configuration
12
- def self.home_dir
13
- ENV.fetch "XDG_CONFIG_HOME", File.join(ENV["HOME"], ".config")
14
- end
15
-
16
- def self.dirs
17
- ENV.fetch("XDG_CONFIG_DIRS", "/etc/xdg").split ":"
18
- end
19
-
20
- def self.computed_dirs
21
- directories = dirs.prepend(home_dir).map { |directory| Pathname(directory).expand_path }
22
- directories.select(&:exist?)
23
- end
24
- end
25
- end
26
- end