diff --git a/.gitignore b/.gitignore index 716fb87..e0ff6ba 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Gemfile.lock .env coverage tmp +/vendor/ diff --git a/README.md b/README.md index 6cee3ae..c5c6f55 100644 --- a/README.md +++ b/README.md @@ -43,12 +43,16 @@ gem install gem-release # Configuration Defaults for all options can be specified in a config file at either one of -these locations: +these locations in this specific order: -* `~/.gem_release/config.yml` -* `~/.gem_release.yml` -* `./.gem_release/config.yml` -* `./.gem_release.yml` +* ./.gem_release/config.yml +* ./.gem_release.yml +* $XDG_CONFIG_HOME/.gem_release/config.yml +* $XDG_CONFIG_HOME/.gem_release.yml +* ~/.gem_release/config.yml +* ~/.gem_release.yml + +`$XDG_CONFIG_HOME` defaults to `~/.config` if not set. Config files must be in the [YAML](http://www.yaml.org/) format, and list options per command. Common options can be set on the root. diff --git a/README.md.erb b/README.md.erb index 4443630..6881d8c 100644 --- a/README.md.erb +++ b/README.md.erb @@ -43,12 +43,13 @@ gem install gem-release # Configuration Defaults for all options can be specified in a config file at either one of -these locations: +these locations in this specific order: -* `~/.gem_release/config.yml` -* `~/.gem_release.yml` -* `./.gem_release/config.yml` -* `./.gem_release.yml` +<% class Gem::Release::Config::Files; def xdg_config_home; '$XDG_CONFIG_HOME/'; end; end -%> +<% Gem::Release::Config::Files.new.combine_paths.map do |path| -%> +* <%= path %> +<% end %> +`$XDG_CONFIG_HOME` defaults to `~/.config` if not set. Config files must be in the [YAML](http://www.yaml.org/) format, and list options per command. Common options can be set on the root. diff --git a/lib/gem/release/config/files.rb b/lib/gem/release/config/files.rb index a2d4862..7265981 100644 --- a/lib/gem/release/config/files.rb +++ b/lib/gem/release/config/files.rb @@ -7,18 +7,21 @@ class Config class Files include Helper::Hash - PATHS = %w( - ./.gem_release/config.yml - ./.gem_release.yml - ~/.gem_release/config.yml - ~/.gem_release.yml - ) + FILES = %w[.gem_release/config.yml .gem_release.yml] def load return {} unless path symbolize_keys(YAML.load_file(path) || {}) end + def combine_paths + folders = ['./', xdg_config_home, '~/'] + + folders.product(FILES).map do |folder, file| + File.join(folder, file) + end + end + private def path @@ -26,9 +29,14 @@ def path end def paths - paths = PATHS.map { |path| File.expand_path(path) } + paths = combine_paths.map { |path| File.expand_path(path) } paths.select { |path| File.exist?(path) } end + + def xdg_config_home + home_config = File.join(ENV.fetch('HOME'), '.config') + ENV.fetch('XDG_CONFIG_HOME', home_config) + end end end end diff --git a/spec/gem/release/config_spec.rb b/spec/gem/release/config_spec.rb index 97e2030..1bdabe6 100644 --- a/spec/gem/release/config_spec.rb +++ b/spec/gem/release/config_spec.rb @@ -1,6 +1,7 @@ describe Gem::Release::Config do - let(:global) { { bump: { commit: false }, tag: { push: false }, quiet: true } } - let(:local) { { bump: { commit: true, push: true }, quiet: false } } + let(:global) { { release: { host: 'https://example.com/global' } } } + let(:local) { { release: { host: 'https://example.com/local' } } } + let(:xdg_config) { { release: { host: 'https://example.com/xdg' } } } subject { described_class.new.opts } @@ -37,6 +38,41 @@ before { write './.gem_release.yml', '' } it { should eq({}) } end + + describe 'XDG_CONFIG_HOME' do + describe 'default' do + before { write File.join(ENV.fetch('HOME'), '.config/.gem_release.yml'), YAML.dump(xdg_config) } + it { should eq xdg_config } + end + + describe 'set to ~/.my-little-config' do + env XDG_CONFIG_HOME: '~/.my-little-config' + before { write '~/.my-little-config/.gem_release.yml', YAML.dump(xdg_config) } + it { should eq xdg_config } + end + end + + describe 'all three ./.gem_release.yml, XDG_CONFIG_HOME, and ~/.gem_release.yml' do + before { write './.gem_release.yml', YAML.dump(local) } + env XDG_CONFIG_HOME: '~/.my-little-config' + before { write '~/.my-little-config/.gem_release.yml', YAML.dump(xdg_config) } + before { write '~/.gem_release.yml', YAML.dump(global) } + it { should eq local } + end + + describe 'both XDG_CONFIG_HOME and ~/.gem_release.yml' do + describe 'XDG_CONFIG_HOME default' do + before { write File.join(ENV.fetch('HOME'), '.config/.gem_release.yml'), YAML.dump(xdg_config) } + before { write '~/.gem_release.yml', YAML.dump(global) } + it { should eq xdg_config } + end + describe 'XDG_CONFIG_HOME set to ~/.my-little-config' do + env XDG_CONFIG_HOME: '~/.my-little-config' + before { write '~/.my-little-config/.gem_release.yml', YAML.dump(xdg_config) } + before { write '~/.gem_release.yml', YAML.dump(global) } + it { should eq xdg_config } + end + end end describe 'both env and files' do