kettle-family 1.2.70 → 1.2.72

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: c2288af511fb1a4739aaa21048c246fc943f37121fade2508036d3ab99118a23
4
- data.tar.gz: dd96a3071d396abca33e2dc05747ed84d5b4071833e6397d18262e7b67a8ac8e
3
+ metadata.gz: 266e37644edc6018b8703bf55cd6f20bf4db15c69697d28ea11e6ff1940fef37
4
+ data.tar.gz: 19ee1e19fdead5782076ec358f5d9989995775f31c721532dc8c38de9933a234
5
5
  SHA512:
6
- metadata.gz: 55c143def3d82260a48d92eb2a790d451b0870639f0824b8995acbf066111b5fb43f9522fb94d7a79de4fccc64f4a786fdd553621512316f0b51ffe81ed6f49c
7
- data.tar.gz: e405c86386fd311f126a473fd7c2410626f1763ae739892c923fd03ea69a8bbff9251e6cb9f08504a3ad0189ec4b50d43b67cf74b5ecd3689fea6614ad15a086
6
+ metadata.gz: bec417de6edd7bea0c58cb336d854ff52c9744447b31b5a37bcf4cfeb1710810a3245f34095d206bd68a1de36d30fc5532818ccf09959a4053f3dff32ac69b29
7
+ data.tar.gz: 07d41736e1d2e3577725a9382c65fbaa10c0a1308ccae0effa86a434a78994ea2cfb56d803325098b09c40af3b9653112986136dc7a7bd0deabb44209aea41f7
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,30 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.72] - 2026-08-30
34
+
35
+ - TAG: [v1.2.72][1.2.72t]
36
+ - COVERAGE: 93.32% -- 5535/5931 lines in 33 files
37
+ - BRANCH COVERAGE: 76.73% -- 2275/2965 branches in 33 files
38
+ - 30.50% documented
39
+
40
+ ### Fixed
41
+
42
+ - Exclude already-bumped local-changelog members from shared family bump selection.
43
+
44
+ - Propagate required shared-version bumps across shared-changelog members while keeping member-local changelogs independent.
45
+
46
+ ## [1.2.71] - 2026-08-30
47
+
48
+ - TAG: [v1.2.71][1.2.71t]
49
+ - COVERAGE: 93.30% -- 5544/5942 lines in 33 files
50
+ - BRANCH COVERAGE: 76.62% -- 2281/2977 branches in 33 files
51
+ - 30.50% documented
52
+
53
+ ### Fixed
54
+
55
+ - Preserve explicitly enabled monorepo template dependency graphs while reconciling release lockfiles.
56
+
33
57
  ## [1.2.70] - 2026-08-30
34
58
 
35
59
  - TAG: [v1.2.70][1.2.70t]
@@ -2346,7 +2370,11 @@ Please file a bug if you notice a violation of semantic versioning.
2346
2370
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2347
2371
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2348
2372
 
