kettle-dev 1.1.59 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data/.envrc +1 -0
  4. data/.envrc.example +1 -0
  5. data/.envrc.no-osc.example +1 -0
  6. data/.github/workflows/ancient.yml +1 -1
  7. data/.github/workflows/ancient.yml.example +1 -1
  8. data/.github/workflows/codeql-analysis.yml +1 -1
  9. data/.github/workflows/coverage.yml +1 -1
  10. data/.github/workflows/coverage.yml.example +1 -1
  11. data/.github/workflows/current.yml +1 -1
  12. data/.github/workflows/current.yml.example +1 -1
  13. data/.github/workflows/dep-heads.yml +1 -1
  14. data/.github/workflows/dependency-review.yml +1 -1
  15. data/.github/workflows/heads.yml +1 -1
  16. data/.github/workflows/heads.yml.example +1 -1
  17. data/.github/workflows/jruby.yml +1 -1
  18. data/.github/workflows/jruby.yml.example +1 -1
  19. data/.github/workflows/legacy.yml +1 -1
  20. data/.github/workflows/license-eye.yml +1 -1
  21. data/.github/workflows/locked_deps.yml +1 -1
  22. data/.github/workflows/opencollective.yml +1 -1
  23. data/.github/workflows/style.yml +1 -1
  24. data/.github/workflows/supported.yml +1 -1
  25. data/.github/workflows/truffle.yml +1 -1
  26. data/.github/workflows/unlocked_deps.yml +1 -1
  27. data/.github/workflows/unsupported.yml +1 -1
  28. data/CHANGELOG.md +35 -1
  29. data/Gemfile +3 -0
  30. data/Gemfile.example +3 -0
  31. data/README.md +90 -37
  32. data/README.md.example +16 -12
  33. data/README.md.no-osc.example +16 -12
  34. data/Rakefile.example +1 -1
  35. data/gemfiles/modular/style.gemfile.example +1 -1
  36. data/gemfiles/modular/templating.gemfile +3 -0
  37. data/lib/kettle/dev/appraisals_ast_merger.rb +383 -0
  38. data/lib/kettle/dev/changelog_cli.rb +13 -0
  39. data/lib/kettle/dev/modular_gemfiles.rb +11 -3
  40. data/lib/kettle/dev/prism_utils.rb +188 -0
  41. data/lib/kettle/dev/rakelib/spec_test.rake +70 -20
  42. data/lib/kettle/dev/source_merger.rb +345 -0
  43. data/lib/kettle/dev/tasks/template_task.rb +11 -1
  44. data/lib/kettle/dev/template_helpers.rb +70 -226
  45. data/lib/kettle/dev/version.rb +1 -1
  46. data/lib/kettle/dev.rb +2 -0
  47. data/sig/kettle/dev/appraisals_ast_merger.rbs +72 -0
  48. data/sig/kettle/dev/changelog_cli.rbs +64 -0
  49. data/sig/kettle/dev/prism_utils.rbs +56 -0
  50. data/sig/kettle/dev/source_merger.rbs +86 -0
  51. data/sig/kettle/dev/versioning.rbs +21 -0
  52. data.tar.gz.sig +0 -0
  53. metadata +14 -5
  54. metadata.gz.sig +0 -0
  55. /data/sig/kettle/dev/{dvcscli.rbs → dvcs_cli.rbs} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9c8cf2d28dc867f2993e6b5833914a56c2ed3b17bd68273d03360a2c31fa706
4
- data.tar.gz: 3a2e6abe6033c6d8faa0b77574ccd0861f43a356c0e24dc8c2536c7200bed7e9
3
+ metadata.gz: c5ef625cbc6016859cd2c88105ce957e3719465cee97356df1fc77a30c8504c1
4
+ data.tar.gz: e18d15a0d1da90c31991b4b6601b698633dad3e377145724f8fb277ec7b2a75a
5
5
  SHA512:
