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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +1 -2
- data/.envrc +1 -0
- data/.envrc.example +1 -0
- data/.envrc.no-osc.example +1 -0
- data/.github/workflows/ancient.yml +1 -1
- data/.github/workflows/ancient.yml.example +1 -1
- data/.github/workflows/codeql-analysis.yml +1 -1
- data/.github/workflows/coverage.yml +1 -1
- data/.github/workflows/coverage.yml.example +1 -1
- data/.github/workflows/current.yml +1 -1
- data/.github/workflows/current.yml.example +1 -1
- data/.github/workflows/dep-heads.yml +1 -1
- data/.github/workflows/dependency-review.yml +1 -1
- data/.github/workflows/heads.yml +1 -1
- data/.github/workflows/heads.yml.example +1 -1
- data/.github/workflows/jruby.yml +1 -1
- data/.github/workflows/jruby.yml.example +1 -1
- data/.github/workflows/legacy.yml +1 -1
- data/.github/workflows/license-eye.yml +1 -1
- data/.github/workflows/locked_deps.yml +1 -1
- data/.github/workflows/opencollective.yml +1 -1
- data/.github/workflows/style.yml +1 -1
- data/.github/workflows/supported.yml +1 -1
- data/.github/workflows/truffle.yml +1 -1
- data/.github/workflows/unlocked_deps.yml +1 -1
- data/.github/workflows/unsupported.yml +1 -1
- data/CHANGELOG.md +35 -1
- data/Gemfile +3 -0
- data/Gemfile.example +3 -0
- data/README.md +90 -37
- data/README.md.example +16 -12
- data/README.md.no-osc.example +16 -12
- data/Rakefile.example +1 -1
- data/gemfiles/modular/style.gemfile.example +1 -1
- data/gemfiles/modular/templating.gemfile +3 -0
- data/lib/kettle/dev/appraisals_ast_merger.rb +383 -0
- data/lib/kettle/dev/changelog_cli.rb +13 -0
- data/lib/kettle/dev/modular_gemfiles.rb +11 -3
- data/lib/kettle/dev/prism_utils.rb +188 -0
- data/lib/kettle/dev/rakelib/spec_test.rake +70 -20
- data/lib/kettle/dev/source_merger.rb +345 -0
- data/lib/kettle/dev/tasks/template_task.rb +11 -1
- data/lib/kettle/dev/template_helpers.rb +70 -226
- data/lib/kettle/dev/version.rb +1 -1
- data/lib/kettle/dev.rb +2 -0
- data/sig/kettle/dev/appraisals_ast_merger.rbs +72 -0
- data/sig/kettle/dev/changelog_cli.rbs +64 -0
- data/sig/kettle/dev/prism_utils.rbs +56 -0
- data/sig/kettle/dev/source_merger.rbs +86 -0
- data/sig/kettle/dev/versioning.rbs +21 -0
- data.tar.gz.sig +0 -0
- metadata +14 -5
- metadata.gz.sig +0 -0
- /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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c5ef625cbc6016859cd2c88105ce957e3719465cee97356df1fc77a30c8504c1
|
|
4
|
+
data.tar.gz: e18d15a0d1da90c31991b4b6601b698633dad3e377145724f8fb277ec7b2a75a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 227cb01388512c937d73fddf46deac2edf2b062f93a97b8e788ac0af4e21f8bd1b3a941dc4bf8eabfd5b494401e935e08a8d28d10fc1954b728e7148953e531b
|
|
7
|
+
data.tar.gz: 336fe91aab36fd2ca958967fbc3cfaaa2d6cea7dbb5b1e4d63882526b1271561920d41c016f301b93eb533cb636d252e923882859c9be58fbe4bd586b29d870d
|
checksums.yaml.gz.sig
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
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)
|
data/.envrc.no-osc.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)
|
|
@@ -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@
|
|
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@
|
|
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@
|
|
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')) }}
|
data/.github/workflows/heads.yml
CHANGED
|
@@ -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@
|
|
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@
|
|
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')) }}
|
data/.github/workflows/jruby.yml
CHANGED
data/.github/workflows/style.yml
CHANGED
|
@@ -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@
|
|
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')) }}
|
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.
|
|
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
|
-
|
|
|
7
|
-
|
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
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
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
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
|
-
|
|
587
|
-
|
|
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
|
-
|
|
590
|
-
|
|
636
|
+
- `exe/kettle-readme-backers`
|
|
637
|
+
- `OPENCOLLECTIVE_HANDLE=my-collective exe/kettle-readme-backers`
|
|
591
638
|
- Behavior:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
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
|
-
|
|
602
|
-
|
|
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
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
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
|
-
|
|
|
7
|
-
|
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
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
|
|
data/README.md.no-osc.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
|
-
|
|
|
7
|
-
|
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
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
|
|