From d64bef88af6befead93f2bc3a57e0b9d1814df3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Wed, 22 Apr 2026 21:57:12 -0700 Subject: [PATCH 1/8] chore(.gitignore): add /vendor/ --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 716fb87..e0ff6ba 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Gemfile.lock .env coverage tmp +/vendor/ From 7b5c407719b3e460b711de1e56706e1268a44c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Wed, 22 Apr 2026 21:59:07 -0700 Subject: [PATCH 2/8] refactor(Config::Files): PATHS -> #combine_paths --- lib/gem/release/config/files.rb | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/gem/release/config/files.rb b/lib/gem/release/config/files.rb index a2d4862..8d4fd91 100644 --- a/lib/gem/release/config/files.rb +++ b/lib/gem/release/config/files.rb @@ -7,12 +7,8 @@ class Config class Files include Helper::Hash - PATHS = %w( - ./.gem_release/config.yml - ./.gem_release.yml - ~/.gem_release/config.yml - ~/.gem_release.yml - ) + FOLDERS = %w[./ ~/] + FILES = %w[.gem_release/config.yml .gem_release.yml] def load return {} unless path @@ -26,9 +22,15 @@ 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 combine_paths + FOLDERS.product(FILES).map do |folder, file| + File.join(folder, file) + end + end end end end From 83bbd354b7a22e51f48ad42385f123db35b62099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Tue, 5 May 2026 23:53:43 -0700 Subject: [PATCH 3/8] feat(Config::Files): use path from $XDG_CONFIG_HOME --- lib/gem/release/config/files.rb | 10 +++++++-- spec/gem/release/config_spec.rb | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/gem/release/config/files.rb b/lib/gem/release/config/files.rb index 8d4fd91..5042b86 100644 --- a/lib/gem/release/config/files.rb +++ b/lib/gem/release/config/files.rb @@ -7,7 +7,6 @@ class Config class Files include Helper::Hash - FOLDERS = %w[./ ~/] FILES = %w[.gem_release/config.yml .gem_release.yml] def load @@ -26,8 +25,15 @@ def paths 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 + def combine_paths - FOLDERS.product(FILES).map do |folder, file| + folders = ['./', xdg_config_home, '~/'] + + folders.product(FILES).map do |folder, file| File.join(folder, file) end end diff --git a/spec/gem/release/config_spec.rb b/spec/gem/release/config_spec.rb index 97e2030..d54d432 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(:xdg_config) { { quiet: true, release: { host: 'https://example.com' } } } 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 /conf' do + env XDG_CONFIG_HOME: '/conf' + before { write '/conf/.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: '/conf' + before { write '/conf/.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 /conf' do + env XDG_CONFIG_HOME: '/conf' + before { write '/conf/.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 From 727b450b80447f3c302ea1ffe3c237d39298f3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Wed, 6 May 2026 23:10:48 -0700 Subject: [PATCH 4/8] test(Config): change absolute path to home subdir to avoid EACCES --- spec/gem/release/config_spec.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spec/gem/release/config_spec.rb b/spec/gem/release/config_spec.rb index d54d432..2980114 100644 --- a/spec/gem/release/config_spec.rb +++ b/spec/gem/release/config_spec.rb @@ -45,17 +45,17 @@ it { should eq xdg_config } end - describe 'set to /conf' do - env XDG_CONFIG_HOME: '/conf' - before { write '/conf/.gem_release.yml', YAML.dump(xdg_config) } + 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 + 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: '/conf' - before { write '/conf/.gem_release.yml', YAML.dump(xdg_config) } + 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 @@ -66,9 +66,9 @@ before { write '~/.gem_release.yml', YAML.dump(global) } it { should eq xdg_config } end - describe 'XDG_CONFIG_HOME set to /conf' do - env XDG_CONFIG_HOME: '/conf' - before { write '/conf/.gem_release.yml', YAML.dump(xdg_config) } + 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 From 33df6941b78453ccdf2efddcbb5bf436673b994f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Fri, 8 May 2026 19:52:07 -0700 Subject: [PATCH 5/8] docs(README.md): add $XDG_CONFIG_HOME config locations --- README.md | 4 ++++ README.md.erb | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 6cee3ae..b7f662d 100644 --- a/README.md +++ b/README.md @@ -47,9 +47,13 @@ these locations: * `~/.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..9ca6d36 100644 --- a/README.md.erb +++ b/README.md.erb @@ -47,9 +47,13 @@ these locations: * `~/.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. From c1396025abdccf4baaece54138148834c49498c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Thu, 14 May 2026 22:47:50 -0700 Subject: [PATCH 6/8] test(Config): change config file stubs to easily identified --- spec/gem/release/config_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/gem/release/config_spec.rb b/spec/gem/release/config_spec.rb index 2980114..1bdabe6 100644 --- a/spec/gem/release/config_spec.rb +++ b/spec/gem/release/config_spec.rb @@ -1,7 +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(:xdg_config) { { quiet: true, release: { host: 'https://example.com' } } } + 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 } From 422ee41642c24497d744eaa0d4a1308151ec9a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Thu, 14 May 2026 23:32:50 -0700 Subject: [PATCH 7/8] docs(README.md.erb): use Files#combine_paths to list available config paths --- README.md.erb | 12 ++++-------- lib/gem/release/config/files.rb | 16 ++++++++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/README.md.erb b/README.md.erb index 9ca6d36..52c325a 100644 --- a/README.md.erb +++ b/README.md.erb @@ -43,15 +43,11 @@ gem install gem-release # Configuration Defaults for all options can be specified in a config file at either one of -these locations: - -* `~/.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` +these locations in this specific order: +<% 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 diff --git a/lib/gem/release/config/files.rb b/lib/gem/release/config/files.rb index 5042b86..7265981 100644 --- a/lib/gem/release/config/files.rb +++ b/lib/gem/release/config/files.rb @@ -14,6 +14,14 @@ def load 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 @@ -29,14 +37,6 @@ def xdg_config_home home_config = File.join(ENV.fetch('HOME'), '.config') ENV.fetch('XDG_CONFIG_HOME', home_config) end - - def combine_paths - folders = ['./', xdg_config_home, '~/'] - - folders.product(FILES).map do |folder, file| - File.join(folder, file) - end - end end end end From 79271a08ba135674c1d1ffd8a90146abfea7430d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamila=20Chludzi=C5=84ska?= Date: Thu, 14 May 2026 23:58:20 -0700 Subject: [PATCH 8/8] docs(README.md.erb): replace `$XDG_CONFIG_HOME` value with string --- README.md | 16 ++++++++-------- README.md.erb | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b7f662d..c5c6f55 100644 --- a/README.md +++ b/README.md @@ -43,14 +43,14 @@ gem install gem-release # Configuration Defaults for all options can be specified in a config file at either one of -these locations: - -* `~/.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` +these locations in this specific order: + +* ./.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. diff --git a/README.md.erb b/README.md.erb index 52c325a..6881d8c 100644 --- a/README.md.erb +++ b/README.md.erb @@ -45,6 +45,7 @@ gem install gem-release Defaults for all options can be specified in a config file at either one of these locations in this specific order: +<% 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 %>