runcom 0.6.0 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 979adb538efd3077c571dae93b8cc570ebc0bc62
4
- data.tar.gz: '0639625144dec6f05ecd65ffd96673ec0dc5fbea'
3
+ metadata.gz: '0079d1916af6b0a44c839bbd3f61988c5efe1bff'
4
+ data.tar.gz: 2d41953a849b8c6b7a41f881ff552934876b160b
5
5
  SHA512:
6
- metadata.gz: 0ed9a641bafd1d4bb47ec29bb85edb9a069ecfde639c5da14c30e8edf8f7b97a80dbeed3fba6cc481fd9dede81ef027692d2fa9f12fa146eee706aef8e846a3d
7
- data.tar.gz: a047ed159c36d0ba6d9b87f9ed8c7b8c6ddae470a8ab49bde642a922024f40279f42e069d28f471797566834ebf250dd5f6f7e8f56d3bba9c6cb5060e2db0063
6
+ metadata.gz: ba0a18fb05999333917446f60d817df0256d68c9987ef66b55c54f2e4e753b687b0c699783ba99d3fa0cc1577e55887877d8137c097801c9c4fb6ef210e88396
7
+ data.tar.gz: 340f0063f2ddf39d5bd90ffa82d59c771238a1a17011f3993c01611df8c44612e003dc97974119914cc1dde9b811133bc0dfefba7140d3045d1c96bd7522ab4f
data/README.md CHANGED
@@ -4,11 +4,14 @@
4
4
  [![Code Climate GPA](https://codeclimate.com/github/bkuhlmann/runcom.svg)](https://codeclimate.com/github/bkuhlmann/runcom)
5
5
  [![Code Climate Coverage](https://codeclimate.com/github/bkuhlmann/runcom/coverage.svg)](https://codeclimate.com/github/bkuhlmann/runcom)
6
6
  [![Gemnasium Status](https://gemnasium.com/bkuhlmann/runcom.svg)](https://gemnasium.com/bkuhlmann/runcom)
7
- [![Travis CI Status](https://secure.travis-ci.org/bkuhlmann/runcom.svg)](https://travis-ci.org/bkuhlmann/runcom)
7
+ [![Circle CI Status](https://circleci.com/gh/bkuhlmann/runcom.svg?style=svg)](https://circleci.com/gh/bkuhlmann/runcom)
8
8
  [![Patreon](https://img.shields.io/badge/patreon-donate-brightgreen.svg)](https://www.patreon.com/bkuhlmann)
9
9
 
10
- A [run command manager](https://en.wikipedia.org/wiki/Run_commands) for command line interfaces
11
- (CLI). It manages/resolves local or global resource (i.e. `.<program>rc`) settings for CLIs.
10
+ Runcom (a.k.a. [Run Command](https://en.wikipedia.org/wiki/Run_commands)) provides common
11
+ functionality for Command Line Interfaces (CLIs) in which to manage global, local, or multiple
12
+ configurations in general. It does this by leveraging the
13
+ [XDG Base Directory Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html).
14
+ Read on for further details.
12
15
 
13
16
  <!-- Tocer[start]: Auto-generated, don't remove. -->
14
17
 
@@ -18,6 +21,11 @@ A [run command manager](https://en.wikipedia.org/wiki/Run_commands) for command
18
21
  - [Requirements](#requirements)
19
22
  - [Setup](#setup)
20
23
  - [Usage](#usage)
24
+ - [`Runcom::Configuration`](#runcomconfiguration)
25
+ - [XDG Configurations](#xdg-configurations)
26
+ - [`$XDG_CONFIG_DIRS`](#xdg_config_dirs)
27
+ - [`$XDG_CONFIG_HOME`](#xdg_config_home)
28
+ - [Variable Priority](#variable-priority)
21
29
  - [Tests](#tests)
22
30
  - [Versioning](#versioning)
23
31
  - [Code of Conduct](#code-of-conduct)
@@ -30,9 +38,14 @@ A [run command manager](https://en.wikipedia.org/wiki/Run_commands) for command
30
38
 
31
39
  # Features
32
40
 
33
- - Loads local or global YAML resource configurations.
34
- - Automatically detects and resolves local or global resource configurations.
35
- - Provides support for merging of nested/complex configurations.
41
+ - Provides run command customization by loading a CLI-specific configuration from a
42
+ [YAML](http://yaml.org) file.
43
+ - Automatically detects and resolves resource configuration file path based on XDG environment
44
+ variables which provides several benefits:
45
+ - Uses the `$XDG_CONFIG_HOME` or `$XDG_CONFIG_DIRS` variables to define configuration paths.
46
+ - Improves configuration organization by not littering your `$HOME` directory with `*rc` files and
47
+ keeping them within a central configuration folder.
48
+ - Supports loading and merging of nested/complex configurations.
36
49
  - Supports hash representation of configuration.
37
50
 
38
51
  # Requirements
@@ -60,26 +73,80 @@ Add the following to your Gemfile:
60
73
 
61
74
  # Usage
62
75
 
63
- Start by leveraging the `Runcom::Configuration` object as follows:
76
+ ## `Runcom::Configuration`
64
77
 
65
- configuration = Runcom::Configuration.new file_name: ".examplerc"
78
+ An object can be initialized as follows:
66
79
 
67
- There is optional support for default settings too:
80
+ configuration = Runcom::Configuration.new project_name: "example"
68
81
 
69
- configuration = Runcom::Configuration.new file_name: ".examplerc", defaults: {name: "Example"}
82
+ The default file name for a configuration is `configuration.yml` but a custom name can be used if
83
+ desired:
70
84
 
71
- Default settings will be overwitten if matching local or global setting keys are detected. Order of
72
- precedence is determined as follows:
85
+ configuration = Runcom::Configuration.new project_name: "example", file_name: "example.yml"
73
86
 
74
- 0. Local (i.e. `<current working directory>/.examplerc`)
75
- 0. Global (i.e. `$HOME/.examplerc`)
76
- 0. Defaults (i.e. `{}` unless specified upon initialization).
87
+ Default settings can be initialized as well:
77
88
 
78
- If multiple settings are detected, only the first one found will be used.
89
+ configuration = Runcom::Configuration.new project_name: "example", defaults: {name: "Example"}
90
+
91
+ Once a configuration has been initialized, a hash representation can be obtained:
92
+
93
+ configuration.to_h
94
+
95
+ A configuration can be merged with another hash (handy for runtime overrides)
96
+
97
+ updated_configuration = configuration.merge {name: "Updated Name"}
98
+
99
+ The computed path of the configuration can be asked for as well:
100
+
101
+ configuration.path # "~/.config/example/configuration.yml"
79
102
 
80
103
  For further details, study the public interface as provided by the
81
104
  [`Runcom::Configuration`](lib/runcom/configuration.rb) object.
82
105
 
106
+ ## XDG Configurations
107
+
108
+ This gem leverages the XDG `$XDG_CONFIG_DIRS` and `$XDG_CONFIG_HOME` environment variables which are
109
+ used to compute the configuration path (as mentioned above). The following details how to take
110
+ advantage of the XDG variables (additional details can be found by reading the
111
+ [XDG Specification](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html)).
112
+
113
+ ### `$XDG_CONFIG_DIRS`
114
+
115
+ This variable is used to define a colon delimited list of configuration directories. The order is
116
+ important as the first directory defined will take precedent over the following directory and so
117
+ forth. Example:
118
+
119
+ XDG_CONFIG_DIRS="/example/one/.config:/example/two/.settings:/example/three/.configuration"
120
+
121
+ # Yields the following array:
122
+ [
123
+ "/example/one/.config",
124
+ "/example/two/.settings",
125
+ "/example/three/.configuration"
126
+ ]
127
+
128
+ In the above example, the `"/example/one/.config"` path will take highest priority since it was
129
+ defined first.
130
+
131
+ When the `$XDG_CONFIG_DIRS` is not defined, it will default to the following array: `["/etc/xdg"]`.
132
+
133
+ ### `$XDG_CONFIG_HOME`
134
+
135
+ This is the environment variable you'll want to use the most as it takes precidence over
136
+ `$XDG_CONFIG_DIRS` environment variable. It is not required to be defined as it defaults to
137
+ `$HOME/.config` which is generally want you want.
138
+
139
+ ### Variable Priority
140
+
141
+ Configuration path precedence is determined in the following order (with the first taking highest
142
+ priority):
143
+
144
+ 0. `$XDG_CONFIG_HOME` - Will be used if defined *and* an exists on the local file system. Otherwise,
145
+ falls back to the `$XDG_CONFIG_DIRS` array.
146
+ 0. `$XDG_CONFIG_DIRS` - Iterates through defined directories starting with the first one defined
147
+ (highest priority). It will choose the first directory, in priority, that exists on the file
148
+ system while skipping those that don't exist.
149
+
83
150
  # Tests
84
151
 
85
152
  To test, run:
data/lib/runcom.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "runcom/identity"
4
+ require "runcom/xdg/configuration"
4
5
  require "runcom/configuration"
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "pathname"
3
4
  require "yaml"
4
5
  require "refinements/hashes"
5
6
 
@@ -8,32 +9,14 @@ module Runcom
8
9
  class Configuration
9
10
  using Refinements::Hashes
10
11
 
11
- def initialize file_name:, defaults: {}
12
- @file_name = file_name
12
+ attr_reader :path
13
+
14
+ def initialize project_name:, file_name: "configuration.yml", defaults: {}
15
+ @path = Pathname "#{XDG::Configuration.computed_dir}/#{project_name}/#{file_name}"
13
16
  @defaults = defaults
14
17
  @settings = defaults.deep_merge load_settings
15
18
  end
16
19
 
17
- def local?
18
- File.exist? local_path
19
- end
20
-
21
- def global?
22
- File.exist? global_path
23
- end
24
-
25
- def local_path
26
- File.join Dir.pwd, file_name
27
- end
28
-
29
- def global_path
30
- File.join ENV["HOME"], file_name
31
- end
32
-
33
- def computed_path
34
- local? ? local_path : global_path
35
- end
36
-
37
20
  def merge custom_settings
38
21
  settings.deep_merge custom_settings
39
22
  end
@@ -44,10 +27,10 @@ module Runcom
44
27
 
45
28
  private
46
29
 
47
- attr_reader :file_name, :defaults, :settings
30
+ attr_reader :file_path, :defaults, :settings
48
31
 
49
32
  def load_settings
50
- yaml = YAML.load_file computed_path
33
+ yaml = YAML.load_file path
51
34
  yaml.is_a?(Hash) ? yaml : {}
52
35
  rescue
53
36
  defaults
@@ -12,7 +12,7 @@ module Runcom
12
12
  end
13
13
 
14
14
  def self.version
15
- "0.6.0"
15
+ "1.0.0"
16
16
  end
17
17
 
18
18
  def self.version_label
@@ -0,0 +1,30 @@
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) being
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.unshift(home_dir).map { |directory| Pathname(directory).expand_path }
22
+ directories.select(&:exist?)
23
+ end
24
+
25
+ def self.computed_dir
26
+ computed_dirs.first
27
+ end
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runcom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-06 00:00:00.000000000 Z
11
+ date: 2017-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: refinements
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '9.4'
47
+ version: '9.6'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '9.4'
54
+ version: '9.6'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -142,28 +142,28 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '4.6'
145
+ version: '4.7'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '4.6'
152
+ version: '4.7'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: rubocop
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '0.48'
159
+ version: '0.49'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '0.48'
166
+ version: '0.49'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: codeclimate-test-reporter
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +192,7 @@ files:
192
192
  - lib/runcom.rb
193
193
  - lib/runcom/configuration.rb
194
194
  - lib/runcom/identity.rb
195
+ - lib/runcom/xdg/configuration.rb
195
196
  homepage: https://github.com/bkuhlmann/runcom
196
197
  licenses:
197
198
  - MIT