kettle-jem 7.1.32 → 7.1.34

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: f62f4e109608570afb3659b7ae9f191b89f8f2ca51e6575035df53d3849f02d8
4
- data.tar.gz: 578cbde7471209ad1623eb3b274a6eac38f66ed605aa783b3e7021a79da751fe
3
+ metadata.gz: e652034338fd5859484f79531a6d6a14e1e12379e3d2b72144f4df384bfb7d66
4
+ data.tar.gz: 0e96ba0332102c087f9f431569996228dd242b698076a9ca1536c29fa5205690
5
5
  SHA512:
6
- metadata.gz: a84de8dbff686176ce7cb9e6a0ded538a1cc675f3246488f22939bd4adcf222ab618ff76c34739e9df6aae86d904778e73283b08df73934c5744d8d90098285c
7
- data.tar.gz: 860ee1f3bc66069a5e880c40cb35a3eed9485fd4cb2454c07632bad5c401397ae38d07fa2bb7dc9949d0f59c2f97db36b2e64e710db61b509b7a4d0d3c105ec0
6
+ metadata.gz: fecfbcc62374cf07646674827e23baabffaec9d7d294b1d6434d3806561b0c8a6c6573ee2a82bf99e765ae3fbc6063761a419f57e33c20e6b29edef84cf093dd
7
+ data.tar.gz: 8566b17caba41147787adf29ce20730f0a6ba5073b263ec05a96bb09f17d072bb6cb3387b5e05ef01746f73cde2b3132aa77dd5d0fef5a1e34e1fdd457326901
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,54 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [7.1.34] - 2026-10-20
34
+
35
+ - TAG: [v7.1.34][7.1.34t]
36
+ - COVERAGE: 93.45% -- 11380/12178 lines in 17 files
37
+ - BRANCH COVERAGE: 77.09% -- 4907/6365 branches in 17 files
38
+ - 19.84% documented
39
+
40
+ ### Changed
41
+
42
+ - [kc] kettle-jem/prepare: updated 10 project files:
43
+ - dependencies (10)
44
+
45
+ - [kc] kettle-jem/template: updated 3 project files:
46
+ - code and tests (1)
47
+ - documentation (1)
48
+ - other (1)
49
+
50
+ - [kc] kettle-jem-deps-floor: Update kettle-jem template dependency floors:
51
+ - kettle-dev (>= 3.1.18 -> >= 3.1.19)
52
+ - kettle-family (>= 1.3.22 -> >= 1.3.25)
53
+ - nomono (>= 1.1.10 -> >= 1.1.14)
54
+
55
+ ### Fixed
56
+
57
+ - Monorepo member Gemfiles now wire every family sibling as a local path dependency, not just the dependency-reachable closure: monorepo CI must never resolve family members from the registry, whose published metadata conflicts with the local graph whenever the family is mid-release (version-coupled sibling pins target the next, unpublished version).
58
+
59
+ - [kc] shape-aware-nomono-requirements: Scope all-sibling path wiring and automatic local lock normalization to monorepo topology, and forward project-fact requirements through eval_nomono_gems in generated Gemfiles.
60
+
61
+ - [kc] shared-nomono-overrides: Use Nomono 1.1.10 shared overrides instead of template-side dependency replacement in local coverage and templating Gemfiles; preserve fact requirements during repeated bootstrap normalization.
62
+
63
+ ## [7.1.33] - 2026-10-19
64
+
65
+ - TAG: [v7.1.33][7.1.33t]
66
+ - COVERAGE: 93.42% -- 11362/12162 lines in 17 files
67
+ - BRANCH COVERAGE: 77.04% -- 4891/6349 branches in 17 files
68
+ - 19.80% documented
69
+
70
+ ### Added
71
+
72
+ - Version gate for local gemfile wiring: _local.gemfile now declares local_gem_requirements from the same template facts style.gemfile uses (KJ|RUBOCOP_LTS_CONSTRAINT, KJ|RUBOCOP_RUBY_CONSTRAINT) and path-wires a local gem only when its checkout version satisfies the requirement; unsatisfied checkouts fall back to the registry declaration. ensure_local_gem_requirements_from_template re-injects the hash after the AST merge, which drops hash assignments absent from the destination.
73
+
74
+ ### Changed
75
+
76
+ - [kc] kettle-jem-deps-floor: Update kettle-jem template dependency floors:
77
+ - kettle-changelog (>= 1.0.12 -> >= 1.0.13)
78
+ - kettle-dev (>= 3.1.15 -> >= 3.1.18)
79
+ - kettle-family (>= 1.3.11 -> >= 1.3.22)
80
+
33
81
  ## [7.1.32] - 2026-10-17
34
82
 
35
83
  - TAG: [v7.1.32][7.1.32t]
@@ -2300,7 +2348,11 @@ Please file a bug if you notice a violation of semantic versioning.
2300
2348
  - Released kettle-jem as part of the initial StructuredMerge Ruby 7.0.0 gem set.
2301
2349
  - Included packaged templates and parser-backed merge support for Ruby gem templating.
2302
2350
 
