kettle-family 0.2.7 → 1.0.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: 3dfb2d02f39f7c5b6e0bbf8398440cdce3300490cab3db8aad780b0d4f2b2b23
4
- data.tar.gz: 3354f6c528b63eaee745d87438fb41b21777d51d0accf30c1d270ac61189db96
3
+ metadata.gz: 5bca5a6ab33a2d894ba06b7b75827b8849476922494bbf02df50efb0d9a0edac
4
+ data.tar.gz: 9dc491d15e3f89e737961bf87f103a982bddafc6183dc26f8d2287b84dce7d12
5
5
  SHA512:
6
- metadata.gz: 2bf468aac31e154c72514ef15100393038244ea081cf4c3d2ee48369e140919edf273029cca70d500dd3f999e9d14cd7165f85560aa63662f1a3c1cacd9761fe
7
- data.tar.gz: 613218aa97433a66acb95849775523a38749267e7fcbf493998def269ccaadabe15d59d9d91f76a08dd436dcf2f9f73540a40372cf38a062e12dbc9c69e28d20
6
+ metadata.gz: 9ebfabcd00bbb7631fe7ef8f3aae71e283b2bfda98a7c60e8b28551e7e3401f219916408c0fafa7321a62dc3ff44fd02a9a44a7461684399a672df9af89d0adf
7
+ data.tar.gz: 9d72e678c1f451b101b3dc297da6b320321a2fec0b1c723a6c174a5e2a5f5f1d0175ef120c276ca1f52df115a70f87a8d6f76a4a7e30eba7fb2b137eade11b29
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,43 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.0.0] - 2026-07-17
34
+
35
+ - TAG: [v1.0.0][1.0.0t]
36
+ - COVERAGE: 95.22% -- 2370/2489 lines in 23 files
37
+ - BRANCH COVERAGE: 76.87% -- 801/1042 branches in 23 files
38
+ - 29.29% documented
39
+
40
+ ### Added
41
+
42
+ - `kettle-family release` now accepts `--ci-workflows` and forwards the
43
+ comma-separated workflow subset to member `kettle-release` runs.
44
+
45
+ ### Changed
46
+
47
+ - Promoted the gems that provide built-in `kettle-family` workflow commands to
48
+ runtime dependencies: `kettle-dev` for release/changelog/SHA-pin/version
49
+ tooling and `kettle-test` for test runs.
50
+ - Moved the `kettle-jem` templating provider to the templating Gemfile while
51
+ the next `kettle-jem` release depends on unreleased `kettle-family` fixes.
52
+ - Raised the runtime Ruby floor to 4.0.0.
53
+
54
+ - kettle-jem-template-20260716-001 - Shim gemspec manifests now include
55
+ `LICENSE.md` instead of nonexistent `LICENSE.txt`.
56
+ - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
57
+ repository-only files by default to reduce downstream distro packaging churn.
58
+
59
+ ### Fixed
60
+
61
+ - Root-mode family changelog release commands now pass the configured family
62
+ name to `kettle-changelog`, allowing shared root changelogs to run from
63
+ repositories that do not have a root gemspec.
64
+ - `kettle-family bump-version` now recognizes exact same-version family
65
+ dependencies written as `= #{spec.version}` instead of failing with a
66
+ misleading ambiguous dependency error.
67
+ - `kettle-family release --ci-workflows` now validates workflow names before
68
+ forwarding them to shell-backed `kettle-release` commands.
69
+
33
70
  ## [0.2.7] - 2026-07-15
34
71
 
35
72
  - TAG: [v0.2.7][0.2.7t]
@@ -699,7 +736,9 @@ Please file a bug if you notice a violation of semantic versioning.
699
736
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
700
737
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
701
738
 