2349
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.70...HEAD
2373
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.72...HEAD
2374
+ [1.2.72]: https://github.com/kettle-dev/kettle-family/compare/v1.2.71...v1.2.72
2375
+ [1.2.72t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.72
2376
+ [1.2.71]: https://github.com/kettle-dev/kettle-family/compare/v1.2.70...v1.2.71
2377
+ [1.2.71t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.71
2350
2378
  [1.2.70]: https://github.com/kettle-dev/kettle-family/compare/v1.2.69...v1.2.70
2351
2379
  [1.2.70t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.70
2352
2380
  [1.2.69]: https://github.com/kettle-dev/kettle-family/compare/v1.2.68...v1.2.69
data/README.md CHANGED
@@ -1049,7 +1049,7 @@ Thanks for RTFM. ☺️
1049
1049
  [📌gitmoji]: https://gitmoji.dev
1050
1050
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1051
1051
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1052
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.902-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1052
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.942-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1053
1053
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
1054
1054
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1055
1055
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -702,8 +702,7 @@ module Kettle
702
702
  )
703
703
  selected = Selection.new(
704
704
  members: ordered,
705
- release_state_results: release_state_results,
706
- shared_version: config.shared_changelog?
705
+ release_state_results: release_state_results
707
706
  ).apply(only: effective_only, exclude: options[:exclude], start_at: start_at.member)
708
707
  result_members = selected
709
708
  display_members = display_members_for(command: command, config: config, members: ordered, selected_members: selected)
@@ -777,23 +777,11 @@ module Kettle
777
777
  end
778
778
 
779
779
  def normalize_shared_version_bump(results)
780
- return results unless results.any? { |result| result.ok? && result.state["bump_release_pending"] == true }
781
-
782
- successful = results.select(&:ok?)
783
- target_version = successful.filter_map { |result| parse_version(result.state["version"]) }.max
784
- released_version = successful.filter_map { |result| parse_version(result.state["latest_released"]) }.max
785
- target_already_bumped = target_version && released_version && target_version > released_version
780
+ shared_results = results.select { |result| result.ok? && shared_changelog_member_result?(result) }
781
+ return results unless shared_results.any? { |result| result.state["bump_release_pending"] == true }
786
782
 
787
783
  results.map do |result|
788
- next result unless result.ok?
789
-
790
- state = result.state
791
- version = parse_version(state["version"])
792
- bump_pending = if target_already_bumped && version == target_version
793
- false
794
- else
795
- state["bump_release_pending"] == true
796
- end
784
+ next result unless result.ok? && shared_changelog_member_result?(result)
797
785
 
798
786
  result.class.new(
799
787
  member_name: result.member_name,
@@ -804,17 +792,16 @@ module Kettle
804
792
  stdout: result.stdout,
805
793
  stderr: result.stderr,
806
794
  elapsed_seconds: result.elapsed_seconds,
807
- state: state.merge("bump_release_pending" => bump_pending),
795
+ state: result.state.merge("bump_release_pending" => true),
808
796
  reason: result.reason,
809
797
  branch: result.branch
810
798
  )
811
799
  end
812
800
  end
813
801
 
814
- def parse_version(value)
815
- Gem::Version.new(value.to_s) unless value.to_s.empty?
816
- rescue ArgumentError
817
- nil
802
+ def shared_changelog_member_result?(result)
803
+ member = members.find { |candidate| candidate.name == result.member_name }
804
+ member && !member_local_changelog?(member)
818
805
  end
819
806
 
820
807
  def git_root
@@ -30,10 +30,9 @@ module Kettle
30
30
  raise Error, "--only release-state tokens cannot be combined with member names: #{member_names.join(", ")}" unless member_names.empty?
31
31
  end
32
32
 
33
- def initialize(members:, release_state_results: nil, shared_version: false)
33
+ def initialize(members:, release_state_results: nil)
34
34
  @members = members
35
35
  @release_state_results = release_state_results
36
- @shared_version = shared_version
37
36
  end
38
37
 
39
38
  def apply(only: nil, exclude: nil, start_at: nil)
@@ -48,7 +47,7 @@ module Kettle
48
47
 
49
48
  private
50
49
 
51
- attr_reader :members, :release_state_results, :shared_version
50
+ attr_reader :members, :release_state_results
52
51
 
53
52
  def select_only(selected, only)
54
53
  names = only.split(",").map(&:strip).reject(&:empty?)
@@ -89,10 +88,6 @@ module Kettle
89
88
  failed = results_by_member.values.select { |result| !result.ok? }
90
89
  raise Error, "release-state check failed for: #{failed.map(&:member_name).join(", ")}" unless failed.empty?
91
90
 
92
- if shared_version && status_tokens.include?("bump")
93
- return selected if selected.any? { |candidate| truthy_state?(results_by_member[candidate.name]&.state&.fetch("bump_release_pending", nil)) }
94
- end
95
-
96
91
  selected.select do |candidate|
97
92
  result = results_by_member[candidate.name]
98
93
  result && status_tokens.all? { |token| truthy_state?(result.state[STATUS_TOKEN_KEYS.fetch(token)]) }
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "1.2.70"
8
+ VERSION = "1.2.72"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -1761,11 +1761,16 @@ module Kettle
1761
1761
  return ["Gemfile.lock was not created by dependency floor lockfile refresh"] unless File.file?(lockfile)
1762
1762
 
1763
1763
  lockfile_source = File.read(lockfile)
1764
- diagnostics = Kettle::Dev::LockfileReset.local_path_remote_lines_from_source(lockfile_source).map do |line_number|
1764
+ allowed_path_gems = dependency_floor_allowed_path_gems(member: member, lockfile_source: lockfile_source)
1765
+ diagnostics = Kettle::Dev::LockfileReset.local_path_remote_lines_from_source(lockfile_source).reject do |line_number|
1766
+ dependency_floor_allowed_path_remote?(member: member, lockfile_source: lockfile_source, line_number: line_number)
1767
+ end.map do |line_number|
1765
1768
  "Gemfile.lock has local path remote at line #{line_number}"
1766
1769
  end
1767
1770
  checksum_entries = Kettle::Dev::LockfileReset.checksum_entries_from_source(lockfile_source) || {}
1768
1771
  diagnostics.concat(released_members.filter_map do |released_member|
1772
+ next if allowed_path_gems.include?(released_member.name)
1773
+
1769
1774
  checksum = checksum_entries[[released_member.name, released_member.version]]
1770
1775
  if checksum.nil?
1771
1776
  "Gemfile.lock CHECKSUMS is missing #{released_member.name} #{released_member.version}"
@@ -1776,6 +1781,48 @@ module Kettle
1776
1781
  diagnostics
1777
1782
  end
1778
1783
 
1784
+ def dependency_floor_allowed_path_remote?(member:, lockfile_source:, line_number:)
1785
+ remote = lockfile_source.each_line.with_index(1).find { |_line, index| index == line_number }.first
1786
+ .to_s.split("remote:", 2).last.to_s.strip
1787
+ remote_path = File.expand_path(remote, member.root)
1788
+ release_allowed_local_path_roots.any? do |root|
1789
+ remote_path == root || remote_path.start_with?("#{root}/")
1790
+ end
1791
+ end
1792
+
1793
+ def dependency_floor_allowed_path_gems(member:, lockfile_source:)
1794
+ in_path = false
1795
+ in_specs = false
1796
+ allowed_remote = false
1797
+ lockfile_source.each_line.each_with_object(Set.new) do |line, gems|
1798
+ stripped = line.strip
1799
+ if stripped.match?(/\A[A-Z][A-Z ]*\z/)
1800
+ in_path = stripped == "PATH"
1801
+ in_specs = false
1802
+ allowed_remote = false
1803
+ next
1804
+ end
1805
+ next unless in_path
1806
+
1807
+ if stripped.start_with?("remote:")
1808
+ remote = stripped.split("remote:", 2).last.to_s.strip
1809
+ remote_path = File.expand_path(remote, member.root)
1810
+ allowed_remote = release_allowed_local_path_roots.any? do |root|
1811
+ remote_path == root || remote_path.start_with?("#{root}/")
1812
+ end
1813
+ next
1814
+ end
1815
+ if stripped == "specs:"
1816
+ in_specs = true
1817
+ next
1818
+ end
1819
+ next unless allowed_remote && in_specs && line.start_with?(" ") && !line.start_with?(" ")
1820
+
1821
+ name = stripped.split(" (", 2).first
1822
+ gems << name unless name.empty?
1823
+ end
1824
+ end
1825
+
1779
1826
  def dependency_floor_lockfile_command(released_members)
1780
1827
  ["bundle", "lock", "--update", *released_members.map(&:name), "--add-checksums"]
1781
1828
  end
@@ -4130,7 +4177,9 @@ module Kettle
4130
4177
  end
4131
4178
 
4132
4179
  def release_allowed_local_path_env_names
4133
- config.release_allowed_local_path_env_names
4180
+ names = config.release_allowed_local_path_env_names
4181
+ names << "K_JEM_TEMPLATING" if preserve_monorepo_template_context?
4182
+ names.uniq
4134
4183
  end
4135
4184
 
4136
4185
  def release_local_path_policy_env
@@ -4146,6 +4195,7 @@ module Kettle
4146
4195
 
4147
4196
  def release_lockfile_local_path_env_overrides(member = nil)
4148
4197
  explicit = config.release_disable_local_path_env.to_h { |key| [key.to_s, "false"] }
4198
+ explicit.delete("K_JEM_TEMPLATING") if preserve_monorepo_template_context?
4149
4199
  derived = release_local_path_env_detection_sources.each_with_object({}) do |(key, value), memo|
4150
4200
  key = key.to_s
4151
4201
  next unless key.end_with?("_LOCAL", "_DEV")
@@ -4155,7 +4205,21 @@ module Kettle
4155
4205
  memo[key] = "false"
4156
4206
  end
4157
4207
  inferred = member ? release_lockfile_inferred_local_path_env(member).to_h { |key| [key, "false"] } : {}
4158
- explicit.merge(derived).merge(inferred).merge(release_member_local_path_env(member))
4208
+ explicit
4209
+ .merge(derived)
4210
+ .merge(inferred)
4211
+ .merge(release_member_local_path_env(member))
4212
+ .merge(preserve_monorepo_template_context? ? {"K_JEM_TEMPLATING" => "true"} : {})
4213
+ end
4214
+
4215
+ # K_JEM_TEMPLATING activates the generated monorepo dependency closure;
4216
+ # it is not an unrelated local checkout switch. Preserve it only when
4217
+ # the caller explicitly enabled it for a configured monorepo release.
4218
+ def preserve_monorepo_template_context?
4219
+ return false unless config.configured_monorepo_release?
4220
+
4221
+ value = release_local_path_env_sources["K_JEM_TEMPLATING"].to_s.strip.downcase
4222
+ %w[true yes 1 on].include?(value)
4159
4223
  end
4160
4224
 
4161
4225
  def release_member_local_path_env(member)
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-family
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.70
4
+ version: 1.2.72
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -441,10 +441,10 @@ licenses:
441
441
  - AGPL-3.0-only
442
442
  metadata:
443
443
  homepage_uri: https://kettle-family.galtzo.com
444
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.70
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.70/CHANGELOG.md
444
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.72
445
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.72/CHANGELOG.md
446
446
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
447
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.70
447
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.72
448
448
  funding_uri: https://github.com/sponsors/pboling
449
449
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
450
450
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file