kettle-dev 1.1.44 → 1.1.47

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: 68f384099e73116f4cc5a9134eaa5e41aeca742df8e65aa9e1cd6b27295d5a13
4
- data.tar.gz: 92adc9e50e738ce72b44877ec5a213316c2981a618896e30a6c9e507b855f002
3
+ metadata.gz: ce61aa17df248a723743179807ea6da8b1c139dbd2555459a69035b4a33338bd
4
+ data.tar.gz: 7eb08bdf8772350131a62caa2ac893de26871ab093d671ee798b5a1edb7a97b0
5
5
  SHA512:
6
- metadata.gz: 4acafb849ccdc44a53928652265aa983e099ead3cd63ebed3c0169c1cbb5d1278c95e4b32ed606f874bb87fd7a732b24125f6979df36ce5d4b346d5c4f027431
7
- data.tar.gz: c954de160931c716a46bc8859e3d90ef59e63186326d3d3b5e43c1005284a689065d4c7dad41c81a029493ff825a07c066e671bd99701152b37d13648de5d291
6
+ metadata.gz: 7936fd630aab1b64ab97ae9b52a570524b5c20ddc576bddbb10df3ee6dd05e26a736e33c34cbe3ba7cebd903c112d68440d9863f5ade11ae7c18f84cc1d08b68
7
+ data.tar.gz: cec2cbdcab872105c822f07d0539ccd08c8ad66aa1a1e7ded93a1c8d3f790a1efc48449f0810dc4128e201d32aa517fde4c5054f4a7e604c1b4e0cda630d3155
checksums.yaml.gz.sig CHANGED
@@ -1,3 +1,4 @@
1
- B6\xn��#�\'4�ٶ{��&{l"'Fp&�{t/�QPp[2 �,�a�܆�oKd�p���S�>��C���{�ys�_?�t��#9�~��0Ub��!�����ߧ"���&%q�XVX������p�h��cɈ'R \��vc��_����P!%u��k���׆�݂ 0�5�cY�I!?�C�S;��*K[
2
- W�Ͳ���ݼ�:��-D�؎w 5��m]��}�K�d��i���bwG ��@S��)v
3
- m(�l���VY���p[�i��B���12���YRR��T�o/�Dς�#��:�5du/R8�� /~A�q+B({�Ɉ�/�[�,b؜�lT
1
+ ?H3UW� �<D
2
+ ����1t4�`����$a���%���Z!p��̰���Ʉ�_�D��u� � �cF��1��1q`e%<G# �
3
+ ��܃�g E���֜m��.57q���<��i����, ��!�k��?woW/�6�B�3�%+\��T���bny���63���\�<%ȱ����I���I��'���a����exPo`7XUI%ި�ۧ�5_*�j��M/U%O�ehx ҫӑ��#6E���j���qO�^VĤ(:^� F��tn�JE�7T�@5�Ծ�
4
+ �3�uȴ�Cf&�K>�� _M��ãou�3����wƙ��N_.���_ a������)���g��� ��۹�\Q�l��
@@ -1,5 +1,5 @@
1
1
  ⚡️ A message from a fellow meat-based-AI ⚡️
2
- - [❤️] Finely-crafted open-source tools like <%= @gem_name %> (& many more) are a full-time endeavor.
2
+ - [❤️] Finely-crafted open-source tools like <%= @gem_name %> (& many more) require time and effort.
3
3
  - [❤️] Though I adore my work, it lacks financial sustainability.
4
4
  - [❤️] Please, help me continue enhancing your tools by becoming a sponsor:
5
5
  - [💲] https://liberapay.com/pboling/donate
@@ -63,3 +63,5 @@ jobs:
63
63
  run: bundle exec appraisal ${{ matrix.appraisal }} bundle
64
64
  - name: Run ${{ matrix.appraisal }} checks via ${{ matrix.exec_cmd }}
65
65
  run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
66
+ - name: Validate RBS Types
67
+ run: bundle exec appraisal ${{ matrix.appraisal }} bin/rbs validate
data/CHANGELOG.md CHANGED
@@ -30,6 +30,48 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.1.47] - 2025-11-06
34
+
35
+ - TAG: [v1.1.47][1.1.47t]
36
+ - COVERAGE: 95.68% -- 4054/4237 lines in 26 files
37
+ - BRANCH COVERAGE: 80.45% -- 1675/2082 branches in 26 files
38
+ - 79.89% documented
39
+
40
+ ### Added
41
+
42
+ - Handle custom dependencies in Gemfiles gracefully
43
+ - Intelligent templating of Appraisals
44
+
45
+ ### Fixed
46
+
47
+ - Typos in funding links
48
+
49
+ ## [1.1.46] - 2025-11-04
50
+
51
+ - TAG: [v1.1.46][1.1.46t]
52
+ - COVERAGE: 96.25% -- 3958/4112 lines in 26 files
53
+ - BRANCH COVERAGE: 80.95% -- 1636/2021 branches in 26 files
54
+ - 79.68% documented
55
+
56
+ ### Added
57
+
58
+ - Validate RBS Types within style workflow
59
+
60
+ ### Fixed
61
+
62
+ - typos in README.md
63
+
64
+ ## [1.1.45] - 2025-10-31
65
+
66
+ - TAG: [v1.1.45][1.1.45t]
67
+ - COVERAGE: 96.33% -- 3961/4112 lines in 26 files
68
+ - BRANCH COVERAGE: 81.00% -- 1637/2021 branches in 26 files
69
+ - 79.68% documented
70
+
71
+ ### Changed
72
+
73
+ - floss-funding related documentation improvements
74
+
33
75
  ## [1.1.44] - 2025-10-31