702
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.2.7...HEAD
739
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.0.0...HEAD
740
+ [1.0.0]: https://github.com/kettle-dev/kettle-family/compare/v0.2.7...v1.0.0
741
+ [1.0.0t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.0.0
703
742
  [0.2.7]: https://github.com/kettle-dev/kettle-family/compare/v0.2.6...v0.2.7
704
743
  [0.2.7t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.2.7
705
744
  [0.2.6]: https://github.com/kettle-dev/kettle-family/compare/v0.2.5...v0.2.6
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # 👩‍👩‍👧‍👧 Kettle::Family
4
4
 
5
- [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![CI JRuby][🚎10-j-wfi]][🚎10-j-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
5
+ [![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: AGPL-3.0-only][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf]
6
6
 
7
7
  `if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite].
8
8
 
@@ -44,10 +44,7 @@ while RubyGems MFA prompts remain interactive.
44
44
 
45
45
  | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] |
46
46
  |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
47
- | Works with JRuby | [![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf] [![JRuby current Compat][💎jruby-c-i]][🚎10-j-wf] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf]|
48
- | Works with Truffle Ruby | [![Truffle Ruby 24.2 Compat][💎truby-24.2i]][🚎truby-24.2-wf] [![Truffle Ruby 25.0 Compat][💎truby-25.0i]][🚎truby-25.0-wf] [![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf] [![Truffle Ruby current Compat][💎truby-c-i]][🚎9-t-wf] [![Truffle Ruby HEAD Compat][💎truby-headi]][🚎3-hd-wf]|
49
47
  | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf]|
50
- | Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎ruby-3.2-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎ruby-3.3-wf] [![Ruby 3.4 Compat][💎ruby-3.4i]][🚎ruby-3.4-wf]|
51
48
  | Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] |
52
49
  | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] |
53
50
  | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
@@ -58,8 +55,8 @@ while RubyGems MFA prompts remain interactive.
58
55
 
59
56
  ### Compatibility
60
57
 
61
- Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby.
62
- CI workflows and Appraisals are generated for MRI Ruby 3.2.0+.
58
+ Compatible with MRI Ruby 4.0.0+, and concordant releases of JRuby, and TruffleRuby.
59
+ CI workflows and Appraisals are generated for MRI Ruby 4.0.0+.
63
60
  This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
64
61
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
65
62
  not practical for the current toolchain.
@@ -220,6 +217,11 @@ release:
220
217
  command: bundle exec kettle-changelog
221
218
  ```
222
219
 
220
+ For `changelog.mode: root`, release commands pass `K_CHANGELOG_GEM_NAME` as the
221
+ configured family name and `K_CHANGELOG_VERSION_FILE` when `version_file` is
222
+ configured, so `kettle-changelog` can operate from a repository root without a
223
+ root gemspec.
224
+
223
225
  For a flat repository that releases from multiple long-lived branches, list the
224
226
  release branches under `release.target_branches`. The branch list is processed
225
227
  in order. Each branch must be clean enough for `git checkout`, and each branch
@@ -539,23 +541,12 @@ Thanks for RTFM. ☺️
539
541
  [🏀codecovi]: https://codecov.io/gh/kettle-dev/kettle-family/graph/badge.svg
540
542
  [🏀coveralls]: https://coveralls.io/github/kettle-dev/kettle-family?branch=main
541
543
  [🏀coveralls-img]: https://coveralls.io/repos/github/kettle-dev/kettle-family/badge.svg?branch=main
542
- [🚎ruby-3.2-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/ruby-3.2.yml
543
- [🚎ruby-3.3-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/ruby-3.3.yml
544
- [🚎ruby-3.4-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/ruby-3.4.yml
545
- [🚎jruby-10.0-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/jruby-10.0.yml
546
- [🚎truby-24.2-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/truffleruby-24.2.yml
547
- [🚎truby-25.0-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/truffleruby-25.0.yml
548
- [🚎truby-33.0-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/truffleruby-33.0.yml
549
544
  [🚎2-cov-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/coverage.yml
550
545
  [🚎2-cov-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/coverage.yml/badge.svg
551
546
  [🚎3-hd-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/heads.yml
552
547
  [🚎3-hd-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/heads.yml/badge.svg
553
548
  [🚎5-st-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/style.yml
554
549
  [🚎5-st-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/style.yml/badge.svg
555
- [🚎9-t-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/truffle.yml
556
- [🚎9-t-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/truffle.yml/badge.svg
557
- [🚎10-j-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/jruby.yml
558
- [🚎10-j-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/jruby.yml/badge.svg
559
550
  [🚎11-c-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/current.yml
560
551
  [🚎11-c-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/current.yml/badge.svg
561
552
  [🚎12-crh-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/dep-heads.yml
@@ -564,19 +555,8 @@ Thanks for RTFM. ☺️
564
555
  [🚎13-🔒️-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/locked_deps.yml/badge.svg
565
556
  [🚎14-🔓️-wf]: https://github.com/kettle-dev/kettle-family/actions/workflows/unlocked_deps.yml
566
557
  [🚎14-🔓️-wfi]: https://github.com/kettle-dev/kettle-family/actions/workflows/unlocked_deps.yml/badge.svg
567
- [💎ruby-3.2i]: https://img.shields.io/badge/Ruby-3.2-CC342D?style=for-the-badge&logo=ruby&logoColor=white
568
- [💎ruby-3.3i]: https://img.shields.io/badge/Ruby-3.3-CC342D?style=for-the-badge&logo=ruby&logoColor=white
569
- [💎ruby-3.4i]: https://img.shields.io/badge/Ruby-3.4-CC342D?style=for-the-badge&logo=ruby&logoColor=white
570
558
  [💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green
571
559
  [💎ruby-headi]: https://img.shields.io/badge/Ruby-HEAD-CC342D?style=for-the-badge&logo=ruby&logoColor=blue
572
- [💎truby-24.2i]: https://img.shields.io/badge/Truffle_Ruby-24.2-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
573
- [💎truby-25.0i]: https://img.shields.io/badge/Truffle_Ruby-25.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
574
- [💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink
575
- [💎truby-c-i]: https://img.shields.io/badge/Truffle_Ruby-current-34BCB1?style=for-the-badge&logo=ruby&logoColor=green
576
- [💎truby-headi]: https://img.shields.io/badge/Truffle_Ruby-HEAD-34BCB1?style=for-the-badge&logo=ruby&logoColor=blue
577
- [💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red
578
- [💎jruby-c-i]: https://img.shields.io/badge/JRuby-current-FBE742?style=for-the-badge&logo=ruby&logoColor=green
579
- [💎jruby-headi]: https://img.shields.io/badge/JRuby-HEAD-FBE742?style=for-the-badge&logo=ruby&logoColor=blue
580
560
  [🤝gh-issues]: https://github.com/kettle-dev/kettle-family/issues
581
561
  [🤝gh-pulls]: https://github.com/kettle-dev/kettle-family/pulls
582
562
  [🤝gl-issues]: https://gitlab.com/kettle-dev/kettle-family/-/issues
@@ -603,7 +583,7 @@ Thanks for RTFM. ☺️
603
583
  [📌gitmoji]: https://gitmoji.dev
604
584
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
605
585
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
606
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.460-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
586
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.489-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
607
587
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
608
588
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
609
589
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -146,6 +146,7 @@ module Kettle
146
146
  release_skip_steps: nil,
147
147
  release_local_ci: false,
148
148
  release_continue_ci_failures: false,
149
+ release_ci_workflows: nil,
149
150
  release_skip_bundle_audit: false,
150
151
  accept: true,
151
152
  tag: false,
@@ -404,6 +405,7 @@ module Kettle
404
405
  option :skip_steps, long: "--skip-steps", value: {type: String, usage: "LIST"}, desc: "Pass skip_steps=LIST through to kettle-release commands"
405
406
  option :local_ci, long: "--local-ci", desc: "Pass --local-ci through to kettle-release commands"
406
407
  option :continue_ci_failures, long: "--continue-ci-failures", desc: "Set K_RELEASE_CI_CONTINUE=true for release commands"
408
+ option :ci_workflows, long: "--ci-workflows", value: {type: String, usage: "LIST"}, desc: "Pass a comma-separated CI workflow monitor subset through to kettle-release commands"
407
409
  option :skip_bundle_audit, long: "--skip-bundle-audit", desc: "Skip bundle:audit/update during release rake checks"
408
410
  option :no_auto_floors, long: "--no-auto-floors", desc: "Do not raise family dependency floors between member releases" do
409
411
  options[:no_auto_floors] = true
@@ -424,6 +426,7 @@ module Kettle
424
426
  release_skip_steps: options[:skip_steps],
425
427
  release_local_ci: truthy_option?(:local_ci),
426
428
  release_continue_ci_failures: truthy_option?(:continue_ci_failures),
429
+ release_ci_workflows: options[:ci_workflows],
427
430
  release_skip_bundle_audit: truthy_option?(:skip_bundle_audit),
428
431
  release_auto_dependency_floors: !truthy_option?(:no_auto_floors),
429
432
  accept: !options.key?(:accept) || options[:accept],
@@ -562,6 +565,7 @@ module Kettle
562
565
  skip_steps: options[:release_skip_steps],
563
566
  local_ci: options[:release_local_ci],
564
567
  continue_ci_failures: options[:release_continue_ci_failures],
568
+ ci_workflows: options[:release_ci_workflows],
565
569
  skip_bundle_audit: options[:release_skip_bundle_audit],
566
570
  auto_dependency_floors: options[:release_auto_dependency_floors],
567
571
  gha_sha_pins_upgrade: options[:gha_sha_pins_upgrade],
@@ -167,9 +167,11 @@ module Kettle
167
167
  end
168
168
 
169
169
  def changelog_env
170
- return {} unless changelog_version_file
170
+ env = {}
171
+ env["K_CHANGELOG_VERSION_FILE"] = changelog_version_file.to_s if changelog_version_file
172
+ env["K_CHANGELOG_GEM_NAME"] = family_name.to_s if shared_changelog?
171
173
 
172
- {"K_CHANGELOG_VERSION_FILE" => changelog_version_file.to_s}
174
+ env
173
175
  end
174
176
 
175
177
  def template_command
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "0.2.7"
6
+ VERSION = "1.0.0"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -80,27 +80,56 @@ module Kettle
80
80
  parse_result = with_dev_errors { Kettle::Dev::VersionBump.parse_source(source, member.gemspec_path) }
81
81
 
82
82
  Kettle::Dev::VersionBump.each_node(parse_result.value).filter_map do |node|
83
- dependency_edit_for(member.gemspec_path, source, node)
83
+ dependency_edit_for(member, source, node)
84
84
  end
85
85
  end
86
86
 
87
- def dependency_edit_for(path, source, node)
87
+ def dependency_edit_for(member, source, node)
88
88
  return unless node.is_a?(Prism::CallNode) && DEPENDENCY_METHODS.include?(node.name)
89
89
 
90
90
  args = node.arguments&.arguments || []
91
91
  name_node, requirement_node = args
92
92
  return unless name_node.is_a?(Prism::StringNode) && member_names.include?(name_node.unescaped)
93
93
  return unless requirement_node
94
- raise Error, "ambiguous family dependency #{name_node.unescaped.inspect} in #{path}" unless requirement_node.is_a?(Prism::StringNode)
94
+ dependency_target_version = member_target_versions.fetch(name_node.unescaped)
95
+ if same_version_dependency_requirement?(node, requirement_node)
96
+ return if dependency_target_version == target_version_for(member)
97
+
98
+ raise Error, "dynamic family dependency #{name_node.unescaped.inspect} in #{member.gemspec_path} uses #{call_receiver_name(node)}.version, but target version is #{dependency_target_version}"
99
+ end
100
+ raise Error, "unsupported dynamic family dependency #{name_node.unescaped.inspect} in #{member.gemspec_path}" unless requirement_node.is_a?(Prism::StringNode)
95
101
 
96
102
  current = requirement_node.unescaped
97
- dependency_target_version = member_target_versions.fetch(name_node.unescaped)
98
103
  exact_prefix = "= "
99
104
  return unless current.start_with?(exact_prefix)
100
105
  return if current == "#{exact_prefix}#{dependency_target_version}"
101
106
 
102
107
  replacement = Kettle::Dev::VersionBump.quote_like(requirement_node.location.slice, "#{exact_prefix}#{dependency_target_version}")
103
- Kettle::Dev::VersionBump.file_edit(path, source, requirement_node.location.start_offset, requirement_node.location.end_offset, replacement)
108
+ Kettle::Dev::VersionBump.file_edit(member.gemspec_path, source, requirement_node.location.start_offset, requirement_node.location.end_offset, replacement)
109
+ end
110
+
111
+ def same_version_dependency_requirement?(dependency_call_node, requirement_node)
112
+ return false unless requirement_node.is_a?(Prism::InterpolatedStringNode)
113
+
114
+ literal_prefix, embedded_version = requirement_node.parts
115
+ return false unless literal_prefix.is_a?(Prism::StringNode) && literal_prefix.unescaped == "= "
116
+ return false unless embedded_version.is_a?(Prism::EmbeddedStatementsNode)
117
+
118
+ statements = embedded_version.statements&.body || []
119
+ return false unless statements.length == 1
120
+
121
+ version_call = statements.first
122
+ version_call.is_a?(Prism::CallNode) &&
123
+ version_call.name == :version &&
124
+ call_receiver_name(version_call) == call_receiver_name(dependency_call_node)
125
+ end
126
+
127
+ def call_receiver_name(node)
128
+ receiver = node.receiver
129
+ return unless receiver
130
+ return receiver.name.to_s if receiver.respond_to?(:name)
131
+
132
+ receiver.location.slice
104
133
  end
105
134
 
106
135
  def target_version_for(member)
@@ -46,7 +46,7 @@ module Kettle
46
46
  REGISTRY_WAIT_ATTEMPTS = 15
47
47
  REGISTRY_WAIT_INTERVAL_SECONDS = 15
48
48
 
49
- def initialize(command:, config:, members:, execute: false, accept: true, commit: true, allow_dirty: false, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, local_ci: false, continue_ci_failures: false, skip_bundle_audit: false, auto_dependency_floors: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, env_overrides: {}, debug: false, gem_signing_password: nil, jobs: nil, progress_io: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil)
49
+ def initialize(command:, config:, members:, execute: false, accept: true, commit: true, allow_dirty: false, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, local_ci: false, continue_ci_failures: false, ci_workflows: nil, skip_bundle_audit: false, auto_dependency_floors: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, env_overrides: {}, debug: false, gem_signing_password: nil, jobs: nil, progress_io: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil, **options)
50
50
  @command = command
51
51
  @config = config
52
52
  @members = members
@@ -61,6 +61,7 @@ module Kettle
61
61
  @skip_steps = skip_steps
62
62
  @local_ci = local_ci
63
63
  @continue_ci_failures = continue_ci_failures
64
+ @ci_workflows = validate_ci_workflows(ci_workflows)
64
65
  @skip_bundle_audit = skip_bundle_audit
65
66
  @auto_dependency_floors = auto_dependency_floors.nil? ? config.release_auto_dependency_floors? : auto_dependency_floors
66
67
  @gha_sha_pins_upgrade = gha_sha_pins_upgrade
@@ -89,7 +90,7 @@ module Kettle
89
90
 
90
91
  private
91
92
 
92
- attr_reader :command, :config, :members, :execute, :accept, :commit, :allow_dirty, :publish, :push, :tag, :start_step, :skip_steps, :local_ci, :continue_ci_failures, :skip_bundle_audit, :auto_dependency_floors, :gha_sha_pins_upgrade, :gha_sha_pins_check, :env_overrides, :debug, :jobs, :progress_io, :bup_args, :bex_args, :start_member, :start_branch
93
+ attr_reader :command, :config, :members, :execute, :accept, :commit, :allow_dirty, :publish, :push, :tag, :start_step, :skip_steps, :local_ci, :continue_ci_failures, :ci_workflows, :skip_bundle_audit, :auto_dependency_floors, :gha_sha_pins_upgrade, :gha_sha_pins_check, :env_overrides, :debug, :jobs, :progress_io, :bup_args, :bex_args, :start_member, :start_branch
93
94
 
94
95
  def current_branch_results(workflow_members)
95
96
  return check_results(workflow_members) if command == "check"
@@ -290,6 +291,7 @@ module Kettle
290
291
  skip_steps: skip_steps,
291
292
  local_ci: local_ci,
292
293
  continue_ci_failures: continue_ci_failures,
294
+ ci_workflows: ci_workflows,
293
295
  skip_bundle_audit: skip_bundle_audit,
294
296
  auto_dependency_floors: auto_dependency_floors,
295
297
  gha_sha_pins_upgrade: gha_sha_pins_upgrade,
@@ -641,6 +643,7 @@ module Kettle
641
643
  args = []
642
644
  args << "start_step=#{start_step}" if start_step
643
645
  args << "skip_steps=#{skip_steps}" if skip_steps && !skip_steps.to_s.empty?
646
+ args << "--ci-workflows=#{ci_workflows}" if ci_workflows && !ci_workflows.to_s.empty?
644
647
  args << "--local-ci" if local_ci
645
648
  args << "--skip-bundle-audit" if skip_bundle_audit
646
649
  return command if args.empty?
@@ -648,6 +651,16 @@ module Kettle
648
651
  command.is_a?(Array) ? [*command, *args] : "#{command} #{args.join(" ")}"
649
652
  end
650
653
 
654
+ def validate_ci_workflows(value)
655
+ return nil if value.nil? || value.to_s.empty?
656
+
657
+ workflows = value.to_s.split(",").map(&:strip)
658
+ invalid = workflows.find { |workflow| workflow.empty? || !workflow.match?(/\A[A-Za-z0-9_.\/-]+\z/) }
659
+ raise Error, "invalid --ci-workflows value #{value.inspect}" if invalid
660
+
661
+ workflows.join(",")
662
+ end
663
+
651
664
  def release_env
652
665
  env = base_release_env
653
666
  env.merge!(env_overrides)
@@ -659,6 +672,7 @@ module Kettle
659
672
  env["KETTLE_FAMILY_CONFIG"] = config.path if config.path
660
673
  env.merge!(TEMPLATE_QUIET_ENV) unless debug
661
674
  env["K_RELEASE_CI_CONTINUE"] = "true" if continue_ci_failures
675
+ env["K_RELEASE_CI_WORKFLOWS"] = ci_workflows if ci_workflows && !ci_workflows.to_s.empty?
662
676
  env["KETTLE_DEV_SKIP_BUNDLE_AUDIT"] = "true" if skip_bundle_audit
663
677
  env
664
678
  end
@@ -1,5 +1,72 @@
1
1
  module Kettle
2
2
  module Family
3
3
  # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
6
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
7
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
8
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
9
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
10
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
11
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
12
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
13
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
14
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
15
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
16
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
17
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
18
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
19
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
20
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
21
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
22
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
23
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
24
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
25
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
26
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
27
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
28
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
29
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
30
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
31
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
32
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
33
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
34
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
35
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
36
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
37
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
38
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
39
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
40
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
41
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
42
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
43
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
44
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
45
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
46
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
47
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
48
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
49
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
50
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
51
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
52
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
53
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
54
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
55
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
56
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
57
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
58
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
59
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
60
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
61
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
62
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
63
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
64
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
65
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
66
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
67
+ module Version
68
+ VERSION: String
69
+ end
70
+ VERSION: String
4
71
  end
5
72
  end
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: 0.2.7
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -74,7 +74,7 @@ dependencies:
74
74
  version: '2.3'
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: 2.3.0
77
+ version: 2.3.4
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
@@ -84,7 +84,27 @@ dependencies:
84
84
  version: '2.3'
85
85
  - - ">="
86
86
  - !ruby/object:Gem::Version
87
- version: 2.3.0
87
+ version: 2.3.4
88
+ - !ruby/object:Gem::Dependency
89
+ name: kettle-test
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '2.0'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.0.10
98
+ type: :runtime
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '2.0'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 2.0.10
88
108
  - !ruby/object:Gem::Dependency
89
109
  name: tsort
90
110
  requirement: !ruby/object:Gem::Requirement
@@ -167,26 +187,6 @@ dependencies:
167
187
  - - ">="
168
188
  - !ruby/object:Gem::Version
169
189
  version: 3.1.4
170
- - !ruby/object:Gem::Dependency
171
- name: kettle-test
172
- requirement: !ruby/object:Gem::Requirement
173
- requirements:
174
- - - "~>"
175
- - !ruby/object:Gem::Version
176
- version: '2.0'
177
- - - ">="
178
- - !ruby/object:Gem::Version
179
- version: 2.0.10
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - "~>"
185
- - !ruby/object:Gem::Version
186
- version: '2.0'
187
- - - ">="
188
- - !ruby/object:Gem::Version
189
- version: 2.0.10
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: turbo_tests2
192
192
  requirement: !ruby/object:Gem::Requirement
@@ -196,7 +196,7 @@ dependencies:
196
196
  version: '3.1'
197
197
  - - ">="
198
198
  - !ruby/object:Gem::Version
199
- version: 3.1.9
199
+ version: 3.1.14
200
200
  type: :development
201
201
  prerelease: false
202
202
  version_requirements: !ruby/object:Gem::Requirement
@@ -206,7 +206,7 @@ dependencies:
206
206
  version: '3.1'
207
207
  - - ">="
208
208
  - !ruby/object:Gem::Version
209
- version: 3.1.9
209
+ version: 3.1.14
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: ruby-progressbar
212
212
  requirement: !ruby/object:Gem::Requirement
@@ -268,28 +268,11 @@ email:
268
268
  executables:
269
269
  - kettle-family
270
270
  extensions: []
271
- extra_rdoc_files:
272
- - CHANGELOG.md
273
- - CITATION.cff
274
- - CODE_OF_CONDUCT.md
275
- - CONTRIBUTING.md
276
- - FUNDING.md
277
- - LICENSE.md
278
- - README.md
279
- - RUBOCOP.md
280
- - SECURITY.md
271
+ extra_rdoc_files: []
281
272
  files:
282
- - AGPL-3.0-only.md
283
273
  - CHANGELOG.md
284
- - CITATION.cff
285
- - CODE_OF_CONDUCT.md
286
- - CONTRIBUTING.md
287
- - FUNDING.md
288
274
  - LICENSE.md
289
275
  - README.md
290
- - RUBOCOP.md
291
- - SECURITY.md
292
- - certs/pboling.pem
293
276
  - exe/kettle-family
294
277
  - lib/kettle/family.rb
295
278
  - lib/kettle/family/branch_lane_audit.rb
@@ -315,16 +298,15 @@ files:
315
298
  - lib/kettle/family/version_gem.rb
316
299
  - lib/kettle/family/workflow.rb
317
300
  - sig/kettle/family.rbs
318
- - sig/kettle/family/version.rbs
319
301
  homepage: https://github.com/kettle-dev/kettle-family
320
302
  licenses:
321
303
  - AGPL-3.0-only
322
304
  metadata:
323
305
  homepage_uri: https://kettle-family.galtzo.com
324
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.2.7
325
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.2.7/CHANGELOG.md
306
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.0.0
307
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.0.0/CHANGELOG.md
326
308
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
327
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.2.7
309
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.0.0
328
310
  funding_uri: https://github.com/sponsors/pboling
329
311
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
330
312
  news_uri: https://www.railsbling.com/tags/kettle-family
@@ -347,7 +329,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
347
329
  requirements:
348
330
  - - ">="
349
331
  - !ruby/object:Gem::Version
350
- version: 3.2.0
332
+ version: 4.0.0
351
333
  required_rubygems_version: !ruby/object:Gem::Requirement
352
334
  requirements:
353
335
  - - ">="
metadata.gz.sig CHANGED
Binary file