2303
- [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.32...HEAD
2351
+ [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.34...HEAD
2352
+ [7.1.34]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.33...v7.1.34
2353
+ [7.1.34t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.34
2354
+ [7.1.33]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.32...v7.1.33
2355
+ [7.1.33t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.33
2304
2356
  [7.1.32]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.31...v7.1.32
2305
2357
  [7.1.32t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.32
2306
2358
  [7.1.31]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.30...v7.1.31
data/README.md CHANGED
@@ -98,6 +98,61 @@ Merge analysis must enter parsing through `tree_haver`. Parser-specific gems reg
98
98
  [sm-family-rust]: https://github.com/structuredmerge/structuredmerge
99
99
  [sm-family-typescript]: https://github.com/structuredmerge/structuredmerge-typescript
100
100
 
101
+ ### Runtime and Platform Support
102
+
103
+ Support tiers describe what this project's CI actually exercises, not what may
104
+ work in an untested environment:
105
+
106
+ - **Parallel support**: CI runs the test suite with multiple workers available.
107
+ - **Unsupported**: the engine/platform combination is not covered by CI and is
108
+ not a project compatibility claim.
109
+
110
+ | Ruby engine/version | Linux | macOS | Windows | Notes |
111
+ |---------------------|-------|-------|---------|-------|
112
+ | MRI 4.0-4.0 | Parallel support | Unsupported | Unsupported | Versioned Ruby workflows run on Linux. |
113
+ | MRI current | Parallel support | Parallel support | Unsupported | Current Ruby workflow covers the declared OS platforms. |
114
+ | MRI head | Parallel support | Unsupported | Unsupported | CI is allowed to fail while Ruby is in development. |
115
+ | JRuby (all CI lanes) | Parallel support | Unsupported | Unsupported | Engine workflows run on Linux; macOS and Windows are not exercised by CI. |
116
+
117
+ ### Federated DVCS
118
+
119
+ <details markdown="1">
120
+ <summary>Find this repo on federated forges (Coming soon!)</summary>
121
+
122
+ | Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI |
123
+ |-------------------------------------------------|-------------------------------------------|-------------------|------------------|-----------------|----------------|
124
+ | 🧪 [structuredmerge/structuredmerge-ruby on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix |
125
+ | 🧊 [structuredmerge/structuredmerge-ruby on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix |
126
+ | 🐙 [structuredmerge/structuredmerge-ruby on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix |
127
+
128
+ </details>
129
+
130
+ ### Enterprise Support
131
+
132
+ [![Tidelift](https://tidelift.com/badges/package/rubygems/kettle-jem)](https://tidelift.com/subscription/pkg/rubygems-kettle-jem?utm_source=rubygems-kettle-jem&utm_medium=referral&utm_campaign=readme)
133
+
134
+ Available as part of the Tidelift Subscription.
135
+
136
+ <details markdown="1">
137
+ <summary>Need enterprise-level guarantees?</summary>
138
+
139
+ The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
140
+
141
+ [![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
142
+
143
+ - 💡Subscribe for support guarantees covering _all_ your FLOSS dependencies
144
+ - 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
145
+ - 💡Tidelift pays maintainers to maintain the software you depend on!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
146
+
147
+ Alternatively:
148
+
149
+ - [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
150
+ - [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
151
+ - [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork]
152
+ - [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor]
153
+
154
+ </details>
155
+
101
156
  ## ✨ Installation
102
157
 
103
158
  Install the gem and add to the application's Gemfile by executing:
@@ -657,6 +712,30 @@ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you m
657
712
 
658
713
  See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
659
714
 
715
+ ### 🚀 Release Instructions
716
+
717
+ See [CONTRIBUTING.md][🤝contributing].
718
+
719
+ ### Code Coverage
720
+
721
+ <details markdown="1">
722
+ <summary>Coverage service badges</summary>
723
+
724
+ </details>
725
+
726
+ ### 🪇 Code of Conduct
727
+
728
+ Everyone interacting with this project's codebases, issue trackers,
729
+ chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
730
+
731
+ ## 🌈 Contributors
732
+
733
+ [![Contributors][🖐contributors-img]][🖐contributors]
734
+
735
+ Made with [contributors-img][🖐contrib-rocks].
736
+
737
+ Also see GitLab Contributors: [https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main][🚎contributors-gl]
738
+
660
739
  ## 📌 Versioning
661
740
 
662
741
  This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
@@ -690,6 +769,41 @@ See [LICENSE.md][📄license] for details.
690
769
 
691
770
  If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license.
692
771
 
772
+ ### © Copyright
773
+
774
+ See [LICENSE.md][📄license] for the official copyright notice.
775
+
776
+ <details markdown="1">
777
+ <summary>Copyright holders</summary>
778
+
779
+ - Required Notice: Copyright (c) 2026 Peter H. Boling
780
+
781
+ </details>
782
+
783
+ ## 🤑 A request for help
784
+
785
+ Maintainers have teeth and need to pay their dentists.
786
+ After getting laid off in an RIF in March, and encountering difficulty finding a new one,
787
+ I began spending most of my time building open source tools.
788
+ I'm hoping to be able to pay for my kids' health insurance this month,
789
+ so if you value the work I am doing, I need your support.
790
+ Please consider sponsoring me or the project.
791
+
792
+ To join the community or get help, use the RubyForum or Discord.
793
+
794
+ [![Ruby Users Forum][✉️ruby-forum-img]][✉️ruby-forum]
795
+ [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite]
796
+
797
+ To say "thanks!" ☝️ Join the community or 👇️ send money.
798
+
799
+ [![Sponsor kettle-dev/kettle-jem on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
800
+
801
+ ### Please give the project a star ⭐ ♥.
802
+
803
+ Many parts of this project are actively managed by a [kettle-jem](https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem) smart template utilizing [StructuredMerge.org](https://structuredmerge.org) merge contracts.
804
+
805
+ Thanks for RTFM. ☺️
806
+
693
807
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
694
808
  [⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611
695
809
  [⛳liberapay]: https://liberapay.com/pboling/donate
@@ -724,6 +838,7 @@ If none of the available licenses suit your use case, please [contact us](mailto
724
838
  [✉️ruby-forum-top-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=flat&logo=discourse&label=Ruby%20Users%20Forum
725
839
  [✉️ruby-forum-img]: https://img.shields.io/discourse/topics?server=https%3A%2F%2Fwww.rubyforum.org&style=for-the-badge&logo=discourse&label=Ruby%20Users%20Forum
726
840
  [✉️ruby-forum]: https://www.rubyforum.org/tag/structuredmerge
841
+
727
842
  [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
728
843
  [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem
729
844
  [⛳️namespace-img]: https://img.shields.io/badge/namespace-Kettle::Jem-3C2D2D.svg?style=square&logo=ruby&logoColor=white
@@ -794,6 +909,7 @@ If none of the available licenses suit your use case, please [contact us](mailto
794
909
  [🖐contrib-rocks]: https://contrib.rocks
795
910
  [🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors
796
911
  [🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby
912
+ [🚎contributors-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main
797
913
  [🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md
798
914
  [🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg
799
915
  [📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
@@ -807,7 +923,7 @@ If none of the available licenses suit your use case, please [contact us](mailto
807
923
  [📌gitmoji]: https://gitmoji.dev
808
924
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
809
925
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
810
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-12.125-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
926
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-12.178-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
811
927
  [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
812
928
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
813
929
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -816,6 +932,7 @@ If none of the available licenses suit your use case, please [contact us](mailto
816
932
  [📄license-img]: https://img.shields.io/badge/License-AGPL--3.0--only_OR_PolyForm--Small--Business--1.0.0-259D6C.svg
817
933
  [📄license-compat]: https://www.apache.org/legal/resolved.html#category-x
818
934
  [📄license-compat-img]: https://img.shields.io/badge/Apache_Incompatible:_Category_X-%E2%9C%97-C0392B.svg?style=flat&logo=Apache
935
+
819
936
  [📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm
820
937
  [📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat
821
938
  [🚎yard-current]: http://rubydoc.info/gems/kettle-jem
@@ -827,3 +944,14 @@ If none of the available licenses suit your use case, please [contact us](mailto
827
944
  [💎appraisal2]: https://github.com/appraisal-rb/appraisal2
828
945
  [💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
829
946
  [💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
947
+
948
+ <!-- kettle-jem:metadata:start -->
949
+ | Field | Value |
950
+ |---|---|
951
+ | Package | kettle-jem |
952
+ | Description | 🔮 Kettle::Jem provides gem scaffolding, templating, and setup automation using the *-merge gem family for AST-based file merging and token-resolver for template token resolution. Includes MergerConfig presets, YAML recipes, and a complete gem template scaffold. |
953
+ | Homepage | https://github.com/structuredmerge/structuredmerge-ruby |
954
+ | Source | https://github.com/structuredmerge/structuredmerge-ruby |
955
+ | License | `AGPL-3.0-only` OR `PolyForm-Small-Business-1.0.0` |
956
+ | Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-dev, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-jem, https://www.buymeacoffee.com/pboling |
957
+ <!-- kettle-jem:metadata:end -->
@@ -49,7 +49,7 @@ module Kettle
49
49
  install_steps << appraisal_generate_step(project_root, env: setup_env, run_options: effective_run_options)
50
50
  install_steps << rubocop_gradual_autocorrect_step(project_root, env: setup_env, run_options: effective_run_options)
51
51
  install_steps << normalize_lockfile_platforms_step(project_root, env: setup_env, run_options: effective_run_options)
52
- install_steps << normalize_lockfile_step(project_root, env: setup_env, run_options: effective_run_options)
52
+ install_steps << normalize_lockfile_step(project_root, env: setup_env, run_options: effective_run_options, repository: report.dig(:facts, :repository) || {})
53
53
  install_steps << bundled_handoff_step(project_root: project_root, env: env, run_options: effective_run_options)
54
54
  install_steps = execute_orchestration_steps(install_steps, project_root: project_root, env: setup_env, run_options: effective_run_options, command_runner: command_runner)
55
55
 
@@ -751,7 +751,7 @@ module Kettle
751
751
  stdout.lines.map(&:strip).include?(gem_name.to_s)
752
752
  end
753
753
 
754
- def normalize_lockfile_step(project_root, env:, run_options: {})
754
+ def normalize_lockfile_step(project_root, env:, run_options: {}, repository: {})
755
755
  if Kettle::Jem::DecisionPolicy.value_to_boolean((run_options || {})[:skip_lock_normalization])
756
756
  return {
757
757
  name: "bundle_lock_normalization",
@@ -780,7 +780,7 @@ module Kettle
780
780
  name: "bundle_lock_normalization",
781
781
  command: lockfile_normalization_command(project_root),
782
782
  status: "ready",
783
- env: normal_lockfile_env(project_root, env),
783
+ env: normal_lockfile_env(project_root, env, repository: repository),
784
784
  reason: "bundle_lock_update_preserving_platforms_without_templating_overrides"
785
785
  }
786
786
  end
@@ -982,7 +982,7 @@ module Kettle
982
982
  stdout.to_s.strip
983
983
  end
984
984
 
985
- def normal_lockfile_env(project_root, env)
985
+ def normal_lockfile_env(project_root, env, repository: {})
986
986
  command_env = (env || {}).to_h.dup
987
987
  strip_inherited_bundler_activation!(command_env)
988
988
  command_env["K_JEM_TEMPLATING"] = "false"
@@ -991,7 +991,7 @@ module Kettle
991
991
  end
992
992
  gemfile = File.join(project_root.to_s, "Gemfile")
993
993
  command_env["BUNDLE_GEMFILE"] = gemfile if File.file?(gemfile)
994
- apply_direct_sibling_lockfile_env!(project_root, command_env)
994
+ apply_direct_sibling_lockfile_env!(project_root, command_env, repository: repository)
995
995
  %w[
996
996
  BUNDLE_PATH
997
997
  BUNDLE_WITH
@@ -1002,7 +1002,9 @@ module Kettle
1002
1002
  command_env
1003
1003
  end
1004
1004
 
1005
- def apply_direct_sibling_lockfile_env!(project_root, command_env)
1005
+ def apply_direct_sibling_lockfile_env!(project_root, command_env, repository: {})
1006
+ return unless Kettle::Jem.send(:repository_monorepo_subproject?, repository)
1007
+
1006
1008
  gemspec_path = Dir.glob(File.join(project_root.to_s, "*.gemspec")).min
1007
1009
  return unless gemspec_path
1008
1010
 
@@ -1012,7 +1014,8 @@ module Kettle
1012
1014
  :direct_sibling_runtime_gems,
1013
1015
  project_root,
1014
1016
  metadata,
1015
- package_name: package_name
1017
+ package_name: package_name,
1018
+ repository: repository
1016
1019
  )
1017
1020
  return if direct_sibling_gems.empty?
1018
1021
 
@@ -118,7 +118,7 @@ Gem::Specification.new do |spec|
118
118
  # and preferably a modular one (see gemfiles/modular/*.gemfile).
119
119
 
120
120
  # Dev, Test, & Release Tasks
121
- spec.add_development_dependency("kettle-dev", "~> 3.1", ">= 3.1.15") # ruby >= {KJ|MIN_TEST_RUBY}
121
+ spec.add_development_dependency("kettle-dev", "~> 3.1", ">= 3.1.19") # ruby >= {KJ|MIN_TEST_RUBY}
122
122
 
123
123
  # Security
124
124
  spec.add_development_dependency("bundler-audit", "~> 0.9.3") # ruby >= 2.0.0
@@ -5,6 +5,8 @@
5
5
 
6
6
  {KJ|LOCAL_GEMFILE_NOMONO_BOOTSTRAP}
7
7
 
8
+ local_gem_requirements = {KJ|LOCAL_GEM_REQUIREMENTS}
9
+
8
10
  local_gems = %w[{KJ|KETTLE_DEV_LOCAL_GEMS}]
9
11
  kettle_dev_nomono_options = {
10
12
  prefix: "KETTLE_DEV",
@@ -17,29 +19,18 @@ kettle_dev_nomono_options = {
17
19
 
18
20
  # export KETTLE_DEV_DEV=/path/to/my
19
21
  platform :mri do
20
- # Replace the gemspec dependency instead of declaring kettle-dev twice. Bundler
21
- # rejects duplicate declarations with different requirements or sources.
22
- kettle_dev_dependency = instance_variable_get(:@dependencies).to_a.find { |dependency| dependency.name == "kettle-dev" }
23
- kettle_dev_local_path = nomono_gems(
24
- gems: %w[kettle-dev],
25
- **kettle_dev_nomono_options
26
- ).fetch("kettle-dev", nil)
27
- if kettle_dev_dependency && kettle_dev_local_path
28
- instance_variable_get(:@dependencies).delete(kettle_dev_dependency)
29
- gem kettle_dev_dependency.name, *kettle_dev_dependency.requirements_list, path: kettle_dev_local_path
30
- end
31
-
32
- declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
33
- local_gems_to_eval = local_gems - %w[{KJ|PACKAGE_NAME}] - declared_gems
22
+ local_gems_to_eval = local_gems - %w[{KJ|PACKAGE_NAME}]
34
23
 
35
24
  eval_nomono_gems(
36
25
  gems: local_gems_to_eval,
26
+ requirements: local_gem_requirements,
37
27
  **kettle_dev_nomono_options
38
28
  )
39
29
 
40
30
  if ENV.fetch("GALTZO_FLOSS_DEV", "false").casecmp("false") != 0
41
31
  eval_nomono_gems(
42
32
  gems: %w[turbo_tests2],
33
+ requirements: local_gem_requirements,
43
34
  prefix: "GALTZO_FLOSS",
44
35
  path_env: "GALTZO_FLOSS_DEV",
45
36
  vendored_gems_env: "GALTZO_FLOSS_VENDORED_GEMS",
@@ -8,9 +8,51 @@
8
8
 
9
9
  {KJ|LOCAL_GEMFILE_NOMONO_BOOTSTRAP}
10
10
 
11
+ # Requirements for local gems (must match the declarations in style.gemfile).
12
+ # Only gems whose local checkout version satisfies the requirement will be
13
+ # path-wired; others fall back to the registry declaration in style.gemfile.
14
+ local_gem_requirements = {
15
+ "rubocop-lts" => [{KJ|RUBOCOP_LTS_CONSTRAINT}],
16
+ "rubocop-lts-rspec" => ["~> 1.0", ">= 1.0.7"],
17
+ "{KJ|RUBOCOP_RUBY_GEM}" => [{KJ|RUBOCOP_RUBY_CONSTRAINT}],
18
+ "standard-rubocop-lts" => ["~> 2.0", ">= 2.0.14"],
19
+ }
20
+
11
21
  local_gems = %w[rubocop-lts rubocop-lts-rspec {KJ|RUBOCOP_RUBY_GEM} standard-rubocop-lts]
12
22
  declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
13
- local_gems_to_eval = local_gems - %w[{KJ|PACKAGE_NAME}] - declared_gems
23
+
24
+ # Filter local_gems: only include gems whose local checkout version satisfies
25
+ # the declared requirement. Unsatisfied gems fall back to the registry.
26
+ def local_gem_satisfies?(gem_name, requirements, dev_root)
27
+ return false unless dev_root && File.directory?(dev_root)
28
+
29
+ # Resolve the actual gem name (handle token substitution)
30
+ actual_name = gem_name.dup
31
+ actual_name = ENV["RUBOCOP_RUBY_GEM"] if gem_name == "{KJ|RUBOCOP_RUBY_GEM}"
32
+ return false if actual_name.nil? || actual_name.empty?
33
+
34
+ # Find the gemspec
35
+ gemspec_path = Dir.glob(File.join(dev_root, actual_name, "*.gemspec")).first
36
+ return false unless gemspec_path && File.file?(gemspec_path)
37
+
38
+ # Parse version from gemspec
39
+ spec = Gem::Specification.load(gemspec_path)
40
+ return false unless spec && spec.version
41
+
42
+ # Check if version satisfies all requirements
43
+ requirements.all? do |req|
44
+ Gem::Requirement.new(req).satisfied_by?(spec.version)
45
+ end
46
+ rescue => e
47
+ warn "Warning: could not check local version for #{gem_name}: #{e.message}"
48
+ false
49
+ end
50
+
51
+ dev_root = ENV["RUBOCOP_LTS_DEV"]
52
+ local_gems_to_eval = local_gems.select do |gem|
53
+ reqs = local_gem_requirements[gem]
54
+ reqs && local_gem_satisfies?(gem, reqs, dev_root)
55
+ end - %w[{KJ|PACKAGE_NAME}] - declared_gems
14
56
 
15
57
  # The generated RuboCop config loads this plugin in both local and released
16
58
  # style modes, so the local bundle must provide it too.
@@ -22,6 +64,7 @@ gem "rubocop-packaging",
22
64
  platform :mri do
23
65
  eval_nomono_gems(
24
66
  gems: local_gems_to_eval,
67
+ requirements: local_gem_requirements,
25
68
  prefix: "RUBOCOP_LTS",
26
69
  path_env: "RUBOCOP_LTS_DEV",
27
70
  vendored_gems_env: "VENDORED_GEMS",
@@ -29,4 +72,4 @@ platform :mri do
29
72
  debug_env: "RUBOCOP_LTS_DEBUG",
30
73
  root: ["src", "my", "rubocop-lts"]
31
74
  )
32
- end
75
+ end
@@ -6,6 +6,9 @@
6
6
 
7
7
  {KJ|LOCAL_GEMFILE_NOMONO_BOOTSTRAP}
8
8
 
9
+ # Declared dependency requirements, supplied by project facts.
10
+ local_gem_requirements = {KJ|LOCAL_GEM_REQUIREMENTS}
11
+
9
12
  structuredmerge_local_gems = %w[
10
13
  tree_haver
11
14
  ast-merge
@@ -61,28 +64,17 @@ structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[{KJ|PACKAGE
61
64
  if ENV.fetch("STRUCTUREDMERGE_DEV", "false").casecmp("false") != 0
62
65
  eval_nomono_gems(
63
66
  gems: structuredmerge_local_gems_to_eval,
67
+ requirements: local_gem_requirements,
64
68
  **structuredmerge_nomono_options
65
69
  )
66
70
  end
67
71
 
68
72
  if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false") != 0
69
- # Replace the gemspec dependency instead of declaring kettle-dev twice. Bundler
70
- # rejects duplicate declarations with different requirements or sources.
71
- kettle_dev_dependency = instance_variable_get(:@dependencies).to_a.find { |dependency| dependency.name == "kettle-dev" }
72
- kettle_dev_local_path = nomono_gems(
73
- gems: %w[kettle-dev],
74
- **kettle_dev_nomono_options
75
- ).fetch("kettle-dev", nil)
76
- if kettle_dev_dependency && kettle_dev_local_path
77
- instance_variable_get(:@dependencies).delete(kettle_dev_dependency)
78
- gem kettle_dev_dependency.name, *kettle_dev_dependency.requirements_list, path: kettle_dev_local_path
79
- end
80
-
81
- declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
82
- kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[{KJ|PACKAGE_NAME}] - declared_gems
73
+ kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[{KJ|PACKAGE_NAME}]
83
74
 
84
75
  eval_nomono_gems(
85
76
  gems: kettle_dev_local_gems_to_eval,
77
+ requirements: local_gem_requirements,
86
78
  **kettle_dev_nomono_options
87
79
  )
88
80
  end
@@ -6,7 +6,7 @@ shimmed_gem_path = ENV["KETTLE_JEM_SHIMMED_GEM_PATH"].to_s
6
6
  gem "{KJ|SHIMMED_GEM_NAME}", path: shimmed_gem_path unless shimmed_gem_path.empty?
7
7
 
8
8
  # Local workspace dependency wiring for templating_local.gemfile overrides.
9
- gem "nomono", "~> 1.1", ">= 1.1.8", require: false # ruby >= 3.2.0
9
+ gem "nomono", "~> 1.1", ">= 1.1.14", require: false # ruby >= 3.2.0
10
10
 
11
11
  # Templating and the StructuredMerge family share this modular Gemfile.
12
12
  # kettle-jem needs StructuredMerge to template, and kettle-changelog needs it at
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "{KJ|SHIMMED_GEM_NAME}"
31
31
 
32
32
  # Dev, Test, & Release Tasks
33
- spec.add_development_dependency("kettle-dev", "~> 3.1", ">= 3.1.15") # ruby >= {KJ|MIN_TEST_RUBY}
33
+ spec.add_development_dependency("kettle-dev", "~> 3.1", ">= 3.1.19") # ruby >= {KJ|MIN_TEST_RUBY}
34
34
 
35
35
  # Tasks
36
36
  spec.add_development_dependency "rake", "~> 13.0"
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "7.1.32"
8
+ VERSION = "7.1.34"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
data/lib/kettle/jem.rb CHANGED
@@ -62,11 +62,11 @@ module Kettle
62
62
  # set in place before Bundler is allowed to evaluate that destination.
63
63
  TEMPLATE_MANAGED_DEPENDENCIES = [
64
64
  {name: PACKAGE_NAME, requirements: ["~> 7.1", ">= 7.1.28"], bootstrap: false},
65
- {name: "nomono", requirements: ["~> 1.1", ">= 1.1.8"], bootstrap: true},
66
- {name: "kettle-dev", requirements: ["~> 3.1", ">= 3.1.15"], bootstrap: true},
65
+ {name: "nomono", requirements: ["~> 1.1", ">= 1.1.14"], bootstrap: true},
66
+ {name: "kettle-dev", requirements: ["~> 3.1", ">= 3.1.19"], bootstrap: true},
67
67
  {
68
68
  name: "kettle-changelog",
69
- requirements: ["~> 1.0", ">= 1.0.12"],
69
+ requirements: ["~> 1.0", ">= 1.0.13"],
70
70
  bootstrap: true,
71
71
  ruby_requirement: ">= 4.0.0"
72
72
  }
@@ -5120,9 +5120,9 @@ module Kettle
5120
5120
  [
5121
5121
  {name: "appraisal2", source: %(gem "appraisal2", "~> 3.2", ">= 3.2.5"\n)},
5122
5122
  {name: "bundler-audit", source: %(gem "bundler-audit", "~> 0.9.3"\n)},
5123
- {name: "kettle-dev", source: %(gem "kettle-dev", "~> 3.1", ">= 3.1.15"\n)},
5123
+ {name: "kettle-dev", source: %(gem "kettle-dev", "~> 3.1", ">= 3.1.19"\n)},
5124
5124
  {name: "kettle-drift", source: %(gem "kettle-drift", "~> 1.0", ">= 1.0.17"\n)},
5125
- {name: "kettle-family", source: %(gem "kettle-family", "~> 1.3", ">= 1.3.11"\n)},
5125
+ {name: "kettle-family", source: %(gem "kettle-family", "~> 1.3", ">= 1.3.25"\n)},
5126
5126
  {name: PACKAGE_NAME, source: kettle_jem_dependency_source},
5127
5127
  {name: "kettle-test", source: %(gem "kettle-test", "~> 2.0", ">= 2.0.27"\n)},
5128
5128
  {name: "rake", source: %(gem "rake", "~> 13.0"\n)},
@@ -6870,7 +6870,7 @@ module Kettle
6870
6870
  end
6871
6871
  end
6872
6872
  if strategy.empty? || strategy == "merge"
6873
- merged = merge_config_template_source(recipe, resolved, original, facts: facts, env: env)
6873
+ merged = merge_config_template_source(recipe, resolved, original, facts: facts, env: env, project_root: project_root)
6874
6874
  merged = preserve_mise_project_settings(recipe, merged, original, project_root: project_root, facts: facts) if template_file_type(recipe) == :toml
6875
6875
  return finalize_template_source_content(recipe, sync_kettle_config_env_overrides(merged, env, project_root: project_root)) if recipe.fetch(:target_path) == KETTLE_CONFIG_PATH
6876
6876
 
@@ -7617,7 +7617,7 @@ module Kettle
7617
7617
  ensure_trailing_newline(lines.join("\n").gsub(/\n{3,}/, "\n\n").strip)
7618
7618
  end
7619
7619
 
7620
- def merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV)
7620
+ def merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV, project_root: nil)
7621
7621
  file_type = template_file_type(recipe)
7622
7622
  trivial_outcome = Ast::Template::Strategies.trivial_merge_outcome(template_content, destination_content)
7623
7623
  if trivial_outcome == :empty_destination
@@ -7754,6 +7754,8 @@ module Kettle
7754
7754
 
7755
7755
  output = normalize_local_gemfile_nomono_bootstrap(output) if local_gemfile_template_recipe?(recipe)
7756
7756
  output = remove_gemfile_percent_w_entries(output, [facts.to_h.dig(:package, :name)]) if local_gemfile_template_recipe?(recipe)
7757
+ output = ensure_local_gem_requirements_from_template(output, template_content) if local_gemfile_template_recipe?(recipe)
7758
+
7757
7759
  return output if recipe.dig(:template_preference, :strategy).to_s == "accept_template"
7758
7760
  return output unless local_gemfile_template_recipe?(recipe)
7759
7761
 
@@ -8762,9 +8764,14 @@ module Kettle
8762
8764
  if marker && activation_assignments.any?
8763
8765
  first_line = activation_assignments.map { |node| node.location.start_line }.min
8764
8766
  first_line = preceding_comment_block_start_line(output.lines, first_line)
8767
+ requirements_record = local_variable_assignment_record(output, :local_gem_requirements)
8768
+ if requirements_record&.fetch(:start_line)&.between?(first_line, marker.fetch(:start_line) - 1)
8769
+ bootstrap = "#{bootstrap}#{requirements_record.fetch(:source)}\n\n"
8770
+ end
8765
8771
  output = replace_source_range_lines(output, first_line, marker.fetch(:start_line) - 1, bootstrap) if first_line < marker.fetch(:start_line)
8766
8772
  output = remove_local_gemfile_nomono_loader_blocks_after_marker(output)
8767
8773
  output = remove_redundant_nomono_bundler_requires_after_marker(output)
8774
+ output = apply_local_gem_exclusions(output)
8768
8775
  return ensure_trailing_newline(output.rstrip)
8769
8776
  end
8770
8777
 
@@ -8781,7 +8788,9 @@ module Kettle
8781
8788
  without_duplicates = require_records.reject { |record| record.equal?(first) }.sort_by { |record| -record.fetch(:start_line) }.reduce(output) do |memo, record|
8782
8789
  replace_source_range_lines(memo, record.fetch(:start_line), expand_line_range_through_following_blanks(memo, record.fetch(:end_line)), "")
8783
8790
  end
8784
- return replace_source_range_lines(without_duplicates, first.fetch(:start_line), first.fetch(:end_line), bootstrap)
8791
+ output = replace_source_range_lines(without_duplicates, first.fetch(:start_line), first.fetch(:end_line), bootstrap)
8792
+ output = apply_local_gem_exclusions(output)
8793
+ return ensure_trailing_newline(output.rstrip)
8785
8794
  end
8786
8795
 
8787
8796
  if (record = local_gems_assignment_record(output))
@@ -8789,6 +8798,8 @@ module Kettle
8789
8798
  else
8790
8799
  ensure_trailing_newline([output.to_s.rstrip, bootstrap.rstrip].reject(&:empty?).join("\n\n"))
8791
8800
  end
8801
+ output = apply_local_gem_exclusions(output)
8802
+ ensure_trailing_newline(output.rstrip)
8792
8803
  end
8793
8804
 
8794
8805
  def local_gemfile_nomono_bootstrap_marker(content)
@@ -8974,6 +8985,68 @@ module Kettle
8974
8985
  word_array_assignment_record(content, :local_gems)
8975
8986
  end
8976
8987
 
8988
+ # Apply local gem exclusions from KETTLE_JEM_LOCAL_GEM_EXCLUSIONS env var
8989
+ # to the local_gems word array in _local.gemfile templates.
8990
+ def apply_local_gem_exclusions(content)
8991
+ exclusions_env = ENV["KETTLE_JEM_LOCAL_GEM_EXCLUSIONS"]
8992
+ return content if exclusions_env.nil? || exclusions_env.strip.empty?
8993
+
8994
+ exclusions = exclusions_env.split(",").map(&:strip).reject(&:empty?)
8995
+ return content if exclusions.empty?
8996
+
8997
+ record = local_gems_assignment_record(content)
8998
+ return content unless record
8999
+
9000
+ current_gems = record.fetch(:names)
9001
+ filtered_gems = current_gems.reject { |gem| exclusions.include?(gem) }
9002
+ return content if filtered_gems == current_gems
9003
+
9004
+ replace_word_array_assignment(content, :local_gems, filtered_gems)
9005
+ end
9006
+
9007
+ # The AST merge can drop the template's local_gem_requirements hash when the
9008
+ # destination predates it. The token-resolved template content is the source
9009
+ # of truth for these requirements (the same facts style.gemfile declares),
9010
+ # so re-inject the assignment from the template after the merge, replacing
9011
+ # any stale copy in the merged output.
9012
+ def ensure_local_gem_requirements_from_template(output, template_content)
9013
+ template_record = local_variable_assignment_record(template_content, :local_gem_requirements)
9014
+ return output unless template_record
9015
+
9016
+ replacement = template_record.fetch(:source)
9017
+ output_record = local_variable_assignment_record(output, :local_gem_requirements)
9018
+ if output_record
9019
+ return output if output_record.fetch(:source) == replacement
9020
+
9021
+ replace_source_range_lines(output, output_record.fetch(:start_line), output_record.fetch(:end_line), replacement)
9022
+ else
9023
+ anchor = local_variable_assignment_record(output, :local_gems) ||
9024
+ local_variable_assignment_record(output, :structuredmerge_local_gems) ||
9025
+ local_variable_assignment_record(output, :declared_gems)
9026
+ return output unless anchor
9027
+
9028
+ lines = output.lines
9029
+ lines.insert(anchor.fetch(:start_line) - 1, "#{replacement}\n\n")
9030
+ ensure_trailing_newline(lines.join)
9031
+ end
9032
+ end
9033
+
9034
+ def local_variable_assignment_record(content, name)
9035
+ result = prism_parse_success(content)
9036
+ return unless result
9037
+
9038
+ node = result.value.breadth_first_search_all do |candidate|
9039
+ candidate.is_a?(::Prism::LocalVariableWriteNode) && candidate.name == name
9040
+ end.first
9041
+ return unless node
9042
+
9043
+ {
9044
+ source: content.lines[(node.location.start_line - 1)...node.location.end_line].join.chomp,
9045
+ start_line: node.location.start_line,
9046
+ end_line: node.location.end_line
9047
+ }
9048
+ end
9049
+
8977
9050
  def word_array_assignment(content, name)
8978
9051
  word_array_assignment_record(content, name)&.fetch(:names) || []
8979
9052
  end
@@ -15465,7 +15538,8 @@ module Kettle
15465
15538
  project_root,
15466
15539
  gemspec_metadata,
15467
15540
  package_name: package_name,
15468
- local_modular_eval_paths: local_modular_eval_paths
15541
+ local_modular_eval_paths: local_modular_eval_paths,
15542
+ repository: repository
15469
15543
  )
15470
15544
  compact_hash(
15471
15545
  freeze_token: config.dig("defaults", "freeze_token").to_s.empty? ? "kettle-jem" : config.dig("defaults", "freeze_token").to_s,
@@ -15475,6 +15549,7 @@ module Kettle
15475
15549
  template_run_year: run_timestamp.year.to_s,
15476
15550
  kettle_dev_local_gems: kettle_dev_local_gems(config),
15477
15551
  local_gemfile_nomono_bootstrap: local_gemfile_nomono_bootstrap(package_name),
15552
+ local_gem_requirements: gemspec_local_gem_requirements(gemspec_metadata),
15478
15553
  main_gemfile_kettle_family_gem: main_gemfile_kettle_family_gem(package_name),
15479
15554
  main_gemfile_nomono_bootstrap: main_gemfile_nomono_bootstrap(package_name),
15480
15555
  package_name: package_name.to_s,
@@ -15493,12 +15568,13 @@ module Kettle
15493
15568
  source_url: source_url,
15494
15569
  project_root: project_root,
15495
15570
  repository: repository,
15571
+ requirements: gemspec_local_gem_requirements(gemspec_metadata),
15496
15572
  local_modular_eval_paths: local_modular_eval_paths.values.flatten
15497
15573
  )
15498
15574
  )
15499
15575
  end
15500
15576
 
15501
- def direct_sibling_runtime_gems(project_root, gemspec_metadata, package_name:, local_modular_eval_paths: {})
15577
+ def direct_sibling_runtime_gems(project_root, gemspec_metadata, package_name:, local_modular_eval_paths: {}, repository: {})
15502
15578
  return [] unless project_root && gemspec_metadata.is_a?(Hash)
15503
15579
 
15504
15580
  sibling_root = File.expand_path("..", project_root.to_s)
@@ -15518,6 +15594,22 @@ module Kettle
15518
15594
  pending.concat(gemspec_runtime_dependency_names(sibling_metadata))
15519
15595
  end
15520
15596
 
15597
+ # A monorepo of sibling gems must resolve every sibling from local
15598
+ # paths, never from the registry: published registry metadata for
15599
+ # released siblings conflicts with the local graph whenever the family
15600
+ # is mid-release (version-coupled sibling pins target the next,
15601
+ # unpublished version, and external tooling like kettle-family pulls
15602
+ # family members transitively). Wire all family members, not just the
15603
+ # dependency-reachable closure.
15604
+ if repository_monorepo_subproject?(repository) && File.directory?(sibling_root)
15605
+ Dir.children(sibling_root).sort.each do |name|
15606
+ next if discovered.include?(name) || excluded.include?(name)
15607
+ next unless direct_sibling_directory_defines_gem?(File.join(sibling_root, name), name)
15608
+
15609
+ discovered << name
15610
+ end
15611
+ end
15612
+
15521
15613
  discovered.reject { |name| excluded.include?(name) }
15522
15614
  end
15523
15615
 
@@ -15582,6 +15674,19 @@ module Kettle
15582
15674
  end
15583
15675
  end
15584
15676
 
15677
+ # Reuse the dependency objects in project facts. Never infer a requirement
15678
+ # from a sibling's current version or scrape a rendered modular Gemfile.
15679
+ def gemspec_local_gem_requirements(gemspec_metadata)
15680
+ %i[runtime_dependencies development_dependencies].each_with_object({}) do |kind, requirements|
15681
+ Array(gemspec_metadata[kind] || gemspec_metadata[kind.to_s]).each do |dependency|
15682
+ next unless dependency.respond_to?(:name) && dependency.respond_to?(:requirements_list)
15683
+
15684
+ name = dependency.name.to_s
15685
+ requirements[name] = (Array(requirements[name]) + dependency.requirements_list).uniq
15686
+ end
15687
+ end.sort.to_h
15688
+ end
15689
+
15585
15690
  def gemspec_runtime_dependency_names(gemspec_metadata)
15586
15691
  dependencies = Array(
15587
15692
  gemspec_metadata[:runtime_dependencies] || gemspec_metadata["runtime_dependencies"]
@@ -15594,7 +15699,7 @@ module Kettle
15594
15699
  end
15595
15700
  end
15596
15701
 
15597
- def main_gemfile_direct_sibling_block(gems, package_name:, source_url:, project_root:, repository: {}, local_modular_eval_paths: [])
15702
+ def main_gemfile_direct_sibling_block(gems, package_name:, source_url:, project_root:, repository: {}, requirements: {}, local_modular_eval_paths: [])
15598
15703
  names = Array(gems).map(&:to_s).reject(&:empty?).uniq
15599
15704
  eval_paths = Array(local_modular_eval_paths).map(&:to_s).reject(&:empty?).uniq.sort
15600
15705
  return "" if names.empty? && eval_paths.empty?
@@ -15637,6 +15742,7 @@ module Kettle
15637
15742
 
15638
15743
  eval_nomono_gems(
15639
15744
  gems: direct_sibling_gems,
15745
+ requirements: #{requirements.slice(*names).inspect},
15640
15746
  prefix: "#{prefix}",
15641
15747
  path_env: "#{dev_env}",
15642
15748
  root: #{root_literal}
@@ -15799,6 +15905,7 @@ module Kettle
15799
15905
  "KJ|TEMPLATE_RUN_YEAR" => project_runtime[:template_run_year].to_s,
15800
15906
  "KJ|KETTLE_DEV_LOCAL_GEMS" => project_runtime[:kettle_dev_local_gems].to_s,
15801
15907
  "KJ|LOCAL_GEMFILE_NOMONO_BOOTSTRAP" => project_runtime[:local_gemfile_nomono_bootstrap].to_s,
15908
+ "KJ|LOCAL_GEM_REQUIREMENTS" => (project_runtime[:local_gem_requirements] || {}).inspect,
15802
15909
  "KJ|MAIN_GEMFILE_KETTLE_FAMILY_GEM" => project_runtime[:main_gemfile_kettle_family_gem].to_s,
15803
15910
  "KJ|MAIN_GEMFILE_NOMONO_BOOTSTRAP" => project_runtime[:main_gemfile_nomono_bootstrap].to_s,
15804
15911
  "KJ|MAIN_GEMFILE_DIRECT_SIBLING_BLOCK" => project_runtime[:main_gemfile_direct_sibling_block].to_s,
@@ -15827,7 +15934,7 @@ module Kettle
15827
15934
  def main_gemfile_kettle_family_gem(package_name)
15828
15935
  return "" if package_name.to_s == "kettle-family"
15829
15936
 
15830
- %(gem "kettle-family", "~> 1.3", ">= 1.3.11"\n)
15937
+ %(gem "kettle-family", "~> 1.3", ">= 1.3.25"\n)
15831
15938
  end
15832
15939
 
15833
15940
  def main_gemfile_nomono_bootstrap(package_name)
@@ -15840,7 +15947,7 @@ module Kettle
15840
15947
  end
15841
15948
 
15842
15949
  def nomono_gemfile_declaration
15843
- %(gem "nomono", "~> 1.1", ">= 1.1.8", require: false # ruby >= 3.2.0)
15950
+ %(gem "nomono", "~> 1.1", ">= 1.1.14", require: false # ruby >= 3.2.0)
15844
15951
  end
15845
15952
 
15846
15953
  def local_gemfile_nomono_bootstrap(_package_name)
@@ -15852,7 +15959,7 @@ module Kettle
15852
15959
  # Bootstrapping nomono here cannot rely on a plain `gem "nomono", ...` line.
15853
15960
  # Bundler records that dependency during Gemfile evaluation, but it does not
15854
15961
  # activate that exact version before the immediate `require "nomono/bundler"`.
15855
- nomono_activation_requirements = ["~> 1.1", ">= 1.1.8"]
15962
+ nomono_activation_requirements = ["~> 1.1", ">= 1.1.14"]
15856
15963
  nomono_requirement = Gem::Requirement.new(nomono_activation_requirements)
15857
15964
  nomono_already_activated = Gem.loaded_specs["nomono"]
15858
15965
  nomono_lockfile = File.expand_path(#{lockfile_path.inspect}, __dir__)
@@ -20742,7 +20849,7 @@ module Kettle
20742
20849
  "actions/checkout" => "actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1",
20743
20850
  "actions/cache" => "actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0",
20744
20851
  "appraisal-rb/setup-ruby-flash" => "appraisal-rb/setup-ruby-flash@6f8ad36ba7488db591541483afb5464d01e8861b # v2.14",
20745
- "ruby/setup-ruby" => "ruby/setup-ruby@651ff0d62c5c79bed6d53ec518387aae20e72c1a # v1.329.0",
20852
+ "ruby/setup-ruby" => "ruby/setup-ruby@824c0e29fdfc7d689c191c27acc969d2d04b7dd8 # v1.331.0",
20746
20853
  "coverallsapp/github-action" => "coverallsapp/github-action@8d6379e14d29928660c4ba802d8e85393440b329 # v2.3.8",
20747
20854
  "qltysh/qlty-action/coverage" => "qltysh/qlty-action/coverage@c9b09987143d1e4ac955f4803c7bea742102feb5 # v2.4.0",
20748
20855
  "codecov/codecov-action" => "codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1",
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-jem
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.32
4
+ version: 7.1.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -226,7 +226,7 @@ dependencies:
226
226
  version: '1.0'
227
227
  - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 1.0.9
229
+ version: 1.0.13
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
@@ -236,7 +236,7 @@ dependencies:
236
236
  version: '1.0'
237
237
  - - ">="
238
238
  - !ruby/object:Gem::Version
239
- version: 1.0.9
239
+ version: 1.0.13
240
240
  - !ruby/object:Gem::Dependency
241
241
  name: kettle-dev
242
242
  requirement: !ruby/object:Gem::Requirement
@@ -246,7 +246,7 @@ dependencies:
246
246
  version: '3.1'
247
247
  - - ">="
248
248
  - !ruby/object:Gem::Version
249
- version: 3.1.9
249
+ version: 3.1.18
250
250
  type: :runtime
251
251
  prerelease: false
252
252
  version_requirements: !ruby/object:Gem::Requirement
@@ -256,7 +256,7 @@ dependencies:
256
256
  version: '3.1'
257
257
  - - ">="
258
258
  - !ruby/object:Gem::Version
259
- version: 3.1.9
259
+ version: 3.1.18
260
260
  - !ruby/object:Gem::Dependency
261
261
  name: kettle-gha-pins
262
262
  requirement: !ruby/object:Gem::Requirement
@@ -676,7 +676,7 @@ dependencies:
676
676
  version: '2.0'
677
677
  - - ">="
678
678
  - !ruby/object:Gem::Version
679
- version: 2.0.25
679
+ version: 2.0.27
680
680
  type: :development
681
681
  prerelease: false
682
682
  version_requirements: !ruby/object:Gem::Requirement
@@ -686,27 +686,27 @@ dependencies:
686
686
  version: '2.0'
687
687
  - - ">="
688
688
  - !ruby/object:Gem::Version
689
- version: 2.0.25
689
+ version: 2.0.27
690
690
  - !ruby/object:Gem::Dependency
691
691
  name: turbo_tests2
692
692
  requirement: !ruby/object:Gem::Requirement
693
693
  requirements:
694
694
  - - "~>"
695
695
  - !ruby/object:Gem::Version
696
- version: '3.2'
696
+ version: '4.0'
697
697
  - - ">="
698
698
  - !ruby/object:Gem::Version
699
- version: 3.2.16
699
+ version: 4.0.0
700
700
  type: :development
701
701
  prerelease: false
702
702
  version_requirements: !ruby/object:Gem::Requirement
703
703
  requirements:
704
704
  - - "~>"
705
705
  - !ruby/object:Gem::Version
706
- version: '3.2'
706
+ version: '4.0'
707
707
  - - ">="
708
708
  - !ruby/object:Gem::Version
709
- version: 3.2.16
709
+ version: 4.0.0
710
710
  - !ruby/object:Gem::Dependency
711
711
  name: ruby-progressbar
712
712
  requirement: !ruby/object:Gem::Requirement
@@ -997,10 +997,10 @@ licenses:
997
997
  - PolyForm-Small-Business-1.0.0
998
998
  metadata:
999
999
  homepage_uri: https://structuredmerge.org
1000
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.32
1001
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.32/CHANGELOG.md
1000
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.34
1001
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.34/CHANGELOG.md
1002
1002
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
1003
- documentation_uri: https://www.rubydoc.info/gems/kettle-jem/7.1.32
1003
+ documentation_uri: https://www.rubydoc.info/gems/kettle-jem/7.1.34
1004
1004
  funding_uri: https://github.com/sponsors/pboling
1005
1005
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
1006
1006
  news_uri: https://www.railsbling.com/tags/kettle-jem
metadata.gz.sig CHANGED
Binary file