34
76
 
35
77
  - TAG: [v1.1.44][1.1.44t]
@@ -1241,7 +1283,13 @@ Please file a bug if you notice a violation of semantic versioning.
1241
1283
  - Selecting will run the selected workflow via `act`
1242
1284
  - This may move to its own gem in the future.
1243
1285
 
1244
- [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.44...HEAD
1286
+ [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.47...HEAD
1287
+ [1.1.47]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.46...v1.1.47
1288
+ [1.1.47t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.47
1289
+ [1.1.46]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.45...v1.1.46
1290
+ [1.1.46t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.46
1291
+ [1.1.45]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.44...v1.1.45
1292
+ [1.1.45t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.45
1245
1293
  [1.1.44]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.43...v1.1.44
1246
1294
  [1.1.44t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.44
1247
1295
  [1.1.43]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.42...v1.1.43
data/FUNDING.md CHANGED
@@ -6,7 +6,7 @@ Many paths lead to being a sponsor or a backer of this project. Are you on such
6
6
 
7
7
  [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
8
 
9
- [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
10
10
 
11
11
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
12
12
  [⛳liberapay]: https://liberapay.com/pboling/donate
@@ -46,7 +46,7 @@ To join the community or get help 👇️ Join the Discord.
46
46
 
47
47
  To say "thanks for maintaining such a great tool" ☝️ Join the Discord or 👇️ send money.
48
48
 
49
- [![Sponsor kettle-rb/kettle-dev 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-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
49
+ [![Sponsor kettle-rb/kettle-dev 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]
50
50
 
51
51
  # Another Way to Support Open Source Software
52
52
 
@@ -6,7 +6,7 @@ Many paths lead to being a sponsor or a backer of this project. Are you on such
6
6
 
7
7
  [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal]
8
8
 
9
- [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
9
+ [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
10
10
 
11
11
  [⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat
12
12
  [⛳liberapay]: https://liberapay.com/pboling/donate
data/README.md CHANGED
@@ -644,10 +644,7 @@ No sponsors yet. Be the first!
644
644
 
645
645
  ### Another way to support open-source
646
646
 
647
- > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
648
- >—Anne Frank
649
-
650
- I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
647
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
651
648
 
652
649
  If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
653
650
 
@@ -655,7 +652,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
655
652
 
656
653
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
657
654
 
658
- [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
655
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
659
656
 
660
657
  ## 🔐 Security
661
658
 
@@ -782,7 +779,7 @@ To join the community or get help 👇️ Join the Discord.
782
779
 
783
780
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
784
781
 
785
- [![Sponsor kettle-rb/kettle-dev 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-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
782
+ [![Sponsor kettle-rb/kettle-dev 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]
786
783
 
787
784
  ### Please give the project a star ⭐ ♥.
788
785
 
@@ -968,9 +965,9 @@ Thanks for RTFM. ☺️
968
965
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
969
966
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
970
967
  [📌gitmoji]:https://gitmoji.dev
971
- [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
968
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
972
969
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
973
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.112-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
970
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.237-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
974
971
  [🔐security]: SECURITY.md
975
972
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
976
973
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
data/README.md.example CHANGED
@@ -217,10 +217,7 @@ No sponsors yet. Be the first!
217
217
 
218
218
  ### Another way to support open-source
219
219
 
220
- > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
221
- >—Anne Frank
222
-
223
- I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
220
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
224
221
 
225
222
  If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
226
223
 
@@ -228,7 +225,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
228
225
 
229
226
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
230
227
 
231
- [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
228
+ [![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
232
229
 
233
230
  ## 🔐 Security
234
231
 
@@ -355,7 +352,7 @@ To join the community or get help 👇️ Join the Discord.
355
352
 
356
353
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
357
354
 
358
- [![Sponsor kettle-rb/kettle-dev 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-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
355
+ [![Sponsor kettle-rb/kettle-dev 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]
359
356
 
360
357
  ### Please give the project a star ⭐ ♥.
361
358
 
@@ -546,9 +543,9 @@ Thanks for RTFM. ☺️
546
543
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
547
544
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
548
545
  [📌gitmoji]:https://gitmoji.dev
549
- [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
546
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
550
547
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
551
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.112-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
548
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.237-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
552
549
  [🔐security]: SECURITY.md
553
550
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
554
551
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -194,10 +194,7 @@ and [Tidelift][🏙️entsup-tidelift].
194
194
 
195
195
  ### Another way to support open-source
196
196
 
197
- > How wonderful it is that nobody need wait a single moment before starting to improve the world.<br/>
198
- >—Anne Frank
199
-
200
- I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions — totaling 79 hours of FLOSS coding over just the past seven days, a pretty regular week for me. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
197
+ I’m driven by a passion to foster a thriving open-source community – a space where people can tackle complex problems, no matter how small. Revitalizing libraries that have fallen into disrepair, and building new libraries focused on solving real-world challenges, are my passions. I was recently affected by layoffs, and the tech jobs market is unwelcoming. I’m reaching out here because your support would significantly aid my efforts to provide for my family, and my farm (11 🐔 chickens, 2 🐶 dogs, 3 🐰 rabbits, 8 🐈‍ cats).
201
198
 
202
199
  If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
203
200
 
@@ -205,7 +202,7 @@ I’m developing a new library, [floss_funding][🖇floss-funding-gem], designed
205
202
 
206
203
  **[Floss-Funding.dev][🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
207
204
 
208
- [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS or refugee efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS or refugee efforts using Patreon][🖇patreon-img]][🖇patreon]
205
+ [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
209
206
 
210
207
  ## 🔐 Security
211
208
 
@@ -332,7 +329,7 @@ To join the community or get help 👇️ Join the Discord.
332
329
 
333
330
  To say "thanks!" ☝️ Join the Discord or 👇️ send money.
334
331
 
335
- [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay-img] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal-img]
332
+ [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
336
333
 
337
334
  ### Please give the project a star ⭐ ♥.
338
335
 
@@ -512,7 +509,7 @@ Thanks for RTFM. ☺️
512
509
  [📗keep-changelog]: https://keepachangelog.com/en/1.0.0/
513
510
  [📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat
514
511
  [📌gitmoji]:https://gitmoji.dev
515
- [📌gitmoji-img]:https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
512
+ [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
516
513
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
517
514
  [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.076-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
518
515
  [🔐security]: SECURITY.md
data/Rakefile.example CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # kettle-dev Rakefile v1.1.44 - 2025-10-31
3
+ # kettle-dev Rakefile v1.1.47 - 2025-11-06
4
4
  # Ruby 2.3 (Safe Navigation) or higher required
5
5
  #
6
6
  # MIT License (see License.txt)
@@ -2,6 +2,7 @@
2
2
 
3
3
  # External stdlibs
4
4
  require "find"
5
+ require "set"
5
6
 
6
7
  module Kettle
7
8
  module Dev
@@ -277,6 +278,46 @@ module Kettle
277
278
  Kettle::Dev.debug_error(e, __method__)
278
279
  # If replacement fails unexpectedly, proceed with content as-is
279
280
  end
281
+
282
+ # If updating the Appraisals file and a destination already exists,
283
+ # merge appraise blocks: augment matching blocks with missing gem/eval_gemfile lines,
284
+ # preserve destination-only blocks and comments/preamble.
285
+ begin
286
+ if dest_exists && File.basename(dest_path.to_s) == "Appraisals" && File.file?(dest_path.to_s)
287
+ existing = begin
288
+ File.read(dest_path)
289
+ rescue
290
+ ""
291
+ end
292
+ content = merge_appraisals(content, existing)
293
+ end
294
+ rescue StandardError => e
295
+ Kettle::Dev.debug_error(e, __method__)
296
+ # On any error, fall back to generated content
297
+ end
298
+
299
+ # If updating a Gemfile or modular .gemfile and the destination already exists,
300
+ # merge dependency lines from the source into the destination to preserve any
301
+ # user-defined gem entries. We append missing `gem "name"` lines; we never
302
+ # alter or remove existing gem lines in the destination.
303
+ begin
304
+ if dest_exists
305
+ dest_str = dest_path.to_s
306
+ is_gemfile_like = File.basename(dest_str) == "Gemfile" || dest_str.end_with?(".gemfile")
307
+ if is_gemfile_like && File.file?(dest_str)
308
+ begin
309
+ existing = File.read(dest_str)
310
+ content = merge_gemfile_dependencies(content, existing)
311
+ rescue StandardError => e
312
+ Kettle::Dev.debug_error(e, __method__)
313
+ # If merging fails, fall back to writing generated content
314
+ end
315
+ end
316
+ end
317
+ rescue StandardError => e
318
+ Kettle::Dev.debug_error(e, __method__)
319
+ end
320
+
280
321
  write_file(dest_path, content)
281
322
  begin
282
323
  # Ensure executable bit for git hook scripts when writing under .git-hooks
@@ -291,6 +332,192 @@ module Kettle
291
332
  puts "Wrote #{dest_path}"
292
333
  end
293
334
 
335
+ # Merge gem dependency lines from a source Gemfile-like content into an existing
336
+ # destination Gemfile-like content. Existing gem lines in the destination win;
337
+ # we only append missing gem declarations from the source at the end of the file.
338
+ # This is deliberately conservative and avoids attempting to relocate gems inside
339
+ # group/platform blocks or reconcile version constraints.
340
+ # @param src_content [String]
341
+ # @param dest_content [String]
342
+ # @return [String] merged content
343
+ def merge_gemfile_dependencies(src_content, dest_content)
344
+ begin
345
+ gem_re = /^\s*gem\s+['"]([^'"\s]+)['"].*$/
346
+ # Collect first occurrence of each gem line in source
347
+ src_gems = {}
348
+ src_content.each_line do |ln|
349
+ next if ln.strip.start_with?("#")
350
+ if (m = ln.match(gem_re))
351
+ name = m[1]
352
+ src_gems[name] ||= ln.rstrip
353
+ end
354
+ end
355
+
356
+ # Index existing gems in destination
357
+ dest_gems = {}
358
+ dest_content.each_line do |ln|
359
+ next if ln.strip.start_with?("#")
360
+ if (m = ln.match(gem_re))
361
+ dest_gems[m[1]] = true
362
+ end
363
+ end
364
+
365
+ missing = src_gems.keys.reject { |n| dest_gems.key?(n) }
366
+ return dest_content if missing.empty?
367
+
368
+ out = dest_content.dup
369
+ out << "\n" unless out.end_with?("\n") || out.empty?
370
+ out << missing.map { |n| src_gems[n] }.join("\n")
371
+ out << "\n"
372
+ out
373
+ rescue StandardError => e
374
+ Kettle::Dev.debug_error(e, __method__)
375
+ dest_content
376
+ end
377
+ end
378
+
379
+ # Merge Appraisals template into existing Appraisals file.
380
+ # Rules:
381
+ # - For each appraise "name" block in template:
382
+ # * If destination has same block, ensure all gem/ eval_gemfile lines from template
383
+ # exist in destination (append missing just before end), keep other dest lines.
384
+ # Use template's contiguous header comment lines (immediately preceding the appraise line)
385
+ # if any; otherwise retain destination's header comments.
386
+ # * If destination lacks the block, add the full template block (with its header).
387
+ # - Preserve destination-only blocks (not present in template) unchanged and after
388
+ # the merged template-ordered blocks.
389
+ # - Preamble (content before first appraise) comes from template when present, else destination.
390
+ def merge_appraisals(template_content, dest_content)
391
+ begin
392
+ parse_blocks = lambda do |text|
393
+ lines = text.lines
394
+ blocks = []
395
+ i = 0
396
+ while i < lines.length
397
+ line = lines[i]
398
+ if line =~ /^\s*appraise\s+["']([^"']+)["']\s+do\s*$/
399
+ name = $1
400
+ # collect header comment lines immediately preceding (contiguous, no blank between comment group and appraise line)
401
+ header_lines = []
402
+ j = i - 1
403
+ while j >= 0
404
+ prev = lines[j]
405
+ break if prev.strip.empty?
406
+ if prev.lstrip.start_with?("#")
407
+ header_lines.unshift(prev)
408
+ j -= 1
409
+ else
410
+ break
411
+ end
412
+ end
413
+ body_lines = []
414
+ i += 1
415
+ while i < lines.length
416
+ l2 = lines[i]
417
+ if l2 =~ /^\s*end\s*$/
418
+ end_line = l2
419
+ blocks << {
420
+ name: name,
421
+ header: header_lines.dup,
422
+ body: body_lines.dup,
423
+ end_line: end_line,
424
+ raw_order: blocks.length,
425
+ original_indices: (j ? (j + 1)..i : i),
426
+ }
427
+ break
428
+ else
429
+ body_lines << l2
430
+ end
431
+ i += 1
432
+ end
433
+ end
434
+ i += 1
435
+ end
436
+ preamble = if blocks.empty?
437
+ text
438
+ else
439
+ # preamble = lines from start up to first block start (exclusive)
440
+ first_block = blocks.first
441
+ # Take lines up to first occurrence of the appraise line (supports either quote type)
442
+ re = /^\s*appraise\s+["']#{Regexp.escape(first_block[:name])}["']\s+do\s*$/
443
+ idx = lines.index { |l| l =~ re } || 0
444
+ lines[0...idx].join
445
+ end
446
+ {blocks: blocks, preamble: preamble}
447
+ end
448
+
449
+ tmpl = parse_blocks.call(template_content)
450
+ dest = parse_blocks.call(dest_content)
451
+ tmpl_blocks = tmpl[:blocks]
452
+ dest_blocks = dest[:blocks]
453
+ dest_by_name = dest_blocks.map { |b| [b[:name], b] }.to_h
454
+
455
+ merged_blocks_strings = []
456
+ gem_or_eval_re = /^\s*(?:gem|eval_gemfile)\b/
457
+
458
+ tmpl_blocks.each do |tb|
459
+ if (db = dest_by_name[tb[:name]])
460
+ # Merge lines
461
+ existing_lines = db[:body].map(&:rstrip)
462
+ existing_set = existing_lines.to_set
463
+ # Collect template gem/eval lines
464
+ tmpl_needed = tb[:body].select { |l| gem_or_eval_re =~ l }
465
+ additions = []
466
+ tmpl_needed.each do |l|
467
+ line_key = l.rstrip
468
+ additions << l unless existing_set.include?(line_key)
469
+ end
470
+ merged_body = db[:body].dup
471
+ unless additions.empty?
472
+ # insert before end (just append; body excludes 'end')
473
+ merged_body += additions
474
+ end
475
+ header = tb[:header].any? ? tb[:header] : db[:header]
476
+ block_text = +""
477
+ block_text << "\n" unless merged_blocks_strings.empty?
478
+ header.each { |hl| block_text << hl } if header.any?
479
+ block_text << "appraise \"#{tb[:name]}\" do\n"
480
+ merged_body.each { |bl| block_text << bl }
481
+ block_text << db[:end_line]
482
+ merged_blocks_strings << block_text
483
+ dest_by_name.delete(tb[:name])
484
+ else
485
+ # New block from template
486
+ block_text = +""
487
+ block_text << "\n" unless merged_blocks_strings.empty?
488
+ tb[:header].each { |hl| block_text << hl } if tb[:header].any?
489
+ block_text << "appraise \"#{tb[:name]}\" do\n"
490
+ tb[:body].each { |bl| block_text << bl }
491
+ block_text << tb[:end_line]
492
+ merged_blocks_strings << block_text
493
+ end
494
+ end
495
+ # Append destination-only blocks preserving their original text
496
+ dest_remaining_order = dest_blocks.select { |b| dest_by_name.key?(b[:name]) }
497
+ dest_remaining_order.each do |b|
498
+ block_text = +""
499
+ block_text << "\n" unless merged_blocks_strings.empty?
500
+ b[:header].each { |hl| block_text << hl } if b[:header].any?
501
+ block_text << "appraise \"#{b[:name]}\" do\n"
502
+ b[:body].each { |bl| block_text << bl }
503
+ block_text << b[:end_line]
504
+ merged_blocks_strings << block_text
505
+ end
506
+
507
+ preamble = tmpl[:preamble].to_s.strip.empty? ? dest[:preamble] : tmpl[:preamble]
508
+ out = +""
509
+ out << preamble unless preamble.nil? || preamble.empty?
510
+ out << "\n" unless out.end_with?("\n")
511
+ out << merged_blocks_strings.join
512
+ out << "\n" unless out.end_with?("\n")
513
+ out
514
+ rescue StandardError => e
515
+ Kettle::Dev.debug_error(e, __method__)
516
+ # Fallback: prefer destination (user changes) and append template content to allow manual reconciliation
517
+ dest_content + "\n# --- TEMPLATE APPRAISALS (unmerged) ---\n" + template_content
518
+ end
519
+ end
520
+
294
521
  # Copy a directory tree, prompting before creating or overwriting.
295
522
  # @return [void]
296
523
  def copy_dir_with_prompt(src_dir, dest_dir)
@@ -6,7 +6,7 @@ module Kettle
6
6
  module Version
7
7
  # The gem version.
8
8
  # @return [String]
9
- VERSION = "1.1.44"
9
+ VERSION = "1.1.47"
10
10
 
11
11
  module_function
12
12
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.44
4
+ version: 1.1.47
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -396,10 +396,10 @@ licenses:
396
396
  - MIT
397
397
  metadata:
398
398
  homepage_uri: https://kettle-dev.galtzo.com/
399
- source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.44
400
- changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.44/CHANGELOG.md
399
+ source_code_uri: https://github.com/kettle-rb/kettle-dev/tree/v1.1.47
400
+ changelog_uri: https://github.com/kettle-rb/kettle-dev/blob/v1.1.47/CHANGELOG.md
401
401
  bug_tracker_uri: https://github.com/kettle-rb/kettle-dev/issues
402
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.44
402
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/1.1.47
403
403
  funding_uri: https://github.com/sponsors/pboling
404
404
  wiki_uri: https://github.com/kettle-rb/kettle-dev/wiki
405
405
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file