6
- metadata.gz: 164fe7151c25ae3180a7ff0444dea16c35b8121dfe89fafc656d7a8cd1b88cf63e0b91d7870e08ca64f658be12162c8346beff45e5d993907c6f0f8f250d1c1e
7
- data.tar.gz: a674cd8c0fb4349aa41e7315a8919919081c97b6493ccf035fb1a9dee897129ae36027fe74d559b06974534923a65d8260660862acdce935af5f230a150d10a5
6
+ metadata.gz: 227cb01388512c937d73fddf46deac2edf2b062f93a97b8e788ac0af4e21f8bd1b3a941dc4bf8eabfd5b494401e935e08a8d28d10fc1954b728e7148953e531b
7
+ data.tar.gz: 336fe91aab36fd2ca958967fbc3cfaaa2d6cea7dbb5b1e4d63882526b1271561920d41c016f301b93eb533cb636d252e923882859c9be58fbe4bd586b29d870d
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1 @@
1
- <���V��/��I�~A�iZF�D:��i���V� ;-RnM
2
- �eƷj�'� j+��S�:�)��GN�6"�e�P(��
1
+ !�5å����Ԇ��,@K:�v���Fr���%�������&��lv��,j_��r��Wy��yU%GU����6�knu|�b������b�g/&��5"K������DF`t<|�q����sǩ�:5^��'B `1����*˲���hV�J�ҥ,��.��*(�y���+�im(�$-�T�W-�x>o%Psw���kt)� �~F�Ȕ�h�‡,�\ �� d̎�������A�EkH���>J�S���"9�,Y̛;�̄C�����ZN��ƍ �$hLx`�=�U����� 1J�;l~T��_��FiOm���6�dSс��o�aD^�1��/���Uw�����F|�3aX�31��A��T'$���b�N#�P{�Fz���v�
data/.envrc CHANGED
@@ -28,6 +28,7 @@ export K_SOUP_COV_MULTI_FORMATTERS=true
28
28
  export K_SOUP_COV_OPEN_BIN= # Means don't try to open coverage results in browser
29
29
  export MAX_ROWS=1 # Setting for simplecov-console gem for tty output, limits to the worst N rows of bad coverage
30
30
  export KETTLE_TEST_SILENT=true
31
+ export KETTLE_DEV_DEBUG=false
31
32
 
32
33
  # Internal Debugging Controls
33
34
  export DEBUG=false # do not allow byebug statements (override in .env.local)
data/.envrc.example CHANGED
@@ -28,6 +28,7 @@ export K_SOUP_COV_MULTI_FORMATTERS=true
28
28
  export K_SOUP_COV_OPEN_BIN= # Means don't try to open coverage results in browser
29
29
  export MAX_ROWS=1 # Setting for simplecov-console gem for tty output, limits to the worst N rows of bad coverage
30
30
  export KETTLE_TEST_SILENT=true
31
+ export KETTLE_DEV_DEBUG=false
31
32
 
32
33
  # Internal Debugging Controls
33
34
  export DEBUG=false # do not allow byebug statements (override in .env.local)
@@ -28,6 +28,7 @@ export K_SOUP_COV_MULTI_FORMATTERS=true
28
28
  export K_SOUP_COV_OPEN_BIN= # Means don't try to open coverage results in browser
29
29
  export MAX_ROWS=1 # Setting for simplecov-console gem for tty output, limits to the worst N rows of bad coverage
30
30
  export KETTLE_TEST_SILENT=true
31
+ export KETTLE_DEV_DEBUG=false
31
32
 
32
33
  # Internal Debugging Controls
33
34
  export DEBUG=false # do not allow byebug statements (override in .env.local)
@@ -62,7 +62,7 @@ jobs:
62
62
 
63
63
  steps:
64
64
  - name: Checkout
65
- uses: actions/checkout@v5
65
+ uses: actions/checkout@v6
66
66
 
67
67
  - name: Setup Ruby & RubyGems
68
68
  uses: ruby/setup-ruby@v1
@@ -60,7 +60,7 @@ jobs:
60
60
 
61
61
  steps:
62
62
  - name: Checkout
63
- uses: actions/checkout@v5
63
+ uses: actions/checkout@v6
64
64
 
65
65
  - name: Setup Ruby & RubyGems
66
66
  uses: ruby/setup-ruby@v1
@@ -38,7 +38,7 @@ jobs:
38
38
 
39
39
  steps:
40
40
  - name: Checkout repository
41
- uses: actions/checkout@v5
41
+ uses: actions/checkout@v6
42
42
 
43
43
  # Initializes the CodeQL tools for scanning.
44
44
  - name: Initialize CodeQL
@@ -55,7 +55,7 @@ jobs:
55
55
 
56
56
  steps:
57
57
  - name: Checkout
58
- uses: actions/checkout@v5
58
+ uses: actions/checkout@v6
59
59
 
60
60
  - name: Setup Ruby & RubyGems
61
61
  uses: ruby/setup-ruby@v1
@@ -55,7 +55,7 @@ jobs:
55
55
 
56
56
  steps:
57
57
  - name: Checkout
58
- uses: actions/checkout@v5
58
+ uses: actions/checkout@v6
59
59
 
60
60
  - name: Setup Ruby & RubyGems
61
61
  uses: ruby/setup-ruby@v1
@@ -65,7 +65,7 @@ jobs:
65
65
  steps:
66
66
  - name: Checkout
67
67
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
68
- uses: actions/checkout@v5
68
+ uses: actions/checkout@v6
69
69
 
70
70
  - name: Setup Ruby & RubyGems
71
71
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -64,7 +64,7 @@ jobs:
64
64
  steps:
65
65
  - name: Checkout
66
66
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
67
- uses: actions/checkout@v5
67
+ uses: actions/checkout@v6
68
68
 
69
69
  - name: Setup Ruby & RubyGems
70
70
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -66,7 +66,7 @@ jobs:
66
66
  steps:
67
67
  - name: Checkout
68
68
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
69
- uses: actions/checkout@v5
69
+ uses: actions/checkout@v6
70
70
 
71
71
  - name: Setup Ruby & RubyGems
72
72
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -15,6 +15,6 @@ jobs:
15
15
  runs-on: ubuntu-latest
16
16
  steps:
17
17
  - name: 'Checkout Repository'
18
- uses: actions/checkout@v5
18
+ uses: actions/checkout@v6
19
19
  - name: 'Dependency Review'
20
20
  uses: actions/dependency-review-action@v4
@@ -66,7 +66,7 @@ jobs:
66
66
  steps:
67
67
  - name: Checkout
68
68
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
69
- uses: actions/checkout@v5
69
+ uses: actions/checkout@v6
70
70
 
71
71
  - name: Setup Ruby & RubyGems
72
72
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -65,7 +65,7 @@ jobs:
65
65
  steps:
66
66
  - name: Checkout
67
67
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
68
- uses: actions/checkout@v5
68
+ uses: actions/checkout@v6
69
69
 
70
70
  - name: Setup Ruby & RubyGems
71
71
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -57,7 +57,7 @@ jobs:
57
57
  steps:
58
58
  - name: Checkout
59
59
  if: ${{ !env.ACT }}
60
- uses: actions/checkout@v5
60
+ uses: actions/checkout@v6
61
61
 
62
62
  - name: Setup Ruby & RubyGems
63
63
  if: ${{ !env.ACT }}
@@ -47,7 +47,7 @@ jobs:
47
47
  steps:
48
48
  - name: Checkout
49
49
  if: ${{ !env.ACT }}
50
- uses: actions/checkout@v5
50
+ uses: actions/checkout@v6
51
51
 
52
52
  - name: Setup Ruby & RubyGems
53
53
  if: ${{ !env.ACT }}
@@ -55,7 +55,7 @@ jobs:
55
55
 
56
56
  steps:
57
57
  - name: Checkout
58
- uses: actions/checkout@v5
58
+ uses: actions/checkout@v6
59
59
 
60
60
  - name: Setup Ruby & RubyGems
61
61
  uses: ruby/setup-ruby@v1
@@ -28,7 +28,7 @@ jobs:
28
28
  runs-on: ubuntu-latest
29
29
  steps:
30
30
  - name: Checkout
31
- uses: actions/checkout@v5
31
+ uses: actions/checkout@v6
32
32
 
33
33
  - name: Check Dependencies' License
34
34
  uses: apache/skywalking-eyes/dependency@main
@@ -71,7 +71,7 @@ jobs:
71
71
 
72
72
  steps:
73
73
  - name: Checkout
74
- uses: actions/checkout@v5
74
+ uses: actions/checkout@v6
75
75
 
76
76
  - name: Setup Ruby & RubyGems
77
77
  uses: ruby/setup-ruby@v1
@@ -13,7 +13,7 @@ jobs:
13
13
  update-backers:
14
14
  runs-on: ubuntu-latest
15
15
  steps:
16
- - uses: actions/checkout@v5
16
+ - uses: actions/checkout@v6
17
17
  with:
18
18
  persist-credentials: false
19
19
  - name: Setup Ruby & RubyGems
@@ -44,7 +44,7 @@ jobs:
44
44
 
45
45
  steps:
46
46
  - name: Checkout
47
- uses: actions/checkout@v5
47
+ uses: actions/checkout@v6
48
48
 
49
49
  - name: Setup Ruby & RubyGems
50
50
  uses: ruby/setup-ruby@v1
@@ -54,7 +54,7 @@ jobs:
54
54
 
55
55
  steps:
56
56
  - name: Checkout
57
- uses: actions/checkout@v5
57
+ uses: actions/checkout@v6
58
58
 
59
59
  - name: Setup Ruby & RubyGems
60
60
  uses: ruby/setup-ruby@v1
@@ -48,7 +48,7 @@ jobs:
48
48
  steps:
49
49
  - name: Checkout
50
50
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
51
- uses: actions/checkout@v5
51
+ uses: actions/checkout@v6
52
52
 
53
53
  - name: Setup Ruby & RubyGems
54
54
  if: ${{ (env.ACT && !(startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) || (!env.ACT && (startsWith(matrix.ruby, 'jruby')) || startsWith(matrix.ruby, 'truffleruby')) }}
@@ -63,7 +63,7 @@ jobs:
63
63
 
64
64
  steps:
65
65
  - name: Checkout
66
- uses: actions/checkout@v5
66
+ uses: actions/checkout@v6
67
67
 
68
68
  - name: Setup Ruby & RubyGems
69
69
  uses: ruby/setup-ruby@v1
@@ -55,7 +55,7 @@ jobs:
55
55
 
56
56
  steps:
57
57
  - name: Checkout
58
- uses: actions/checkout@v5
58
+ uses: actions/checkout@v6
59
59
 
60
60
  - name: Setup Ruby & RubyGems
61
61
  uses: ruby/setup-ruby@v1
data/CHANGELOG.md CHANGED
@@ -30,6 +30,36 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.0] - 2025-11-25
34
+
35
+ - TAG: [v1.2.0][1.2.0t]
36
+ - COVERAGE: 94.38% -- 4066/4308 lines in 26 files
37
+ - BRANCH COVERAGE: 78.81% -- 1674/2124 branches in 26 files
38
+ - 69.14% documented
39
+
40
+ ### Changed
41
+
42
+ - Source merging switched from Regex-based string manipulation to Prism AST-based manipulation
43
+ - Comments are preserved in the resulting file
44
+
45
+ ## [1.1.60] - 2025-11-23
46
+
47
+ - TAG: [v1.1.60][1.1.60t]
48
+ - COVERAGE: 94.38% -- 4066/4308 lines in 26 files
49
+ - BRANCH COVERAGE: 78.86% -- 1675/2124 branches in 26 files
50
+ - 79.89% documented
51
+
52
+ ### Added
53
+
54
+ - Add KETTLE_DEV_DEBUG to direnv defaults
55
+ - Documentation of the explicit policy violations of RubyGems.org leadership toward open source projects they funded
56
+ - https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
57
+
58
+ ### Fixed
59
+
60
+ - Prevent double test runs by ensuring only one of test/coverage/spec are in default task
61
+ - Add debugging when more than one registered
62
+
33
63
  ## [1.1.59] - 2025-11-13
34
64
 
35
65
  - TAG: [v1.1.59][1.1.59t]
@@ -1440,7 +1470,11 @@ Please file a bug if you notice a violation of semantic versioning.
1440
1470
  - Selecting will run the selected workflow via `act`
1441
1471
  - This may move to its own gem in the future.
1442
1472
 
1443
- [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.59...HEAD
1473
+ [Unreleased]: https://github.com/kettle-rb/kettle-dev/compare/v1.2.0...HEAD
1474
+ [1.2.0]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.60...v1.2.0
1475
+ [1.2.0t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.2.0
1476
+ [1.1.60]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.59...v1.1.60
1477
+ [1.1.60t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.60
1444
1478
  [1.1.59]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.58...v1.1.59
1445
1479
  [1.1.59t]: https://github.com/kettle-rb/kettle-dev/releases/tag/v1.1.59
1446
1480
  [1.1.58]: https://github.com/kettle-rb/kettle-dev/compare/v1.1.57...v1.1.58
data/Gemfile CHANGED
@@ -12,6 +12,9 @@ git_source(:gitlab) { |repo_name| "https://gitlab.com/#{repo_name}" }
12
12
  # Include dependencies from <gem name>.gemspec
13
13
  gemspec
14
14
 
15
+ # Templating
16
+ eval_gemfile "gemfiles/modular/templating.gemfile"
17
+
15
18
  # Debugging
16
19
  eval_gemfile "gemfiles/modular/debug.gemfile"
17
20
 
data/Gemfile.example CHANGED
@@ -12,6 +12,9 @@ git_source(:gitlab) { |repo_name| "https://gitlab.com/#{repo_name}" }
12
12
  # Include dependencies from <gem name>.gemspec
13
13
  gemspec
14
14
 
15
+ # Templating
16
+ eval_gemfile "gemfiles/modular/templating.gemfile"
17
+
15
18
  # Debugging
16
19
  eval_gemfile "gemfiles/modular/debug.gemfile"
17
20
 
data/README.md CHANGED
@@ -1,15 +1,16 @@
1
- | 📍 NOTE |
2
- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
- | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
- | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
- | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
- | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
7
- | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
8
- | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
9
- | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
10
- | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
11
- | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
12
- | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
1
+ | 📍 NOTE |
2
+ |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
+ | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
+ | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
+ | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
+ | Simply put - there was active policy for adding or removing maintainers/owners of [rubygems][rubygems-maint-policy] and [bundler][bundler-maint-policy], and those [policies were not followed][policy-fail]. |
7
+ | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
8
+ | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
9
+ | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
10
+ | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
11
+ | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
12
+ | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
13
+ | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
13
14
 
14
15
  [rubygems-org]: https://github.com/rubygems/
15
16
  [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
@@ -26,6 +27,9 @@
26
27
  [gem-scopes]: https://github.com/galtzo-floss/bundle-namespace
27
28
  [gem-server]: https://github.com/galtzo-floss/gem-server
28
29
  [reinteractive-podcast]: https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6
30
+ [bundler-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/bundler/playbooks/TEAM_CHANGES.md
31
+ [rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
32
+ [policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
29
33
 
30
34
  [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-dev Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-dev-i]][🖼️kettle-dev]
31
35
 
@@ -570,41 +574,84 @@ What it does:
570
574
  - Stages and commits any bootstrap changes with message: `🎨 Template bootstrap by kettle-dev-setup v<version>`.
571
575
  - Executes `bin/rake kettle:dev:install` with the parsed passthrough args.
572
576
 
577
+ ### Template Manifest and AST Strategies
578
+
579
+ `kettle:dev:template` looks at `template_manifest.yml` to determine how each file should be updated. Each entry has a `path` (exact file or glob) and a `strategy`:
580
+
581
+ | Strategy | Behavior |
582
+ | --- | --- |
583
+ | `skip` | Legacy behavior: template content is copied with token replacements and any bespoke merge logic already in place. |
584
+ | `replace` | Template AST replaces the destination outside of `kettle-dev:freeze` sections. |
585
+ | `append` | Only missing AST nodes (e.g., `gem` or `task` declarations) are appended; existing nodes remain untouched. |
586
+ | `merge` | Destination nodes are updated in-place using the template AST (used for `Gemfile`, `*.gemspec`, and `Rakefile`). |
587
+
588
+ All Ruby files receive this reminder (inserted after shebang/frozen-string-literal lines):
589
+
590
+ ```
591
+ # To force retention during kettle-dev templating:
592
+ # kettle-dev:freeze
593
+ # # ... your code
594
+ # kettle-dev:unfreeze
595
+ ```
596
+
597
+ Wrap any code you never want rewritten between `kettle-dev:freeze` / `kettle-dev:unfreeze` comments. When an AST merge fails, the task emits an error asking you to file an issue at https://github.com/kettle-rb/kettle-dev/issues and then aborts—there is no regex fallback.
598
+
599
+ ### Template Example
600
+
601
+ Here is an example `template_manifest.yml`:
602
+
603
+ ```yaml
604
+ # For each file or glob, specify a strategy for how it should be managed.
605
+ # See https://github.com/kettle-rb/kettle-dev/blob/main/docs/README.md#template-manifest-and-ast-strategies
606
+ # for details on each strategy.
607
+ files:
608
+ - path: "Gemfile"
609
+ strategy: "merge"
610
+ - path: "*.gemspec"
611
+ strategy: "merge"
612
+ - path: "Rakefile"
613
+ strategy: "merge"
614
+ - path: "README.md"
615
+ strategy: "replace"
616
+ - path: ".env.local"
617
+ strategy: "skip"
618
+ ```
619
+
573
620
  ### Open Collective README updater
574
621
 
575
622
  - Script: `exe/kettle-readme-backers` (run as `kettle-readme-backers`)
576
623
  - Purpose: Updates README sections for Open Collective backers (individuals) and sponsors (organizations) by fetching live data from your collective.
577
624
  - Tags updated in README.md (first match wins for backers):
578
- - The default tag prefix is `OPENCOLLECTIVE`, and it is configurable:
579
- - ENV: `KETTLE_DEV_BACKER_README_OSC_TAG="OPENCOLLECTIVE"`
580
- - YAML (.opencollective.yml): `readme-osc-tag: "OPENCOLLECTIVE"`
581
- - The resulting markers become: `<!-- <TAG>:START --> … <!-- <TAG>:END -->`, `<!-- <TAG>-INDIVIDUALS:START --> … <!-- <TAG>-INDIVIDUALS:END -->`, and `<!-- <TAG>-ORGANIZATIONS:START --> … <!-- <TAG>-ORGANIZATIONS:END -->`.
582
- - ENV overrides YAML.
583
- - Backers (Individuals): `<!-- <TAG>:START --> … <!-- <TAG>:END -->` or `<!-- <TAG>-INDIVIDUALS:START --> … <!-- <TAG>-INDIVIDUALS:END -->`
584
- - Sponsors (Organizations): `<!-- <TAG>-ORGANIZATIONS:START --> … <!-- <TAG>-ORGANIZATIONS:END -->`
625
+ - The default tag prefix is `OPENCOLLECTIVE`, and it is configurable:
626
+ - ENV: `KETTLE_DEV_BACKER_README_OSC_TAG="OPENCOLLECTIVE"`
627
+ - YAML (.opencollective.yml): `readme-osc-tag: "OPENCOLLECTIVE"`
628
+ - The resulting markers become: `<!-- <TAG>:START --> … <!-- <TAG>:END -->`, `<!-- <TAG>-INDIVIDUALS:START --> … <!-- <TAG>-INDIVIDUALS:END -->`, and `<!-- <TAG>-ORGANIZATIONS:START --> … <!-- <TAG>-ORGANIZATIONS:END -->`.
629
+ - ENV overrides YAML.
630
+ - Backers (Individuals): `<!-- <TAG>:START --> … <!-- <TAG>:END -->` or `<!-- <TAG>-INDIVIDUALS:START --> … <!-- <TAG>-INDIVIDUALS:END -->`
631
+ - Sponsors (Organizations): `<!-- <TAG>-ORGANIZATIONS:START --> … <!-- <TAG>-ORGANIZATIONS:END -->`
585
632
  - Handle resolution:
586
- 1. `OPENCOLLECTIVE_HANDLE` environment variable, if set
587
- 2. `opencollective.yml` in the project root (e.g., `collective: "kettle-rb"` in this repo)
633
+ 1. `OPENCOLLECTIVE_HANDLE` environment variable, if set
634
+ 2. `opencollective.yml` in the project root (e.g., `collective: "kettle-rb"` in this repo)
588
635
  - Usage:
589
- - `exe/kettle-readme-backers`
590
- - `OPENCOLLECTIVE_HANDLE=my-collective exe/kettle-readme-backers`
636
+ - `exe/kettle-readme-backers`
637
+ - `OPENCOLLECTIVE_HANDLE=my-collective exe/kettle-readme-backers`
591
638
  - Behavior:
592
- - Writes to README.md only if content between the tags would change.
593
- - If neither the backers nor sponsors tags are present, prints a helpful warning and exits with status 2.
594
- - When there are no entries, inserts a friendly placeholder: "No backers yet. Be the first!" or "No sponsors yet. Be the first!".
595
- - When updates are written and the repository is a git work tree, the script stages README.md and commits with a message thanking new backers and subscribers, including mentions for any newly added backers and subscribers (GitHub @handles when their website/profile is a github.com URL; otherwise their name).
596
- - Customize the commit subject via env var: `KETTLE_README_BACKERS_COMMIT_SUBJECT="💸 Thanks 🙏 to our new backers 🎒 and subscribers 📜"`.
597
- - Or via .opencollective.yml: set `readme-backers-commit-subject: "💸 Thanks 🙏 to our new backers 🎒 and subscribers 📜"`.
598
- - Precedence: ENV overrides .opencollective.yml; if neither is set, a sensible default is used.
599
- - Note: When used with the provided `.git-hooks`, the subject should start with a gitmoji character (see [gitmoji][📌gitmoji]).
639
+ - Writes to README.md only if content between the tags would change.
640
+ - If neither the backers nor sponsors tags are present, prints a helpful warning and exits with status 2.
641
+ - When there are no entries, inserts a friendly placeholder: "No backers yet. Be the first!" or "No sponsors yet. Be the first!".
642
+ - When updates are written and the repository is a git work tree, the script stages README.md and commits with a message thanking new backers and subscribers, including mentions for any newly added backers and subscribers (GitHub @handles when their website/profile is a github.com URL; otherwise their name).
643
+ - Customize the commit subject via env var: `KETTLE_README_BACKERS_COMMIT_SUBJECT="💸 Thanks 🙏 to our new backers 🎒 and subscribers 📜"`.
644
+ - Or via .opencollective.yml: set `readme-backers-commit-subject: "💸 Thanks 🙏 to our new backers 🎒 and subscribers 📜"`.
645
+ - Precedence: ENV overrides .opencollective.yml; if neither is set, a sensible default is used.
646
+ - Note: When used with the provided `.git-hooks`, the subject should start with a gitmoji character (see [gitmoji][📌gitmoji]).
600
647
  - Tip:
601
- - Run this locally before committing to keep your README current, or schedule it in CI to refresh periodically.
602
- - It runs automatically on a once-a-week schedule by the .github/workflows/opencollective.yml workflow that is part of the kettle-dev template.
648
+ - Run this locally before committing to keep your README current, or schedule it in CI to refresh periodically.
649
+ - It runs automatically on a once-a-week schedule by the .github/workflows/opencollective.yml workflow that is part of the kettle-dev template.
603
650
  - Authentication requirement:
604
- - When running in CI with the provided workflow, you must provide an organization-level Actions secret named `README_UPDATER_TOKEN`.
605
- - Create it under your GitHub organization settings: `https://github.com/organizations/<YOUR_ORG>/settings/secrets/actions`.
606
- - The updater will look for `REPO` or `GITHUB_REPOSITORY` (both usually set by GitHub Actions) to infer `<YOUR_ORG>` for guidance.
607
- - If `README_UPDATER_TOKEN` is missing, the tool prints a helpful error to STDERR and aborts, including a direct link to the expected org settings page.
651
+ - When running in CI with the provided workflow, you must provide an organization-level Actions secret named `README_UPDATER_TOKEN`.
652
+ - Create it under your GitHub organization settings: `https://github.com/organizations/<YOUR_ORG>/settings/secrets/actions`.
653
+ - The updater will look for `REPO` or `GITHUB_REPOSITORY` (both usually set by GitHub Actions) to infer `<YOUR_ORG>` for guidance.
654
+ - If `README_UPDATER_TOKEN` is missing, the tool prints a helpful error to STDERR and aborts, including a direct link to the expected org settings page.
608
655
 
