kettle-family 1.2.82 → 1.2.84

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: 30f24abb8d6167fc028b11ee8a675b9aefeb7268690bc70f6d016e5dcc43d65f
4
- data.tar.gz: a46437f03a8571fa67b059dad4148a82de5c8707f94bcedd355c55a52dfcfddf
3
+ metadata.gz: 9d60e9fc61486c0ac3adcbbd20df98c09cab7c9758e9eb5caa3a95c4308bb168
4
+ data.tar.gz: 0bb55d3a77da5d9fdf94c73d4295ae8f5a772b8f9a07e5da4108970135b690c2
5
5
  SHA512:
6
- metadata.gz: deb096f7906dc799b1c83c9d4a4e7bf2adbf37704318da50e080d5ecf92b7d3728cdf34cc3e5e9e1c618045f5846994ebdd780017925e081fe6e2f9e9b87902c
7
- data.tar.gz: 2e40c9f326e2481d12143676aa14596741a33eb4a8567defe153e521d6195f6b68ff54456f360b5d9467facf5aa9628a91d9ba892d1ab76e26f5c6875544ad70
6
+ metadata.gz: f868bb0dbf6665ea261cb0011a04b33125c8bf794a51e2b4092359993a6ab5d35fa19ed2d006279f0c1d13694aedd439caf913c3918763d0c03304808a2649cc
7
+ data.tar.gz: 8fe0c820e3b2b2d17c627b0a6fb7d44e28b8f885c4daa1d379fed8b45fac134b9b84e6b9037829bdfb22026d17e0e74b183f3c4067ecc90b57433189ac583fe1
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,28 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.84] - 2026-09-05
34
+
35
+ - TAG: [v1.2.84][1.2.84t]
36
+ - COVERAGE: 93.08% -- 5783/6213 lines in 33 files
37
+ - BRANCH COVERAGE: 76.04% -- 2345/3084 branches in 33 files
38
+ - 30.69% documented
39
+
40
+ ### Fixed
41
+
42
+ - Keep changelog tooling out of nomono-only template bootstrap resolution.
43
+
44
+ ## [1.2.83] - 2026-09-02
45
+
46
+ - TAG: [v1.2.83][1.2.83t]
47
+ - COVERAGE: 93.08% -- 5782/6212 lines in 33 files
48
+ - BRANCH COVERAGE: 76.04% -- 2345/3084 branches in 33 files
49
+ - 30.69% documented
50
+
51
+ ### Fixed
52
+
53
+ - Run aggregate monorepo release members in isolated worktrees and serialize shared release finalization.
54
+
33
55
  ## [1.2.82] - 2026-09-01
34
56
 
35
57
  - TAG: [v1.2.82][1.2.82t]
@@ -2488,7 +2510,11 @@ Please file a bug if you notice a violation of semantic versioning.
2488
2510
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2489
2511
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2490
2512
 
