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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +53 -1
- data/README.md +129 -1
- data/lib/kettle/jem/tasks/install_task.rb +10 -7
- data/lib/kettle/jem/templates/gem.gemspec.example +1 -1
- data/lib/kettle/jem/templates/gemfiles/modular/coverage_local.gemfile.example +5 -14
- data/lib/kettle/jem/templates/gemfiles/modular/style_local.gemfile.example +45 -2
- data/lib/kettle/jem/templates/gemfiles/modular/templating_local.gemfile.example +6 -14
- data/lib/kettle/jem/templates/shim/Gemfile.example +1 -1
- data/lib/kettle/jem/templates/shim/gem.gemspec.example +1 -1
- data/lib/kettle/jem/version.rb +1 -1
- data/lib/kettle/jem.rb +122 -15
- data.tar.gz.sig +0 -0
- metadata +14 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e652034338fd5859484f79531a6d6a14e1e12379e3d2b72144f4df384bfb7d66
|
|
4
|
+
data.tar.gz: 0e96ba0332102c087f9f431569996228dd242b698076a9ca1536c29fa5205690
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
+
[](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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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"
|
data/lib/kettle/jem/version.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
66
|
-
{name: "kettle-dev", requirements: ["~> 3.1", ">= 3.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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@
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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: '
|
|
696
|
+
version: '4.0'
|
|
697
697
|
- - ">="
|
|
698
698
|
- !ruby/object:Gem::Version
|
|
699
|
-
version:
|
|
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: '
|
|
706
|
+
version: '4.0'
|
|
707
707
|
- - ">="
|
|
708
708
|
- !ruby/object:Gem::Version
|
|
709
|
-
version:
|
|
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.
|
|
1001
|
-
changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.
|
|
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.
|
|
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
|