609
656
  ## 🦷 FLOSS Funding
610
657
 
@@ -675,6 +722,12 @@ We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you m
675
722
 
676
723
  See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
677
724
 
725
+ ### Roadmap
726
+
727
+ - [ ] Template the RSpec test harness.
728
+ - [ ] Enhance gitlab pipeline configuration.
729
+ - [ ] Add focused, packaged, named, templating strategies, allowing, for example, only refreshing the Appraisals related template files.
730
+
678
731
  ### 🚀 Release Instructions
679
732
 
680
733
  See [CONTRIBUTING.md][🤝contributing].
data/README.md.example CHANGED
@@ -1,15 +1,16 @@
1
- | 📍 NOTE |
2
- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
- | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
- | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
- | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
- | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
7
- | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
8
- | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
9
- | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
10
- | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
11
- | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
12
- | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
1
+ | 📍 NOTE |
2
+ |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
+ | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
+ | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
+ | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
+ | Simply put - there was active policy for adding or removing maintainers/owners of [rubygems][rubygems-maint-policy] and [bundler][bundler-maint-policy], and those [policies were not followed][policy-fail]. |
7
+ | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
8
+ | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
9
+ | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
10
+ | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
11
+ | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
12
+ | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
13
+ | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
13
14
 
14
15
  [rubygems-org]: https://github.com/rubygems/