2491
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.82...HEAD
2513
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.84...HEAD
2514
+ [1.2.84]: https://github.com/kettle-dev/kettle-family/compare/v1.2.83...v1.2.84
2515
+ [1.2.84t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.84
2516
+ [1.2.83]: https://github.com/kettle-dev/kettle-family/compare/v1.2.82...v1.2.83
2517
+ [1.2.83t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.83
2492
2518
  [1.2.82]: https://github.com/kettle-dev/kettle-family/compare/v1.2.81...v1.2.82
2493
2519
  [1.2.82t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.82
2494
2520
  [1.2.81]: https://github.com/kettle-dev/kettle-family/compare/v1.2.80...v1.2.81
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-6.064-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1052
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.213-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
@@ -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.82"
8
+ VERSION = "1.2.84"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -824,6 +824,9 @@ module Kettle
824
824
 
825
825
  def template_bootstrap_dependency_env(_member)
826
826
  env = template_prepare_env
827
+ # This refresh only activates nomono. Changelog tooling is not needed
828
+ # and can pin a previously released monorepo dependency graph.
829
+ env["KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY"] = "true"
827
830
  env["K_JEM_TEMPLATING"] = "false"
828
831
  env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
829
832
  env
@@ -1014,15 +1017,15 @@ module Kettle
1014
1017
  File.join(config.root, "tmp", "kettle-family", "template-worktrees", safe_member, "#{Process.pid}-#{safe_branch}")
1015
1018
  end
1016
1019
 
1017
- def relocate_member_to_worktree(member, worktree_root)
1020
+ def relocate_member_to_worktree(member, worktree_root, source_root: member.root)
1018
1021
  relocate = lambda do |path|
1019
1022
  next unless path
1020
1023
 
1021
- relative = Pathname.new(path).relative_path_from(Pathname.new(member.root))
1024
+ relative = Pathname.new(path).relative_path_from(Pathname.new(source_root))
1022
1025
  File.join(worktree_root, relative)
1023
1026
  end
1024
1027
  member.dup.tap do |worktree_member|
1025
- worktree_member.root = worktree_root
1028
+ worktree_member.root = relocate.call(member.root)
1026
1029
  worktree_member.gemspec_path = relocate.call(member.gemspec_path)
1027
1030
  worktree_member.version_file = relocate.call(member.version_file)
1028
1031
  end
@@ -1443,6 +1446,8 @@ module Kettle
1443
1446
  end
1444
1447
 
1445
1448
  def parallel_release_member_results(release_members, initial_results)
1449
+ return parallel_monorepo_release_member_results(release_members, initial_results) if monorepo_release_workers?
1450
+
1446
1451
  results = initial_results.dup
1447
1452
  waves = release_waves(release_members)
1448
1453
  completed_members = []
@@ -1502,6 +1507,248 @@ module Kettle
1502
1507
  ordered_results.compact
1503
1508
  end
1504
1509
 
1510
+ def parallel_monorepo_release_member_results(release_members, initial_results)
1511
+ results = initial_results.dup
1512
+ completed_members = []
1513
+ @release_completed_member_names = []
1514
+ release_progress = start_release_progress(release_members)
1515
+ @release_progress = release_progress
1516
+ begin
1517
+ release_waves(release_members).each_with_index do |wave, index|
1518
+ results << release_wave_result(wave, index: index, total: release_waves(release_members).length)
1519
+ aggregate_members, independent_members = wave.partition { |member| aggregate_release_member?(member) }
1520
+
1521
+ unless aggregate_members.empty?
1522
+ worker_results = run_monorepo_release_wave(aggregate_members)
1523
+ results.concat(worker_results.flatten)
1524
+ break unless worker_results.all? { |member_results| member_results.all?(&:ok?) }
1525
+
1526
+ finalization_results = finalize_monorepo_release_wave(aggregate_members)
1527
+ results.concat(finalization_results)
1528
+ break unless finalization_results.all?(&:ok?)
1529
+ end
1530
+
1531
+ independent_members.each do |member|
1532
+ results.concat(release_results_for_member(member, runner: release_command_runner))
1533
+ break unless results.last.ok?
1534
+ end
1535
+ break unless results.last&.ok?
1536
+
1537
+ completed_members.concat(wave)
1538
+ @release_completed_member_names.concat(wave.map(&:name))
1539
+ remaining_members = release_members - completed_members
1540
+ append_dependency_floor_results(released_members: wave, dependent_members: remaining_members, runner: release_command_runner, memo: results)
1541
+ break unless results.last&.ok?
1542
+ end
1543
+ ensure
1544
+ emit_release_progress_summary(results, progress: release_progress)
1545
+ @release_progress = nil
1546
+ end
1547
+ results
1548
+ end
1549
+
1550
+ def run_monorepo_release_wave(members)
1551
+ entries, setup_results = monorepo_release_worktree_entries(members)
1552
+ unless setup_results.all?(&:ok?)
1553
+ return setup_results.zip
1554
+ end
1555
+
1556
+ worker_results = run_monorepo_release_worktree_entries(entries)
1557
+ materialization_results = materialize_monorepo_release_artifacts(entries, worker_results)
1558
+ worker_results.each_with_index.map do |member_results, index|
1559
+ artifact_result = materialization_results[index]
1560
+ artifact_result ? [*member_results, artifact_result] : member_results
1561
+ end
1562
+ ensure
1563
+ cleanup_monorepo_release_worktrees(entries || [])
1564
+ end
1565
+
1566
+ def monorepo_release_worktree_entries(members)
1567
+ runner = command_runner
1568
+ control_member = monorepo_release_control_member
1569
+ entries = []
1570
+ results = []
1571
+ members.each do |member|
1572
+ root = monorepo_release_worktree_path(member)
1573
+ result = runner.call(
1574
+ member: control_member,
1575
+ phase: "release_worktree_add",
1576
+ command: ["git", "worktree", "add", "--detach", root, "HEAD"]
1577
+ )
1578
+ results << result
1579
+ break unless result.ok?
1580
+
1581
+ entries << {member: relocate_member_to_worktree(member, root, source_root: config.root), original_member: member, worktree_root: root}
1582
+ end
1583
+ [entries, results]
1584
+ end
1585
+
1586
+ def monorepo_release_worktree_path(member)
1587
+ safe_member = member.name.to_s.gsub(/[^A-Za-z0-9_.-]+/, "_")
1588
+ File.join(config.root, "tmp", "kettle-family", "release-worktrees", safe_member, "#{Process.pid}-#{Time.now.to_i}")
1589
+ end
1590
+
1591
+ def monorepo_release_control_member
1592
+ family_member.dup.tap { |member| member.root = config.root }
1593
+ end
1594
+
1595
+ def run_monorepo_release_worktree_entries(entries)
1596
+ queue = Queue.new
1597
+ entries.each_with_index { |entry, index| queue << [index, entry] }
1598
+ ordered_results = Array.new(entries.length)
1599
+ mutex = Mutex.new
1600
+ stop = false
1601
+ Array.new(release_jobs(entries)) do
1602
+ Thread.new do # rubocop:disable ThreadSafety/NewThread -- each member has an isolated detached monorepo worktree.
1603
+ loop do
1604
+ break if mutex.synchronize { stop }
1605
+
1606
+ index, entry = queue.pop(true)
1607
+ member_results = release_results_for_monorepo_worktree(entry)
1608
+ mutex.synchronize do
1609
+ ordered_results[index] = member_results
1610
+ stop = true unless member_results.all?(&:ok?)
1611
+ end
1612
+ rescue ThreadError
1613
+ break
1614
+ rescue => error
1615
+ mutex.synchronize do
1616
+ ordered_results[index] = [release_worker_error_result(entry.fetch(:original_member), error)]
1617
+ stop = true
1618
+ end
1619
+ break
1620
+ end
1621
+ end
1622
+ end.each(&:join)
1623
+ ordered_results.compact
1624
+ end
1625
+
1626
+ def release_results_for_monorepo_worktree(entry)
1627
+ member = entry.fetch(:member)
1628
+ original_member = entry.fetch(:original_member)
1629
+ progress = @release_progress
1630
+ progress&.start_member(original_member, total: release_phase_total(original_member), status: "check")
1631
+ [].tap do |memo|
1632
+ if skip_already_released?(original_member)
1633
+ memo << already_released_result(original_member)
1634
+ emit_member_result_progress(original_member, memo.last, progress: progress)
1635
+ return memo
1636
+ end
1637
+
1638
+ append_release_internal_checks(member: member, memo: memo)
1639
+ memo.last(2).each { |result| emit_member_result_progress(original_member, result, progress: progress) }
1640
+ return memo unless memo.last(2).all?(&:ok?)
1641
+
1642
+ release_event_state = {}
1643
+ result = release_command_runner.call(
1644
+ member: member,
1645
+ phase: release_phase,
1646
+ command: release_command_for(member),
1647
+ env: release_env_for_member(member, family_root: entry.fetch(:worktree_root)).merge("KETTLE_RELEASE_FAMILY_MEMBER_PUBLISH" => "true"),
1648
+ interactive: release_command_interactive?,
1649
+ stdout_line_handler: release_event_line_handler(original_member, progress: progress, state: release_event_state),
1650
+ log_path: release_command_log_path(original_member, release_phase),
1651
+ passthrough_output: release_command_passthrough_output?
1652
+ )
1653
+ result.member_name = original_member.name
1654
+ result.resume_step = release_event_state[:failed_step] unless result.ok?
1655
+ memo << result
1656
+ emit_member_result_progress(original_member, result, progress: progress)
1657
+ ensure
1658
+ finished_result = memo.find { |result| result.phase == release_phase } || memo.last
1659
+ progress&.finish_member(original_member, success: memo.all?(&:ok?), status: release_member_finish_status(finished_result)) if finished_result
1660
+ end
1661
+ end
1662
+
1663
+ def materialize_monorepo_release_artifacts(entries, worker_results)
1664
+ entries.each_with_index.map do |entry, index|
1665
+ next unless worker_results[index]&.all?(&:ok?)
1666
+
1667
+ copy_monorepo_release_artifact(entry)
1668
+ end
1669
+ end
1670
+
1671
+ def copy_monorepo_release_artifact(entry)
1672
+ member = entry.fetch(:member)
1673
+ original_member = entry.fetch(:original_member)
1674
+ version = original_member.version.to_s
1675
+ source = Dir[File.join(member.root, "pkg", "#{original_member.name}-#{version}.gem")].first
1676
+ destination = File.join(original_member.root, "pkg", "#{original_member.name}-#{version}.gem")
1677
+ unless source && File.file?(source)
1678
+ return release_worker_error_result(original_member, Error.new("worker did not produce #{File.basename(destination)}"))
1679
+ end
1680
+
1681
+ FileUtils.mkdir_p(File.dirname(destination))
1682
+ FileUtils.cp(source, destination)
1683
+ CommandResult.new(
1684
+ member_name: original_member.name,
1685
+ phase: "release_artifact_materialize",
1686
+ command: ["internal", "copy-release-artifact"],
1687
+ workdir: original_member.root,
1688
+ status: 0,
1689
+ success: true,
1690
+ stdout: File.basename(destination),
1691
+ stderr: "",
1692
+ elapsed_seconds: 0.0,
1693
+ skipped: false,
1694
+ reason: "copied from isolated release worktree"
1695
+ )
1696
+ rescue => error
1697
+ release_worker_error_result(original_member, error)
1698
+ end
1699
+
1700
+ def cleanup_monorepo_release_worktrees(entries)
1701
+ runner = command_runner
1702
+ control_member = monorepo_release_control_member
1703
+ entries.each do |entry|
1704
+ root = entry.fetch(:worktree_root)
1705
+ next unless Dir.exist?(root)
1706
+
1707
+ runner.call(member: control_member, phase: "release_worktree_remove", command: ["git", "worktree", "remove", "--force", root])
1708
+ end
1709
+ end
1710
+
1711
+ def finalize_monorepo_release_wave(members)
1712
+ runner = release_command_runner
1713
+ results = []
1714
+ members.each do |member|
1715
+ results << ensure_monorepo_release_tag(member, runner: runner)
1716
+ break unless results.last.ok?
1717
+
1718
+ results << runner.call(
1719
+ member: member,
1720
+ phase: "release_finalize",
1721
+ command: release_command_for(member),
1722
+ env: release_env_for_member(member).merge("KETTLE_RELEASE_FAMILY_MEMBER_FINALIZE" => "true"),
1723
+ interactive: release_command_interactive?,
1724
+ stdout_line_handler: release_event_line_handler(member, progress: @release_progress, state: {}),
1725
+ log_path: release_command_log_path(member, "release_finalize"),
1726
+ passthrough_output: release_command_passthrough_output?
1727
+ )
1728
+ break unless results.last.ok?
1729
+ end
1730
+ return results unless results.all?(&:ok?)
1731
+
1732
+ results << runner.call(
1733
+ member: monorepo_release_control_member,
1734
+ phase: "release_shared_push",
1735
+ command: config.release_push_command
1736
+ )
1737
+ results
1738
+ end
1739
+
1740
+ def ensure_monorepo_release_tag(member, runner:)
1741
+ version = member.version.to_s
1742
+ tag = release_tag_name(version)
1743
+ escaped_tag = Shellwords.escape(tag)
1744
+ runner.call(
1745
+ member: monorepo_release_control_member,
1746
+ phase: "release_shared_tag",
1747
+ command: ["sh", "-lc", "git rev-parse -q --verify refs/tags/#{escaped_tag} >/dev/null || git tag -a #{escaped_tag} -m #{escaped_tag}"],
1748
+ env: release_env
1749
+ )
1750
+ end
1751
+
1505
1752
  def release_wave_result(wave, index:, total:, jobs: nil)
1506
1753
  CommandResult.new(
1507
1754
  member_name: "wave #{index + 1}",
@@ -1626,7 +1873,19 @@ module Kettle
1626
1873
  execute &&
1627
1874
  release_jobs(release_members) > 1 &&
1628
1875
  release_members.length > 1 &&
1629
- distinct_git_roots?(release_members)
1876
+ (distinct_git_roots?(release_members) || monorepo_release_workers?)
1877
+ end
1878
+
1879
+ # Aggregate monorepo members share one Git checkout, so their complete
1880
+ # kettle-release workflows cannot safely run concurrently. They are
1881
+ # instead published from disposable worktrees using the explicit
1882
+ # member-only contract, then finalized serially in the primary checkout.
1883
+ def monorepo_release_workers?
1884
+ execute &&
1885
+ publish &&
1886
+ config.configured_monorepo_release? &&
1887
+ aggregate_monorepo_github_release? &&
1888
+ kettle_release_command?(raw_release_command)
1630
1889
  end
1631
1890
 
1632
1891
  def release_jobs(release_members)
@@ -2680,10 +2939,10 @@ module Kettle
2680
2939
  # A monorepo member runs kettle-release from its own checkout, while its
2681
2940
  # changelog may live at the family root. Pass the shared paths to the
2682
2941
  # member release phase as well as to the separate family phase.
2683
- def release_env_for_member(member)
2942
+ def release_env_for_member(member, family_root: config.root)
2684
2943
  env = release_env
2685
- env.merge!(release_wave_local_path_env_for(member))
2686
- env.merge!(release_local_path_policy_env)
2944
+ env.merge!(release_wave_local_path_env_for(member, family_root: family_root))
2945
+ env.merge!(release_local_path_policy_env(family_root: family_root))
2687
2946
  # Family release performs one live pin review before member releases.
2688
2947
  # Child kettle-release must consume that reviewed cache instead of
2689
2948
  # repeating the GitHub API lookup for every member.
@@ -2703,7 +2962,7 @@ module Kettle
2703
2962
  if config.family_mode == "monorepo"
2704
2963
  # Monorepo members release from subdirectories, while CI workflows
2705
2964
  # live at the shared repository root.
2706
- env["K_RELEASE_CI_ROOT"] = config.root
2965
+ env["K_RELEASE_CI_ROOT"] = family_root
2707
2966
  env["K_RELEASE_CI_WORKFLOWS"] ||= "current.yml"
2708
2967
  # Explicit multi-gem monorepos publish one aggregate GitHub Release
2709
2968
  # after their member gems. A standalone gem uses the default
@@ -2763,13 +3022,13 @@ module Kettle
2763
3022
  # release for the next member. Dependencies outside the selected set are
2764
3023
  # already treated as registry dependencies; this is what makes resume
2765
3024
  # runs work after an earlier wave has been published.
2766
- def release_wave_local_path_env_for(member)
3025
+ def release_wave_local_path_env_for(member, family_root: config.root)
2767
3026
  # Monorepo members and their sibling dependencies share the same CI
2768
3027
  # checkout, so their canonical development lockfile may keep those
2769
3028
  # paths throughout every release wave.
2770
3029
  if config.configured_monorepo_release?
2771
3030
  env_name = config.family_local_path_env_name
2772
- return env_name ? {env_name => config.family_local_path_root} : {}
3031
+ return env_name ? {env_name => family_local_path_root_for(family_root)} : {}
2773
3032
  end
2774
3033
 
2775
3034
  return {} unless config.release_local_path_strategy == "waves"
@@ -4430,14 +4689,28 @@ module Kettle
4430
4689
  config.release_allowed_local_path_roots
4431
4690
  end
4432
4691
 
4692
+ def family_local_path_root_for(family_root)
4693
+ return config.family_local_path_root if File.expand_path(family_root) == File.expand_path(config.root)
4694
+
4695
+ relative = Pathname.new(config.family_local_path_root).relative_path_from(Pathname.new(config.root))
4696
+ File.expand_path(relative, family_root)
4697
+ end
4698
+
4433
4699
  def release_allowed_local_path_env_names
4434
4700
  names = config.release_allowed_local_path_env_names
4435
4701
  names << "K_JEM_TEMPLATING" if preserve_monorepo_template_context?
4436
4702
  names.uniq
4437
4703
  end
4438
4704
 
4439
- def release_local_path_policy_env
4440
- roots = release_allowed_local_path_roots
4705
+ def release_local_path_policy_env(family_root: config.root)
4706
+ roots = release_allowed_local_path_roots.map do |root|
4707
+ if File.expand_path(family_root) == File.expand_path(config.root)
4708
+ root
4709
+ else
4710
+ relative = Pathname.new(root).relative_path_from(Pathname.new(config.root))
4711
+ File.expand_path(relative, family_root)
4712
+ end
4713
+ end
4441
4714
  env_names = release_allowed_local_path_env_names
4442
4715
  return {} if roots.empty? && env_names.empty?
4443
4716
 
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.82
4
+ version: 1.2.84
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -91,7 +91,7 @@ dependencies:
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 3.0.28
94
+ version: 3.0.30
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
97
  version: 4.0.0
@@ -101,7 +101,7 @@ dependencies:
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: 3.0.28
104
+ version: 3.0.30
105
105
  - - "<"
106
106
  - !ruby/object:Gem::Version
107
107
  version: 4.0.0
@@ -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.82
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.82/CHANGELOG.md
444
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.84
445
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.84/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.82
447
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.84
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