gemchain 0.2.3 → 0.2.4

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
  SHA256:
3
- metadata.gz: ab27d10beec845df41578b7b6c4d565b7bbc0f9cba1e6a54a0dea436e6e4a6b6
4
- data.tar.gz: f174ef1730a64b7ccde749d7bd501718c9e01cbdb45811c364d7c3ee3ad69f65
3
+ metadata.gz: 28efcb002b8ff78a3dad0554ff43dd7082221c42a927d0f61fd31d892fff87c1
4
+ data.tar.gz: 8e2f0892d8018723ce6f90c27abdd877249889b1f2bc357de0c9811083bf5fe5
5
5
  SHA512:
6
- metadata.gz: 6496d418a3d2678a3c68235f2dba7b6e92e6f19e43f9b419b3a84274f2aea7d4dc630255957dbff5742fab85b15aaffc9a53851801d71104ae9efd26f9224279
7
- data.tar.gz: aab0e316ac54d912ae20c37ed75da0520d6a8a00deb9969e553de4286c855db40fdf399968b76141b3b3e1f9ceeec65c0bfc963f4f07fba368e8c2cac496ca20
6
+ metadata.gz: 606408575bd7f7e3fd77d5b7185c37435617d8f8d728caeb42f4a42ddccd15c7570e1999ead8390703b31890720c23f886258493c79e3f066350c5a785fe98e5
7
+ data.tar.gz: 1afe1853d547bcf461a517b0f1216c206c84566ac1d3116aa7eefe8f72221e4d8b5e86bb82ed48bd5aba403d9652ea4204715dac90b493ccabdab3265b61e9b1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [0.2.4] — 2026-09-17
2
+
3
+ ### Fixed
4
+
5
+ - **Cascade continues past dependent failures** — when a dependent fails
6
+ (test, build, push, etc.), its remaining steps are skipped but the
7
+ cascade continues to the next gem. Healthy dependents are still updated
8
+ and released. Previously a single failure (e.g. missing git remote)
9
+ halted the entire cascade, leaving perfectly good dependents untouched.
10
+ The final report now lists which gems failed and which succeeded.
11
+
1
12
  ## [0.2.3] — 2026-08-13
2
13
 
3
14
  ### Fixed
data/lib/gemchain/cli.rb CHANGED
@@ -120,10 +120,17 @@ module Gemchain
120
120
  puts "\n Cascade complete."
121
121
  end
122
122
  else
123
- gem, message = result.failed.first
124
- puts "\n ✖ Cascade stopped at #{gem}:"
125
- puts " #{message}"
126
- puts " Released so far: #{result.released.join(', ')}" unless result.released.empty?
123
+ puts "\n ⚠️ Cascade completed with failures:"
124
+ result.failed.each do |gem, message|
125
+ puts "#{gem}: #{message.split("\n").first}"
126
+ end
127
+ puts "\n ✅ Released: #{result.released.join(', ')}" unless result.released.empty?
128
+ puts " ⏭ Skipped: #{result.skipped.join(', ')}" unless result.skipped.empty?
129
+ if result.released.empty?
130
+ puts "\n No gems were released."
131
+ else
132
+ puts "\n Good dependents were updated successfully."
133
+ end
127
134
  end
128
135
  end
129
136
  puts
@@ -1,15 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "open3"
4
+ require "set"
4
5
  require "timeout"
5
6
 
6
7
  module Gemchain
7
8
  class ExecutionError < Error; end
8
9
 
9
10
  # Executes a cascade plan: bumps versions, rewrites gemspec constraints,
10
- # runs test suites, and releases gems to RubyGems stopping at the first
11
- # failure. All shell interaction goes through the +runner+ so the whole
12
- # pipeline is testable without touching bundler, git, or RubyGems.
11
+ # runs test suites, and releases gems to RubyGems. On failure the
12
+ # remaining steps for the failing gem are skipped but the cascade
13
+ # continues to the next gem, so healthy dependents are still updated.
14
+ # All shell interaction goes through the +runner+ so the whole pipeline
15
+ # is testable without touching bundler, git, or RubyGems.
13
16
  class Executor
14
17
  Result = Struct.new(:success, :released, :skipped, :failed, keyword_init: true)
15
18
 
@@ -62,8 +65,16 @@ module Gemchain
62
65
  def run
63
66
  released = []
64
67
  skipped = []
68
+ failed = {}
69
+ failed_gems = Set.new
65
70
 
66
71
  @steps.each do |step|
72
+ # Skip remaining steps for a gem that already failed
73
+ if failed_gems.include?(step[:gem])
74
+ @output.puts " ⏭ Skipping remaining steps for #{step[:gem]} (previous step failed)"
75
+ next
76
+ end
77
+
67
78
  begin
68
79
  case step[:action]
69
80
  when :bump
@@ -82,12 +93,14 @@ module Gemchain
82
93
  end
83
94
  end
84
95
  rescue ExecutionError => e
85
- return Result.new(success: false, released: released, skipped: skipped,
86
- failed: {step[:gem] => e.message})
96
+ @output.puts " ✖ #{step[:gem]}: #{e.message.split("\n").first}"
97
+ failed[step[:gem]] = e.message
98
+ failed_gems << step[:gem]
87
99
  end
88
100
  end
89
101
 
90
- Result.new(success: true, released: released, skipped: skipped, failed: nil)
102
+ success = failed.empty?
103
+ Result.new(success: success, released: released, skipped: skipped, failed: failed.empty? ? nil : failed)
91
104
  end
92
105
 
93
106
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gemchain
4
- VERSION = "0.2.3"
4
+ VERSION = "0.2.4"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemchain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaka Ruto