15
16
  [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
@@ -26,6 +27,9 @@
26
27
  [gem-scopes]: https://github.com/galtzo-floss/bundle-namespace
27
28
  [gem-server]: https://github.com/galtzo-floss/gem-server
28
29
  [reinteractive-podcast]: https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6
30
+ [bundler-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/bundler/playbooks/TEAM_CHANGES.md
31
+ [rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
32
+ [policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
29
33
 
30
34
  [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-dev Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-dev-i]][🖼️kettle-dev]
31
35
 
@@ -1,15 +1,16 @@
1
- | 📍 NOTE |
2
- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
- | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
- | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
- | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
- | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
7
- | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
8
- | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
9
- | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
10
- | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
11
- | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
12
- | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
1
+ | 📍 NOTE |
2
+ |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
3
+ | RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
4
+ | Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
5
+ | It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
6
+ | Simply put - there was active policy for adding or removing maintainers/owners of [rubygems][rubygems-maint-policy] and [bundler][bundler-maint-policy], and those [policies were not followed][policy-fail]. |
7
+ | I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
8
+ | If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
9
+ | Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
10
+ | Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
11
+ | The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
12
+ | See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
13
+ | What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
13
14
 
14
15
  [rubygems-org]: https://github.com/rubygems/
15
16
  [draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
@@ -26,6 +27,9 @@
26
27
  [gem-scopes]: https://github.com/galtzo-floss/bundle-namespace
27
28
  [gem-server]: https://github.com/galtzo-floss/gem-server
28
29
  [reinteractive-podcast]: https://youtu.be/_H4qbtC5qzU?si=BvuBU90R2wAqD2E6
30
+ [bundler-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/bundler/playbooks/TEAM_CHANGES.md
31
+ [rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
32
+ [policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
29
33
 
30
34
  [![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-dev Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-dev-i]][🖼️kettle-dev]
31
35