gemchain 0.2.5 → 0.3.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
  SHA256:
3
- metadata.gz: 4225472cc9e011c58b4ca33df554b3f54be147f4db9b3293d7aecd37d8b55121
4
- data.tar.gz: e5d9b76f7a02d707efcb2fa53d43f28cd6767d99862263ebdd29af18e68856eb
3
+ metadata.gz: 1cacd44997c24011ea6c204ad739d11cea72da928bcaf7f5ebe9cd27f8b3cf96
4
+ data.tar.gz: a75aa99478abefb2d716b187cc24ee28104f54c46f144f20ab126472c4c2cd08
5
5
  SHA512:
6
- metadata.gz: fb9dc21eab05eab8ddf65425fa185c0159bee96cf6267401e984b7c2bd535279238ef9f314dbb4c53e1ccd88abb552a3d136e502f3e805610642f7314765b12b
7
- data.tar.gz: ae43d4fb6a343ab80a4f77dde5adfd23d1599095af49e71e3f9400e33a2153f62ae966d5ddb5e817d47cfb08fb0f954f7e88d09f867cb91a9ed9aa3c5b87048c
6
+ metadata.gz: 9efa9ebffb78684ea4358f00900a377d903c598d2c982afdbbb749b650e6f69b41ab7cfa0fbd59c43619ffff1790287a052adaede75566e82c3f8c5d052ae34c
7
+ data.tar.gz: fcbf7ec2dcc638fb83c95af834f38bd5fb9a8a453c806b550401bf51d3929877c15146f2f34aaff83e14d4f0219d710cd9ac84f7beadac82cbc4c768a1843b9d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.3.0] - 2026-09-23
4
+
5
+ ### Added
6
+
7
+ - Patch-level dependent releases roll over to the next minor after patch 9.
8
+ - Cascade releases finalize and stage changelog entries before publishing.
9
+
1
10
  ## [0.2.5] — 2026-09-22
2
11
 
3
12
  ### Added
@@ -3,6 +3,7 @@
3
3
  require "open3"
4
4
  require "set"
5
5
  require "timeout"
6
+ require "date"
6
7
 
7
8
  module Gemchain
8
9
  class ExecutionError < Error; end
@@ -195,6 +196,7 @@ module Gemchain
195
196
  return
196
197
  end
197
198
 
199
+ finalize_changelog(dir, version, step[:dependency], step[:constraint])
198
200
  files = release_files(dir)
199
201
  @runner.run(["git", "add", *files], chdir: dir)
200
202
 
@@ -221,6 +223,8 @@ module Gemchain
221
223
  # commonly ignore it).
222
224
  def release_files(dir)
223
225
  files = [gemspec_file(dir), version_file(dir)]
226
+ changelog = File.join(dir, "CHANGELOG.md")
227
+ files << changelog if File.file?(changelog)
224
228
  lockfile = File.join(dir, "Gemfile.lock")
225
229
  files << lockfile if File.exist?(lockfile) && !git_ignored?(dir, lockfile)
226
230
  files
@@ -260,7 +264,48 @@ module Gemchain
260
264
  case level
261
265
  when :major then "#{parts[0] + 1}.0.0"
262
266
  when :minor then "#{parts[0]}.#{parts[1] + 1}.0"
263
- else "#{parts[0]}.#{parts[1]}.#{(parts[2] || 0) + 1}"
267
+ else
268
+ patch = parts[2] || 0
269
+ patch >= 9 ? "#{parts[0]}.#{parts[1] + 1}.0" : "#{parts[0]}.#{parts[1]}.#{patch + 1}"
270
+ end
271
+ end
272
+
273
+ def finalize_changelog(dir, version, dependency, constraint)
274
+ path = File.join(dir, "CHANGELOG.md")
275
+ return unless File.file?(path)
276
+
277
+ content = File.read(path)
278
+ return if content.match?(/^## \[#{Regexp.escape(version)}\]/)
279
+
280
+ unreleased = content.match(/^## \[Unreleased\]\s*\n(.*?)(?=^## \[|\z)/m)
281
+ notes = unreleased ? unreleased[1].strip : ""
282
+ if dependency
283
+ note = "- Updated #{dependency} dependency to #{constraint}."
284
+ notes = append_changelog_note(notes, "Changed", note)
285
+ end
286
+
287
+ release = "## [#{version}] - #{Date.today}\n"
288
+ release += "\n#{notes}\n" unless notes.empty?
289
+ replacement = "## [Unreleased]\n\n#{release}"
290
+
291
+ if unreleased
292
+ content = content.sub(unreleased[0], replacement)
293
+ elsif (title = content.match(/\A(# Changelog\s*\n)/i))
294
+ content = content.sub(title[0], "#{title[1]}\n#{replacement}\n")
295
+ else
296
+ content = "# Changelog\n\n#{replacement}\n#{content}"
297
+ end
298
+ File.write(path, content)
299
+ end
300
+
301
+ def append_changelog_note(notes, section, note)
302
+ heading = "### #{section}"
303
+ if notes.match?(/^#{Regexp.escape(heading)}\s*$/)
304
+ notes.sub(/^#{Regexp.escape(heading)}\s*$/, "#{heading}\n\n#{note}")
305
+ elsif notes.empty?
306
+ "#{heading}\n\n#{note}"
307
+ else
308
+ "#{notes}\n\n#{heading}\n\n#{note}"
264
309
  end
265
310
  end
266
311
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gemchain
4
- VERSION = "0.2.5"
4
+ VERSION = "0.3.0"
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.5
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaka Ruto